You're closing the books. Stripe Billing shows ₹50 lakhs in annual revenue. Xero shows ₹47.5 lakhs. Finance says reconcile it. You pull transaction exports, cross-reference line items, and find nothing obviously wrong. The gap is real, it's material, and it's buried across rounding, tax timing, currency conversion, and refund handling that neither system documents clearly. This isn't a bug in your software. It's a fault line that opens between billing systems that track money charged and accounting software that records money owed and earned . The two aren't the same. One invoices in multiple currencies; the other consolidates in one. One recognizes revenue on invoice; the other on payment. One rounds at line-item level; the other at transaction level. Stack these misalignments across nine GL sync points and a ₹2.5 lakh variance becomes inevitable. Here's how to find it, map it, and stop it from recurring at year-end close. The nine sync breaks: Where invoices and GL diverge Most billing-to-accounting workflows fail at one of these nine points. A comprehensive audit catches them before month-end close. Line-item rounding vs transaction rounding: Stripe rounds tax at the transaction level; Xero rolls up line items first. On a three-line invoice with 5% tax, Stripe might charge ₹5,000.25; Xero calculates ₹5,000.27. Multiply by 500 invoices and you have ₹100 drift that compounds. Multi-currency conversion timing: An invoice charged in USD on 15 March converts at March 15 rates in Stripe but syncs to Xero on 16 March at March 16 rates. The 1–2% FX drift per invoice is recorded as a gain/loss in GL but not flagged as reconcilable. Tax accrual vs tax remittance: Billing systems accrue tax on invoice; accounting software often records it on payment or filing. GST charged in January may not hit the GL until the monthly return is filed in February. Refund timing and reversal routing: A refund issued on 30 March in Stripe may reverse the original invoice line in Xero but credit a discount or contra-revenue account instead. The GL sees the reversal; Stripe sees a negative charge. The routing is inconsistent. Partial payment and overpayment allocation: A customer pays ₹45,000 against a ₹50,000 invoice. Stripe records the partial payment; Xero allocates it to the oldest open invoice. If another invoice is due, the allocation path diverges. Subscription proration and mid-cycle changes: A plan change on 15 March prorates ₹2,500 credit. Stripe credits the next invoice; Xero records it as a line item reversal. The credit appears in different GL accounts. Failed payment retries and dunning fees: Stripe retries a failed charge and may add a dunning fee. Xero doesn't know the fee exists until a manual journal entry arrives—or never, if it's forgotten. Discount, coupon, and promotion timing: A ₹5,000 coupon applied on checkout in Stripe may sync to Xero as a line-item discount or a separate transaction, depending on the integration. The GL account it hits varies. API sync lag and batch reconciliation windows: Billing data syncs to accounting on a daily or hourly schedule. An invoice created at 11:55 PM may sync the next morning, creating a one-day GL lag. If reconciliation runs at close-of-business, the invoice is missing. Real scenario: ₹50 lakhs annual revenue, ₹8 lakhs unreconciled A SaaS company with ₹50 lakhs ARR across 200 customers ran a full reconciliation audit. Here's what they found: Rounding across 2,400 invoices: ₹1.2 lakhs (₹50 average drift per invoice). Multi-currency FX gain/loss: ₹2.1 lakhs (15% of invoices in USD, 1.8% average rate drift). Tax accrual timing (GST filed 3–5 days after month-end): ₹1.8 lakhs (GST not yet in GL when reconciliation ran). Refunds reversed to wrong accounts: ₹0.9 lakhs (15 refunds routed to contra-revenue instead of original invoice line). Proration credits not yet billed: ₹0.7 lakhs (7 mid-cycle plan changes, credits held in Stripe, not yet invoiced). Failed payment retry fees: ₹0.4 lakhs (28 retries, fees charged but never recorded in GL). Coupon discount routing: ₹0.6 lakhs (12 coupons applied; Stripe recorded as line discount, Xero recorded as separate promo account). API sync lag (invoices created after cutoff): ₹0.3 lakhs (48 invoices created 11 PM–11:59 PM, synced next morning after close). Total unreconciled: ₹8 lakhs. None of it was fraud or error . It was timing, rounding, routing, and system design colliding. How to map the nine breaks: A 90-minute audit checklist You don't need a forensic accountant. You need a systematic walkthrough of your sync architecture and a spreadsheet. Here's the sequence: Step 1: Pull the trial balances (15 minutes) Export the GL revenue account (e.g., 4100 Product Revenue) from your accounting software for the month. Export the invoice ledger (or revenue report) from your billing system for the same month. Calculate the difference. Record it as the reconciliation target. Step 2: Isolate rounding and currency (20 minutes) Pull a sample of 20–3