Revenue recognition ASC 606 is the US GAAP rule that says a Shopify store earns revenue when it transfers control of a product to the customer — usually at shipment — not when the customer pays or when Shopify deposits the payout. The standard uses a five-step model, but for DTC brands the action lives in identifying performance obligations and timing recognition around fulfillment.
Most ASC 606 explainers are written for SaaS companies or construction contractors. They walk through the five steps in the abstract and leave Shopify operators to figure out how the rule applies to a $79 subscription box, a pre-order with a 90-day lead time, or a Black Friday bundle that bakes a free gift into the SKU. This guide is written for that gap. In our work with 100+ Shopify brands at Ottit, the patterns below are what we actually see in 2026.
What is ASC 606 and why does it matter for Shopify brands?
ASC 606 is the revenue recognition standard from the Financial Accounting Standards Board. It replaced a patchwork of industry-specific rules with one principle-based model. For a Shopify store, it matters the moment the business raises outside capital, applies for a loan, or talks to a buyer. Diligence teams expect accrual-basis books that recognize revenue on shipment, not on cash receipt.
The standard lives in the FASB codification at Topic 606. The five-step model defined in FASB ASC 606 (Revenue from Contracts with Customers) applies to nearly every contract a business has with a customer. A Shopify checkout is a contract.
Why this matters operationally for a Shopify brand:
- Lenders and Wayflyer-style cash advance providers look at deferred revenue to gauge real run-rate, not gross sales.
- M&A buyers normalize EBITDA on accrual revenue. A brand with $8M in cash-basis sales but $1.2M in unshipped pre-orders is really a $6.8M brand at the close date.
- Investors during due diligence will reverse out gift card liabilities, unfulfilled subscriptions, and shipped-but-not-delivered orders depending on shipping terms.
- Auditors for any Series A and beyond will demand ASC 606 compliance as a baseline.
Cash-basis bookkeeping is fine for tax purposes at the smaller end. But the moment a brand crosses roughly $3M to $5M in revenue, the gap between cash-basis and ASC 606 books starts costing real money. That shows up as misread KPIs, missed lender covenants, and confused board meetings. Our related guide on Shopify COGS accounting walks through the matching-side of the same problem.
Cash hitting your Mercury account is not revenue. Shipment is the revenue event. Everything else is balance sheet movement.
Takeaway: Any Shopify brand planning to raise, borrow, or sell within 24 months should be on accrual books with ASC 606-compliant revenue recognition. The conversion gets harder and more expensive the longer it waits.
How does the ASC 606 five-step model apply to a Shopify store?
The ASC 606 five-step model walks from contract identification through revenue recognition. For a Shopify store, the contract is the order, the performance obligations are the SKUs and any add-ons, the transaction price is the order total minus discounts, allocation matters mostly for bundles, and recognition happens at shipment for most goods. Steps 2 and 5 do the heavy lifting.
| Step | Generic ASC 606 Language | Shopify DTC Translation |
|---|---|---|
| 1. Identify the contract | Enforceable agreement with a customer | The Shopify order itself — checkout completion creates the contract |
| 2. Identify performance obligations | Distinct goods or services promised | Each SKU, plus subscription renewals, gift cards, free-gift-with-purchase items, warranties |
| 3. Determine transaction price | Amount expected in exchange | Order total, less expected returns, less discount codes, less marketplace fees |
| 4. Allocate the price | Spread price across obligations | Mostly relevant for bundles, BOGO offers, and prepaid subscriptions |
| 5. Recognize revenue | When control transfers | Generally at shipment (FOB origin) — sometimes at delivery (FOB destination) |
Steps 1, 3, and 4 are usually mechanical for a DTC brand. The Shopify order is the contract. Transaction price is what the customer paid. Allocation matters when there are multiple distinct items at a blended price. The interesting work — and the place audits, diligence reviews, and lender covenants poke hardest — sits in Steps 2 and 5.
Takeaway: Treat the five-step model as a checklist you run against every product type the store sells. If the same SKU works the same way every time, document the policy once. The exceptions — subscriptions, pre-orders, bundles, gift cards — get individual treatment.
How revenue recognition ASC 606 treats Shopify performance obligations
A performance obligation under ASC 606 is each distinct promise to transfer a good or service. For Shopify brands, a single order can contain multiple performance obligations: each SKU in a bundle, each future shipment in a subscription, a free gift, an extended warranty, or a loyalty point earned at checkout. Each obligation gets allocated a piece of the transaction price.
Subscription boxes (Recharge, Skio, Smartrr)
A monthly box subscription with month-to-month billing is straightforward. Each box ships, that month's revenue books, done. The complication starts with prepaid annual plans. A customer paying $360 upfront for 12 monthly boxes creates 12 distinct performance obligations. Cash hits the bank on day one, but revenue recognizes $30 per month as each box ships.
Bundled SKUs and BOGO offers
A starter kit priced at $99 that includes a $60 hero product, a $40 travel size, and a $20 tote contains three performance obligations. The transaction price is $99, but the standalone selling prices total $120. ASC 606 says to allocate the $99 across the three obligations using their relative standalone selling prices.
If all three items ship in the same box on the same day, the allocation is academic — total revenue is $99 either way. It matters when items ship separately. A pre-order item bundled with an in-stock item means $49.50 books at the first shipment and $33 plus $16.50 books later. Most Shopify brands ignore allocation when items ship together and only break it out for split shipments.
Free gift with purchase
If the email pop-up promises a free travel size with any $75 order, that travel size is a performance obligation. The transaction price gets allocated across both items. The free gift's standalone selling price reduces the revenue booked on the main product. This is the part most stores get wrong — the gift is not a marketing expense, it is allocated revenue.
Gift cards
Gift card sales never book as revenue at sale. The cash creates a liability. Revenue books only when the card is redeemed and the underlying product ships. ASC 606 also allows recognition of breakage — the portion of cards reasonably expected to never be redeemed — proportionally as other cards are redeemed. For a brand with a 12% historical breakage rate, every $100 of redemptions also recognizes about $13.64 of breakage revenue.
Takeaway: Map every product type the store sells to its ASC 606 obligation profile. Subscription apps like Recharge produce reports that separate prepaid balances from monthly billing — these reports are the input for accurate deferred revenue. Without them, the books drift.
When should a Shopify store recognize revenue under ASC 606?
Revenue under ASC 606 is recognized when control of the product transfers to the customer. For Shopify stores, this is almost always at shipment — but the precise moment depends on shipping terms. FOB origin (also called FOB shipping point) transfers control when the product is handed to the carrier. FOB destination transfers control when the customer receives it. Most DTC brands operate FOB origin.
FOB origin vs. FOB destination — and what most Shopify stores actually use
Shopify's terms of service and most brands' shipping policies are silent on FOB terms by default. In practice, accountants treat the shipment date as the revenue event when:
- The customer bears the risk of loss in transit (most DTC stores).
- The customer is responsible for filing carrier claims for lost packages.
- The store's policy says it ships from a 3PL like ShipBob or a self-managed warehouse and treats handoff to the carrier as fulfillment.
Brands that explicitly guarantee delivery — full refund on any lost or stolen package, no questions — are arguably operating FOB destination. In that case, revenue should book on delivery, not shipment. The difference for a brand shipping 3,000 orders a month with a 4-day average transit is roughly 4 days of revenue stuck in transit at any given month-end. On a $2M monthly run rate, that is around $267,000 in revenue that books in the next period under FOB destination treatment.
How Shopify Payments payouts confuse the picture
Shopify Payments deposits cash to the bank on a rolling schedule — typically two business days after the order, but timing varies by country and risk profile per the Shopify Help Center guide to payouts. The payout deposit is not a revenue event. It is cash settlement of revenue that was already earned (or deferred) at order/shipment time.
This is where most cash-basis Shopify books fail GAAP. Without a tool that posts revenue on the order/fulfillment date, the books only see the payout deposit and miss the deferred revenue layer entirely. Bookkeep, the tool we use for revenue recognition across the 100+ Shopify stores Ottit closes books for, posts daily summary journals based on order events with revenue, fees, refunds, and gift card liability split out. A2X takes a similar payout-driven approach but reconciles to the payout rather than the order date, which works well for cash matching but requires extra mapping for accrual revenue recognition.
For brands that want strict accrual recognition tied to fulfillment events, Bookkeep tends to be the cleaner fit. The related Ottit guide on Xero–Shopify reconciliation architecture walks through how the moving parts fit together.
Takeaway: Document the store's shipping terms in the revenue recognition policy memo. Whatever the position, apply it consistently across periods. Auditors and diligence teams care less about FOB origin vs. destination than they care about consistency.
How are pre-orders and crowdfunded launches handled under ASC 606?
Pre-orders are deferred revenue under ASC 606. Cash collected at checkout is a liability until the product ships. For a Shopify brand running a 90-day pre-order campaign on PreProduct, Purple Dot, or a native draft order workflow, every dollar of pre-order cash sits on the balance sheet as deferred revenue for the entire pre-order window. None of it hits the income statement until fulfillment.
A worked example: a brand opens a pre-order on January 15 for a product launching March 30. Customers pay upfront. Between January 15 and March 30, the store collects $480,000 in pre-orders.
Cash-basis books would show $140K in January revenue, $190K in February revenue, and $150K in March revenue. Accrual ASC 606 books show zero in January and February and $480K in March. For a founder reading their own dashboards, the difference is the gap between thinking January was a great month and understanding that none of that activity was earned yet.
Partial pre-orders — where one SKU on an order is in stock and another is on pre-order — split into two performance obligations and ship separately. The in-stock portion books revenue at first shipment. The pre-order portion stays in deferred revenue until that ships. This is exactly the bundle allocation problem from Step 4 made operational.
Takeaway: Tag pre-order SKUs with a metafield in Shopify so the bookkeeping tool can route them to a separate deferred revenue account. Reconcile the deferred revenue balance to the open pre-order quantity times price every month-end. If the balance does not tie, something is shipping unrecorded.
How do refunds, returns, and chargebacks affect ASC 606 revenue?
ASC 606 requires variable consideration — including expected returns, refunds, and chargebacks — to reduce revenue at the time of sale, not when the refund actually happens. A brand with a historical 8% return rate on apparel cannot book 100% of an order's revenue and then debit it back two months later. The standard requires a returns reserve estimated up front.
In practice, Shopify brands handle this in one of two ways:
- Reserve method (GAAP-strict): Each month, post a journal entry that debits revenue and credits a refund liability for the expected return rate times current-period revenue. When refunds happen, debit the liability instead of revenue.
- Cash-basis approximation (common at sub-$10M): Book revenue gross, debit revenue when refunds clear. Acceptable for internal management reporting; not GAAP-compliant for audit or diligence.
- Hybrid (most $5M+ brands): Run cash-basis-style during the month, post a returns reserve true-up at month-end based on a rolling 90-day return rate.
Chargebacks work similarly but the reserve rate is much lower — usually 0.1% to 0.6% of revenue depending on category and fraud profile. Tools like Gorgias and Shopify's own chargeback dashboard provide the historical data needed to estimate the rate.
Takeaway: Pull a 12-month rolling return rate from Shopify analytics or the post-purchase platform (Loop, Returnly, AfterShip Returns). Apply it as a monthly reserve. Reconcile actual refunds against the liability quarterly to see whether the rate needs to move.
How are shipping fees and Shopify fees treated under ASC 606?
Shipping fees charged to the customer are revenue under ASC 606. The standard provides a practical expedient that lets companies treat shipping activities that happen after control transfers as a fulfillment cost rather than a separate performance obligation. Most Shopify brands elect this expedient — it means shipping revenue books at the same time as product revenue, and outbound shipping cost goes to COGS or a fulfillment expense line.
Shopify Payments processing fees, app fees, and marketplace commissions (for stores selling through Shop App or Shopify Collective) are not revenue reductions — they are operating expenses. The full transaction price the customer paid is revenue. The processor fees flow through as a cost line.
| Line item | ASC 606 treatment | Where it lands |
|---|---|---|
| Product price | Revenue at shipment | Revenue |
| Shipping charged to customer | Revenue at shipment (with expedient) | Revenue (or separate Shipping Revenue line) |
| Discount code applied | Reduction of transaction price | Contra-revenue or net revenue |
| Sales tax collected | Liability — never revenue | Sales Tax Payable |
| Shopify Payments fee | Operating expense | Payment Processing Fees |
| 3PL outbound shipping cost | Fulfillment expense | COGS or Fulfillment |
| Gift card sold | Liability until redemption | Gift Card Liability |
| Tip on order | Revenue (if retained) or pass-through liability | Depends on arrangement |
The table below compares how the main fee and revenue components are typically classified across a Shopify P&L:
| Line item | Classification | P&L location |
|---|---|---|
| Product price paid by customer | Revenue | Gross revenue |
| Shipping fee charged to customer | Revenue (practical expedient) | Shipping revenue |
| Discount code applied | Contra-revenue | Below gross revenue |
| Sales tax collected | Liability | Balance sheet only |
| Shopify Payments processing fee | Operating expense | Below gross profit |
| Outbound shipping cost (carrier) | Fulfillment expense | COGS or opex |
| Gift card sold | Liability | Balance sheet only |
| Gift card redeemed | Revenue (on shipment) | Gross revenue |
Sales tax collected from the customer is never revenue under any framework. It is a liability owed to state and local jurisdictions. The related guides on Shopify sales tax automation and Amazon FBA sales tax nexus cover the liability side in depth.
Takeaway: The cleanest Shopify chart of accounts splits revenue into Product Revenue and Shipping Revenue, runs Discounts as contra-revenue, and parks all fees and costs below the gross revenue line. This makes net-to-gross reconciliation against Shopify's order reports straightforward.
What does an ASC 606-compliant Shopify revenue stack look like?
An ASC 606-compliant Shopify accounting stack has four layers: the Shopify store, a journal-posting tool that translates orders into accrual entries, the general ledger (QuickBooks Online or Xero), and a month-end reconciliation process that ties Shopify's order data to the GL revenue line. The journal-posting layer is where most setups break down.
The four layers
- Source of truth (Shopify): Order events, fulfillment events, refund events, gift card transactions. This is the raw data.
- Journal layer (Bookkeep, A2X, or similar): Translates order events into daily summary journal entries with revenue, fees, refunds, gift cards, and tax broken out properly.
- General ledger (QuickBooks Online or Xero): Holds the chart of accounts, deferred revenue balances, and produces financials.
- Reconciliation process: Monthly check that the GL revenue line matches Shopify's reported revenue, with documented variances.
For most Shopify brands at $1M to $20M revenue, Bookkeep handles layer 2 cleanly. It posts accrual-basis daily summaries with deferred revenue handling for gift cards and subscriptions. A2X is also widely used and works well for cash-matching against Shopify Payments payouts but requires more manual mapping for strict accrual treatment of pre-orders and gift card breakage. The trade-offs between the two journal-posting tools sit in this comparison:
| Dimension | Bookkeep (P1 partner) | A2X |
|---|---|---|
| Posting basis | Order/fulfillment date (accrual) | Payout date (cash-match leaning) |
| Pre-order deferred revenue | Native handling | Manual mapping required |
| Gift card breakage | Configurable accrual | Requires custom journal |
| Subscription deferred revenue | Built-in support via Recharge/Skio mapping | Add-on workflow |
| Cash payout reconciliation | Strong | Strongest |
| Best fit | Brands prioritizing GAAP/ASC 606 accuracy | Brands prioritizing payout matching |
Below the journal layer, QuickBooks Online is the most common GL across the brands we close books for, with Xero running second for international or accountant-led setups. Both handle ASC 606 fine if the journal layer is configured correctly. The deeper comparison sits in the ecommerce accounting software guide.
ASC 606 compliance is not a tool you buy. It is a policy you write, a chart of accounts you build, and a reconciliation you run every month. The tool just enforces what the policy already decided.
Takeaway: Before evaluating tools, write a one-page revenue recognition memo. Document the shipping terms, the gift card breakage policy, the returns reserve method, and the deferred revenue treatment for pre-orders and subscriptions. Then configure the tool to match. Reversing the order — picking the tool first — is how brands end up with two years of mis-mapped journal entries to clean up before a Series A close.