Commission Structure Modeler

Design your payout curve. Compare scenarios. Model real rep earnings. All before you commit to a plan.

💰

Compensation Setup

60% base / 40% variable
All VariableAll Base
Base Salary
$120,000
Target Variable
$80,000
📐

Plan Structure

TierFrom %To %Rate

Options

Accelerator
Higher rate above target
Decelerator
Lower rate below threshold
Earnings Cap
Maximum payout ceiling
📈

Payout Curve

$120K
Base Salary
$80K
Target Variable
$200K
OTE at 100%
$104K
Variable at 120%
$140K
Variable at 150%
$160K
Max Payout
🔀

Scenario Comparison

Save your plan configurations to compare them side by side. Up to 3 scenarios.

👥

Rep Earnings Simulator

Rep Attainment Visual Zone Variable Pay Total Comp
Total Comp Cost
Avg Variable Pay
Min / Max Variable
`); w.document.close(); setTimeout(() => w.print(), 500); } // ═══════════════════════════════════════════════ // MASTER RECALC // ═══════════════════════════════════════════════ function recalc() { updateChart(); updateMetrics(); renderReps(); } // ═══════════════════════════════════════════════ // INIT // ═══════════════════════════════════════════════ document.addEventListener('DOMContentLoaded', () => { renderTiers(); initChart(); recalc(); // Delegate change events for tier inputs $('tierBody').addEventListener('input', () => { tiers.forEach((t, i) => { const row = $('tierBody').children[i]; if (!row) return; const inputs = row.querySelectorAll('input'); t.from = +inputs[0].value; t.to = +inputs[1].value; t.rate = +inputs[2].value; }); recalc(); }); // Listen for option inputs ['accelStart','accelMult','decelEnd','decelMult','capPct','commRate','revTarget'].forEach(id => { $(id).addEventListener('input', recalc); }); });