The API does not trigger API events, to avoid infinite loops (exception: sendChat can cause infinite loops). If you want your code to trigger other event-handling code, break out your callbacks into named functions, and call the functions yourself. Example: on('change:campaign:turnorder', turnOrderChanged); on('chat:message', function(msg) { ... // event handling code // Time to change the turn order! Campaign().set('turnorder', turnOrder); turnOrderChanged(Campaign(), { // id and type won't be changing _id: Campaign().id, _type: 'campaign', // if your change:campaign:turnorder function cares about what the turnorder changed *from* you need this turnorder: oldTurnOrder, // the other properties of the campaign won't have changed for a turnorder change event initiativepage: Campaign().get('initiativepage'), playerpageid: Campaign().get('playerpageid'), playerspecificpages: Campaign().get('playerspecificpages') }); }); function turnOrderChanged(campaign, oldCampaignState) { // campaign.get('turnorder') is different from oldCampaignState.turnorder! DO SOMETHING!!! // Of course, because the campaign is a singleton, you could use `Campaign()` instead of `campaign`. // If you don't care about the previous value of the turnorder, you don't even need oldCampaignState, // and you could call turnOrderChanged without any parameters at all. } It's generally considered a good idea to namespace your stuff, so that you don't have name collisions with other scripts. For that, you'd do something like this: var jeremy_w = jeremy_w || {}; on('change:campaign:turnorder', jeremy_w.turnOrderChanged); on('chat:message', function(msg) { ... jeremy_w.turnOrderChanged(...); }); jeremy_w.turnOrderChanged = function(...) { ... };