I agree with Pat. Let me see if I can put it another way to help clarify what's going on. First, your code has a typo in that you reversed the @ and the left brace in one of your @{selected} references. But what is really going to be the show stopper is that your script is issuing a command which WILL NOT have selected tokens. (I suggest watching the first 15 minutes of this video I made explaining scripts to understand why this message can NEVER have selected tokens. You can watch beyond that point, but it gets into metascripts, which are a whole other level of weirdness that you don't need to deal with... yet.) =D Since the message sent by your script can never have tokens, the @{selected} reference will never resolve when you send the message through the chat parser. It might try to find a character named "selected," but that won't resolve either. So instead of using the @{selected} formation, you would need to use the NAME version (as Pat mentioned): @{Actual Cannibal|d20} This doesn't mean you have to have a different script for each character; it means you have to derive the character's name dynamically from the information you DO have. Here's how you can do that: Any selected token is going to be on the message object in the .selected property array, so a good first step is to make sure the property is there and has at least one reference in it. if(!(msg.selected && msg.selected.length)) { // maybe provide a notification that a selected token is required for this command return; } Once we know it's there, you will need to get the reference from the array; I'm going to assume you're looking for the first entry in the array (entry 0): let sel = msg.selected[0]; Then you will need to use it to actually get the token: let token = getObj('graphic', sel._id); Note the underscore as a part of the property name. This is necessary when you're looking at the selected property. Now that you have the token, you have to see if it represents a character: if(!token.get('represents').length) { // again, maybe a notification of this token not representing a character return; } If it represents a character, you can use that value to drive another retrieval, this time of the character object. We'll need that in order to get the character name. (Yes, most times a character-representing token will have the same name as the character it represents and you *could* use the token name... but there are times that the name has changed, especially for mooks, duplication, etc.) let char = getObj('character', token.get('represents')); Then you can get the name from the character so that you can use it, later: let charName = char.get('name'); Now you can build your sendChat command using this name instead of "selected": sendChat("TokenDamage", "&{template:simple} {{name=Concentration Save}} {{r1=@{" + charName + "|d20}+@{" + charName + "|constitution_save}}} {{saving_throw_dc=" + final_conc_DC + "}}"); When your script sends that, the command line that hits the chat is something more like: &{template:simple} {{name=Concentration Save}} {{r1=@{Actual Cannibal|d20}+@{Actual Cannibal|constitution_save}}} {{saving_throw_dc=12}}" ...and Roll20 should be able to find the character named "Actual Cannibal". The above is the more readable, "verbose" version of the code. There are a lot of efficiencies that could be applied to it to reduce the number of lines you have to add to your script, but when it's written this way, you can see how each part builds on the previous and, hopefully, why we have to go this direction to get the result you're looking for.