You're three months into your affiliate program. Commission math looked tight in a spreadsheet, and payouts went out on time. Month four arrives, and finance flags a discrepancy: $3,200 that doesn't match Stripe settlement data. You dig through the spreadsheet, find a typo in a tier mapping, adjust it, and send a correction payout. Month five: another $1,900 gap. By month six, you're running three spreadsheets in parallel—one for tracking clicks, one for conversions, one for payouts—and none of them agree with your bank statement. This is the reconciliation tax that kills most affiliate programs before they scale. The problem isn't your attention to detail. It's that spreadsheets are inherently unsynchronized with reality. Stripe settles disputes 30–60 days after a chargeback; your payout sheet doesn't know that. An affiliate hits the tier boundary on day 25; rounding errors stack. Tax withholding logic lives in a separate tab that doesn't talk to commission calc. By the time you notice drift, you've already over- or under-paid several affiliates, and fixing it without creating a larger mess requires rebuilding your entire audit trail from Stripe exports and email receipts. Here's how to build an affiliate payout system that reconciles, handles disputes, and scales past the spreadsheet ceiling. The reconciliation breakdown: where spreadsheets lose sync Affiliate payout math has three layers that must align: Transaction source truth: Stripe or your payment processor records what actually settled, when disputes arrived, and what margin was taken. Commission calculation: Tiers, milestone bonuses, clawbacks for refunds, and tax withholding logic. Payout execution: Who got paid, when, to which account, and what the payee confirmed receiving. A spreadsheet-based system handles layer 1 by copying Stripe CSV exports by hand. Layer 2 works if the formulas are tight—but they break as soon as you add a second product tier or a clawback rule. Layer 3 is a comment thread and a bank statement you cross-reference monthly. The math drifts because: Chargebacks land out of band. Stripe reports a chargeback weeks after a successful transaction. Your payout spreadsheet already sent the affiliate their commission. You clawback manually, the affiliate disputes it, and now you're managing refunds via Slack. Tier boundaries aren't atomic. An affiliate earns $4,200 in a period. Your tier says "10% at $4K, 12% at $5K." Do they get 10% of everything or 10% on the first $4K and 12% on the overage? The spreadsheet doesn't enforce the rule consistently across all affiliates. Tax withholding isn't a checkbox. Some affiliates are taxable contractors; others are LLCs or foreign. Your spreadsheet has a column for tax rate, but it doesn't validate the tax ID against what the affiliate actually provided, or flag when the rate changes between payout cycles. Version control is a graveyard. "Affiliate Payouts – Final – v3 – REAL.xlsx" lives on your desktop. Someone updates it, someone else works from the old version, a formula gets overwritten, and nobody knows what happened. Audit trail is an afterthought. When a dispute lands, you have to reconstruct the logic from formula cells and a vague memory of what changed in month 2. Regulators, affiliates, and accountants all want to know: why did this payment differ from the one six months ago? The spreadsheet can't answer. By month four, drift compounds to 8–12% of total payouts. By month six, you're not sure which version is correct. Foundation: Stripe as the source of truth Start by accepting that Stripe is your only source of truth for transactions and settlements. Don't calculate commissions from your app's transaction log or your sales dashboard. Both are real, but both can diverge from what Stripe actually settled. Set up a daily Stripe data export: Pull charges, refunds, and payouts into a database table with immutable timestamps. Use Stripe's API, not manual CSV exports. Tag each transaction with a reference ID that ties it to your affiliate (a campaign UTM code, a referral code, or an embed ID—whatever your system uses). Load disputes and chargebacks into a separate table. These typically land 30–60 days after the original charge, so your payout logic must defer commission crediting until disputes have settled. Record the settlement amount, Stripe's fee, and the net—this is what you actually have to distribute. Now your commission calculation works with real data, not spreadsheet guesses. Tier mapping: a configuration, not a formula Stop encoding tier logic in spreadsheet formulas. Build a tier table that lives in your system (a database, a small configuration service, or even a CRM that tracks affiliate metadata): Example tier structure: Tier 1: $0–$5K monthly volume → 8% commission Tier 2: $5K–$15K monthly volume → 10% commission Tier 3: $15K+ monthly volume → 12% commission Bonus: +2% if 90%+ of referred customers are still active at day 30 Clawback: –50% commission on any transaction th