Playbooks · Step 04

Know which channels drive revenue

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
TriggerContact is created1. Delay10 min, let data settle2. BranchOriginal traffic sourceOrganic searchAI referralsDirect trafficEmail marketingPaid searchPaid socialReferralsOffline sourcesSet channelInbound organicSet channelInbound organicby assistantSet channelInbound organicdetail: directSet channelInboundby emailSet channelPaidby campaignSet channelPaidby campaignSet channelReferralor partner3. BranchDrill-down 1ImportIntegrationCRM UISales extensionConnected inboxConversationsSet channelFrom import nameOutreach appOutboundWebinar appEventEvent appEventSet channelInboundSet channelReferralSet channelInboundSet channelInboundEvery “set channel” step also writes detail and confidence, and only runs when the channel field is still empty.

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 sourceDrill-down or ruleYour channelConfidence
Organic searchSearch engineInbound organichigh
AI referralsChatGPT, Perplexity, Claude…Inbound organichigh
Direct trafficNo referrer passedInbound organicmedium
Email marketingMarketing emailInboundhigh
Paid search / Paid socialCampaign namePaidhigh
ReferralsReferring domain on partner listPartnerhigh
ReferralsAny other domainReferralhigh
Offline: importImport named "Event – …"Eventhigh
Offline: importImport named "Outbound – …"Outboundhigh
Offline: integrationOutbound tool (Lemlist, La Growth Machine)Outboundhigh
Offline: integrationWebinar or event appEventhigh
Offline: CRM UICreated by hand after they reached outInboundmedium
Offline: sales extensionLogged from an introduction emailReferralmedium
Offline: connected inboxThey emailed you firstInboundmedium
Offline: conversationsChat or shared inboxInboundhigh

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

  1. 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.
  2. 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.
  3. Add a second field for the detail: the campaign, event name, partner or keyword. Channel stays short and stable, detail can be anything.
  4. 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.
  5. 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

  1. Trigger on contact created. Add a short delay so the tracking code and integrations finish writing the source fields.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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

  1. 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.
  2. 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.
  3. CRM UI: someone reached out and a rep added them by hand. Map to Inbound with medium confidence, and let the rep correct it.
  4. Sales extension: usually logged from an email thread, often an introduction from someone you know. Map to Referral.
  5. Connected inbox: the person emailed you first. Map to Inbound.
  6. Conversations (chat, shared inbox): someone wrote to you first. Map to Inbound.
  7. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. Merge duplicate companies first, matching on website domain, starting with the companies that have open or won deals.
  2. Check that every contact sits on the company that matches their email domain. Send mismatches to a review list instead of fixing them blindly.
  3. Require at least one associated contact before a deal can move past its first stage.
  4. 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.
  5. 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

  1. Create deal fields that mirror the contact ones: deal channel, deal channel detail, deal channel confidence.
  2. Trigger on deal created, with a short delay so contacts and companies are associated first.
  3. Copy the three fields from the contact labelled as originating contact. Without a label, use the contact who booked or attended the first meeting.
  4. If no contact has a channel, fall back to the company’s first contact and set confidence to low.
  5. 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

  1. Main report: deals created and revenue won per deal channel, per quarter, with win rate and average days to close.
  2. Add full cost per channel for the same period: media, tools, events, agency and people time. Cost per won deal beats cost per lead.
  3. Second view: the same deals grouped by contact first touch. Third view: grouped by self-reported source.
  4. 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.
  5. 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

  1. Give the agent your channel definitions, the mapping rules from the workflow and read access to contacts, companies and deals.
  2. 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.
  3. Reconcile: total won revenue this quarter must equal the sum of revenue by deal channel. Any gap is listed deal by deal.
  4. 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.
  5. 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.