Attribution & reporting · How-to

How to Set Up Self-Reported Attribution in HubSpot and Salesforce

Self-reported attribution asks buyers how they found you and stores the answer on the deal. Here's the exact setup in HubSpot and Salesforce, the benchmarks for a clean source field, and how to report it next to what your tracking still sees.

Joe LaGrutta, Founder of JayOh
Joe LaGrutta, Founder, JayOh12 min read · Updated November 2026
Two-button cartoon meme: one button says Comply with GDPR / CCPA, the other says Keep attribution working, and a sweating man labeled Every Marketing Ops team can't choose
The choice most teams think they have to make. You don't.

The LinkedIn post that started this one: consent didn't break attribution, depending on every click did.

Read the original LinkedIn post
Your attribution didn't break because of privacy law. It broke because it depended on tracking every click. Consent banners do exactly what they're supposed to. Until someone accepts, analytics and ad cookies don't fire. So the ad click and the comparison-page read never get recorded. When that visitor finally accepts and fills out a form, the session shows up as direct traffic or branded search. Marketing ops gets asked to keep the old reports working anyway. That's the trap. Patching click-level tracking back together means pushing consent rules further than legal will sign off on. And you still end up with gaps. What we build instead: 🔸 Form capture that stores UTMs and referrer on the contact, where your consent setup allows it 🔸 A required self-reported source field on demo and contact forms 🔸 Campaign influence measured on opportunities, not anonymous sessions 🔸 Consent status as a CRM property, so reports know which records they can trust Then report two views side by side: what the system tracked and what the buyer said. When they disagree, the buyer is usually closer to the truth. Podcasts, communities and peer referrals never left a click to begin with. Compliance and measurement only fight when measurement needs every click. Measure what buyers tell you and what closes. #MarketingOps #Attribution #DataPrivacy #RevOps #B2BMarketing
Joe LaGrutta, Founder of JayOh
Joe LaGrutta, Founder, JayOhPosted on LinkedIn
Why this breaks

Why click-based attribution keeps losing the plot

Your source report shows more Direct every quarter because the system can only credit what it saw, and it now sees less.

01 · The big one

Consent gates the tracker

Until a visitor accepts, analytics and ad cookies don't fire. The ad click and the comparison-page read are never recorded. When they accept later and fill a form, the session lands as Direct or branded search. etracker's 2025 study puts average visit-data loss with a compliant banner at about 60%.

↳ fixing this by bending consent rules is a legal problem, not an ops one
02

Dark social never leaves a click

Podcasts, Slack groups, peer referrals and posts read in-feed send buyers who type your URL. SparkToro found visits from TikTok, Slack, Discord and WhatsApp were recorded as direct 100% of the time.

03

Buyers decide before they click

6sense's 2025 Buyer Experience Report found 94% of buying groups had ranked their preferred vendors before first contact. The first tracked touch is often the last step of the decision.

04

The source field is optional or never mapped

When "How did you hear about us?" is optional, about 30% skip it. When it's free text with no mapping, nobody can report on it. Either way the channel you most need to see stays blank.

05

Influence is measured on sessions, not deals

Reports built on anonymous sessions fall apart under consent. Campaign influence only holds up when touches are tied to known contacts on opportunities.

Benchmarks

What good self-reported attribution looks like

Aim for a required, mapped source on 95% of high-intent conversions and under 20% of new pipeline sitting in Direct or Unknown.

MetricWeakAcceptableStrongSource
Completion of the source question on high-intent formsUnder 70% (optional field)85 to 95%95%+ (required)Dreamdata via Recast, 2023 (about 30% skip when optional); ranges JayOh experience
Answers mapped to a categoryUnder 60%80 to 90%95%+JayOh experience
New pipeline where software says Direct or UnknownOver 40%20 to 40%Under 20%JayOh experience
Opportunities with contact roles (Salesforce)Under 50%70 to 85%90%+JayOh experience; contact roles drive Campaign Influence (Salesforce Ben, 2025)
Visit data lost with a compliant consent bannerAbout 60% on averageetracker Cookie Consent Benchmark Study, 2025
Gap between self-reported and software attribution on dark social90%. Podcasts: 53% of closed-won revenue self-reported, 0% in softwareRefine Labs, 2023
Dark-social app visits recorded as Direct100% for TikTok, Slack, Discord, WhatsApp; 75% for Facebook MessengerSparkToro, cited by Recast, 2023
Buying groups with a ranked vendor shortlist before first contact94%6sense Buyer Experience Report, 2025

Sources: Refine Labs Hybrid Attribution study (2023), Recast (2023), etracker (2025), 6sense (2025), Salesforce Ben (2025). Weak, acceptable and strong ranges without a third-party source come from JayOh audits of B2B SaaS CRMs and are labeled as such.

The playbook

The 9-step self-reported attribution setup

Two properties, one required question, a mapping workflow, and a report that puts both views on the same deals.

Already running multi-touch? Keep it. This setup sits beside it. If you're starting from scratch, read our complete guide to attribution first for the model choices, then come back here for the self-reported half.

1

Pick the forms and write one question

What: Add a single required question, "How did you hear about us?", to high-intent forms only: demo request, contact sales, pricing, and trial signup if you run a product-led motion.

Why: The answer matters where pipeline starts. Asking on newsletter or content forms adds noise and costs conversions. Recast notes about 30% of people skip the field when it is optional, so required is the default.

HubSpotForms editor: add a field from a new contact property, set it to required. Leave newsletter and gated-content forms alone.
SalesforceWeb-to-Lead or your form tool (Account Engagement, Marketo, Formstack): add the field and mark it required. Map it to the Lead.
2

Create two properties: raw and mapped

What: One free-text property holds exactly what the buyer typed. A second dropdown holds the category you report on.

Why: You will re-map answers as the taxonomy matures. If you overwrite the raw text, you lose the ability to fix it later.

HubSpotSettings, Properties, Contact: self_reported_source_raw (multi-line text) and self_reported_source (dropdown select). Add the same dropdown on Deals.
SalesforceObject Manager: Self_Reported_Source_Raw__c (Long Text Area) and Self_Reported_Source__c (Picklist) on Lead and Contact, plus the picklist on Opportunity. Map both in Lead field mapping.
3

Start free text, then build the taxonomy from real answers

What: Run the field as free text for the first 30 to 50 high-intent submissions. Then write 10 to 12 categories based on what buyers actually said.

Why: A dropdown with "Google" at the top gets "Google". Free text keeps the answer unprompted, and the first batch tells you which channels deserve their own bucket. Add "AI assistant" now: buyers increasingly name ChatGPT, Claude or Perplexity.

HubSpotCreate a contact view: raw is known AND mapped is unknown. Bulk-edit the first batch by hand to set the categories.
SalesforceList view on Leads: raw not blank AND picklist blank. Inline-edit the first batch, then lock the picklist values (restricted picklist).
4

Capture UTMs, referrer and consent status where allowed

What: Add hidden fields for utm_source, utm_medium, utm_campaign and landing page, and store consent status as its own property.

Why: Software source still answers "what did they engage with", and reports need to know which records had tracking on. etracker's 2025 benchmark found compliant banners lose about 60% of visit data on average, so the consent property tells you which software rows to trust.

HubSpotForms: hidden fields populate contact properties from the query string (HubSpot KB). Add a consent_status dropdown fed by your consent tool.
SalesforceHidden fields on the form, mapped to Lead fields. Store consent status on Lead and Contact; if you use Account Engagement, keep its tracking-consent settings aligned with legal.
5

Automate the mapping

What: Use keyword branches to map raw answers into the dropdown. Anything unmatched goes to a review queue instead of "Other".

Why: Manual tagging stops after month two. A rules engine plus a weekly review keeps the mapped rate above 95%.

HubSpotContact-based workflow. Trigger: raw is known. If/then branches on raw "contains any of" (podcast, episode, show; chatgpt, claude, perplexity). Each branch: Set property value. None-met branch: set "Other or unclear" and create a task for the owner.
SalesforceRecord-triggered flow on Lead and Contact (after save, when raw changes). Decision element with CONTAINS conditions per category, Assignment sets the picklist. Default outcome: "Other or unclear" plus a queue.
6

Stamp the source on the deal at creation

What: Copy the mapped category from the buyer onto the deal or opportunity when it is created, and never update it after.

Why: Budget questions are asked in pipeline and revenue, not in contacts. A frozen deal-level value is what makes quarter-over-quarter reporting honest.

HubSpotDeal-based workflow on create: copy property value from the associated contact (primary) to the deal property. Deal must have a contact association, so require it in the pipeline rules.
SalesforceRecord-triggered flow on Opportunity create: get the converted Contact (or first Contact Role) and set the picklist. Enforce Contact Roles with a validation rule at a mid stage.
7

Measure campaign influence on opportunities, not sessions

What: Tie campaign touches to deals so you can see what engaged the buying group after they found you.

Why: This is the software half of the hybrid view. Session-based reports break under consent; opportunity-level influence uses known contacts.

HubSpotAssociate campaigns to deals through contacts and use attribution reports on deals (Marketing Hub Enterprise). On lower tiers, report on campaign membership of deal contacts.
SalesforceCustomizable Campaign Influence with First Touch, Last Touch or Even Distribution models. It only counts contacts added as Contact Roles (Salesforce Ben, 2025); extra models need Account Engagement.
8

Build the hybrid report

What: One matrix: self-reported source down the side, software original source across the top, created pipeline and closed-won in the cells.

Why: This is where the gap shows up. Refine Labs found a 90% measurement gap on dark social, with podcasts credited for 53% of closed-won revenue by buyers and 0% by software.

HubSpotCustom report on Deals: rows = deal self_reported_source, columns = Original Traffic Source of the primary contact, value = amount. Add a closed-won filter version.
SalesforceMatrix report on Opportunities: rows = Self_Reported_Source__c, columns = Lead Source, sum of Amount. Add a joined block with Campaign Influence by model.
9

Review monthly and reconcile before budget season

What: Check completion, mapped rate and Direct share every month. Before planning, reconcile ad-platform conversions to closed-won in the CRM.

Why: Platform numbers move when measurement changes. Meta turned on "Measure conversions on customer devices" by default on November 12, 2026 (PPC Land), so reported conversions can rise without a single extra buyer.

HubSpotDashboard with the three health metrics and the hybrid matrix. Monthly task to re-map "Other or unclear".
SalesforceDashboard with the same metrics. Quarterly: export closed-won and compare by channel to what each ad platform claims.
Best practices and mistakes

Best practices, and the mistakes that cost budget

Most failures aren't technical. They're a leading dropdown, an optional field, or a report built on contacts instead of revenue.

Do this

  • Ask only on high-intent forms. Demo, contact sales, pricing, trial.
  • Make it required. Optional fields go blank on the channels you can't see.
  • Free text first, categories second. Let buyers tell you the taxonomy.
  • Keep the raw answer forever. Re-mapping beats re-asking.
  • Cap categories at 12. More than that and nobody maps consistently.
  • Add an AI assistant category now. It's already showing up in answers.
  • Stamp the source on the deal at creation. Freeze it for honest trend lines.
  • Report on pipeline and closed-won, not leads or contacts.
  • Store consent status as a property. Reports should know which software rows to trust.
  • Name one owner for the taxonomy and review it monthly.

Avoid this

  • A dropdown with Google at the top.Costs: search gets over-credited and budget drifts to paid search.
  • An optional field.Costs: roughly 30% blanks, concentrated in dark-social channels.
  • Asking on every form.Costs: lower conversion on content forms and noisy answers.
  • Overwriting the raw answer when you categorize.Costs: you can't fix the taxonomy later without re-asking.
  • Reporting self-reported source on leads only.Costs: podcasts look like cheap leads you can't tie to revenue, so they get cut.
  • Pushing consent rules to restore tracking.Costs: legal exposure, and you still have gaps.
  • Treating either view as the truth.Costs: recall bias or click bias decides the budget instead of you.

Once both views are in place, put them on the leadership dashboard instead of building another report. Our post on revenue dashboards leadership actually uses covers how to keep it to the numbers people decide on.

Interactive tool

Attribution coverage calculator

See how much of your new revenue software can explain today, and how much a required source question adds.

How much revenue can you explain?

Enter your numbers. Coverage = the share of new revenue with a usable source. The hybrid figure assumes the two views fail independently.

Software coverage32%
Self-reported coverage82%
Hybrid coverage88%
New business per year173 deals
New revenue software can't source$0Weak
Still unsourced with hybrid$0
Adjust the inputs to see your next move.

Grades use the Direct or Unknown benchmark above: over 40% weak, 20 to 40% acceptable, under 20% strong. Want the multi-touch math too? Try the marketing attribution calculator.

Template + Claude skill

Copy the setup spec

Hand this to whoever owns your forms and CRM. It's the whole build on one page.

SELF-REPORTED ATTRIBUTION SETUP SPEC (JayOh)

1. QUESTION
   Label: How did you hear about us?
   Type: free text (multi-line), required
   Forms: demo request, contact sales, pricing, trial signup. Not on content or newsletter forms.

2. PROPERTIES
   HubSpot contact: self_reported_source_raw (multi-line text), self_reported_source (dropdown)
   HubSpot deal: self_reported_source (dropdown, copied from primary contact at deal create)
   Salesforce Lead + Contact: Self_Reported_Source_Raw__c (Long Text Area), Self_Reported_Source__c (Picklist)
   Salesforce Opportunity: Self_Reported_Source__c (Picklist, set by flow)
   Lead field mapping: Raw and Picklist mapped Lead to Contact on conversion

3. CATEGORIES (max 12)
   Peer or colleague referral | Podcast | LinkedIn | Community or Slack group
   Search engine | AI assistant | Event or webinar | Review site
   Partner or marketplace | Newsletter or publication | Outbound | Other or unclear

4. MAPPING RULES (contains any of)
   Podcast: podcast, episode, show, listened, spotify, apple podcasts
   AI assistant: chatgpt, gpt, claude, perplexity, gemini, copilot, ai
   Peer referral: friend, colleague, coworker, boss, referred, referral, recommended by
   LinkedIn: linkedin, linked in, li post
   Community: slack, community, discord, group, forum, reddit
   Search engine: google, search, bing, googled
   Review site: g2, capterra, trustradius, review
   Event: conference, event, webinar, booth, summit, meetup
   No match: set Other or unclear and add to the Needs review list

5. CAPTURE (where consent allows)
   Hidden fields: utm_source, utm_medium, utm_campaign, landing page, referrer
   Contact property: consent_status (accepted, declined, not shown)

6. REPORTS
   A. Created pipeline by self-reported source (last 4 quarters)
   B. Closed-won amount by self-reported source
   C. Hybrid matrix: self-reported source (rows) x software original source (columns)
   D. Data health: completion rate, mapped rate, Direct or Unknown share

7. OWNERSHIP
   Taxonomy owner: (name)
   Monthly review: re-map Other, retire unused categories, check benchmarks
   Benchmarks: completion 95%+, mapped 95%+, Direct or Unknown pipeline under 20%
Free Claude skill

self-reported-attribution-classifier

Paste or upload an export of "How did you hear about us?" answers and Claude does the mapping work from this post.

  • Sorts raw answers into a 12-category taxonomy and quotes them as evidence
  • Writes the "contains any of" keyword rules for your HubSpot workflow or Salesforce flow
  • Builds the hybrid table against software source and grades your data on these benchmarks

Claude web or desktop:

  1. Go to Settings, then Capabilities, and make sure code execution and file creation is on.
  2. Under Skills, click Upload skill and choose the .zip.
  3. Toggle it on.

Claude Code: save it as ~/.claude/skills/self-reported-attribution-classifier/SKILL.md, or under .claude/skills/ in your repo.

Skills are available on Claude Pro, Max, Team and Enterprise plans. New to skills? Read how to use skills in Claude.

Preview SKILL.md
---
name: self-reported-attribution-classifier
description: Classifies free-text "How did you hear about us?" answers into a clean self-reported source taxonomy, flags answers that need a human, and builds a hybrid attribution table that compares what buyers said with what the CRM tracked. Use when someone pastes or uploads an export of form responses, contacts, leads or deals with a self-reported source column, or asks to clean up, map, categorize or report on self-reported attribution.
---

# Self-Reported Attribution Classifier

You turn raw "How did you hear about us?" answers into categories a CRM can report on, then compare them with software-tracked source. This follows the JayOh method in "How to Set Up Self-Reported Attribution in HubSpot and Salesforce".

## Inputs to ask for (only if missing)
1. The export: one row per contact, lead or deal. Needed columns: record ID, the raw self-reported answer. Helpful: software original source (for example HubSpot Original Source or Salesforce Lead Source), created date, pipeline amount, deal stage.
2. The category list the team already uses, if any. If none, use the default taxonomy below.

## Default taxonomy (max 12 categories)
- Peer or colleague referral
- Podcast
- LinkedIn (posts, people, ads)
- Community or Slack group
- Search engine
- AI assistant (ChatGPT, Claude, Perplexity, Gemini, Copilot)
- Event, conference or webinar
- Review site (G2, Capterra, TrustRadius)
- Partner, agency or integration marketplace
- Newsletter or publication
- Outbound (email, call or message from our team)
- Other or unclear

## Steps
1. Read every row. Keep the raw answer exactly as written. Never overwrite it.
2. Assign one primary category per answer. If an answer names two channels, pick the one the buyer names as where they first heard and list the second as a secondary mention.
3. Match on meaning, not just keywords. "my old boss uses you" is a peer referral. "saw Joe on a show" is a podcast. "chatgpt recommended" is an AI assistant.
4. Mark an answer as Needs review when it is blank, a single character, a company name with no channel, a joke, or fits two categories equally. Never guess a channel for these.
5. Write keyword rules that would catch at least 80 percent of the answers automatically, one line per category, as "contains any of" lists the team can paste into a HubSpot workflow branch or a Salesforce flow Decision element.
6. If a software source column exists, build the hybrid table: self-reported category as rows, software source as columns, counts in each cell, plus pipeline amount if provided.
7. Score the data against these benchmarks:
   - Completion on high-intent forms: under 70 percent weak, 85 to 95 percent acceptable, 95 percent or more strong.
   - Answers mapped to a category: under 60 percent weak, 80 to 90 percent acceptable, 95 percent or more strong.
   - Pipeline where software says Direct or Unknown: over 40 percent weak, 20 to 40 percent acceptable, under 20 percent strong.

## Output format (always this order)
1. Summary: rows read, completion rate, mapped rate, Needs review count, and the three benchmark grades.
2. Category table: category, count, share of rows, pipeline amount if given, two example raw answers quoted exactly.
3. Hybrid table (only if a software source column exists), then three findings, each citing the cells it comes from. Example finding shape: "Software credits 61 of these deals to Direct. Buyers named a podcast in 22 of them."
4. Needs review list: record ID, raw answer quoted, why it needs a person.
5. Keyword rules block, one line per category.
6. Next steps: at most five, each tied to a number above.

## Guardrails
- Quote raw answers as evidence. Never paraphrase them in the tables.
- Never invent numbers, channels, amounts or rows. If a column is missing, say which analysis you skipped and why.
- Do not treat either view as the truth. Self-reported answers carry recall bias and software carries click bias. Say which question each one answers: buyers tell you how they found you, software tells you what they clicked.
- Do not include personal data such as emails or names in the output unless the user asks for it.
- If fewer than 30 answers are provided, say the sample is too small to set budget from and present the result as directional only.

Built by JayOh (jayoh.io). Full method, benchmarks and a coverage calculator: https://jayoh.io/self-reported-attribution/
FAQ

Self-reported attribution FAQ

Short answers to what teams ask when they set this up.

What is self-reported attribution?

Self-reported attribution is asking buyers how they found you, usually with a required 'How did you hear about us?' field on high-intent forms, and storing the answer on the contact and the deal. It captures channels that leave no click, like podcasts, communities, peer referrals and AI assistants.

Should the 'How did you hear about us?' field be free text or a dropdown?

Start with free text. A dropdown leads the answer and over-credits whatever sits at the top of the list. Collect 30 to 50 answers, build categories from what buyers actually wrote, then map the raw text to a dropdown property with a workflow or flow, and keep the raw answer.

Is self-reported attribution accurate?

It is accurate about how buyers remember finding you, and it carries recall bias toward recent or memorable touches. Software attribution is accurate about clicks and blind to anything without one. Neither is the truth on its own, which is why the hybrid view reports both side by side.

What is hybrid attribution?

Hybrid attribution combines self-reported source with software-tracked source on the same records. Self-reported answers how the buyer found you. Software answers what they engaged with before converting. Reporting both on pipeline and closed-won shows where each view is blind.

Why does HubSpot show so much Direct Traffic after adding a cookie banner?

When a visitor declines or ignores the banner, the tracking code does not record their earlier sessions. If they later accept and submit a form, HubSpot only sees the converting session, which often has no referrer, so Original Source lands on Direct Traffic or the source of that last visit.

Which forms should ask how buyers heard about you?

Only high-intent forms: demo requests, contact sales, pricing or consultation requests, and free-trial signups for product-led motions. Skip newsletter and content forms. The answer matters most where pipeline starts, and extra questions on low-intent forms cost conversions.

How do you report self-reported attribution in Salesforce?

Store the raw answer and a mapped picklist on the Lead, map both to the Contact on conversion, and copy the picklist to the Opportunity with a record-triggered flow. Then report opportunities and closed-won amount grouped by the picklist, next to Lead Source or Campaign Influence.

The JayOh take

Stop rebuilding the click trail. Ask, then compare.

Every quarter we see teams spend weeks trying to rebuild click-level attribution that consent was designed to stop. It never closes the gap, and it puts marketing ops at odds with legal. The teams that get clarity do something simpler: they ask the buyer, store the answer on the deal, and report it beside what the system tracked.

That hybrid view is also what holds up when someone outside the team looks hard at the numbers. We've seen attribution data fall apart in diligence for exactly this reason. If you want the self-reported half built, mapped and wired into your pipeline reporting, that's a sprint, not a project.

Further reading: Refine Labs hybrid attribution study, Recast on survey limits, HubSpot hidden form fields, Salesforce Campaign Influence guide.

The 30-second version

  • One required question on high-intent forms
  • Raw text plus a mapped dropdown
  • Workflow or flow does the mapping
  • Stamp it on the deal at creation
  • Report both views on closed-won