Direct answer: CPA usually pays better when you need predictable cash flow, have uncertain player quality, or buy traffic with fixed media costs. Rev-share usually pays better when you send loyal, high-value players and can trust the operator’s reporting, retention, and adjustment rules.
For iGaming affiliates and operators, the smart decision is not “CPA vs rev-share” in the abstract. It is whether the expected player value, first-time depositor rate, NGR, chargebacks, negative carryover, and reporting quality make one payout model meaningfully safer than the other. Use the calculator below to model the deal before you sign it.
// Utilities const clamp = (v,min,max)=>Math.max(min,Math.min(max,v)); const num = (el,def=0)=>{ const v = parseFloat(el.value.replace(/,/g,'')); return isNaN(v) ? def : v; }; const pct = (el,def=0)=>clamp((num(el,def))/100,0,1); const fmtMoney = (n, curr='EUR') => new Intl.NumberFormat(undefined,{style:'currency',currency:curr,maximumFractionDigits:0}).format(n); const fmtPct = (n)=> (n*100).toFixed(1)+'%';
// Shell const wrap = document.createElement('div'); wrap.className = 'revcalc'; wrap.innerHTML = `
| Model | Revenue | Traffic Cost | Net Profit | Revenue / Click | ROI |
|---|---|---|---|---|---|
| CPA Winner | — | — | — | — | — |
| Rev-Share Winner | — | — | — | — | — |
`; root.appendChild(wrap);
// Grab inputs const q = (sel)=> wrap.querySelector(sel); const currencyEl = q('#rc-currency'); const clicksEl = q('#rc-clicks'); const ftdRateEl = q('#rc-ftd-rate'); const cpcEl = q('#rc-cpc');
const ltvModeEl = q('#rc-ltv-mode'); const lifetimeWrap = q('#rc-lifetime-wrap'); const monthlyWrap = q('#rc-monthly-wrap'); const ltvEl = q('#rc-ltv'); const mngrEl = q('#rc-mngr'); const monthsEl = q('#rc-months'); const decayEl = q('#rc-decay');
const cpaEl = q('#rc-cpa'); const cpaVoidEl = q('#rc-cpa-void'); const rsEl = q('#rc-rs'); const rsVoidEl = q('#rc-rs-void');
// Outputs const ftdsOut = q('#rc-ftds'); const cpaRevOut = q('#rc-cpa-rev'); const cpaCostOut = q('#rc-cpa-cost'); const cpaProfitOut = q('#rc-cpa-profit'); const cpaRpcOut = q('#rc-cpa-rpc'); const cpaRoiOut = q('#rc-cpa-roi');
const rsRevOut = q('#rc-rs-rev'); const rsCostOut = q('#rc-rs-cost'); const rsProfitOut = q('#rc-rs-profit'); const rsRpcOut = q('#rc-rs-rpc'); const rsRoiOut = q('#rc-rs-roi');
const beCPAOut = q('#rc-be-cpa'); const beRSOut = q('#rc-be-rs');
const barCPA = q('#rc-bar-cpa'); const barRS = q('#rc-bar-rs'); const barCPALabel = q('#rc-bar-cpa-label'); const barRSLabel = q('#rc-bar-rs-label');
const winCPA = q('#rc-winner-cpa'); const winRS = q('#rc-winner-rs');
const copyBtn = q('#rc-copy'); const resetBtn = q('#rc-reset');
function effectiveLTV(){ if(ltvModeEl.value === 'lifetime'){ return Math.max(0, num(ltvEl, 0)); } else { const monthly = Math.max(0, num(mngrEl, 0)); const months = Math.max(1, Math.round(num(monthsEl, 1))); const d = clamp(num(decayEl, 1), 0.5, 1); const sumFactor = (d === 1) ? months : (1 - Math.pow(d, months)) / (1 - d); return monthly * sumFactor; } }
function recalc(){ const curr = currencyEl.value; const clicks = Math.max(0, Math.round(num(clicksEl, 0))); const ftdRate = pct(ftdRateEl, 0); // clicks -> FTD const ftds = clicks * ftdRate;
const cpc = Math.max(0, num(cpcEl, 0)); const trafficCost = clicks * cpc;
// Commission params const cpa = Math.max(0, num(cpaEl, 0)); const cpaVoid = pct(cpaVoidEl, 0); const rsPct = pct(rsEl, 0); const rsVoid = pct(rsVoidEl, 0);
// Player value const ltv = effectiveLTV();
// Per-FTD earnings const cpaPerFTD = cpa * (1 - cpaVoid); const rsPerFTD = ltv * rsPct * (1 - rsVoid);
// Totals const revCPA = ftds * cpaPerFTD; const revRS = ftds * rsPerFTD;
// Costs (same traffic cost for both) const costCPA = trafficCost; const costRS = trafficCost;
const profitCPA = revCPA - costCPA; const profitRS = revRS - costRS;
const rpcCPA = clicks > 0 ? (revCPA / clicks) : 0; const rpcRS = clicks > 0 ? (revRS / clicks) : 0;
const roiCPA = costCPA > 0 ? (profitCPA / costCPA) : null; const roiRS = costRS > 0 ? (profitRS / costRS) : null;
// Break-even thresholds const beCPA = rsPerFTD; // CPA per FTD that equals your rev-share value per FTD const beRS = ltv > 0 ? (cpaPerFTD / ltv) : 0; // rev-share % (as decimal) to match your CPA
// Bars const maxRev = Math.max(revCPA, revRS, 1); const wCPA = (revCPA / maxRev) * 100; const wRS = (revRS / maxRev) * 100;
// Winner tag winCPA.style.display = revCPA >= revRS ? 'inline-block' : 'none'; winRS.style.display = revRS > revCPA ? 'inline-block' : 'none';
// Write outputs ftdsOut.textContent = Math.round(ftds).toLocaleString();
cpaRevOut.textContent = fmtMoney(revCPA, curr); cpaCostOut.textContent = fmtMoney(costCPA, curr); cpaProfitOut.textContent = fmtMoney(profitCPA, curr); cpaRpcOut.textContent = fmtMoney(rpcCPA, curr); cpaRoiOut.textContent = (roiCPA === null) ? '—' : (roiCPA*100).toFixed(0)+'%';
rsRevOut.textContent = fmtMoney(revRS, curr); rsCostOut.textContent = fmtMoney(costRS, curr); rsProfitOut.textContent = fmtMoney(profitRS, curr); rsRpcOut.textContent = fmtMoney(rpcRS, curr); rsRoiOut.textContent = (roiRS === null) ? '—' : (roiRS*100).toFixed(0)+'%';
beCPAOut.textContent = fmtMoney(beCPA, curr) + ' per FTD'; beRSOut.textContent = (beRS*100).toFixed(1) + '%';
barCPA.style.width = wCPA.toFixed(1)+'%'; barRS.style.width = wRS.toFixed(1)+'%'; barCPALabel.textContent = 'CPA: ' + fmtMoney(revCPA, curr); barRSLabel.textContent = 'Rev-Share: ' + fmtMoney(revRS, curr); }
// Toggle player value mode UI function toggleMode(){ const mode = ltvModeEl.value; lifetimeWrap.style.display = (mode === 'lifetime') ? '' : 'none'; monthlyWrap.style.display = (mode === 'monthly') ? '' : 'none'; recalc(); }
// Events wrap.addEventListener('input', (e)=>{ if(e.target === ltvModeEl) toggleMode(); else recalc(); }); wrap.addEventListener('change', (e)=>{ if(e.target === ltvModeEl) toggleMode(); else recalc(); });
copyBtn.addEventListener('click', ()=>{ const curr = currencyEl.value; const summary = ` Rev-Share vs CPA — Summary Currency: ${curr} Clicks: ${Math.round(num(clicksEl))} FTD rate: ${ftdRateEl.value}% CPC: ${num(cpcEl).toFixed(2)}
Player value mode: ${ltvModeEl.value} Lifetime NGR: ${ltvModeEl.value==='lifetime' ? num(ltvEl) : '-'} Monthly NGR: ${ltvModeEl.value==='monthly' ? num(mngrEl) : '-'} Months: ${ltvModeEl.value==='monthly' ? Math.round(num(monthsEl)) : '-'} Decay: ${ltvModeEl.value==='monthly' ? num(decayEl) : '-'}
CPA: ${num(cpaEl)} CPA void %: ${num(cpaVoidEl)}% Rev-Share %: ${num(rsEl)}% Rev-Share void %: ${num(rsVoidEl)}%
${q('#rc-bar-cpa-label').textContent} ${q('#rc-bar-rs-label').textContent} CPA Net Profit: ${q('#rc-cpa-profit').textContent} Rev-Share Net Profit: ${q('#rc-rs-profit').textContent} Break-even CPA: ${q('#rc-be-cpa').textContent} Break-even Rev-Share: ${q('#rc-be-rs').textContent} (Estimates only; actuals depend on program rules.) `.trim(); navigator.clipboard.writeText(summary).then(()=>{ copyBtn.textContent = 'Copied ✔'; setTimeout(()=>copyBtn.textContent='Copy summary',1200); }); });
resetBtn.addEventListener('click', ()=>{ currencyEl.value='EUR'; clicksEl.value='10000'; ftdRateEl.value='1.5'; cpcEl.value='0'; ltvModeEl.value='lifetime'; ltvEl.value='800'; mngrEl.value='150'; monthsEl.value='8'; decayEl.value='0.90'; cpaEl.value='200'; cpaVoidEl.value='5'; rsEl.value='30'; rsVoidEl.value='8'; toggleMode(); });
// Init toggleMode(); })();
CPA, or cost per acquisition, pays the affiliate a fixed amount when a player completes the qualifying action, usually a first-time deposit. Rev-share pays the affiliate a percentage of the player’s net gaming revenue over time.
The tradeoff is simple: CPA gives certainty earlier, while rev-share gives upside later. CPA protects the affiliate from weak retention and poor operator economics. Rev-share rewards the affiliate when players stay active, deposit again, and generate clean NGR after bonuses, taxes, payment fees, fraud, and chargebacks.
| Model | Best when | Main risk | What to check |
|---|---|---|---|
| CPA | You need predictable cash flow or buy paid traffic | You cap upside if players become high-value | Qualification rules, voids, minimum deposits, payment timing |
| Rev-share | You send loyal players with strong lifetime value | You wait longer and depend on transparent reporting | NGR definition, negative carryover, deductions, retention |
| Hybrid | You want upfront cash plus long-term upside | Lower CPA and lower rev-share can hide weak economics | Break-even point, clawbacks, reporting, payment terms |
Start with realistic assumptions, not best-case numbers. Enter your expected clicks, first-time depositor rate, media cost, CPA payout, rev-share percentage, void rate, and player value. Then compare the net result after costs and adjustments.
The calculator is most useful when you run several scenarios:
If CPA wins only in the conservative case, rev-share may be attractive for strong organic or email traffic. If CPA wins even in the expected case, the fixed payout may be safer. If rev-share wins only under heroic assumptions, the deal probably needs renegotiation.
CPA is often the better model when the affiliate has real acquisition costs and cannot wait months for player value to mature. Paid search, paid social, influencer traffic, and media-buying campaigns often need faster payback.
CPA also makes sense when:
The danger is that CPA can underpay affiliates who consistently deliver profitable players. If your traffic produces loyal depositors, a flat CPA may leave a lot of value with the operator.
Rev-share is usually better when traffic quality is high and player value compounds over time. Organic comparison pages, email lists, trusted communities, and niche iGaming audiences can perform well under rev-share because players may keep depositing long after the first conversion.
Rev-share becomes more attractive when:
The danger is opacity. If the affiliate cannot see reliable player, NGR, bonus, void, and adjustment data, rev-share becomes hard to audit.
For operators managing CPA, rev-share, and hybrid deals, affiliate software is not just a reporting convenience. It is the system that keeps payout logic, partner performance, postbacks, campaign data, and adjustments visible enough for both sides to trust the deal.
Scaleo is the first platform to evaluate when an iGaming operator needs affiliate tracking, partner management, reporting, fraud controls, and room to scale beyond spreadsheets. It fits this topic because CPA and rev-share decisions depend on clean tracking, transparent partner dashboards, and reliable reporting. Alternatives may still fit smaller programs or different workflows, but the selection should start with the tracking and payout complexity of the program.
Before choosing a platform, check whether it can support:
Do not negotiate only the headline CPA amount or rev-share percentage. The hidden rules often matter more than the visible rate.
| Question | Why it matters |
|---|---|
| What counts as a qualified FTD? | Minimum deposit, geography, payment method, and fraud rules can change payout volume. |
| How is NGR calculated? | Bonus costs, taxes, payment fees, refunds, and chargebacks can reduce rev-share. |
| Is there negative carryover? | One bad month can reduce future earnings if negative balances carry forward. |
| When are commissions approved and paid? | Payment delay affects cash flow and paid traffic planning. |
| Can the affiliate audit reporting? | Transparent dashboards reduce disputes and make optimization possible. |
| What happens to hybrid deals after the first payment? | Some hybrids look attractive upfront but reduce long-term upside. |
Imagine an affiliate sends 10,000 clicks. If 1.5% become first-time depositors, that is 150 FTDs. A $200 CPA would produce $30,000 before voids and traffic costs. A 30% rev-share deal needs enough player NGR to beat that fixed payout.
If the average player produces $800 in lifetime NGR, 150 FTDs generate $120,000 in NGR. A 30% rev-share would be $36,000 before adjustments. In that case, rev-share may win. But if actual lifetime NGR is only $450, the same 30% rev-share produces $20,250, and CPA is probably safer.
That is why the calculator matters. Small changes in FTD rate, NGR, voids, or media cost can flip the answer.
Choose CPA when certainty, payback speed, and cash flow matter most. Choose rev-share when you have strong player quality, reporting transparency, and patience. Choose hybrid only when the math still works after reducing both the upfront payment and long-term share.
For operators, the bigger lesson is that payout models are only as good as the tracking behind them. Clean postbacks, transparent reporting, fair adjustments, and partner-level analytics are what turn CPA and rev-share from arguments into measurable business decisions.
CPA is usually better when player value is uncertain or the affiliate needs predictable cash flow. Rev-share is usually better when the affiliate sends loyal, high-value players and the operator has transparent reporting.
Check FTD rate, player lifetime NGR, CPA amount, rev-share percentage, voids, chargebacks, negative carryover, media cost, and reporting reliability.
Yes. Affiliate software can help operators and affiliates compare payout models by tracking clicks, FTDs, NGR, adjustments, partner performance, and commission rules in one place.
A hybrid deal can make sense when the affiliate wants upfront cash flow and long-term upside. It only works when the CPA amount, rev-share percentage, qualification rules, and reporting definitions are clear.
Every online casino platform provider demo looks excellent. Here is how operators cut through the…
AI in iGaming is no longer a vague “future technology” topic. It is already useful…
I needed to build a system that fires outbound HTTP callbacks (webhooks/postbacks) to hundreds of…
The best iGaming affiliate tracking software in 2026 is not the platform with the prettiest…
The honest guide to free casino scripts and open-source casino game engines in 2026 —…
The 2026 iGaming affiliate software comparison operators actually need — evaluated on postback reliability, NGR…