Closed-won, not pipeline
Rank channels by revenue that actually closed, so pipeline inflation stops setting the budget.
Marketing attribution for B2B SaaS companies
Match closed-won opportunities in your CRM to the campaigns that produced the original inquiry — across a cycle measured in quarters, not sessions.
$2,070,000 69% of $3,000,000 paid
The blind spot
Marketing reports MQLs, sales reports pipeline, finance reports revenue, and none of the three reconcile. The board asks what the demand-gen budget produced in ARR and the honest answer is that nobody can join the systems that would tell them.
What you get
Rank channels by revenue that actually closed, so pipeline inflation stops setting the budget.
A deal sourced in Q1 and closed in Q4 still traces to the campaign that produced it.
Demand gen, RevOps and finance read the same report instead of three reconciliations.
A worked example
Not impressions, not leads, not cost per click. Closed revenue, by the channel that produced it, for a period you choose — with the portion we could not trace shown rather than quietly shared out across your paid channels.
| Channel | Sales | Revenue | Share | % |
|---|---|---|---|---|
| Google Ads | 18 | $720,000 | 24% | |
| LinkedIn Ads | 21 | $930,000 | 31% | |
| Email marketing | 12 | $420,000 | 14% | |
| Direct / Unknown | 24 | $930,000 | 31% |
The MQL was invented to give marketing a number it could move before revenue arrived. In a market where cycles run two to four quarters, it has become the number teams optimize instead of revenue — and the two have drifted far enough apart that a record MQL quarter can precede a flat bookings year.
The join that would settle it is not complicated: the CRM knows which opportunities closed and for how much, and the ad platforms know which campaign produced the original inquiry. What is missing is anything that reconciles them on the person rather than on a session, which is why the answer usually lives in a quarterly spreadsheet nobody trusts.
CloseRev does that join from two exports. It is not an attribution platform to implement, and there is no tag to deploy on a product surface where security review takes a quarter of its own.
Enterprise buying committees have five to ten people and a dozen touches. Assigning the whole deal to the first or last of them produces a number that is precise and wrong, which is worse than an approximate one that is honest.
CloseRev deliberately does not model multi-touch weightings. It reports the channel that produced the contact who became the deal, and puts everything it cannot trace in Direct / Unknown rather than distributing it by a rule nobody can defend. That is a smaller claim than most attribution vendors make, and it is a claim that survives a CFO asking how the number was produced.
Net revenue retention is the figure a software board studies hardest, and almost all of it comes from accounts somebody acquired one, two or three years earlier. A seat expansion booked this quarter exists because a campaign two years ago put the right company in front of the right rep. The account executive who worked the upsell is credited for it, correctly. The channel that produced the original contact was credited with a first-year figure and then forgotten, which is how demand generation ends up arguing for its budget using the smallest number available to it.
Because the match is held on the contact rather than on a session, running the report across three or four fiscal years attaches every later booking to the channel that produced the first conversation. A source that looked marginal on new-logo bookings alone can turn out to sit underneath a third of the book. It is a different ranking, and it is the one that answers the question a chief financial officer actually asked, which was what the money spent in a past year has earned since it was spent.
The condition is that your export carries the same contact across those bookings, and most systems do, because renewals and upsells are recorded against the account rather than typed in fresh. Export every closed-won line with a contact detail, the booked amount and the close date, and let the report do the joining. Where an expansion was signed by somebody who appears in no lead file, it lands in Direct / Unknown rather than being handed to the acquiring channel on an assumption that nobody could check afterwards.
Nearly every software company has a "how did you hear about us" field on its demo or signup form, and nearly every one of them argues about whether to believe it. Buyers answer loosely: they name the podcast rather than the search that followed it, or they type a colleague's name. Treated as a single source of truth it is unreliable. Treated as one more file to reconcile against closed-won revenue it becomes genuinely useful, because you can see which of those answers precede money and which precede nothing at all.
Add it to the lead file, each row tagged with the answer as its source. Every row is a person with contact details and a label, which is exactly what any other lead export is, so it ranks on closed-won revenue next to paid search and paid social. What may emerge is that two or three of the free-text answers account for most of the value while the rest are noise, and that a channel your ad platform reports as expensive looks rather different once the deals whose buyers named it are counted against it as well.
This also gives you something to do with the answers that are not channels at all. A buyer who writes the name of a community, a newsletter or a peer group is describing demand you did not buy and cannot bid on. Ranked on revenue it either justifies a sponsorship or it does not, and either finding is worth more than the recurring argument about whether the field should exist. Nothing is inferred from a blank answer; a blank stays unmatched and the revenue behind it stays in the unattributed bucket.
Three findings recur. The first is that lead volume and revenue rank the channels differently, often severely: a source producing a tenth of the inquiries carries a quarter of the bookings because it reaches companies with budget rather than companies with curiosity. The second is that the unattributed share is larger than anyone expected, commonly a third, because outbound sequences, community, conversations between operators and inbound from a founder's network are all genuine demand that no advertising account will ever claim credit for.
The third is narrower and more uncomfortable. Campaigns tuned on cost per qualified lead tend to have optimized toward the inquiries easiest to produce, which in software means students, consultants, competitors and people at companies far below the size the product is priced for. Those never appear in a closed-won file at all, so they simply do not rank. Seeing a quarter of a budget sitting against a row that produced no bookings whatsoever is the most common reason a media plan gets rewritten after a first report.
None of that requires a change to how the business operates. Two exports produce the whole thing: closed-won opportunities from the CRM, and whatever lead and campaign files already exist. Because the revenue records were kept for recognition rather than for tracking, a completed fiscal year can be analyzed on the afternoon you sign up. Most teams start exactly there, since a finished year is the cheapest available test of whether this tells them anything they did not already believe about their own spending.
Why it matters
"We generated 400 leads" invites an argument. "This channel closed $186,400 last quarter, here is the reconciliation" ends one. The teams that can show closed revenue by channel are the teams that get the next increase approved, because they are asking with evidence rather than with conviction.
Killing spend is politically harder than adding it, because someone always owns the channel being cut. A number that reconciles to the sales export takes the argument out of the room — you are not overruling a colleague's judgment, you are reading the same ledger they are.
Platform-reported conversions do not reconcile to revenue, and eventually someone in finance notices. Reporting built from your own closed-sales export starts from the number finance already trusts, which is why it holds up when it is checked.
Because this reconciles exports rather than tracking visitors, it works on months that have already closed. You are not instrumenting now to learn something in ninety days — you can answer for last quarter today, which is usually when the question is being asked.
Honest answers
Then you probably already know its weakest point: it tracks sessions, so it loses deals whose cycle outlives the cookie and it cannot see the meeting booked from a conference badge scan. This works from CRM exports, so cycle length is irrelevant and offline sources are included rather than dropped.
Nothing connects to Salesforce. You export closed-won opportunities — a contact email, the amount, the close date — and that file is what gets analyzed. No integration, no OAuth scope, no security review of a live connection.
For multi-touch weighting, yes — and we do not pretend to solve that. What we solve is that most teams cannot even produce the deterministic join, so the modeling sits on top of numbers nobody has reconciled. Start with what closed and where the contact came from.
Pricing
The price here is the price on the invoice, plus any sales tax that applies — no per-call, per-minute or per-form fees. Enterprise usually fits sales-led software companies with enterprise deal cycles — ten seats for the team and the highest monthly record allowance, since a year of closed deals is a lot of rows.
One business closing at volume
$499/mo
billed monthly
Questions
Anything else? Talk to us — a person answers, usually the same day.
Closed-won opportunities: a primary contact email or phone, the booked amount, and the close date. Salesforce, HubSpot and Dynamics all produce this as a standard report.
Export whichever figure you want the report to rank on. It ranks consistently on what you provide.
Export the figure your team plans on — first-year ARR or TCV — and keep it consistent. Mixing the two across periods is what makes internal attribution arguments unresolvable.
It matches on the contact records you export, so exporting every contact on the opportunity attributes it to whichever channel produced any of them. It does not split credit between them, and says so rather than inventing a weighting.
Add the badge-scan or event list to the lead file, each row tagged with the event as its source, and those deals attribute like any other channel. Events are often the largest blind spot in a click-based tool.
As long as your data covers. There is no attribution window, because there is no cookie involved.
Typically demand gen, RevOps and someone in finance. The Enterprise plan includes ten seats and the monthly record allowance is shared across the workspace rather than per person.
Encrypted in transit and at rest, isolated to your workspace, deletable in one click, and we act as a processor with a DPA. Only a contact detail, an amount and a date are needed.
Yes, with a booking-type column mapped as Product / service. The report then shows new-logo and expansion bookings separately, with how much of each traces to a channel, which matters because the two are funded from one budget.
Add the prospecting list to the lead file, each row tagged as outbound. Outbound then ranks on closed-won revenue beside paid channels rather than vanishing into Direct / Unknown, which is where it sits by default when nobody supplies the list.
No. Nothing is installed and no admin project is created. Somebody runs a report, saves it as CSV and uploads it, so the exercise can happen without asking RevOps for a change window.
A closed-won row carries one phone number and one email, so put the contact most likely to have inquired on it. If that person is in the lead file, the deal is credited once, to the earliest lead carrying their detail. A colleague's separate inquiry does not count toward it, and the amount is never split between channels.
At least one full cycle plus the quarter before it. For a two-quarter cycle that means about a year; for longer cycles, two. A range shorter than the cycle measures only its tail.
Not as a figure in the report. The match ignores the gap, so a deal that closes two quarters after the first touch still credits its channel, but cycle length is not calculated. Both files carry dates, so it can be worked out from them, and by channel it can be more actionable than cost per deal.
Nearby
Match closed-won contracts and their annual value to the campaigns, events and content that produced the account, four to eight quarters earlier.
See how it worksMatch signed managed-services agreements and their recurring value to the campaigns that produced the first conversation.
See how it worksMatch closed-won contracts to the campaigns, events and content that produced the first conversation — across evaluations measured in quarters.
See how it worksWhere your sales already are
Export closed-won deals and reconcile them against your ad and call exports, including the offline sources HubSpot never receives.
What to exportExport closed-won opportunities and reconcile them against your ad, call and partner exports — no campaign influence model required.
What to exportExport won deals and match them to the ads, calls and referrals behind them — including the sources Pipedrive only records as a text field.
What to exportExport won opportunities, upload the sources that produced the leads, and rank channels on closed value rather than on lead volume.
What to exportExport your Calendly invitees, upload your closed sales beside them, and find out which bookings turned into money.
What to exportExport your Microsoft Ads leads, match them against closed sales, and compare the channel on revenue per lead instead of on impressions.
What to exportExport your Reddit leads, match them against closed sales over a period that fits the decision, and see the channel where its effect actually lands.
What to exportWhere your campaigns produce contact details, match them against closed sales. Where they do not, this page tells you plainly that they cannot be measured this way.
What to exportExport won deals and leads from Zoho CRM, join them on the contact detail, and see what the source field has actually been recording.
What to exportExport deals and leads from your boards, reconcile them once in the file, and get a single revenue-by-source answer.
What to exportExport your submissions, match them against closed sales, and find out which forms and which sources produced revenue.
What to exportExport invoices from NetSuite, upload the leads behind them, and rank marketing on invoiced revenue.
What to exportExport contacts with their original source and deals with their value, and rank on what each channel actually produced.
What to exportExport leads and invoices from Odoo, join them on the customer, and rank sources on invoiced revenue.
What to exportFrom the blog
A software company with both a free trial and an enterprise sales motion has two attribution problems that contradict each other. Product analytics claims the signup, sales claims the contract, and the finance system records revenue that neither of them can explain.
Read the articleLinkedIn is the one paid channel where the person who clicked is very probably the person you wanted. It is also the channel whose reporting is least able to tell you whether that person ever bought — because the sale happens months later, through a committee, in a system LinkedIn cannot see.
Read the articleAttribution needs history and privacy law needs forgetting, and those two facts are in direct tension. A practical retention policy for marketing data: what to keep, what to aggregate, what to delete, and how to prove you did.
Read the articleStart today
Upload two exports and see your real revenue by channel in minutes. 14 days free, no card.