Ask a SaaS company how many customers it has and you will often get three answers. The sales team quotes HubSpot. The founder quotes the Stripe dashboard. The accountant quotes QuickBooks. All three are telling the truth.
Each system answers a different question
| System | What it counts | Where it drifts |
|---|---|---|
| HubSpot or Salesforce | Companies with a closed-won deal | Churned customers left as customers; duplicate company records |
| Stripe | Billing accounts | Two subscriptions for one company; re-subscriptions after a failed card; test accounts |
| QuickBooks or Xero | Whoever received an invoice | One-off services invoices; subsidiaries billed under a parent |
None of these systems was built to answer “how many customers do we have?” Each was built to do its own job, and each does that job well.
Why it matters more than it seems
Customer count is the denominator under half your metrics. When it moves depending on who pulled the report, so does everything built on it:
- Logo churn looks better or worse depending on which list you start from.
- Net revenue retention double-counts expansion when one customer has two billing accounts.
- CAC per customer shrinks when duplicates inflate the count of new customers.
- Customer concentration, which every buyer checks, understates your largest accounts when they are split across records.
A worked example
Demo Co, our fictional $3M ARR SaaS company, shows 231 customers in HubSpot, 247 in Stripe and 219 in QuickBooks. Here is how each gets to the real number, 212.
| Starting point | Adjustment | Count |
|---|---|---|
| Stripe | Billing accounts | 247 |
| Second subscriptions for an existing customer | −19 | |
| Subscriptions re-created after a failed payment | −14 | |
| Test and internal accounts | −2 | |
| Real customers | 212 | |
| HubSpot | Closed-won companies | 231 |
| Churned, never updated in the CRM | −12 | |
| Duplicate company records | −7 | |
| Real customers | 212 | |
| QuickBooks | Names invoiced this year | 219 |
| One-off services invoices, no subscription | −9 | |
| Subsidiaries billed under a parent | +2 | |
| Real customers | 212 |
The fix: a customer crosswalk
- Pick the master ID. Usually the CRM company ID, because that is where the relationship lives.
- Map every billing and accounting record to it. Exact matches first, then fuzzy name matches reviewed by a person.
- Write the rules down. When does a parent and its subsidiary count as one customer? Is a re-subscription within 30 days a continuation? Do services-only customers count?
- Check it every month. New records that don't map go on an exceptions list, and someone clears that list before the numbers go out.
Once the crosswalk exists, churn, NRR and CAC stop changing depending on who pulled the report. The first build takes some effort. Keeping it current takes minutes a month, and most of that can be automated.
What to do this week
- Pull customer counts from all three systems for the same date.
- If they differ by more than a few percent, export the lists and match them on name and email domain.
- Sort the unmatched records into the categories above. Most companies find the same five or six causes.
If your board deck and your Stripe dashboard disagree, this is usually why.
Common questions
Why does Stripe show more customers than HubSpot?
Stripe creates a customer per billing account, so one company with two subscriptions, or one that re-subscribed after a failed card, can appear more than once. HubSpot usually has one company record per organization.
What is a customer crosswalk?
A mapping table that assigns one ID to each real customer and links it to that customer’s records in the CRM, billing system and accounting system, with written rules for edge cases.