The Stripe deposit hits your bank for $3,847.92. The contract you signed last week was $4,127. Your founder asks why the numbers don't match. You stare at the screen because both numbers are right. This is the gap that breaks most SaaS accounting workflows. Stripe runs a charge, takes its cut, batches payouts, and sometimes pulls back refunds before the deposit lands. ASC 606 says the $4,127 contract recognizes over the service period. The deposit and the revenue live on different timelines. They almost never match.
This article walks the full path from Stripe charge to recognized revenue for SaaS bookkeeping. You'll see where each step shows up in the books. You'll see where the reconciliation breaks. And you'll see how the clearing-account method keeps your P&L honest. We'll also cover Stripe Billing Revenue Recognition (the native module) versus external recognition in the general ledger. Plus when to graduate from a spreadsheet to a dedicated tool. See stripe revenue recognition.
Two readers in mind here. Sarah Chen is a bookkeeper closing the month for three SaaS clients, all on Stripe. Priya Patel just turned on Stripe Billing for her first SaaS product. She wants her books audit-ready by Series A. Same path, different jobs. Bobby (a CPA firm partner, not a CPA himself) built these patterns by running Growthy's own Stripe setup. The numbers below come from real ops, not theory.
What is Stripe revenue recognition for SaaS, and why doesn't the deposit equal the revenue?
Stripe revenue recognition moves money from a Stripe charge into recognized revenue on your income statement. It follows ASC 606. The deposit doesn't equal recognized revenue for three reasons. First, Stripe deposits are net of fees (about 2.9% plus 30 cents) and refunds. Recognized revenue is gross. Second, Stripe payouts batch charges across many days. One deposit can span two recognition periods. Third, annual prepay subscriptions create deferred revenue. It recognizes monthly over the contract term, while the cash hit happens once. A clean monthly close ties Stripe Clearing back to zero. It splits fees from revenue and recognizes contract revenue on the right schedule.
Key Takeaways
- Stripe deposits are net. Recognized revenue is gross. A $4,127 invoice yields a $3,847.92 deposit after fees and refunds. The $279.08 gap is fees and one $50 partial refund, not lost revenue.
- Annual prepay creates deferred revenue. A $4,127 annual contract recognizes $343.92 per month. The rest sits in deferred revenue on the balance sheet until earned.
- Multi-day payout batches span recognition periods. A Stripe payout that settles on January 2 can hold December 30 charges. Without a clearing account, your December P&L misses revenue.
- Stripe Billing RevRec works for Stripe-only revenue. The native module handles ASC 606 for contracts in Stripe Billing. It does not cover non-Stripe revenue, custom contract terms, or multi-currency rollups.
- The clearing account method nets to zero monthly. Every gross charge, fee, refund, and deposit posts through Stripe Clearing. At month-end, the balance should sit within a few cents of zero. Timing gaps cause the small drift.
- Graduate from spreadsheets at roughly 100 active contracts. Below that, a deferred revenue rollforward in Sheets works fine. Above it, the close drags past five days. Audit prep gets painful.
The Stripe-to-recognized-revenue path
Money moves through four checkpoints between a charge and recognized revenue. Each checkpoint is a reconciliation point. Each one is also a common place for the books to break.
Charge to bank deposit to deferred revenue to revenue
The first step happens when a customer's card is charged. The money sits in Stripe's balance, not your bank account. For a $4,127 annual plan billed up front, Stripe shows a charge on the dashboard. Your bank balance hasn't moved.
The second step is the payout. Stripe batches charges and pushes a net deposit to your bank. The cadence is a two-day rolling cycle for US accounts. The deposit is gross charges minus fees, minus any refunds or disputes that hit during the batch window. In our example, the $4,127 charge cleared with $279.08 in cuts. The bank saw a $3,847.92 deposit.
The third step is where revenue recognition starts. For a monthly plan, recognition happens at once because service and payment align. For an annual prepay, the full $4,127 sits in deferred revenue. It recognizes $343.92 each month over twelve months. The contract is billed and paid. But only the earned slice is revenue today.
The fourth step is the recognition journal entry. Each month, a JE moves a slice from deferred revenue into recognized revenue on the income statement. After twelve monthly entries, deferred revenue zeroes out for that contract. The full $4,127 has been recognized.
Where each step shows up in the books
Each transition makes a specific accounting entry. Here's what the books look like for a clean $4,127 annual prepay contract. Stripe fees are $254.08. One $25 partial refund hits.
Signing day (charge succeeds, money in Stripe):
DR Stripe Clearing $4,127.00
CR Deferred Revenue $4,127.00
Payout day (deposit hits bank, net of fees and refunds):
DR Operating Bank $3,847.92
DR Processor Fees $254.08
DR Refunds Issued $25.00
CR Stripe Clearing $4,127.00
Month one recognition:
DR Deferred Revenue $343.92
CR Subscription Revenue $343.92
After all three entries post, Stripe Clearing nets to zero. Deferred revenue holds $3,783.08. Recognized revenue shows $343.92. The P&L is right. The balance sheet tracks what's still owed.
The reconciliation points
The books should tie out at three checkpoints. First, Stripe gross charges (from the dashboard or Balance API) should equal the debit side of Stripe Clearing for the period. Second, the bank deposit (from the bank feed) should equal the credit side of Stripe Clearing for that payout. Third, the deferred revenue rollforward should equal the deferred revenue balance on the balance sheet.
If any of these three breaks, the cause is usually one of three things. A refund that hit after the period close. A chargeback dispute that's still open. Or a multi-day payout that crosses the cutoff.
Why the Stripe deposit never matches your recognized revenue
This is the most common point of mix-up in SaaS bookkeeping. Founders see a Stripe deposit hit the bank. They assume it's revenue. They book it as such. The result is a P&L that's wrong on three fronts at once.
Net versus gross
Stripe deposits arrive net of fees. For a US card charge, the standard rate is 2.9% plus 30 cents. International cards and some card types cost more. On a $4,127 contract, the fee is about $149.98 if the card clears cleanly. Refunds and disputes also trim the deposit. If a customer asks for a $25 partial refund the day before payout, that refund cuts the deposit. But it does not cut the original revenue you owe.
Recognized revenue is gross. The contract was for $4,127. That's the amount that recognizes (over time or at once, based on the terms). Fees are an expense on a separate line. They do not reduce revenue. Refunds are contra-revenue, also on their own line.
If you book the $3,847.92 deposit as Sales, three things go wrong. You've understated revenue by $279.08. You've understated fee expense by $254.08. You've understated refunds by $25. Gross margin no longer works.
Refunds and chargebacks
Refunds add a second wrinkle. A refund issued mid-month trims the next Stripe payout. It doesn't always tie to one deposit. If you refund $400 today and your next payout is $3,847.92, the payout is gross charges minus fees minus that $400 refund. The bank line shows one number. The real movement is three things.
Chargebacks are slower and messier. A customer disputes a charge. Stripe debits your balance for that amount plus a $15 dispute fee. You then accept or fight the dispute. If you fight and win, the funds come back. If you lose, the chargeback is final. The dispute fee sticks. None of this maps cleanly to recognized revenue. But all of it shows up in your bank feed.
Multi-day batches
Stripe payouts run as rolling two-day batches in the US. A single deposit can hold charges from three or four days. Those days can cross a month-end cutoff. A January 2 payout might hold December 30 and December 31 charges. If you book that payout as January revenue, you cause harm. You shift revenue from December to January. You skew both months. You break the trend chart the founder cares about.
The fix has two parts. Recognize on the charge date, not the payout date. Use Stripe Clearing to absorb the timing gap. Stripe Clearing on December 31 holds the December charges not yet deposited. On January 2, the deposit zeroes out that clearing balance. The books stay clean.
Stripe Billing Revenue Recognition: the native tool
Stripe shipped its Revenue Recognition module inside Stripe Billing. It reads your Stripe contract data. It applies ASC 606 logic. It builds a revenue recognition schedule plus journal entry summaries you can post to your GL. For Stripe-only SaaS companies, it saves real time.
What it does
The module takes Stripe Billing contracts (subs, invoices, one-time charges). It computes ratable recognition over the service period. It handles standard cases well. Monthly subs recognize at once. Annual prepays recognize monthly. Mid-term cancels recognize through the cancel date. It outputs a recognition report. You can drop it into your GL as one monthly JE, or sync it via Stripe's links.
It also handles deferred revenue on its own. If a contract is billed and paid but not yet earned, the unearned portion shows as deferred revenue in the module. You can tie this to your GL deferred revenue balance during the reconciliation step.
What it doesn't do
The native module has real limits. It doesn't cover revenue outside Stripe Billing. If you take wire transfers, ACH outside Stripe, or one-off invoices on a different platform, Stripe RevRec doesn't see that money. You'll need a parallel flow for the non-Stripe portion.
It also doesn't handle custom contract terms outside Stripe Billing. Say you sell an enterprise contract with a non-standard ramp (free for three months, then $5K per month for nine months). If you don't model that exact shape in Stripe, the module can't recognize it right. You'd need to override at the GL level.
Multi-currency rollup is another gap. If you bill in USD, EUR, and GBP and report in USD, the module shows each currency on its own. You'll do the rollup outside Stripe.
When it's the right fit
Stripe Billing RevRec works well when three things hold. First, all your revenue flows through Stripe Billing (or close to it). Second, you're single-currency. Or your multi-currency story is simple. Third, your contract terms are standard enough to model in Stripe Billing.
For most early-stage SaaS firms on pure Stripe, this is true. Take a founder like Priya who just turned on Stripe Billing. The native module is likely the right next step once contract count grows.
External recognition in the GL: the bookkeeper method
The other path is doing recognition fully in the general ledger. The deferred revenue rollforward lives in a spreadsheet. This is how most small SaaS firms run before they outgrow it.
When GL-side recognition is enough
GL-side recognition works under three conditions. Contract volume is low (say, under 100 active subs). Contract types are simple. There's no near-term audit pressure. A bookkeeper can hold a deferred revenue schedule in Sheets. They post a monthly recognition JE and tie it to the GL balance in under an hour.
The monthly recognition JE pattern
The pattern is simple. At signing, cash (or Stripe Clearing) debits. Deferred revenue credits for the full contract value. Each month after, a recognition JE moves one twelfth of the contract from deferred to recognized:
DR Deferred Revenue $343.92
CR Subscription Revenue $343.92
For a book of contracts, the bookkeeper sums the monthly recognition across all active contracts. They post one combined JE per month. The Sheets rollforward shows which contracts recognized, when each started, and what's left in deferred.
Where the reconciliation lives
Reconciliation lives in the rollforward. Each month, the rollforward should tie to three things. The contract data (from Stripe or the billing system). The GL deferred revenue balance. And the GL recognized revenue balance.
Say the rollforward says deferred revenue should be $48,200. The GL shows $48,180. You've got a $20 break to check. Usually it's a rounding error. Or a mid-month change you didn't update in the sheet. Or a recognition JE that posted the wrong amount. The goal: investigate breaks under $100 and fix breaks above that line before they grow.
The clearing account method for Stripe with QBO or Xero
The clearing-account method is the bookkeeper's trick for keeping Stripe-driven SaaS books clean in QuickBooks Online or Xero. It splits each part of the Stripe flow into its own GL line. Stripe Clearing acts as the holding account that nets to zero monthly.
Why bank-feed-only setups produce wrong P&Ls
The default QBO and Xero setup ties to the Stripe bank feed. It books each deposit as one entry. Most founders or junior bookkeepers tag that deposit as Sales. The deposit is net of fees and refunds. So Sales is understated. Fees show up nowhere unless someone splits the entry by hand. Refunds don't show on their own line. The gross margin number on the P&L is junk.
This is the most common failure in SaaS bookkeeping. It's invisible until someone tries to model unit economics, gross margin, or CAC payback. By the time the founder cares, you've got six months of bad data.
The Stripe Clearing Account setup
Set up a new asset account called Stripe Clearing. Then book three types of activity through it.
For gross charges (when a Stripe charge succeeds):
DR Stripe Clearing $4,127.00
CR Subscription Revenue (or Deferred Revenue, for prepay) $4,127.00
For processor fees (charged by Stripe per transaction):
DR Processor Fees $254.08
CR Stripe Clearing $254.08
For refunds (issued back to customer):
DR Refunds (contra-revenue) $25.00
CR Stripe Clearing $25.00
For the bank deposit (Stripe payout to your operating account):
DR Operating Bank $3,847.92
CR Stripe Clearing $3,847.92
After all four entries post, Stripe Clearing nets to zero. Every dollar that came in is accounted for. Revenue (or deferred). Fees. Refunds. Cash deposited.
In practice, most teams use a Stripe-to-QBO sync tool (Synder, A2X, Bookkeep.com) or a custom import to push these entries on autopilot. The math is the same regardless of the tool.
Monthly reconciliation steps
Monthly reconciliation has three steps. First, pull the Stripe Balance Transactions report for the month. Total up gross charges, fees, refunds, and payouts. Second, compare those totals against the Stripe Clearing activity in the GL. Third, confirm Stripe Clearing nets to zero. A few cents of drift is fine for payouts that haven't settled yet.
If Stripe Clearing has a balance over $100 at month-end, dig in. Common causes: a payout in transit (still showing as "in transit" on the Stripe dashboard), a refund that posted after period close, or a chargeback dispute that's open. Note each break. Leave the balance as-is if the timing gap is real. Adjust if it's a posting error.
For more on the mechanics, see deferred revenue mechanics and SaaS contract examples with JEs. The five-step ASC 606 frame that sits under all of this is covered in the ASC 606 five-step model.
When to graduate from spreadsheet recognition to Stripe Billing RevRec or Maxio
A point comes where the spreadsheet rollforward stops scaling. The signs are usually a mix of volume, complex contracts, and audit pressure.
Volume triggers
Volume is the most common trigger. Once you're past roughly 100 active sub contracts, the rollforward gets clunky. The monthly close starts to drag past five days. Recognition errors get harder to catch. The human eye can't scan 200 rows for off rows. A new contract type or a mid-term cancel creates ripples across the sheet that take hours to chase down.
At that point, two options pay for themselves. Stripe Billing RevRec, if all your revenue is in Stripe. Or a dedicated tool like Maxio (formerly SaaSOptics or Chargify). The annual cost is usually less than the bookkeeper hours saved.
Complexity triggers
Complex contracts are the second trigger. Multi-year deals with mid-term ramps. Changes that shift the recognition schedule (upgrades, downgrades, pauses). Multi-currency contracts that need rollup. Setup fees recognized over the contract term versus at once. Each of these adds rules to the rollforward. The rules stack up fast.
Once you've got more than five or six special-case contracts, the sheet feels fragile. One missed change breaks the rollforward for that contract. It can cascade to other contracts that share the same data. A dedicated tool handles these rules out of the box.
Audit triggers
Audit is the third trigger. Most SaaS firms first hit audit prep at Series B. Investors require audited financials there. Some hit it sooner in an M&A diligence flow, even before a priced round. An auditor will ask for the deferred revenue rollforward. They want it tied to source data (contract terms, billing records, payments). A sheet rollforward can pass an audit. But the audit prep work is heavy.
A dedicated revenue recognition tool builds an audit-ready report with source-data lineage. The audit prep work drops from weeks to days. If audit is on your near-term roadmap, that's the signal to upgrade.
For most early-stage SaaS, you'll graduate to one of these tools between $1M and $5M in ARR. Below that, the sheet is fine. Above that, the tool earns its keep.
For the broader Stripe-to-books flow including reconciliation patterns beyond revenue recognition, see Stripe Bookkeeping.
Growthy is bookkeeping software, not a CPA firm. This content is educational, not professional advice. Full disclaimer.
Get Started with Growthy
Related: SaaS Accounting, Stripe Bookkeeping, AI Bookkeeping.