The CRM-to-GL gap:
where revenue goes to lie.
There's a quiet hallucination running in most early-stage SaaS companies: that a closed-won deal in the CRM equals revenue in the GL. It doesn't. Between the celebratory Slack message and the QuickBooks line item lives a gap where money quietly leaks.
1. What the gap actually looks like
I've audited finance functions at seed, Series A, and Series B SaaS companies. The pattern doesn't change. Sales books a deal in HubSpot. Someone — sometimes a founder, sometimes a junior ops person, sometimes nobody — is supposed to walk that deal into the billing system. Most of the time, they do. Some of the time, they don't. And nobody catches it because the CRM still says "closed won."
By the time the bookkeeper closes the month, three things have happened: the contract is sitting in HubSpot looking like recognized revenue, the customer hasn't been invoiced, and the GL doesn't know any of it exists.
2. The "swivel chair" integration
Almost every leak I find traces back to a human in the middle. Someone reading a contract PDF, opening Stripe, picking the right product, choosing a billing frequency, hitting send. Errors in this loop aren't a possibility — they're a mathematical certainty across enough deals.
"If your revenue depends on a junior ops person remembering to check a custom field in HubSpot before opening Stripe, you don't have a process. You have a liability."
3. Engineering the fix
The fix isn't another dashboard. It's a model where the CRM, the billing system, and the GL all agree on what a "deal" is — same SKU taxonomy, same pricing rules, same billing frequency. When those three systems share a vocabulary, the swivel chair goes away. Reconciliation becomes a check, not a job.
That's what we mean by "the CRM-to-GL gap." It's not a tooling problem; it's a definitions problem dressed up as a tooling problem. Solve the definitions and the tools follow.
Want this in your inbox?
Field Notes ships on Substack. One operator dispatch at a time.