Here's a breakdown of the elements used in this macro: /w gm &{template:default} {{name=Wise Mans Gambit}} {{Wise Mans Roll= ?{Cheat with Sleight of Hand? | Yes, [[d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125;]] + [[d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125; ]] | No, [[d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125; ]] } }} {{Perception Roll= [[d20]] + [[0[perception bonus] ]] }} /w gm <--- you probably already know this is a whisper, everything on the same line as this will be in the whisper. If you hit enter you will need to whisper again if you don't want to broadcast to the general chat &{template:default} <-- template declaration, tells the parser what template to use. everything elsse that you want to be in the template must be on the same line as this declaration (dont press enter) (Templates are the boxy formatting that shows up in the chat, the default one is available in every Roll20 game but many systems have more specific templates available (DnD especially)) {{name= Title }} <--- This is the text that goes in the title box, it has to be the first thing following the template declaration ( {{name= Wise Mans Gambit }} ) {{ }} <--- this will start the first body row of the template, you can add as many of these as you want. If you put "some text = some info" it will split the row into two columns, the lefthand column is always bolded (its meant to be the title). If you don't split the row it will display whatever you want in bold (it thinks you only gave it a title). ( {{ Perception Roll= [[d20]] + [[0[perception bonus] ]] }} ) [[ ]] <--- this tells the dice parser to roll whatever is inside it ( [[ d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125; ]] ) ( [[ d20 ]] ) ( [[ 0[perception bonus] ]] ) [ some text ] <--- when you put something in single brackets inside a roll box (double brackets) it tells the parser to ignore it, but it will still show up in the hover over. You can use this to label parts of a roll so you can keep track of where bonuses or extra dice are coming from ( 0 [ perception bonus ] ) ?{ some text | default number value } <--- this makes a Roll Query (the popouts), you don't have to put a default number if you don't want to. As Keith said a Roll Query only needs to be answered once, every other time in the code that the exact same roll query shows up will have the same value ?{ some text | some option , some number value | some other option , some other number value } <--- this is also a Roll Query, but it makes a dropdown instead of a text box. separate the dropdown title from the dropdown value with a comma ( ?{ Cheat with Sleight of Hand? | Yes , [[d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125;]] + [[d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125; ]] | No , [[d?{Die Size?&#124; D4&#44;4 &#124; D6&#44;6 &#124; D8&#44;8 &#125; ]] } ) as for those random strings, those are HTML encoded characters: &#44; = ' , ' &#124; = ' | ' &#125; = ' } ' You have to use these in Roll Queries because the parser will break if it sees these^ characters (it thinks you want to close the Roll Query or that you've put in gibberish code). When it runs the code it replaces these with the actual character. Unfortunately when you save and close the macro it also replaces these with the actual character, so the next time you save you're back to gibberish. If you want to use complex roll queries you have to save your macro outside of roll20 and paste it in any time you want to change the macro. This is also all documented in the wiki