The problem
In Post 02, we answered where deals come from and which channels convert best. Useful — but incomplete. The CRM tracks deal value at the moment of closing. Billing tracks what the customer actually pays over time. These are rarely the same number. Until you connect the two, you can’t answer the real question: which channels generate the most recurring revenue?What we did
We connected two additional sources — Stripe (billing) and ad platforms (Meta Ads, Google Ads, LinkedIn Ads) — and crossed them with HubSpot deal data. The join path: HubSpot deal won → product organization (via workspace slug) → Stripe customer → charges. Ad spend is aggregated by platform and mapped to thePaid acquisition channel.
What we found
36% without attribution
35 of 97 paying customers have no acquisition channel in the CRM. They likely entered before the CRM was in place — but they represent 62% of all recurring revenue. Any budget decision without this data is a guess.
110× multiplier
One customer entered as a $745 deal in the CRM. In Stripe, they’ve generated over $82k in recurring revenue. The deal value in HubSpot? Still $745 today. CRM deal values are unreliable proxies for actual revenue.
573 vs 4,372 runs
Partner Referral has 10 clients averaging 573 runs in the product. LinkedIn Organic has 11 clients with 4,372 runs. The channel that converts best isn’t always the one that retains best.
The takeaway
The CRM tells you who converted. Billing tells you who actually pays. Ads tell you how much you paid to acquire a customer. When you connect the three, the ranking changes — channels that looked mediocre by deal value turn out to be the most valuable by recurring revenue, and vice versa. This is what completing Stage 00 looks like: the full picture of where revenue actually comes from.The Skill
Download the file below and add it to your Claude Skills. It will query your HubSpot and Stripe data at Nekt and generate the analysis automatically. ⬇ Download Skill file (.md)SQL — Revenue Attribution (CRM × Billing)
If you prefer to run the query directly in the Explorer or adapt it to your schema:- Nekt Express / GCP (BigQuery)
- AWS (Amazon Athena)
Variations
Top customers by multiplier
Top customers by multiplier
See which individual customers have the largest gap between CRM deal value and real recurring revenue:
Add billing status and product engagement
Add billing status and product engagement
Cross with product metrics to see which channels produce customers that stick and use the product:
Add acquisition cost from ad platforms
Add acquisition cost from ad platforms
Aggregate spend from Meta Ads, Google Ads, and LinkedIn Ads to calculate CAC and ROI for the Paid channel:Map
custom_source = 'Paid' to the aggregated spend. CAC = total_spend / customers won via Paid. ROI = stripe_revenue / total_spend. For granular attribution (which platform generated which deal), cross UTMs (deal_utm_source) with campaign data.Implementation notes
amountin Stripe is in cents (BIGINT) — divide by 100.amountin HubSpot is a varchar — useTRY_CAST(... AS DOUBLE)orCAST(... AS FLOAT64).- Stripe charges may include multiple currencies (BRL and USD) — the sum aggregates without currency conversion.
- Customers without
custom_sourcein the CRM appear as “(no attribution)” — this is one of the main findings. - Google Ads
cost_microsis in micros (BIGINT) — divide by 1,000,000. - The Ads → CRM channel mapping is by convention:
custom_source = 'Paid'groups all paid media spend. For granular attribution, cross UTMs (deal_utm_source) with campaign data.
Next up
With this foundation in place, we’re out of the chaos stage. Next: the first pipeline dashboard the whole company reads the same way. Conversion funnel, time in stage, and monthly evolution.04 · Pipeline Overview
Stage 01 · Visibility — Deals by stage, conversion rates, and revenue by period. The first dashboard everyone reads the same way.