Re-opening this thread from a year ago as I just encountered it today. I initialize a few attributes when opening a sheet through the sheet:opened event. On:change listeners on skill fields connected to those attributes work just fine when the attributes are changed through user interaction. However, the change made to the attribute by the function in the sheet:opened event does not fire the on:change event, and so does not update the connected skills. <a href="https://app.roll20.net/forum/post/7266026/sheetworker-on-change-events-not-firing-when-changes-are-made-within-a-routine-called-by-sheet-opened-event/?pageforid=7268028#post-7268028" rel="nofollow">https://app.roll20.net/forum/post/7266026/sheetworker-on-change-events-not-firing-when-changes-are-made-within-a-routine-called-by-sheet-opened-event/?pageforid=7268028#post-7268028</a> // Stats to initialize with a value of 1 const statListOne = [ ' brawn ' , ' agility ' , ' intellect ' , ' cunning ' , ' willpower ' , ' presence ' ]; statListOne . forEach ((stat) => { on ( ' sheet:opened ' , () => { getAttrs ([ stat ], (values) => { const thisStat = ( isNaN ( values [ stat ]) || ( values [ stat ]) === 0 || ( values [ stat ]) === " 0 " ) ? 1 : parseInt ( values [ stat ]); const statValue = thisStat > 0 ? thisStat : 1 ; setAttrs ({[ stat ]: statValue }); // Properly sets the stats, but does not fire an on:change event; bug reported }); }); }); const skillStat = {A BUNCH OF skill:stat PAIRS} for ( const skill in skillStat ) { on ( ' change:brawn change:agility change:intellect change:cunning change:willpower change:presence ' , (eventInfo) => { const stat = eventInfo .sourceAttribute; if ( skillStat [ skill ] === stat ) { CalculateDiceStatChange ( eventInfo , skill , stat ); // Goes on to do the calcs on a manual change, but not from the sheet:opened event } }); };