Skip to main content

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:

  1. Identify the contract: a Stripe subscription = a contract.
  2. Identify performance obligations: the obligation is to deliver software access for the subscription period.
  3. Determine the transaction price: the subscription’s recurring amount.
  4. Allocate the transaction price: for single-product subscriptions, all of it goes to the one obligation.
  5. 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:

AccountDebitCredit
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)

AccountDebitCredit
Deferred Revenue$100
Subscription Revenue$100

Repeat each month.

End of month 12 (final recognition)

AccountDebitCredit
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:

AccountDebitCredit
Deferred Revenue$800
Stripe Clearing$800

If not refunded (e.g. cancellation effective end of period):

AccountDebitCredit
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:

AccountDebitCredit
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 actual
  • gl_entry joined to stripe_subscription: every recognition entry is linked back to the subscription that triggered it
  • data_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