-
Innovid Investment Impact Calculator
ROI & investment-impact calculator

Investment impact calculator

Real-time ROI across four Innovid solution pillars. Built for live client conversations — no submit button, no spreadsheets.

var CREATIVE_PRESETS={conservative:[5,5],aggressive:[30,30]}; function buildCreative(){ var wfRows=ROI_DEFAULTS.workflow.map(function(r,i){return wfRow('d_wf',i,r);}).join(''); var left='
' +'
Scenario

'+SCENARIO_NOTE+'

' +'
'+seclabel('1','Primary inputs') +field('Total media budget','Display + video, annual',money('d_budget',50000000,1000000,'$')) +field('Video share of budget',null,'
Video 50%50% Display
') +'
' +'
' +'
Workflow Efficiencies (Creative Design Suite, Dynamic Creative, Feeds, Generative AI)
'+wfRows+'

' +'
Performance (Dynamic Creative, Creative Intelligence, Creative Optimization, Interactive & Shoppable Creative)
' +field('CTV share of video',null,'
CTV 50%50% OLV
') +'
'+field('Video ROAS','Standard',money('d_rv',300,10,null,'%'))+field('Display ROAS','Standard',money('d_rd',300,10,null,'%'))+field('Video lift','From personalization',money('d_lv',10,1,null,'%'))+field('Display lift','From personalization',money('d_ld',10,1,null,'%'))+'
' +'
'+field('Video % personalized',null,money('d_pvv',20,5,null,'%'))+field('Display % personalized',null,money('d_pdd',25,5,null,'%'))+'
' +'

Cost assumptions (CPMs & fees)

' +'
'+field('CTV CPM',null,money('d_ctvcpm',50,1,'$'))+field('OLV CPM',null,money('d_olvcpm',8,0.5,'$'))+field('Display CPM',null,money('d_dispcpm',3.5,0.25,'$'))+field('Video ad-tech fee',null,money('d_vfee',10,1,null,'%'))+field('Display ad-tech fee',null,money('d_dfee',10,1,null,'%'))+field('Video serving — std',null,money('d_vstd',0.25,0.01,'$'))+field('Video serving — all-in',null,money('d_vall',0.40,0.01,'$'))+field('Display serving — std',null,money('d_dstd',0.05,0.01,'$'))+field('Display serving — all-in',null,money('d_dall',0.20,0.01,'$'))+'
' +'
' +'
'; var right='
'+tile('Net ROI','—',C.dory)+tile('Incremental rev.','—',C.coral)+tile('Breakeven lift','—')+'
' +'
Total revenue: before vs. after personalization

' +'
' +'
'; document.getElementById('mode-creative').innerHTML='
'+left+right+'
'; document.querySelectorAll('#mode-creative input').forEach(function(i){i.addEventListener('input',renderCreative);}); var pv=document.getElementById('d_pv');pv.addEventListener('input',function(){document.getElementById('d_pvL').textContent=pv.value+'%';document.getElementById('d_pvR').textContent=(100-pv.value)+'%';}); var pc=document.getElementById('d_pc');pc.addEventListener('input',function(){document.getElementById('d_pcL').textContent=pc.value+'%';document.getElementById('d_pcR').textContent=(100-pc.value)+'%';}); bindDrawerToggle('#mode-creative'); function applyCreativePreset(key){var P=CREATIVE_PRESETS[key];document.getElementById('d_lv').value=P[0];document.getElementById('d_ld').value=P[1];document.querySelectorAll('#dco_presets button').forEach(function(x){x.classList.toggle('on',x.getAttribute('data-p')===key);});renderCreative();} document.querySelectorAll('#dco_presets button').forEach(function(b){b.addEventListener('click',function(){applyCreativePreset(b.getAttribute('data-p'));});}); applyCreativePreset('conservative'); } function readCreativeWorkflow(){var g=function(id){return document.getElementById(id).value;};return ROI_DEFAULTS.workflow.map(function(r,i){return{role:r.role,fte:g('d_wf_fte_'+i),salary:g('d_wf_sal_'+i),effPct:g('d_wf_eff_'+i)};});} function renderCreative(){ var g=function(id){return document.getElementById(id).value;}; var args={totalBudget:g('d_budget'),pctVideo:g('d_pv')/100,pctCTV:g('d_pc')/100,roasVideo:g('d_rv')/100,roasDisplay:g('d_rd')/100,liftVideo:g('d_lv')/100,liftDisplay:g('d_ld')/100,persVideo:g('d_pvv')/100,persDisplay:g('d_pdd')/100, ctvCpm:g('d_ctvcpm'),olvCpm:g('d_olvcpm'),displayCpm:g('d_dispcpm'),videoTechFee:g('d_vfee')/100,displayTechFee:g('d_dfee')/100,videoServStd:g('d_vstd'),videoServAll:g('d_vall'),displayServStd:g('d_dstd'),displayServAll:g('d_dall'), workflow:readCreativeWorkflow()}; var r=calcPersonalizationROI(args); if(!r.valid)return; document.getElementById('dco_hero').innerHTML=hero('Creative personalization — ROI',r.blendedRoiMultiple,'Invest',r.personalizationCost,'Total return',r.totalBenefits,'Hard-dollar ROI (revenue only, excl. workflow): '+mult(r.hardRoiMultiple)+' · breaks even at just '+pct(r.breakevenLift,1)+' performance lift — this scenario assumes '+g('d_lv')+'% (industry studies: 10–30%)'); var t=document.querySelectorAll('#mode-creative .tile .v'); t[0].textContent=mult(r.blendedRoiMultiple);t[1].textContent=usdC(r.incrementalRevenue);t[2].textContent=pct(r.breakevenLift,1); document.getElementById('d_tag_workflow_group').textContent=usdC(r.workflow.workflowSavings); document.getElementById('d_tag_perf_group').textContent=usdC(r.incrementalRevenue); document.getElementById('d_wf_note').innerHTML='Frees '+r.workflow.fteFreed.toFixed(2)+' FTE of '+r.workflow.totalFte.toFixed(1)+' → '+r.workflow.fteAfter.toFixed(2)+' remaining.'; document.getElementById('dco_sub').textContent='Axis zoomed to highlight the incremental lift ('+usdC(r.incrementalRevenue)+').'; var lo=r.revenueBefore*0.97,hi=r.revenueAfter,rng=(hi-lo)||1; var bars=[['Before',r.revenueBefore,C.o4],['After',r.revenueAfter,'linear-gradient(180deg,'+C.ocean+','+C.dory+')']]; document.getElementById('dco_bars').innerHTML=bars.map(function(b){var h=20+((b[1]-lo)/rng)*70;return '
'+usdC(b[1])+'
'+b[0]+'
';}).join(''); var ch=[['Video (CTV + OLV)',r.video,C.dory],['Display',r.display,C.purple]]; document.getElementById('dco_channels').innerHTML=ch.map(function(c){var o=c[1];return '
'+c[0]+''+usdC(o.budget)+'
ROAS'+pct(o.roasStd)+' → '+pct(o.roasPers)+'
Blended CPM'+usd(o.cpmStd,2)+' → '+usd(o.cpmAfter,2)+'
Incremental revenue'+usdC(o.incrRevenue)+'
Personalization cost'+usdC(o.persCost)+'
';}).join(''); document.getElementById('dco_summary').innerHTML='
Summary of assumptions & result

Recap this with the client before the reveal — every number below is theirs.

' +summaryRows([['Total media budget',usdC(toNum(g('d_budget')))],['Video / display split',g('d_pv')+'% / '+(100-g('d_pv'))+'%'],['CTV / OLV split',g('d_pc')+'% / '+(100-g('d_pc'))+'%'],['Personalization lift (V / D)',g('d_lv')+'% / '+g('d_ld')+'%'],['% personalized (V / D)',g('d_pvv')+'% / '+g('d_pdd')+'%'],['Workflow savings',usdC(r.workflow.workflowSavings)],['Breakeven lift',pct(r.breakevenLift,1)]]) +'
INVEST '+usdC(r.personalizationCost)+'TOTAL RETURN '+usdC(r.totalBenefits)+'ROI '+mult(r.blendedRoiMultiple)+'
' +''; repop('dco_hero'); } /* ============================= AD SERVING ============================= */ var AS_PRESETS={conservative:{lp:[8,4,2],le:[4,3,3],waste:40},aggressive:{lp:[15,12,8],le:[6,5,5],waste:90}}; function buildAdServing(){ var d=AD_SERVING_DEFAULTS; var wfRows=d.workflow.map(function(r,i){return wfRow('as_wf',i,r);}).join(''); var perfMeta=[['Reach & Frequency Optimization','5–15%'],['Creative Optimization','4–12%'],['Last Touch Attribution','3–8%']]; var ecpmMeta=[['Log-Level Data','3–6%'],['Audience HQ','3–5%'],['Data Connectivity','3–5%']]; var perfLev=perfMeta.map(function(m,i){return leverRow('as_lp_'+i,m[0],m[1],d.perfLevers[i]);}).join(''); var ecpmLev=ecpmMeta.map(function(m,i){return leverRow('as_le_'+i,m[0],m[1],d.ecpmLevers[i]);}).join(''); var left='
' +'
Scenario

Ranges are placeholders — no public source calculator exists yet for Ad Serving. Tune per deal.

' +'
'+seclabel('1','Primary inputs') +field('Annual ad-served spend','Proxy for impression volume at your average CPM',money('as_annualSpend',d.annualSpend,1000000,'$')) +field('Ad serving fee','Your investment — a % of served spend',money('as_feePct',d.feePct,0.5,null,'%')) +'
' +'
' +'
Workflow Efficiencies (Ad Serving, Integrations, NIVO Agents, Reach & Frequency, Log-Level Data)
'+wfRows+'

'+field('Annual spend wasted on over-exposure',null,money('as_wasteWriteoff',d.wasteWriteoff,50000,'$'))+field('Waste reduction with R&F Optimization',null,money('as_wasteReductionPct',d.wasteReductionPct,5,null,'%'))+field('Average ad-serving eCPM',null,money('as_avgEcpm',d.avgEcpm,0.5,'$'))+'
Data & CPM efficiency levers — total
'+ecpmLev +'
Performance

Optional upside on top of the efficiency headline (Creative Optimization + Last Touch Attribution) — not required to justify the fee.

'+field('Spend split — performance vs. awareness',null,'
Perf '+d.perfPct+'%'+(100-d.perfPct)+'% Aware
')+field('Target ROAS (standard)',null,money('as_targetRoasPct',d.targetRoasPct,10,null,'%'))+'
ROAS boost levers — total
'+perfLev +'
' +'
'; var right='
' +'
' +'
'+tile('Hours/FTE saved','—',C.ocean)+tile('Cost avoidance','—',C.purple)+tile('Net efficiency impact','—',C.coral)+'
' +'
How the efficiency impact builds up

WorkflowWasteEfficiency
' +'
Bonus performance upside

Not required to justify the fee — shown for context if the buyer asks about ROAS.

Before Innovid
After Innovid
' +'
' +'
'; document.getElementById('mode-adserving').innerHTML='
'+left+right+'
'; document.querySelectorAll('#mode-adserving input').forEach(function(inp){inp.addEventListener('input',renderAdServing);}); var pr=document.getElementById('as_perfPct');pr.addEventListener('input',function(){document.getElementById('as_perfL').textContent=pr.value+'%';document.getElementById('as_awareL').textContent=(100-pr.value)+'%';}); bindDrawerToggle('#mode-adserving'); function applyAsPreset(key){var P=AS_PRESETS[key];['as_lp_0','as_lp_1','as_lp_2'].forEach(function(id,i){document.getElementById(id).value=P.lp[i];});['as_le_0','as_le_1','as_le_2'].forEach(function(id,i){document.getElementById(id).value=P.le[i];});document.getElementById('as_wasteReductionPct').value=P.waste;document.querySelectorAll('#as_presets button').forEach(function(x){x.classList.toggle('on',x.getAttribute('data-p')===key);});renderAdServing();} document.querySelectorAll('#as_presets button').forEach(function(b){b.addEventListener('click',function(){applyAsPreset(b.getAttribute('data-p'));});}); applyAsPreset('conservative'); } function readAdServingWorkflow(){var g=function(id){return document.getElementById(id).value;};return AD_SERVING_DEFAULTS.workflow.map(function(r,i){return{role:r.role,fte:g('as_wf_fte_'+i),salary:g('as_wf_sal_'+i),effPct:g('as_wf_eff_'+i)};});} function renderAdServing(){ var g=function(id){return document.getElementById(id).value;}; var r=calcAdServing({annualSpend:g('as_annualSpend'),feePct:g('as_feePct'),workflow:readAdServingWorkflow(), wasteWriteoff:g('as_wasteWriteoff'),wasteReductionPct:g('as_wasteReductionPct'), perfPct:g('as_perfPct'),targetRoasPct:g('as_targetRoasPct'),perfLevers:[g('as_lp_0'),g('as_lp_1'),g('as_lp_2')], avgEcpm:g('as_avgEcpm'),ecpmLevers:[g('as_le_0'),g('as_le_1'),g('as_le_2')]}); if(!r.valid)return; document.getElementById('as_hero').innerHTML=heroDollar('Innovid Ad Serving — efficiency impact',r.netEfficiencyImpact,'net efficiency impact / year','Invest',usdC(r.investment),'FTE freed',r.workflow.fteFreed.toFixed(2),'Bonus: if performance levers land, a '+pct(r.performance.perfBoost)+' ROAS boost adds another '+usdC(r.performance.incrementalRevenue)+' in incremental revenue on top'); var t=document.querySelectorAll('#mode-adserving .tile .v'); t[0].textContent=fmt(r.workflow.hoursSaved)+' hrs';t[1].textContent=usdC(r.costAvoidance);t[2].textContent=usdC(r.netEfficiencyImpact); document.getElementById('as_tag_workflow_group').textContent=usdC(r.benefits.workflow+r.benefits.waste+r.benefits.efficiency); document.getElementById('as_tag_perf_group').textContent=usdC(r.benefits.revenue); document.getElementById('as_wf_note').innerHTML='Frees '+r.workflow.fteFreed.toFixed(2)+' FTE ('+fmt(r.workflow.hoursSaved)+' hours/yr) of '+r.workflow.totalFte.toFixed(1)+' → '+r.workflow.fteAfter.toFixed(2)+' remaining.'; document.getElementById('as_ecpmRedL').textContent=pct(r.efficiency.ecpmReduction); document.getElementById('as_perfBoostL').textContent=pct(r.performance.perfBoost); var segs=[['workflow',C.ocean],['waste',C.purple],['efficiency',C.dory]];var tot=(r.benefits.workflow+r.benefits.waste+r.benefits.efficiency)||1; document.getElementById('as_stack').innerHTML=segs.map(function(s){return '
';}).join(''); document.getElementById('as_stack_sub').textContent='Three efficiency drivers stack against a '+usdC(r.investment)+' investment — no ROAS assumption required.'; document.getElementById('as_revB').textContent=usdC(r.performance.revenueBefore); document.getElementById('as_revA').textContent=usdC(r.performance.revenueAfter); document.getElementById('as_boostTag').textContent='+'+pct(r.performance.perfBoost); document.getElementById('as_revBbar').style.width='72%'; document.getElementById('as_revAbar').style.width=Math.min(100,r.performance.revenueAfter/r.performance.revenueBefore*72)+'%'; document.getElementById('as_summary').innerHTML='
Summary of assumptions & result

Recap this with the client before the reveal — every number below is theirs.

' +summaryRows([['Annual ad-served spend',usdC(toNum(g('as_annualSpend')))],['Ad serving fee',g('as_feePct')+'%'],['Investment',usdC(r.investment)],['Waste written off',usdC(toNum(g('as_wasteWriteoff')))],['Waste reduction',g('as_wasteReductionPct')+'%'],['Efficiency levers',pct(r.efficiency.ecpmReduction)],['FTEs (before → after)',r.workflow.totalFte.toFixed(1)+' → '+r.workflow.fteAfter.toFixed(2)],['Hours saved / year',fmt(r.workflow.hoursSaved)]]) +'
NET EFFICIENCY IMPACT '+usdC(r.netEfficiencyImpact)+'COST AVOIDANCE '+usdC(r.costAvoidance)+'HOURS SAVED '+fmt(r.workflow.hoursSaved)+'
' +''; repop('as_hero'); } /* ============================= MEASUREMENT ============================= */ var measSub='sig'; function buildMeasurement(){ var segBtns=[['sig','Is my result significant?'],['size','How big a test do I need?'],['roi','What is the ROI of Measurement?']].map(function(s){return '';}).join(''); document.getElementById('mode-measurement').innerHTML='
'+segBtns+'
'; document.querySelectorAll('#measseg button').forEach(function(b){b.addEventListener('click',function(){measSub=b.getAttribute('data-sub');document.querySelectorAll('#measseg button').forEach(function(x){x.classList.toggle('on',x===b);});buildMeasBody();});}); buildMeasBody(); } function confSeg(id,val){return '
'+CONF.map(function(c){return '';}).join('')+'
';} function buildMeasBody(){ if(measSub==='sig'){ var left='
'+seclabel('A','Creative 1 · control')+field('Impressions delivered',null,money('s_imp1',16721814,100000))+field('Attributable actions',null,money('s_act1',6880,10))+'
'+seclabel('B','Creative 2 · test')+field('Impressions delivered',null,money('s_imp2',3215019,100000))+field('Attributable actions',null,money('s_act2',1413,10))+'
'+seclabel(null,'Confidence')+confSeg('s_conf',0.95)+'
'; var right='
Confidence achieved
Performance rate
'; document.getElementById('meas_body').innerHTML='
'+left+right+'
'; document.querySelectorAll('#meas_body input').forEach(function(i){i.addEventListener('input',renderSig);}); document.querySelectorAll('#s_conf button').forEach(function(b){b.addEventListener('click',function(){document.querySelectorAll('#s_conf button').forEach(function(x){x.classList.toggle('on',x===b);});renderSig();});}); renderSig(); } else if(measSub==='size'){ var left2='
'+seclabel('1','Primary inputs')+field('Baseline performance rate','Actual or estimated',money('z_base',0.043,0.001,null,'%'))+'
'+field('Expected uplift — low',null,money('z_ul',10,1,null,'%'))+field('Expected uplift — high',null,money('z_uh',20,1,null,'%'))+'
'+field('Daily impressions served',null,money('z_ipd',500000,50000))+'
'+seclabel(null,'Confidence')+confSeg('z_conf',0.95)+'
'; var right2='
'+tile('Min imps / cell','—')+tile('Max imps / cell','—')+tile('Shortest run','—',C.ocean)+'
Impressions required per creative
'; document.getElementById('meas_body').innerHTML='
'+left2+right2+'
'; document.querySelectorAll('#meas_body input').forEach(function(i){i.addEventListener('input',renderSize);}); document.querySelectorAll('#z_conf button').forEach(function(b){b.addEventListener('click',function(){document.querySelectorAll('#z_conf button').forEach(function(x){x.classList.toggle('on',x===b);});renderSize();});}); document.getElementById('z_advtoggle').addEventListener('click',function(){document.getElementById('z_advbody').classList.toggle('hidden');}); renderSize(); } else { buildMeasRoi(); } } function activeConf(id){var b=document.querySelector('#'+id+' button.on');return b?Number(b.getAttribute('data-v')):0.95;} function renderSig(){ var g=function(id){return document.getElementById(id).value;}; var r=calcSignificance({imp1:g('s_imp1'),act1:g('s_act1'),imp2:g('s_imp2'),act2:g('s_act2'),confidence:activeConf('s_conf')}); if(!r.valid)return; var bg=r.significant?'linear-gradient(135deg,'+C.deep+',#10466b)':'linear-gradient(135deg,'+C.deep+',#3a1a4a)'; document.getElementById('s_banner').innerHTML=''; var col=r.significant?C.ocean:C.coral;var frac=Math.max(0,Math.min(100,r.achieved*100)); var gauge=document.getElementById('gauge');gauge.setAttribute('stroke',col);gauge.setAttribute('stroke-dasharray',frac+' '+(100-frac)); document.getElementById('gaugeVal').textContent=pct(r.achieved,1);document.getElementById('gaugeVal').style.color=col; document.getElementById('gaugeSub').textContent='Target: '+pct(r.confidence)+' · p = '+r.pValue.toFixed(4); var mx=Math.max(r.p1,r.p2)||1;var rd=[['Creative 1',r.p1,r.winner===1],['Creative 2',r.p2,r.winner===2]]; document.getElementById('rateBars').innerHTML=rd.map(function(d){var h=20+(d[1]/mx)*70;return '
'+(d[1]*100).toFixed(3)+'%
'+d[0]+'
';}).join(''); repop('s_banner'); } function renderSize(){ var g=function(id){return document.getElementById(id).value;}; var r=calcSampleSize({baseRate:g('z_base')/100,upliftLow:g('z_ul')/100,upliftHigh:g('z_uh')/100,confidence:activeConf('z_conf'),impPerDay:g('z_ipd'),power:g('z_power')/100}); if(!r.valid)return; document.getElementById('z_banner').innerHTML=''; var t=document.querySelectorAll('#meas_body .tile .v');t[0].textContent=fmt(r.nMin);t[1].textContent=fmt(r.nMax);t[2].textContent=fmt(r.daysMin)+' d'; var mx=r.nMax||1;var rows=[['+'+document.getElementById('z_uh').value+'% uplift',r.nMin],['+'+document.getElementById('z_ul').value+'% uplift',r.nMax]]; document.getElementById('z_bars').innerHTML=rows.map(function(rr){return '
'+rr[0]+'
'+(rr[1]/1e6).toFixed(2)+'M
';}).join(''); repop('z_banner'); } /* ---- MEASUREMENT ROI (bonus 3rd sub-mode) ---- */ var MROI_PRESETS={conservative:{lp:[3,2,2],waste:30},aggressive:{lp:[12,10,8],waste:85}}; function buildMeasRoi(){ var mr=MEASUREMENT_ROI_DEFAULTS; var wfRows=mr.workflow.map(function(r,i){return wfRow('mr_wf',i,r);}).join(''); var perfMeta=[['Outcomes (Digital/3P/Offline)','4–10%'],['Multi-Touch Attribution','3–8%'],['Reach & Frequency + Conversion Optimization (Harmony)','3–8%']]; var perfLev=perfMeta.map(function(m,i){return leverRow('mr_lp_'+i,m[0],m[1],mr.perfLevers[i]);}).join(''); var left='
' +'
Scenario

Ranges are placeholders — no public source calculator exists yet for Measurement ROI. Tune per deal.

' +'
'+seclabel('1','Primary inputs')+field('Annual measured spend',null,money('mr_annualSpend',mr.annualSpend,1000000,'$'))+field('Innovid Measurement fee','Your investment — a % of spend',money('mr_feePct',mr.feePct,0.5,null,'%'))+'
' +'
' +'
Workflow Efficiencies (Unified Identity, Log-Level Data, Last Touch Attribution, Reach & Frequency)
'+wfRows+'

'+field('Annual spend on redundant/duplicate exposure',null,money('mr_wasteWriteoff',mr.wasteWriteoff,50000,'$'))+field('Waste reduction from spotting redundancy',null,money('mr_wasteReductionPct',mr.wasteReductionPct,5,null,'%')) +'
Performance (Outcomes, MTA, Linear Measurement, Harmony)
'+field('Spend split — performance vs. other',null,'
Perf '+mr.perfPct+'%'+(100-mr.perfPct)+'% Other
')+field('Target ROAS (standard)',null,money('mr_targetRoasPct',mr.targetRoasPct,10,null,'%'))+'
ROAS boost levers — total
'+perfLev +'
' +'
'; var right='
' +'
' +'
'+tile('Workflow','—',C.ocean)+tile('Waste','—',C.purple)+tile('Incr. revenue','—',C.coral)+'
' +'
How the return builds up

WorkflowWasteRevenue
' +'
Benefit composition
' +'
' +'
'; document.getElementById('meas_body').innerHTML='
'+left+right+'
'; document.querySelectorAll('#meas_body input').forEach(function(inp){inp.addEventListener('input',renderMeasRoi);}); var pr=document.getElementById('mr_perfPct');pr.addEventListener('input',function(){document.getElementById('mr_perfL').textContent=pr.value+'%';document.getElementById('mr_awareL').textContent=(100-pr.value)+'%';}); bindDrawerToggle('#meas_body'); function applyMroiPreset(key){var P=MROI_PRESETS[key];['mr_lp_0','mr_lp_1','mr_lp_2'].forEach(function(id,i){document.getElementById(id).value=P.lp[i];});document.getElementById('mr_wasteReductionPct').value=P.waste;document.querySelectorAll('#mr_presets button').forEach(function(x){x.classList.toggle('on',x.getAttribute('data-p')===key);});renderMeasRoi();} document.querySelectorAll('#mr_presets button').forEach(function(b){b.addEventListener('click',function(){applyMroiPreset(b.getAttribute('data-p'));});}); applyMroiPreset('conservative'); } function renderMeasRoi(){ var g=function(id){return document.getElementById(id).value;}; var wf=MEASUREMENT_ROI_DEFAULTS.workflow.map(function(r,i){return{role:r.role,fte:g('mr_wf_fte_'+i),salary:g('mr_wf_sal_'+i),effPct:g('mr_wf_eff_'+i)};}); var r=calcMeasurementRoi({annualSpend:g('mr_annualSpend'),feePct:g('mr_feePct'),workflow:wf, wasteWriteoff:g('mr_wasteWriteoff'),wasteReductionPct:g('mr_wasteReductionPct'), perfPct:g('mr_perfPct'),targetRoasPct:g('mr_targetRoasPct'),perfLevers:[g('mr_lp_0'),g('mr_lp_1'),g('mr_lp_2')]}); if(!r.valid)return; document.getElementById('mr_hero').innerHTML=hero('Innovid Measurement — total ROI',r.roiMultiple,'Invest',r.investment,'Return',r.totalBenefits,'a '+pct(r.breakevenBoost,1)+' ROAS boost by itself covers the entire fee'); var tiles=document.querySelectorAll('#meas_body .tile .v'); tiles[0].textContent=usdC(r.benefits.workflow);tiles[1].textContent=usdC(r.benefits.waste);tiles[2].textContent=usdC(r.benefits.revenue); document.getElementById('mr_tag_workflow_group').textContent=usdC(r.benefits.workflow+r.benefits.waste); document.getElementById('mr_tag_perf_group').textContent=usdC(r.benefits.revenue); document.getElementById('mr_wf_note').innerHTML='Frees '+r.workflow.fteFreed.toFixed(2)+' FTE of '+r.workflow.totalFte.toFixed(1)+' → '+r.workflow.fteAfter.toFixed(2)+' remaining.'; document.getElementById('mr_perfBoostL').textContent=pct(r.performance.perfBoost); var segs=[['workflow',C.ocean],['waste',C.purple],['revenue',C.coral]];var tot=r.totalBenefits||1; document.getElementById('mr_stack').innerHTML=segs.map(function(s){return '
';}).join(''); document.getElementById('mr_stack_sub').textContent='Three value drivers stack against a '+usdC(r.investment)+' investment.'; donutSvg('mr_donut','mr_donut_leg',[['Incremental revenue',r.benefits.revenue],['Waste savings',r.benefits.waste],['Workflow savings',r.benefits.workflow]],tot); document.getElementById('mr_summary').innerHTML='
Summary of assumptions & result

Recap this with the client before the reveal — every number below is theirs.

' +summaryRows([['Annual measured spend',usdC(toNum(g('mr_annualSpend')))],['Measurement fee',g('mr_feePct')+'%'],['Investment',usdC(r.investment)],['Waste reduction',g('mr_wasteReductionPct')+'%'],['FTEs (before → after)',r.workflow.totalFte.toFixed(1)+' → '+r.workflow.fteAfter.toFixed(2)]]) +'
TOTAL RETURN '+usdC(r.totalBenefits)+'ROI '+mult(r.roiMultiple)+'
' +''; repop('mr_hero'); } /* ---- tabs / init ---- */ function buildTabs(){document.getElementById('tabs').innerHTML=MODES.map(function(m){return '';}).join('');document.querySelectorAll('#tabs .tab').forEach(function(b){b.addEventListener('click',function(){setMode(b.getAttribute('data-key'));});});updateBlurb();} function updateBlurb(){document.getElementById('blurb').textContent=MODES.find(function(m){return m.key===current;}).blurb;} function setMode(k){current=k;document.querySelectorAll('#tabs .tab').forEach(function(b){b.classList.toggle('on',b.getAttribute('data-key')===k);});['social','creative','adserving','measurement'].forEach(function(m){document.getElementById('mode-'+m).classList.toggle('hidden',m!==k);});updateBlurb();} buildTabs();buildSocial();buildCreative();buildAdServing();buildMeasurement();