Skip to main content
All posts
Playbook

Closed-won, never invoiced: how to find every one

The Junction team · November 2, 2026 · 7 min read

The deal closed on a Tuesday in March. The rep moved the stage, the forecast rolled up, and commission went out with the month. In Stripe there is a customer record, a plan from the previous contract, one paid invoice, and then nothing. The customer is using the product. The revenue is in the CRM, in the board deck, and in next year’s plan. It has never been billed.

Nobody made an obvious mistake. That is what makes this one hard to see.

A won deal is a sales fact. An invoice is a separate act.

Your CRM answers one question: did sales finish? A closed-won opportunity says a rep qualified the account, negotiated terms, and got a signature. Billing answers a different question: what does this customer owe, and has it been collected? Two records, two systems, two teams, written at two different moments.

Nothing joins them automatically. In Stripe, for a normal subscription, the invoice exists because the subscription exists: Stripe creates the invoice when you create the subscription, then finalizes it immediately or an hour later depending on the collection method. If nobody created the subscription, there is no invoice waiting to be finalized, no draft to chase, no failed payment to retry. The deal is simply not in billing.

HubSpot makes the same point from the other side. Its documentation says that when you use Stripe as a payment processor, invoices created in HubSpot are not created in Stripe. An invoice in the CRM is therefore not evidence of a Stripe invoice. The two documents can carry the same deal and never meet.

That leaves four steps between the signature and the first dollar: create the billing customer, create the subscription with the right price and start date, finalize the first invoice, and get the payment to succeed. Four steps, two teams, one contract. Every one is a place to drop it.

Five ways a won deal ends up unbilled

  • No customer, no subscription. Billing never learned the deal existed. This is the total loss case: 100% of the contract, invisible because neither system contains a record of what is missing.
  • The subscription exists at the wrong price. The order form has a negotiated discount, an annual prepay, a ramp, or a seat count that changed on the signature call. Stripe runs list price. The invoice goes out, the customer pays it, and the amount booked is not the amount on the contract. Nothing looks broken on either side.
  • The subscription exists, but the first invoice was never finalized. Stripe creates invoices as drafts, and a draft is not payable. Stripe’s documentation puts it plainly: if an invoice isn’t finalized, you can’t collect payment. With the email option off, even a finalized invoice is never sent. A draft sitting in the dashboard for four months looks like work in progress.
  • Billing starts late. A trial that converted, a contract start date earlier than the billing anchor, an implementation period that was supposed to end. Every month of delay bills nothing, and the only way to see it is to compare the contract start date with the first invoice date.
  • Invoiced once, never renewed. An annual deal set up as a one-time invoice rather than a subscription. Year one is billed and paid. Year two has no invoice scheduled, the account stays active in the CRM, and the renewal exists only in the forecast.

The third and the fifth survive a casual check, because a record exists in both systems. Presence is not the test. Status and term are.

The errors are small. The sum is not.

MGI Research’s 2016 survey of monetization buyers found 42% of companies reporting revenue leakage, and its 2023 research note puts the ratio more bluntly: a 0.1% error rate in the financial and CRM records translates to at least 1% revenue leakage.

0.1% to 1%

MGI Research’s estimate of how a small error rate in the CRM and financial records turns into revenue leakage. On $10M ARR, 1% is $100K a year, from defects small enough that nobody files a ticket.

MGI Research, November 2023

The ratio is the useful part. The visible defect is a tenth of the money, which is why an audit built on spot checks misses it. By the time a mismatch is large enough to notice in a dashboard, it has been compounding for months, and on an annual contract the first real notice usually arrives as a question from the customer.

The audit you can run this week

  • Fix the window. Take last quarter’s closed-won deals, not the open pipeline. The question is what was won and never billed, and a rolling pipeline view will bury it.
  • Export six fields per deal: contract value, close date, contract start date, term length, billing contact, and the CRM company ID.
  • Export Stripe customers, subscriptions, and invoices for the same window, and keep the invoice status column. It is the field most checks drop and the one that decides whether money moved.
  • Match on a stored identifier, not a name. The right key is the Stripe customer ID kept on the CRM company record. If none is stored, that is your first finding: nothing in the CRM points at billing, so no comparison can ever be automatic. Fall back to the billing email domain. Treat name matches as unverified, because “Acme” and “Acme Corp” are different strings often enough to matter.
  • Ask three questions per deal, in order. Is there a billing customer? Is there a subscription covering the current term, or a paid invoice for it? Does the amount match the signed order form? The first failure is a missing deal, the second is a missing charge, the third is a wrong charge. Different people fix each one.
  • Sort the failures by contract value, then read the invoice status. Paid is cash. Open is a collections question. Draft is a broken process, not a customer problem. Void and uncollectible are decisions someone made and nobody wrote down.

Done properly, budget an afternoon for a quarter of deals at a company with a few hundred accounts. It produces the number the controller actually asked for: contracted value won and not yet invoiced, with names attached and dates beside them.

Six weeks later it is a different spreadsheet

The method works once. What it does not do is become a control, and the reason is maintenance rather than skill.

Every exception needs a judgment. A deal closed under a group account and invoiced to a local entity. A subsidiary with its own Stripe customer. A contract in euros billed in dollars. Seats added mid-term. A discount that is contractual rather than promotional. Each is easy to resolve by hand and hard to encode in a VLOOKUP that has to survive next quarter’s export.

Then the output itself is a list of things that are wrong, and every item needs a write into a system. Creating the subscription, finalizing the invoice, correcting the price. Each of those writes produces a document the customer will see, which is exactly why it should not happen on an unattended schedule, and why it does not happen at all when the person who owns it is on a call.

So the list gets made in March, gets shorter in April, and by the next quarter the reconciliation is a spreadsheet nobody trusts and everybody still runs.

An unbilled contract never appears on a report as unbilled. It appears as a won deal with good news attached.

Find the list read-only, then approve the fix

Junction reads HubSpot or Salesforce and Stripe together, compares the records account by account, and returns every place they disagree with a dollar figure attached, ranked by what it is costing you. The first scan is free and read-only: it changes nothing in either system, and results usually arrive in minutes rather than after a data project. You can see the shape of the output at the sample scan before you connect anything.

On the paid plan, revenue agents work that list: missing invoice recovery for the deal that never got a subscription, subscription price correction when the contract moved and billing did not. Each one prepares the exact change, waits for your approval, applies only the change you approved, then re-checks both systems so you know whether the account actually agrees. Nothing on that list moves without a person saying yes to that specific change.

The deals are already won. The contract is signed, the customer is live, and the only thing missing is the invoice. Start with the free read-only scan at app.getjunction.io/signup. It changes nothing, and the first list is ranked by dollars, so the top of it is where to start.

If this gap is one of several you suspect, four silent revenue breaks covers the other three, and the month-end reconciliation tax covers what the manual version costs every close.

Sources

  1. Dirty Data Kills! Is bad data killing your billing software implementation?, MGI Research (Research Note, 2023-11-03)
  2. State of Monetization (2016 survey of monetization buyers), MGI Research
  3. Subscription invoices, Stripe Documentation
  4. Status transitions and finalization, Stripe Documentation
  5. Create invoices for your buyers in HubSpot, HubSpot Knowledge Base
See it on your own data

Put a dollar figure on the gap between your CRM and billing.

One read-only scan finds every account where the two disagree and shows you what it’s costing you, in minutes. Nothing is written back without your approval.

Create your workspace. No invitation or credit card needed.

Prefer to talk first? Talk to us about a design partnership →

Keep reading

Book a demo