You've got 30 affiliates running paid campaigns for your SaaS product. Commission math looks clean in the spreadsheet: $50 per qualified lead, $200 per trial, $500 per annual customer. Then month six hits. Your spreadsheet says you owe $47,200 in commissions. Stripe settlement reports show only $41,400 actually converted. The gap isn't small—it's 12%, and your finance team is asking which number is right. This drift is not random. It happens because spreadsheets track promised commissions (leads referred, trials started) while Stripe only settles realized revenue (payments completed, chargebacks reversed, refunds processed). By month six, those two realities have diverged enough to create real accounting problems: overstated affiliate payables, reconciliation delays, and commission disputes that kill partner relationships. Why spreadsheets and Stripe diverge A spreadsheet affiliate tracker works like this: Affiliate sends a lead. You log it and assign a $50 commission. Lead converts to trial. You log the trial and add a $200 bonus. Trial converts to annual customer. You log the sale and add a $500 commission. At month end, you total all logged commissions and wire the check. Stripe's settlement works like this: Customer pays. Stripe credits your account minus processing fees (2.9% + $0.30 typically). Customer disputes the charge. Stripe reverses the payment and charges a $15 chargeback fee. Customer requests a refund. Stripe deducts the full amount plus processing fees already paid. You earn the money only when the settlement period closes (usually 2–7 days after the transaction). The divergence happens in three places: 1. Chargeback and refund timing You pay the affiliate for a $500 annual sale in month one. In month three, the customer disputes the charge. Stripe reverses the $500 payment and charges you a $15 chargeback fee. But your spreadsheet still shows the $500 owed to the affiliate, because you logged it the moment the trial converted. You've now overpaid the affiliate by $500 and absorbed the chargeback fee yourself. 2. Failed payment retries A customer's payment fails on the first attempt. Stripe retries automatically. On the second attempt it succeeds. Your spreadsheet might log the sale twice if you're importing lead data and payment data from separate sources. Stripe only counts the successful settlement once. Off by one deal, multiplied across 30 affiliates over six months: easy to miss. 3. Fees and currency conversion drift You quoted the affiliate $500 per annual customer. Stripe settles the payment at $510 (because the customer paid in GBP and Stripe converted at a favorable rate), then deducts 2.9% + $0.30 in fees, leaving $493.51. Your spreadsheet shows $500 owed. You're short by $6.49 per deal. Over 100 deals, that's $649 of unaccounted variance. The core problem: Spreadsheets track when you grant commission rights . Stripe tracks when actual money settles . These are not the same date, and they diverge predictably over time. Measuring the drift: A 20-affiliate baseline Let's quantify this for a typical SaaS affiliate program with 20–30 active partners: Month 1–2: Drift is negligible. Maybe $200–500. You haven't had chargebacks yet, and most customers are still in their trial period. Month 3–4: First chargebacks and refunds appear. Drift climbs to 3–5% of payables. You're now tracking disputed transactions in a separate column or ignoring them. Month 5–6: Drift hits 8–12%. You've got cohorts of customers from month 1 hitting their 90-day refund windows. Chargeback volume increases. Some affiliates are asking why their commissions aren't matching their referral logs. Month 7+: Drift stabilizes around 10–15% unless you actively reconcile. The gap feels permanent because you've stopped investigating it. For a $100K/month affiliate budget, a 12% drift means you're off by $12,000—enough to trigger an audit, demand reconciliation from finance, or overpay affiliates and create a liability on your balance sheet. Building the reconciliation loop: Stripe webhooks + reconciliation template The fix is to move affiliate accounting into Stripe's world, not your spreadsheet's. You need three pieces: 1. Capture Stripe settlement events in real time Stripe fires webhooks for every state change: charge.succeeded , charge.refunded , charge.dispute.created , charge.dispute.closed . Instead of trusting your spreadsheet, subscribe to these webhooks and log them into a separate reconciliation table with timestamps, amounts, and status. You don't need custom code for this. If you're using invoicing and accounting software that integrates with Stripe, it should expose these events. If not, you can use Zapier or Make to route Stripe webhooks to a Google Sheet or Airtable base in real time. 2. Match Stripe settlements to affiliate commissions For each sale logged in your spreadsheet, create a lookup key: affiliate_id + customer_email + amount + date . When a Stripe webhook arrives, search for a matching commissio