As Andreas says, you definitely want Custom Roll Parsing. You'll find a detailed guide for that here <a href="https://cybersphere.me/guide-to-custom-roll-parsing/" rel="nofollow">https://cybersphere.me/guide-to-custom-roll-parsing/</a> Yes, it is possible, and if you can create scripts in the API, it should even be fairly trivial for you. Without knowing more details about the roll (how do you dice how many dice to roll, are there ever any modfiers to the roll or to the successes), it' hard to suggest a worker. The simplest form would be something like this: on ( 'clicked:my_button' , () => { const roll_string = "&{template:default} {{my_roll=[[3d12]]}}" ; startRoll ( roll_string , roll => { let total = 0 ; roll . results . my_roll . dice . forEach ( die => { if ( die >= 12 ) { total += 2 ; } else if ( die >= 8 ) { total += 1 ; } }); finishRoll ( roll . rollID ,{ roll : total }); }) }); Or compactified a bit: on ( 'clicked:my_button' , () => { const roll_string = "&{template:default} {{my_roll=[[3d12]]}}" ; startRoll ( roll_string , roll => { const total = roll . results . my_roll . dice . reduce (( sum , die ) => sum + ( die >= 12 ? 2 : ( die >= 8 ? 1 : 0 )), 0 ); finishRoll ( roll . rollID ,{ roll : total }); }) }); Then in your rolltemplate (with CRP, you always need a custom roll template), you can get the successes using the computed property - just use {{computed:my_roll}} instead of anumber.