you got the right event. it should fire every time you advance the marker, unless you are using another script that takes over the turn order and screws up the event for you. the turn order is just a JSON array of the things in the turn order tracker, and it does in fact change every time you advance (rotating the entries.) if you aren't seeing events, I believe you have a replacement turn tracker installed? for example code, here's a thing I was experimenting with (links to the journal entries and clickable actions) which I think I will work with Robin to add to CombatTracker instead (after making it pretty!): derScript . get_token = function ( token_flat ) { if (! token_flat ) { return undefined } var token = getObj ( "graphic" , token_flat . id ); if (! token ) { token = getObj ( "graphic" , token_flat [ "_id" ]); } return token } on ( 'change:campaign:turnorder' , function ( campaign , previous ) { var token_flat = JSON . parse ( campaign . get ( 'turnorder' ))[ 0 ] var token = derScript . get_token ( token_flat ) if (! token ) { return } var character_id = token . get ( 'represents' ) if (! character_id ) { return } var character = getObj ( 'character' , character_id ) var text = [] const regex = new RegExp ( `^repeating_npcaction_(-[-A-Za-z0-9]+?|\\d+)_name` ); text . push ( "next turn is for " + character . get ( 'name' )) text . push ( "<a href="https://journal.roll20.net/character/" rel="nofollow">https://journal.roll20.net/character/</a>" + character_id ) findObjs ({ type: 'attribute' , characterid: character_id }). forEach ( attribute => { var attribute_name = attribute . get ( 'name' ) if ( attribute_name . search ( regex ) === 0 ) { text . push ( "[" + attribute . get ( 'current' ) + "](~" + character_id + "|" + attribute_name . slice ( 0 , - 5 ) + "_npc_action)" ) } }) if ( text . length > 0 ) { sendChat ( "derScript" , "/w GM " + text . join ( ' ' ), null , { noarchive: true }) } });