“We have a full campaign influence model.”
Then you have a good answer for the touches that are in it. This adds the ones that are not, and gives you a total that reconciles to the opportunity export rather than to the model.
For Salesforce
Export closed-won opportunities and reconcile them against your ad, call and partner exports — no campaign influence model required.
No API key Nothing to install in Salesforce No card required
The gap
Campaign influence needs every touch to be in Salesforce as a campaign member. The touches that matter most are the ones nobody ever loaded.
What was sold, to whom, and for how much.
The click, the keyword, the call, and what each one cost.
The file
Three things carry the match: who, how much, and when. Anything else is optional and only changes how the report can be sliced.
The primary contact on the opportunity, or the associated lead's contact detail. Email is usually cleanest in a Salesforce org.
The closed-won amount, or the recognised revenue figure if your finance team uses a different one.
The opportunity's close date, used consistently between uploads.
Separates lines of business that have no business sharing a cost per deal.
Step by step
Written for somebody with Salesforce open in the next tab. Report names vary by edition, so each step says what to look for.
Include amount, close date and the contact's email or phone. A standard opportunity report with the contact fields added is enough.
If deals take six months, export eighteen months. Anything shorter and the opportunities closing now have no enquiry in the file to match to.
This is the step most orgs miss. An opportunity report with account names and no contact email cannot be matched to anything.
Mapping is suggested, you confirm it, and manual mapping is always available for unusual headers.
Ad platform exports, call tracking, partner registrations, event lists, outbound sequences. Each is ranked on closed-won revenue.
What comes back
Revenue by channel, the count of sales behind each figure, and an honest bucket for the ones nobody could trace. Sample figures, from the worked example on the B2B SaaS page — not from a Salesforce account.
| Channel | Share | Sales | Revenue |
|---|---|---|---|
| Google Ads | 18 | $720,000 | |
| LinkedIn Ads | 21 | $930,000 | |
| Email marketing | 12 | $420,000 | |
| Direct / Unknown | 24 | $930,000 |
Unmatched sales stay in Direct / Unknown. They are never spread across the paid channels to make the total look better.
The argument
Salesforce can attribute properly, and in a well-run org it does. The mechanism is campaign influence: every touch has to exist as a campaign member on the contact, and the model then distributes credit across them. When the data is complete the output is good.
The data is rarely complete, and the incompleteness is not random. Digital touches land automatically if the integration is configured. A conference conversation, a partner introduction, an inbound call to a regional office, a customer referral — these arrive as a person, not as a campaign member, and somebody has to remember to load them. The channels that get left out are systematically the offline ones.
So the report tells you about the channels that were easy to instrument, and is silent on the ones that were not. That silence reads as absence, and budget follows the report.
Instead of modelling how much credit each touch deserves, this asks whether the person on a closed-won opportunity appears in a given source list. It is a coarser question, and that is the point: it has a definite answer and the answer can be checked by opening two files.
High-confidence matches — an exact phone or email after normalisation — count automatically. Weaker links are surfaced for a human to accept or reject rather than counted. And opportunities that appear in no source list at all are reported as unattributed, which on most orgs is a larger and more interesting number than anyone expects.
Because the whole thing runs on exports, it needs no admin project, no new object, no field on the opportunity and no change to how the sales team works.
Large Salesforce orgs usually run several businesses through one instance: new business and renewals, direct and channel, several product lines with wildly different deal sizes. A single cost per closed-won opportunity across all of them is an average nobody owns.
A record type or business unit column splits the report along the lines the company is actually managed on. It is the difference between a chart that gets shown once and a chart a business unit leader asks for monthly.
Channel-led revenue is notoriously hard to attribute, because the partner owns the relationship and the end customer may never touch your website. Deal registration gives you a record of the partner, not of the marketing that produced the end customer.
Uploading partner-sourced deals as a source file puts them on the same revenue axis as direct demand generation. The comparison — what the channel programme produced against what paid search produced — is one most organisations have never been able to make on a single scale.
In an organisation where the marketing number is contested, the important property is not accuracy — it is auditability. A figure somebody can challenge and you can trace to two rows in two exports is worth more than a more sophisticated figure nobody can open.
Every match here is inspectable and reversible. High-confidence matches on a normalised phone or email count automatically; anything weaker is queued for a person to accept or reject, and that decision is recorded. Workspaces carry seats, so finance and marketing can look at the same queue.
That is a deliberately unglamorous design. It is also the reason the number survives the meeting where somebody asks where it came from.
Fair questions
Then you have a good answer for the touches that are in it. This adds the ones that are not, and gives you a total that reconciles to the opportunity export rather than to the model.
There is nothing to add. This reads a CSV report your team can already run.
Phones and emails are normalised before matching, which absorbs most of it. What cannot be matched confidently is flagged rather than guessed.
Closed-won opportunities with a contact email or phone, the amount, and the close date.
No. This is deliberately independent of it — that is the point of reconciling exports instead.
Yes. A partner-sourced list is a source file and ranks on closed-won revenue beside direct channels.
At least two sales cycles. Eighteen months is a common starting point for a six-month cycle.
Yes, with the relevant column, on Growth and above.
No. It works from a report export, so no org changes are required.
Export them with a type column so they credit the original acquiring channel rather than counting as new acquisitions.
Then it cannot be matched and is reported as unattributed. We do not guess from the account name.
Yes — workspaces carry seats, and every match is auditable and reversible.
Encrypted in transit and at rest, isolated per workspace, deletable in one click, DPA available.
Anyone with a seat in the workspace. Decisions are recorded and reversible, so finance and marketing can review the same queue.
The report exports to CSV, which most teams load into a custom object or a reporting layer rather than onto the opportunity itself.
By trade
What the report looks like once the export is in, written for each one.
Other systems
Running more than one system, or comparing? The method is the same and the columns are not.
Salesforce and the other product names and logos on this page belong to their owners and are shown to identify the software a file comes from. CloseRev is not affiliated with or endorsed by them, and connects to none of them: it reads a file you export.
Start today
Nothing to install in Salesforce, no API key, and no need to have been tracking anything until now. Last year works as well as this month.