Stripe revenue reconciliation: catching silent payment drift
Customers pay but your database disagrees. Revenue drift happens silently and compounds daily. Here is how to detect and fix it automatically.
Revenue drift is when Stripe records a successful payment but your application database does not reflect it. The customer paid, the money moved, but the subscription was not activated, the entitlement was not granted, or the invoice record is missing. This happens more often than founders expect, and it compounds silently until a customer opens a support ticket or an accountant finds the discrepancy.
How revenue drift happens
The most common causes: webhook delivery failure (endpoint down, signing secret wrong, body parsing broken), handler error after returning 200 to Stripe (database write fails silently), race conditions between concurrent webhook events, and Stripe retries creating duplicate processing that the handler does not deduplicate.
The pain of manual reconciliation
Without automation, reconciliation means exporting Stripe payment data, exporting your database records, and manually matching them. For a SaaS with daily transactions, this is unsustainable. By the time you notice drift, you might have weeks of unresolved discrepancies and angry customers who paid but cannot access the product.
What to reconcile
Every completed Checkout session should have a corresponding database record: a subscription row, an entitlement flag, an invoice entry, or whatever your app writes on successful payment. The reconciliation check compares Stripe's record of completed sessions against your database's record of fulfilled orders. Any mismatch is revenue drift.
Automated revenue reconciliation
PreFlight's Revenue Ledger Watch reconciles every paid Checkout session against the side effects you configure. It runs continuously, not just at launch. When a payment lands in Stripe but the corresponding database record is missing, you get an alert immediately — not three weeks later when accounting finds the gap. This is the difference between a minor fix and a major customer trust issue.
