Your affiliate spreadsheet says ₹47,200 in commissions earned last month. Stripe deposited ₹41,500. The missing ₹5,700 isn't fraud—it's three separate timing, conversion, and settlement layers colliding. By month six, if you're not reconciling actively, that 12% drift hardens into a permanent blind spot. You stop knowing whether payouts are delayed or actually lost. You stop catching Stripe's batch errors. And you stop recovering commissions that should have been flagged weeks ago. This guide walks through exactly where the drift happens, how to build a reconciliation template that catches it, and when a missing payout is actually missing. Where Stripe settlement drift actually occurs Stripe doesn't move money in real time. Your affiliate system records a sale. Stripe records it. Your commission logic fires. Then four separate delays stack: Transaction lag (0–2 days): Sale recorded by Stripe; your system hasn't imported it yet. If you reconcile daily from Stripe's API, you'll see payable commissions before Stripe itself has cleared the payment method. Batch window (2–7 days by default): Stripe groups transactions into settlement batches. A sale on day one might not batch until day four. If your payout cycle runs on day three, that commission doesn't pay out yet—it queues for the next cycle. Currency conversion (–2 to +1%): If your affiliate earns in USD but Stripe pays in INR (or any local currency), Stripe applies its FX rate at the *moment of batch settlement*, not at transaction time. Same transaction, two different payouts if batches cross FX moves. Payout hold (1–3 days after batch): Once batched, Stripe initiates the payout but holds it in a clearing state for 1–3 days before your bank receives the funds. This is where your accounting sees zero but Stripe's dashboard shows 'paid.' Most affiliate platforms only check Stripe's balance at one point in the cycle. If that check happens before batch processing completes, you'll see a phantom shortfall that resolves itself two days later. The 12% drift breakdown: where money actually goes missing Let's model a real scenario. You have 12 affiliates earning ₹100 each in commissions over one month. Your system calculates ₹1,200 owed. Stripe should pay you ₹1,200 in affiliate fees (or deduct it from your processing volume). Here's what typically happens: Tier 1 drift (2–4%): Three affiliates' transactions are still in Stripe's "processing" state when your payout batch runs. You skip them because Stripe's API doesn't return them as settled yet. They post on day five, after your payout cycle ended. Expected payout: ₹1,200 → actual: ₹1,156. Tier 2 drift (1–2%): One affiliate earned commission in GBP (₹90 at Tuesday's rate, ₹88 at Friday's rate when batched). Stripe settled at Friday's worse rate. Expected: ₹100 → actual: ₹88. Tier 3 drift (2–3%): Stripe's fee tier changed mid-cycle (a rare event, but happens with volume spikes). One payment batch was charged at 2.9% instead of 2.2%. Your system recorded gross commission but Stripe netted more in fees. Expected: ₹1,200 → actual: ₹1,164. Tier 4 drift (0–2%): A refund posted mid-cycle. Your commission system subtracts it from next month's payout. Stripe already settled this month's batch. Reconciliation gap appears but clears in month two. Expected: ₹1,200 → actual: ₹1,188. Stack all four: ₹1,200 expected → ₹1,048 actual = 12% drift, all legitimate, all recoverable with proper reconciliation. Build your reconciliation template You need three columns that you update weekly, not monthly: Commission ledger (your source of truth): Every sale, affiliate ID, gross commission, currency, date recorded by your system. This should pull directly from your affiliate platform's API or export, not manual entry. Include a "status" field: {Pending, Batch Processed, Paid Out, Refunded}. Stripe settlement data (API pull): Every payout Stripe initiated, amount, date initiated, date landed in your bank account, FX rate applied, Stripe's fee tier that period. Stripe's dashboard export is brittle; use the Stripe Payouts API directly or a tool that syncs it. For each payout ID, record the batch size (how many transactions in that batch) and the date the batch closed. Reconciliation variance (the gap): Expected payout (sum of commissions marked "Paid Out" in period) minus actual payout (sum from Stripe). Break variance into: timing (commissions not yet settled), FX (apply Stripe's FX rate retroactively to currency conversions), fees (Stripe's fee tier delta), and orphaned (commissions still in pending after 10 days—these are actual problems). Template structure in a spreadsheet: Commission ID Affiliate Amount (local) Currency Date Earned Status Stripe Batch ID Payout ID Amount Settled (INR) Variance Reason AFF-001 Partner A ₹2,500 INR 2025-01-15 Paid Out batch_abc123 po_xyz789 ₹2,500 — AFF-002 Partner B $30 USD USD 2025-01-16 Batch Processed batch_abc123 po_xyz789 ₹2,478 FX (‰2.2%) – rate moved 1.8% between earn and payout date AFF-003 Partn