Most attribution reports are wrong long before anyone picks a model. The source on the contact is too broad, half the leads sit in "offline sources", and the deal inherits the source of whichever contact happened to be oldest. These plays fix the data first, so the revenue-by-channel report can be trusted down to the last euro.
In one paragraph
Channel attribution means tracing every deal back to the channel that really started it: outbound, inbound, paid, events, referrals or partners. Your CRM already records a broad original source for every contact. You turn that into your own channel list with a workflow that reads the drill-down details, clean the links between deals, contacts and companies, copy the channel onto the deal from the contact who started it, and then report pipeline and revenue by channel.
Blueprint 1
The source mapping workflow
One contact workflow, drawn the way it looks in HubSpot. It branches on the built-in original source and maps each branch to a channel. Offline sources gets a second branch on its drill-down, because imports, integrations and contacts created by hand all mean different things.
CRM · Workflow · Set source channel on contacts · ON
Blueprint 2
The mapping table
The rules behind the workflow, in one table. Keep it next to the workflow and give it to the audit agent, so people and AI apply the same logic.
Attribution rules · contact level
Built-in source
Drill-down or rule
Your channel
Confidence
Organic search
Search engine
Inbound organic
high
AI referrals
ChatGPT, Perplexity, Claude…
Inbound organic
high
Direct traffic
No referrer passed
Inbound organic
medium
Email marketing
Marketing email
Inbound
high
Paid search / Paid social
Campaign name
Paid
high
Referrals
Referring domain on partner list
Partner
high
Referrals
Any other domain
Referral
high
Offline: import
Import named "Event – …"
Event
high
Offline: import
Import named "Outbound – …"
Outbound
high
Offline: integration
Outbound tool (Lemlist, La Growth Machine)
Outbound
high
Offline: integration
Webinar or event app
Event
high
Offline: CRM UI
Created by hand after they reached out
Inbound
medium
Offline: sales extension
Logged from an introduction email
Referral
medium
Offline: connected inbox
They emailed you first
Inbound
medium
Offline: conversations
Chat or shared inbox
Inbound
high
Blueprint 3
From contact to deal
A deal has one channel: the channel of the originating contact, the person whose interest led to the first call. Everyone else on the deal is there for the sale, not for attribution. That only works when the deal sits on the right company and the originating contact is marked.
CRM · Deal · Harbor Foods – Platform rollout
Company
Harbor Foodsharborfoods.com✓ one record
Harbor Foods BVharborfoods.com✗ duplicate, merge first
Contacts on the deal
Lena Vos · Finance leadChannel: Outbound · Q3 fintech list★ Originating contact: her interest led to the first call
Tom Ellis · Head of SalesJoined after the first callOn the deal, not used for the channel
Noah Berg · Partner managerWorks at a different company✗ wrong company
Deal
Deal channel: OutboundDetail: Q3 fintech list · Confidence: highCopied from Lena, locked at stage 2
Blueprint 4
Same revenue, two stories
The same €1.24M of won revenue, grouped two ways. On the left, the built-in source. On the right, the deal channel after mapping. Only the right side tells you where to put next year’s budget.
Report · Won revenue · last 12 months
Before: built-in original source
Offline sources€520k
Direct traffic€310k
Organic search€190k
Paid search€120k
Referrals€100k
67% of revenue sits in “offline sources” and “direct traffic”. Nobody can act on that.
After: deal channel
Outbound€410k
Inbound organic€300k
Event€220k
Referral€150k
Paid€110k
Partner€50k
Outbound and events were hiding inside offline sources. Check it against first touch and what buyers said themselves.
Blueprint 5
The weekly attribution audit
What a Claude agent with read-only CRM access reports every Monday. It proves every euro has a channel, and proposes fixes a person approves.
claude · attribution-audit
> Run the weekly attribution audit for Q4.
Reading 1,412 contacts, 386 companies and 74 deals…
Won revenue this quarter: €412,000 · with a trusted channel: €391,000 (95%)
€21,000 on 2 deals with no originating contact → propose Lena Vos and Sam Peters, from meeting history
38 contacts from import “leads (1).csv” with no rule → propose Event · Fintech Summit, matched on date and list
2 companies share harborfoods.com → propose merge, the deal moves to the main record
11 contacts from a new integration “Webinar app” → propose new rule: Event
4 fixes proposed · approve, edit or skip each one. Nothing is written until you say yes.
01
Decide which channels you will report on
Also called Channel taxonomy for revenue attribution
Write down the six to nine channels leadership actually decides budget on, for example outbound, inbound organic, paid, events, referral, partner and existing customers. Every contact and every deal gets exactly one of them. The CRM’s built-in sources are inputs to this list, not the list itself.
Why it matters. Built-in sources describe how a browser arrived, not why a company started talking to you. "Offline sources" or "direct traffic" can hide your best outbound campaign and your biggest event in the same bucket.
How to do it
List the channels you spend money or time on and would move budget between. If you would never move budget to or from it, it is a detail, not a channel.
Give each channel a one-line definition, for example: Outbound = we contacted them first. Inbound = they came to us without a direct prompt from us. Event = first real conversation happened at or because of an event.
Add a second field for the detail: the campaign, event name, partner or keyword. Channel stays short and stable, detail can be anything.
Add a confidence field: high when a rule proved it, medium when it was inferred, low when it was a fallback. You will thank yourself when reading reports.
Create the fields on contacts and deals with fixed dropdown values, never free text.
What goes wrong
Too many channels. Twenty values means every report needs a pivot table and nobody reads it.
Reusing the CRM’s built-in source field. You cannot change its values, and the CRM overwrites parts of it.
Mixing channel with campaign. "Webinar March" is a detail of Event, not a channel.
02
Translate the CRM’s source into your channels with a workflow
Also called Original source mapping workflow (contact level)
Build one workflow that runs when a contact is created. It waits a few minutes for tracking data to settle, branches on the built-in original source, then on its drill-down details, and writes your channel, detail and confidence. In HubSpot that means branching on Original Traffic Source and then on Drill-Down 1 and 2 or Record Source.
Why it matters. The built-in source is right about the browser and vague about the business reason. A rule per branch turns a broad value like "Paid Search" or "Offline Sources" into a channel you can report on with confidence.
How to do it
Trigger on contact created. Add a short delay so the tracking code and integrations finish writing the source fields.
Branch 1 on the original source: organic search, paid search, paid social, email marketing, organic social, referrals, AI referrals, other campaigns, direct traffic and offline sources.
Map each branch: organic search, AI referrals and direct traffic to Inbound organic; email marketing to Inbound; paid search and paid social to Paid with the campaign as detail; referrals to Referral, or to Partner when the referring domain is on your partner list.
Add a second branch under offline sources on its drill-down, because imports, integrations and contacts created by hand mean different things. The next play covers it.
Write channel, detail and confidence in one "set properties" step per branch, and only when the channel field is empty, so a person’s correction is never overwritten.
Run it once on historical contacts, then sort the results by confidence and check the low ones by hand.
What goes wrong
No delay. The workflow runs before the source is known and everything lands in the fallback branch.
Overwriting a channel a rep set by hand. Always check the field is empty first.
Forgetting the "none met" branch. Send it to a review list so the workflow tells you what it could not map.
03
Open up the "offline sources" bucket
Also called Record source and drill-down mapping for imports, integrations and sales-created contacts
Offline sources is the CRM’s word for "not from a tracked website visit". In many B2B databases it is the biggest bucket. It mixes list imports, outbound tools, event apps, contacts created by reps and contacts from email or chat. The drill-down tells you which, and each one maps to a different channel.
Why it matters. If outbound and events both live inside offline sources, your two most expensive channels look like one blurry line in every report.
How to do it
Import: name every import by channel and detail, for example "Event – Fintech Summit 2026" or "Outbound – Q4 fintech list", and map on the import name.
Integration: branch on the integration name. An outbound tool such as Lemlist or La Growth Machine maps to Outbound, a webinar app or an event app to Event.
CRM UI: someone reached out and a rep added them by hand. Map to Inbound with medium confidence, and let the rep correct it.
Sales extension: usually logged from an email thread, often an introduction from someone you know. Map to Referral.
Connected inbox: the person emailed you first. Map to Inbound.
Conversations (chat, shared inbox): someone wrote to you first. Map to Inbound.
Documents or meeting links: usually an existing conversation. Inherit the channel of the company’s first contact.
What goes wrong
Unnamed imports such as "contacts_final_v3.csv". After six months nobody knows where they came from.
Letting a re-import or enrichment tool create contacts that are already in the CRM, which resets their source.
04
Treat direct traffic as inbound organic
Also called Direct vs organic traffic, dark social and self-reported attribution
Direct traffic means the browser did not say where the visitor came from. For a B2B company that is rarely a random visitor typing your URL. It is word of mouth, a podcast, a LinkedIn post, a link shared in Slack or WhatsApp, or someone who already knew you. That is unpaid demand, so map it to Inbound organic, next to organic search, and keep "direct" as the detail.
Why it matters. Left as its own line, direct traffic looks like a mystery bucket and gets ignored. Read as inbound organic, it shows how much demand your reputation creates without paid media.
How to do it
In the workflow, map direct traffic to Inbound organic and write "direct" in the detail field, so you can still split it from organic search.
Add a "How did you hear about us?" dropdown to your demo and contact forms, and store the answer as a detail. It tells you which post, podcast or person sent them.
Tag every link you control with campaign tags (UTMs): emails, posts, partner pages, slides, event QR codes. Untagged links are the main reason paid and event visits end up as direct.
Each quarter, look at the share of revenue from direct. If it grows while you cut paid spend, your brand is doing the work.
What goes wrong
Giving direct traffic to the last campaign that ran. That is a guess presented as data.
Making "how did you hear about us" free text only. You get a hundred spellings of LinkedIn.
05
Make sure every deal points to the right people and company
Also called Deal, contact and company associations, duplicate companies
Attribution travels along associations: contact to company, contact to deal, deal to company. If a deal sits on a duplicate company, has no contacts, or has a contact from a different company, the source on the deal will be wrong however good your workflow is.
Why it matters. Duplicate companies split contacts across two records, so the deal is created on the one that has none of the history. The channel on the deal then comes from nowhere.
How to do it
Merge duplicate companies first, matching on website domain, starting with the companies that have open or won deals.
Check that every contact sits on the company that matches their email domain. Send mismatches to a review list instead of fixing them blindly.
Require at least one associated contact before a deal can move past its first stage.
Mark the originating contact on every deal, for example with an association label: the person whose interest led to the first call. This is the person the deal’s channel comes from.
Run a weekly check for deals with no contacts, deals whose contacts belong to another company, and companies with the same domain.
What goes wrong
Merging parent and subsidiary companies because they share a brand. Keep them separate and link them as parent and child.
Adding every person from a meeting to the deal without marking who started it.
06
Copy the channel onto the deal, from the contact who started it
Also called Deal source attribution workflow
When a deal is created, a deal workflow copies the channel, detail and confidence from the originating contact, the person whose interest led to the first call, onto the deal and then locks them. A deal has one channel, and it comes from that one person.
Why it matters. By default HubSpot gives a deal the original source of the associated contact who was first seen earliest, or of the company when there is no contact. A newsletter subscriber from four years ago can win the credit for a deal your outbound team opened last month.
How to do it
Create deal fields that mirror the contact ones: deal channel, deal channel detail, deal channel confidence.
Trigger on deal created, with a short delay so contacts and companies are associated first.
Copy the three fields from the contact labelled as originating contact. Without a label, use the contact who booked or attended the first meeting.
If no contact has a channel, fall back to the company’s first contact and set confidence to low.
Lock the fields once the deal reaches its second stage, so later activity cannot rewrite history. Keep a separate field for "influenced by" if you want to credit later touches.
What goes wrong
Reading the built-in deal source and assuming it means "this channel opened the deal".
Letting the deal channel change every time someone new is added to the deal.
07
Report revenue by channel, and read it three ways
Also called Pipeline and revenue attribution reporting, cost per channel
Report each channel on pipeline created, win rate, sales cycle, revenue won and cost, using the deal channel as the main view. Then check it against first touch on the contact and against what buyers said themselves. Where the three agree, act with confidence. Where they disagree, you have found a tracking gap or a channel that assists more than it opens.
Why it matters. One model always flatters someone. Deal channel shows what opens deals, first touch shows what first brought people in, self-reported shows what buyers remember. Together they stop the loudest channel owner from winning the budget meeting.
How to do it
Main report: deals created and revenue won per deal channel, per quarter, with win rate and average days to close.
Add full cost per channel for the same period: media, tools, events, agency and people time. Cost per won deal beats cost per lead.
Second view: the same deals grouped by contact first touch. Third view: grouped by self-reported source.
Add a "low confidence" share per channel. If more than a fifth of a channel’s revenue is low confidence, fix the data before moving budget.
Review monthly with sales and marketing in the room, and decide one budget move per quarter based on it.
What goes wrong
Comparing channels on leads or clicks. A cheap lead that never becomes a deal is the most expensive lead you have.
Reading one quarter. B2B cycles are long, so look at rolling twelve months for revenue and the last quarter for pipeline.
08
Let a Claude agent audit your attribution every week
Also called AI attribution audit agent for HubSpot
Connect Claude to your CRM with read-only access and give it one job: check that every euro of won revenue has a trusted channel. Each week it lists unmapped contacts, deals without an originating contact, duplicate companies and low-confidence revenue, explains each deal’s channel with evidence, and proposes fixes that a person approves.
Why it matters. Attribution decays quietly: a new import named badly, a new integration, a rep who skips the association. A weekly audit catches it while it is one record, not a quarter of broken reports.
How to do it
Give the agent your channel definitions, the mapping rules from the workflow and read access to contacts, companies and deals.
Weekly checks: contacts with an empty or low-confidence channel, new import names or integrations not in the rules, deals without an originating contact, contacts on the wrong company, duplicate domains.
Reconcile: total won revenue this quarter must equal the sum of revenue by deal channel. Any gap is listed deal by deal.
For each problem, the agent proposes the fix with its reason: the channel to set, the association to change, the companies to merge. Nothing is written until a person approves.
Ask it questions in plain language, for example "which channel opened the most revenue from fintech accounts this year, and how confident are we?"
What goes wrong
Giving the agent write access on day one. Start read-only, then allow approved changes only.
Letting it guess a channel without evidence. "Unknown, needs review" is a valid answer.
Questions people ask
What is the difference between original source and deal source in HubSpot?
Original traffic source is set on the contact by HubSpot from how they first arrived, such as organic search or offline sources. By default a deal takes the original source of the associated contact who was first seen earliest, or of the company. A custom deal channel copied from the contact who started the deal is usually more accurate.
What does "offline sources" mean in HubSpot?
It means the contact was not created by a tracked website visit: for example an import, an integration such as an outbound or event tool, a rep creating the contact by hand or from email, or a chat conversation. The drill-down fields show which one, so you can map it to a real channel.
Is direct traffic the same as organic traffic?
Not exactly. Organic search means the visitor came from a search engine result. Direct means no referrer was passed, which in B2B usually means word of mouth, a shared link, a podcast or someone who already knew you. Both are unpaid demand, so map both to Inbound organic and keep the difference in a detail field.
Which attribution model should a B2B company use?
Start with one clear rule: the channel that started each deal, taken from the contact who started it. Then compare it with first touch and with what buyers report themselves. Clean data with a simple model beats a complex model on messy data.