Hi Patrick, I just had a very quick look over your script, and a couple of things - 1. You've got most of your functions and variables exposed in the top scope. This is problematic in the Roll20 sandbox, because all scripts are concatenated before being executed - every single Mod script is pasted into one big fat string and executed in the same context. It's extra bad with the use of the var keyword (variable hoisting) and generic variable names like 'selectedToken' - there's very good opportunity for collisions and mix-ups there. The most-used pattern to solve this on Roll20 is Revealing Module Pattern - there's a fair amount of explanation here , and some more here . It essentially makes your script scope private, apart from anything you choose to expose via the return { } object at the bottom. This is generally wrapped in an IIFE so it executes as soon as it's declared (the IIFE part is why there's extra parentheses around the function). As Jakob points out in that first link, you don't even need to name the outer function unless you need to expose some internal methods or functions. If your script functions 100% off chat events, you can just wrap your script in an anonymous IIFE: const selected = null; // This will cause a crash if any other script author has used it in their outer scope (() => { // or '(function() {' if you prefer normal function syntax over arrow syntax const selected = 'stuff'; // This is only visible to your script, and will cause no conflict with anyone else's on('ready', () => { on('chat:message', (msg) => { sendChat('', `${msg.who} posted a message.`); }); }); })(); This all protects scripts from interfering with each other - everything inside that outer function is private from other sandbox scripts. 2. On the same note, I'd probably try to come up with something a little longer than !tp for your keyword - there's a fair chance someone's used it as a keyword or alias for another script, so it could end up firing multiple scripts for someone with a big script load. It might be fine, but I probably wouldn't chance it with the number of scripts floating around. 3. The use of &{template:desc} means the menu will only work for the Roll20 5e sheet, or any other sheet that coincidentally has a template with the same name. &{template:default} is the only universal roll template. Of course, this is fine if you only wanted the script to work with 5e, but maybe chuck that info in the top post if that was the plan. Looks good otherwise!