Month one, your affiliate spreadsheet balances perfectly. Stripe shows $50,000 in commissions paid. Your manual tracker shows $50,000. Everything lines up. By month three, you're out by $1,200. By month six, the gap is $6,000—a full 12% drift. You have no idea where it went. This isn't carelessness. It's the math of multi-currency sales, refund handling, and rounding errors compounding across dozens of affiliate transactions. A spreadsheet can't see what a payment processor's API knows: currency conversion happened at 3.47 PM Singapore time, not midnight. That refund reversed a commission in CAD, not USD. That decimal rounded down seven times across twelve affiliate payouts. By the time drift is visible, you've either overpaid affiliates or underpaid them—and reconciling six months back is a forensic nightmare. Here's how to catch it now, with an audit framework you can run this week. Why spreadsheet affiliate math breaks The moment you move beyond one currency, one payment processor, or same-day payouts, your spreadsheet becomes a best-guess ledger. Here's where the 12% lives: 1. Currency conversion rates drift You log a commission as $100 USD. Stripe converts it to INR at 83.2 at 2:14 PM. Your spreadsheet grabbed the 4 PM rate of 83.5. You've just recorded ₹8,350 when Stripe actually moved ₹8,320. On fifty transactions, that's ₹1,500 of phantom money that never existed. Multiply across a month and you're quietly overstating payout obligations by 2–3%. Razorpay applies its own spread on top of SWIFT rates. 2C2P adds a second layer for intra-Asia transfers. Your spreadsheet can't see any of it. 2. Refund commissions reverse asymmetrically An affiliate's customer buys for $200, triggering a $20 commission. Thirty days later, the customer refunds $150 (the remainder was a discount code). Do you reverse the full $20 commission, or $15 pro-rata? Most spreadsheet logic goes full-reversal because it's simpler. Stripe logs a partial refund: the commission doesn't reverse at all (many merchant accounts don't auto-reverse affiliate payouts on partial refunds). Razorpay follows a different rule. By month two, your affiliate ledger and your payment processor ledger speak different languages. 3. Rounding compounds across batches You calculate an affiliate's total as $4,237.565. Your payout system rounds down to $4,237.56. But Stripe's batch processor rounded each transaction inside the batch, not the total. Two transactions at $2,118.784 each round to $2,118.78 on Stripe, but $2,118.79 + $2,118.78 = $4,237.57 in your math. One cent per payout, fifty payouts per month, and you're $0.50 off—which compounds month-over-month into $3–5 of unexplained variance that drives audit chaos. 4. Multi-currency sales hide conversion arbitrage An Indian affiliate drives a sale in Singapore dollars (SGD), but you pay them in INR. Stripe converts SGD → USD → INR. Each conversion applies a fee and a rate. 2C2P goes direct SGD → INR and quotes a different final number. You're reconciling the same transaction against two different payment paths, and they will never match. 5. Payout timing misaligns with period Your affiliate commission period closes on the last day of the month. Stripe's payout runs on the 3rd of next month. You're recording commissions in period A but the payment clears in period B. If you're comparing Stripe's API pull from the 3rd against your spreadsheet built on the 1st, you're comparing different sets of data—sometimes off by days' worth of transactions. Building the audit: Three data sources you need To find the drift, you don't reconcile spreadsheet-to-spreadsheet. You pull the source of truth from each payment processor's API, then compare them against each other. This is what a real audit looks like: Pull 1: Stripe API (or Razorpay, or 2C2P) Hit your payment processor's reporting or payout API and extract: Payout ID, amount (in processor's native currency), timestamp (to the second) Original transaction currency and amount Conversion rate applied (if multi-currency) Fees deducted Refunds reversed in this period (date and amount) Settlement date (when the money actually cleared to your bank) For Stripe, use the Payouts API and the Balance Transactions endpoint. For Razorpay, pull the Settlement Reports. For 2C2P, export the Transaction Report. All three let you timestamp exactly what happened and when. Your spreadsheet cannot do this. It can only record what you manually entered—and you entered it hours or days after the transaction cleared. Pull 2: Your payment gateway's reconciliation file Most payment processors offer a daily or weekly reconciliation file (Stripe calls it the Reconciliation Report, Razorpay calls it the Settlement Report). This is not the transaction list—it's the summary that the processor guarantees matches their bank settlement. Download it and extract: Total commissions processed in period Total refunds reversed Total fees or spreads applied Net amount moved to your account Any reversals or