September 16, 2026
Cody Leach, CPA
Accounting

How to avoid black box accounting for Stripe data

If you're a controller or revenue accountant at a self-serve or PLG company, there's a good chance Stripe found its way into your finance stack before anyone in accounting had a say in it. As Cody Leach, CPA and Head of Product Experience at HubiFi, put it during a recent CPE session on Stripe accounting: it usually starts with a founder and an engineer who need just "six lines of code" to start taking payments.

By the time a company hits real revenue, accounting inherits whatever data structure engineering happened to build and Stripe's data model was never designed with GAAP in mind.

Cody has spent the better part of a decade in high-volume revenue recognition, first in internal audit and then focused specifically on order-to-cash accounting for Stripe, Apple, and Google. In this session, he walked through how Stripe actually works under the hood, where most companies get the accounting wrong, and what changes once volume outgrows a spreadsheet. 

You Need to Understand Stripe's Data Model Before You Touch the Accounting

Stripe runs on roughly 30 different endpoints, and the objects that matter most for accounting nest inside one another in a specific order:

Customer → Subscription → Subscription Item → Invoice (header, invoice item, invoice line item) → Payment Intent → Charge → Payout

The detail that trips up most teams: Stripe conflates the concept of a contract with the invoice. Performance obligations, the actual "what am I on the hook to deliver, and over what term", live on the invoice line item, not on any higher-level contract object. There's no native Stripe report for "my contracts” so if you want that view, you have to build it.

A few other wrinkles worth knowing:

  • Credit notes apply to invoices as a payment method and can void or reduce what's owed.
  • Disputes and refunds belong to a payment, not to the invoice itself which is an important distinction when you're setting accounting policy for how those flow back through revenue.
  • Customer balance transactions are Stripe's version of account credit, gift-card-style balances, or unused time credit. These sit on the customer record with almost no native reporting. As Cody noted, this is one of the most common places for un-booked liabilities to hide, sometimes to the tune of several million dollars when a prior sales or CS team ran a credit promotion nobody documented.
  • Stripe also charges two distinct types of fees: per-payment processing fees and standalone service fees (invoicing, usage-based billing, etc.). Its newest pricing model also bills some of these outside Stripe entirely, making full fee reconciliation even harder to catch manually.

The Three Reports That Actually Matter

For manual Stripe accounting, three reports carry the entire order-to-cash cycle:

  1. Invoice report: The only native reporting on invoicing. Filter by creation date, exclude free-trial ($0) invoices, and watch for false positives from draft or voided invoices that were created but never finalized.
  2. Payout reconciliation report: The cash-basis view on successful charges, refunds, and fees, tied to payouts that actually hit your bank account. This is also where your cash-in-transit balance comes from (what customers have paid that Stripe hasn't paid out yet).
  3. Balance transaction report: Fees on a cash basis versus fees that should actually hit the P&L, with the difference sitting in cash in transit.

If you're on manual (not automatic) Stripe payouts, be aware: Stripe won't tell you which underlying transactions were paid out together. 

Cody's recommendation is to switch to automatic payouts wherever possible as manual payouts force you into treating Stripe like an ever-building wallet balance, which is workable but painful to maintain.

The 9 Most Common Stripe Accounting Errors

Drawing on work with some of Stripe's highest-volume customers, Cody walked through the mistakes that show up again and again:

  1. Cash-basis accounting: The most common error by far. Recognizing revenue off the payout reconciliation report instead of the invoice is the natural default given Stripe's reporting gaps, but it doesn't hold up under audit.
  2. Under-recorded liabilities: Customer balance transactions (credits, unused time) rarely get tracked, leaving real GAAP liabilities off the balance sheet.
  3. Under-recorded revenue and bad debt expense: Cash-basis accounting means unpaid invoices, and the revenue and bad debt expense tied to them, which often never get booked at all.
  4. Inaccurate performance obligation dates: These are usually caused by upstream RevOps misconfiguration (e.g., marking something immediate that should be recognized over time).
  5. Inconsistent discount and contra-revenue treatment: Time-based discounts tied to cancellation risk generally warrant a provision; immediate, non-contingent discounts can net against deferred revenue. Some teams net everything the same way regardless.
  6. Fee timing errors: Booking fees when the payout hits instead of accruing for the 2–3 day lag between when Stripe actually takes the fee and when it shows up in the payout.
  7. Unrecognized FX gain/loss: This usually disappears entirely if you're not comparing what was accrued at invoice booking to what was actually collected.
  8. Sales tax liability errors: Even when using a third-party provider like TaxJar, Avalara, or Anrock, these tools, which are strong operationally, frequently fail to reverse the tax liability correctly on refunds or lost disputes.
  9. Unused-time-credit fraud: An increasingly serious issue especially among high-profile AI companies, raising real ASC 606 questions about whether a valid contract even exists and whether revenue should be recognized, reserved against, or reversed.

Key ASC 606 Judgment Calls Specific to Stripe

A few policy decisions come up repeatedly for Stripe-heavy businesses:

  • Fee classification: Processing fees can be treated as a cost of revenue (commission-style, amortized alongside revenue under ASC 606) or as an operating expense under ASC 340. The right call often depends on how embedded the payment processor is in the business model. For example, buy-now-pay-later companies have a much stronger case for cost of revenue than a company that could easily swap processors.

  • Bad debt vs. revenue recognition: Collectability is one input into revenue recognition, not the only one. Defaulting to "only recognize revenue once paid" is conservative but frequently wrong; most invoices should be recognized as revenue with a corresponding ASC 326/CECL bad debt reserve where warranted.

  • Proration and variable consideration: Whether early cancellations reverse future revenue depends on the actual right-to-return terms in the contract, not a blanket policy.

  • Gross vs. net presentation for connected accounts: Where Stripe's agent-vs-principal dynamics come into play.

Where Manual Accounting Breaks Down

Excel can carry a Stripe close further than most people expect, but eventually the volume wins. Beyond the compliance risk of the errors above, Cody pointed to a subtler cost: manual Stripe accounting can devalue the accounting function itself. 

When the close takes weeks to reconcile, FP&A stops waiting on accounting and starts pulling its own (usually incorrect) revenue numbers straight from invoices and the rest of the month gets spent reconciling two numbers that never should have diverged in the first place.

It also doesn't scale technically. Pushing raw Stripe transaction volume directly into an ERP like NetSuite can get prohibitively expensive and, at real scale, simply breaks. ERPs weren't built to carry that kind of transactional load.

This is the gap HubiFi's Stripe integration is built to close: full order-to-cash automation across all of Stripe's endpoints (invoicing, payments, connected accounts, application fees, metering, credit grants, and more), producing a daily, audit-ready close that both accounting and FP&A can work from, with journal entries pushed automatically to your GL or ERP.

The Bottom Line

Stripe is exceptional at what it was built for: frictionless self-serve payments, but it was not built to be a revenue recognition system, and its own native RevRec module tends to run into the same volume and GAAP-compliance limits that manual processes do. 

Getting Stripe accounting right starts with understanding that the invoice line item, where your performance obligations live, and that cash hitting your bank account is the last step in the process, not the first one you should be accounting for.

Have questions about your own Stripe setup? Cody's happy to talk through your environment. Connect with him on LinkedIn.

Cody Leach, CPA

Accounting Automation | Product | Technical Accounting | Accounting Systems Nerd

Cody Leach, CPA is a technology and automation focused CPA helping finance leaders bring their processes into the 21st century. He's advised finance teams around technical accounting and automation - such as Cursor, Meta, Strava, and many others and has helped SaaS and AI finance teams turn messy and usage data into clean, automated revenue reporting that actually matches how the business runs. Former KPMG auditor, Cody holds in Masters in Accounting from North Carolina State University. He is a CPA.