Also, it should be mentioned that Fetch can help here, too. Specifically because of the problem GiGs notes about the expanded macro having query-breaking characters (right brace, pipe, comma). Using Roll20 syntax, all of the macros, abilities, and attributes will be expanded into the command line before the query is evaluated... so if any of them have a breaking character, your query will no longer function. On the flip side, you could build your component macros with HTML replacement characters, but then they will no longer work if you click on them, directly. Fetch works because the Fetch construction works during the metascript phase ... after Roll20 parsers have expanded macros, abilities, and attributes, handled inline rolls, and processed queries. Fetch constructions don't trip any Roll20 parsing, so when your query would come around you're still picking from among Fetch constructions to include in the command line. It's only after the roll query has finished (and the rest of the Roll20 parsing) that Fetch gets a look at the command line. By that point, you've selected one of the macros to keep in the command line, and Fetch goes to get it for you. Even if that macro/ability/attribute has query-breaking characters in it, they no longer matter because you're getting it after the query processing has finished. This also means that now you can click on the "nested" macro and it will still work. It works in both places*. * with one caveat, see below. An example would be: ! ?{Choose Attack| Long Sword,@(selected.weapon1attackmacro)| Short Sword,@(selected.weapon2attackmacro)| Long Bow,@(selected.weapon3attackmacro)} Caveat Notice that the line begins with a bang ("!"). That gets the metascripts involved. This message now won't hit the chat output on its own. This is fine if you choose an attribute that actually invokes a script. The message will continue out of the metascripts and be caught by the script you intend to catch it. If, instead, your chosen attribute would send a simple message (like a roll template, or just text), then you'll need one more component: ZeroFrame. Using ZeroFrame, you can add a {&simple} in the query options where you need it. For example, if your weapon1 AND weapon2 attackmacro attributes sent normal text, but your weapon3 sent a script/mod command, you could add {&simple} like this: ! ?{Choose A ttack| Long Sword,@(selected|weapon1attackmacro) {&simple}| Short Sword,@(selected|weapon2attackmacro) {&simple}| Long Bow,@( selected|weapon3attackmacro)} Again, we'd add it here because we don't need it in weapon1 and weapon2... they are still unchanged, and able to be run independently of using this solution. We only add it to the options that require the "simple" output (going to chat).