Stripe ASC 606 Revenue Recognition - Practical Guide for SaaS
How ERPClaw handles Stripe ASC 606 revenue recognition. Deferred revenue, monthly recognition, mid-cycle changes, refunds, and the journal entries that prove it works.
ASC 606 is the accounting standard for revenue recognition. It says you cannot count an annual subscription as revenue when the customer pays it. You have to recognize it monthly over the subscription period.
This page documents how ERPClaw implements ASC 606 for Stripe subscriptions, with the actual journal entries.
The five steps
ASC 606 defines a five-step framework for revenue recognition. For Stripe subscriptions, the steps map as follows:
- Identify the contract: a Stripe subscription = a contract.
- Identify performance obligations: the obligation is to deliver software access for the subscription period.
- Determine the transaction price: the subscription’s recurring amount.
- Allocate the transaction price: for single-product subscriptions, all of it goes to the one obligation.
- Recognize revenue when (or as) the obligation is satisfied: monthly, over the subscription period.
Multi-product subscriptions and bundles need step 4 to allocate, which gets complicated. ERPClaw handles single-product subscriptions correctly out of the box; multi-product allocations require manual configuration of allocation ratios.
The journal entries
Customer pays $1,200 for an annual subscription
When the charge succeeds:
| Account | Debit | Credit |
|---|---|---|
| Stripe Clearing | $1,200 | |
| Stripe Fees | $35 | |
| Deferred Revenue | $1,200 | |
| Stripe Fee (Expense) | $35 (offset) |
Note: the Stripe fee is an immediate expense, not deferred.
End of month 1 (recognize 1/12)
| Account | Debit | Credit |
|---|---|---|
| Deferred Revenue | $100 | |
| Subscription Revenue | $100 |
Repeat each month.
End of month 12 (final recognition)
| Account | Debit | Credit |
|---|---|---|
| Deferred Revenue | $100 | |
| Subscription Revenue | $100 |
After this, Deferred Revenue for this subscription is $0.
Customer cancels mid-year (after 4 months)
Eight months unused at $100/month = $800 unrecognized.
If refunded:
| Account | Debit | Credit |
|---|---|---|
| Deferred Revenue | $800 | |
| Stripe Clearing | $800 |
If not refunded (e.g. cancellation effective end of period):
| Account | Debit | Credit |
|---|---|---|
| Deferred Revenue | $800 | |
| Subscription Revenue | $800 |
The full $800 is recognized at cancellation because the obligation is discharged.
Mid-cycle upgrades and downgrades
If a customer upgrades from $100/mo to $200/mo on day 15 of a 30-day cycle, the proration creates a charge for the difference applied prorated to the remaining 15 days.
ERPClaw posts the new charge to Deferred Revenue normally, then adjusts the recognition schedule:
- Days 1-15: revenue recognized at $100/30 per day
- Days 16-30: revenue recognized at $200/30 per day
- Days 16-30 also recognize the proration top-up
The math is in stripe_subscription_recognition_schedule table; you
can audit per-subscription, per-day recognition by inspecting it.
Annual subscriptions paid with discount
If a customer pays $1,000 for a $1,200 annual plan (Stripe Coupon applied), the journal entries reflect the actual cash:
| Account | Debit | Credit |
|---|---|---|
| Stripe Clearing | $1,000 | |
| Deferred Revenue | $1,000 |
Monthly recognition is then $83.33, not $100. The discount is absorbed into the recognized revenue, not separately accounted for.
Failed payment then re-attempted successfully
Stripe attempts to charge, fails, retries, succeeds. ERPClaw posts
journal entries only on successful charge. The failed attempt
creates a stripe_charge row with status='failed' for audit
purposes but no GL impact.
Subscriptions on Stripe trial
Trial periods do not collect payment. No journal entry is posted during trial. When the trial ends and the first paid charge succeeds, revenue recognition begins from that date.
If the customer cancels during trial, no journal entry, no Deferred Revenue.
Multi-currency subscriptions
ERPClaw v1 supports USD-denominated subscriptions only. Other currencies are recorded but not auto-converted to USD for GL posting. Multi-currency support is on the roadmap.
Audit trail
For an auditor reviewing your books, ERPClaw provides:
stripe_subscription_recognition_schedule: per-subscription, per-day recognition planned and actualgl_entryjoined tostripe_subscription: every recognition entry is linked back to the subscription that triggered itdata_audit_log: every change to a recognition schedule (proration, cancellation, refund) is logged with timestamp and trigger event
You can export any subset for a CPA or auditor:
erpclaw stripe-export-asc606 --account-id <id> --period-start 2026-01-01 --period-end 2026-04-30
Outputs a CSV per accountant convention.
Edge cases handled
- Proration on upgrade
- Proration on downgrade (results in credit, applied to next invoice)
- Refund of a partially recognized subscription
- Cancellation with end-of-period grace
- Payment failure followed by recovery
- Subscription resumed after pause
- Trial-to-paid transition
- Free plan to paid upgrade
Edge cases NOT handled in v1
- Multi-currency conversions
- Custom billing cycles beyond month/year (weekly, daily, custom day count)
- Multi-element subscriptions with manual allocation
- Variable consideration adjustments (price changes mid-cycle by usage)
If you hit one of these, the recognition will need a manual journal
entry. Email [email protected] if you have a regular case that
isn’t covered.
ASC 606 in plain English
You are not paying for “access to a SaaS tool.” You are paying for 12 months of access. The vendor cannot count your money as revenue until they have actually given you access for the period they promised. ASC 606 makes this rule formal.
The accounting effect is straightforward but easy to get wrong by hand. ERPClaw automates it for any size book.
Source
- ASC 606 standard: fasb.org
- Stripe docs on revenue recognition: stripe.com/docs/billing/revenue-recognition
- ERPClaw recognition engine source: github.com/avansaber/erpclaw-addons