HubSpot has three attribution reports, and they answer three different questions: which interactions created contacts, which created deals, and which led to closed-won revenue. Each one reads the same interaction history, but each needs different records to be in place before its numbers mean anything. Most "HubSpot attribution is wrong" complaints I see come from reading one report as if it were another, or from a report built on deals with no contacts attached.
This post is the hands-on version. If you want the overview of how tracking, sources and models fit together, start with the HubSpot attribution guide. Here I go through the reports themselves: how to build each one, what it counts, how the same deal gets different credit under different models, and how to check a report before you put it in front of anyone.
The three report types
HubSpot frames them as a funnel: contact create at the top, deal create in the middle, revenue at the bottom. Just remember each has its own date filter and its own requirements.
| Report | Question it answers | Tier | What it needs |
|---|---|---|---|
| Contact create attribution | Which interactions led to new contacts? | Marketing Hub or Content Hub Professional and Enterprise | Contacts with tracked interactions before creation |
| Deal create attribution | Which interactions led to new deals? | Marketing Hub Enterprise | Deals associated with contacts, and those contacts' interactions |
| Revenue attribution | Which interactions led to closed-won revenue? | Marketing Hub Enterprise | Closed-won deals with Amount, Create date and Close date, and at least one associated contact |
Note on names: HubSpot's report builder now calls the last one Deal Revenue Attribution. Older dashboards and most blog posts still say Revenue Attribution. Same report.
Contact create attribution
This is the only one Professional portals have. It credits the interactions a person had before they became a contact. The interaction positions are first interaction (usually the first visit), last interaction (the last touch before the contact was created) and lead create. In attribution reports, "lead" means the contact, not the newer lead object.
Use it for "where do new contacts come from", not "what drives pipeline". A channel full of ebook downloads looks great here and may produce no deals.
Deal create attribution
This credits interactions up to the point a deal was associated with the contact. It adds a deal create position: the contact's last interaction before a deal was associated to them. The association sets it, not the deal's creation, so a contact added three weeks late moves the position you see in drill-downs.
Revenue attribution
This credits interactions on deals that reached a closed-won stage, weighted by Amount. It adds a deal closed-won position: the contact's last interaction before the deal moved to closed won. HubSpot only includes a deal when all of these are true:
- The deal is in a stage marked closed won.
- At least one contact is associated with it.
- Amount, Create date and Close date all have values.
Sales activities (calls, meetings, conversations, replied one-to-one emails) only count when they are associated with both the contact and the deal. One-to-one emails without a reply do not count at all.
How to build each one
The path is the same for all three. In HubSpot, go to Reporting > Reports (behind More in some accounts), click Create report, choose Attribution report in the left sidebar, click Next, pick Contacts, Deals or Revenue as the data source, and click Next again.
Then, in the left panel:
- Chart type. Start with a table. Donut, pie and summary only work with one model and one dimension.
- Attribution model. Select one or more. Each model gets its own column or series, which is what you want for comparison.
- Dimensions. Start with Interaction source. Add Interaction type or UTM Campaign as a second dimension with + Add another dimension.
- Filters tab. Contact create reports filter on Contact create date. Deal create reports filter on Deal create date. Revenue reports filter on Deal close date, and only closed-won deals in that range are counted.
Reports include up to 20 million interactions after sampling. In high-volume portals HubSpot samples page views and email interactions, but not form submissions, calls or meetings, so do not use an attribution report to count page views.
Interactions: what gets counted
A model is a rule for splitting credit across a list of interactions. The list matters more than the rule.
For contact create reports, HubSpot counts ad clicks (from connected ad accounts), CTA clicks, form submissions, marketing email clicks, page views on pages with your tracking code, social post clicks from connected accounts, marketing event registrations and attendance, and connected calls. A marketing email click only counts if the email went to the contact's primary email address.
For deal create and revenue reports you choose the list. Go to Settings > Tracking & Analytics > Attribution. The Revenue attribution tab and the Deal create attribution tab each have a toggle per interaction type. Some are off by default, including marketing event attendance and registration, media plays and sequence enrollment. If your company sells through webinars and events and nobody switched those on, your revenue report has never seen them. After you save, HubSpot reprocesses existing reports, which its documentation says can take up to two days.
Each interaction is also given a source. Page views and forms take the source of the session they happened in, so a form filled during a session that started from a Google Ads click is Paid Search. Calls, meetings, sales email replies and conversations are Sales. Email clicks are Email marketing. A contact created outside a tracked visit (import, integration, manual creation) is Offline sources.
One deal, eight interactions, five answers
To show why the same deal looks different under each model, here is an illustrative journey. It is made up for this post, not taken from a client. One contact, one $30,000 deal that closes on day 110.
| # | Day | Interaction | Source | Position |
|---|---|---|---|---|
| 1 | 1 | LinkedIn ad click | Paid Social | First interaction |
| 2 | 10 | Blog post view | Organic Search | |
| 3 | 20 | Guide download form | Organic Search | Lead create |
| 4 | 35 | Nurture email click | Email marketing | |
| 5 | 60 | Pricing page view | Direct Traffic | |
| 6 | 61 | Demo request form | Direct Traffic | Deal create |
| 7 | 80 | Discovery call | Sales | |
| 8 | 100 | Case study email click | Email marketing | Last interaction |
HubSpot's report builder currently offers five models: First Touch, Last Touch, Linear, Time Decay and Empirical. Here is the revenue credit for three of the interactions under each:
| Model | LinkedIn ad (#1) | Discovery call (#7) | Last email (#8) |
|---|---|---|---|
| First Touch | $30,000 | $0 | $0 |
| Last Touch | $0 | $0 | $30,000 |
| Linear | $3,750 | $3,750 | $3,750 |
| Time Decay (7-day half-life) | about $1 | about $3,500 | about $25,400 |
| Empirical | depends on your portal's history | depends on your portal's history | depends on your portal's history |
The ad that started the journey is worth anything from $30,000 to a dollar. The data did not change, only the question.
Empirical has no fixed split. HubSpot says it weighs interaction types by how often they occur across conversion paths in your portal: rarer types get more weight, and every interaction of the same type gets equal weight. In most B2B portals page views and email clicks are the common types. In this journey that would tilt credit toward the single ad click, the two form submissions and the call, and away from the two page views and the two email clicks, which share their type's weight equally.
Now break it. Say the demo form at step 6 was an embedded form that lost the session, which is common enough to have its own page on UTMs missing from HubSpot forms. Or say the LinkedIn click landed with no cookie because the visitor declined the banner. Interaction 1 disappears, or turns into Direct Traffic. Every model above then hands Paid Social zero, and no model choice brings it back.
Choosing a model for B2B
Until 2026 HubSpot also offered U-shaped, W-shaped, J-shaped, inverse J-shaped and full path models. HubSpot's report documentation now says Empirical replaces the shaped models, and full path is no longer listed. Old saved reports may still show their names.
How I think about each of the five with a long sales cycle:
- First Touch. Good for "what brings new buyers in". Pair it with Last Touch, never use it alone.
- Last Touch. Good for "what tips people over". With long cycles it over-credits nurture emails, retargeting and Direct Traffic, because those are what happens last.
- Linear. Easy to explain, rarely useful on its own. Ten page views outweigh one demo request.
- Time Decay. Misleading for B2B with cycles longer than a few weeks. The 7-day half-life means anything from the first month of a long deal is close to zero.
- Empirical. The closest thing to a weighted model HubSpot now has. It rewards distinctive interactions such as form submissions, calls and ad clicks over repeated page views. The catch is that the weights come from your own data, so they inherit its gaps. If your reps log one call in five, the logged calls look rarer and weigh more. If you switch an interaction type on or off in attribution settings, the weights move.
My default: First Touch and Last Touch side by side, with Empirical as the third column once the inputs are clean. If the three tell the same story, the story is probably real. If they disagree, the disagreement is the finding.
The data these reports need
Attribution reports do not fix data, they multiply it. Four things decide whether a report is worth reading.
Source capture. If UTMs, click IDs or the visitor cookie are lost before HubSpot reads them, the first interaction is missing or labelled Direct. Then every model starts from the wrong place. If Direct is a large share of your interactions, start with why HubSpot shows so much Direct traffic, and for multi-domain journeys check HubSpot cross-domain tracking.
Association hygiene. Deal create and revenue reports only see deals through their contacts. A closed-won deal with no contact is invisible. Calls and meetings logged on the company but not the deal do not count.
Offline touches. Events, partner introductions and conference meetings are not on the path unless they are in HubSpot: as marketing events (and switched on in attribution settings), as logged meetings associated with the deal, or as a campaign the contact is tied to. The same closed-won data is also what ad platforms need to optimize for pipeline, which is the work behind sending real conversions back to Google Ads, Meta and LinkedIn.
Direct and Offline sources share. Look at both before trusting any channel number. Offline sources means the contact was created without a tracked visit: import, integration, API or manual creation. HubSpot now points to the Record source and Record source detail 1 properties for the detail. A large Offline share usually means a sales tool or integration creates contacts before they convert on the site, so their web history never joins up. If you are comparing these numbers with GA4, read why GA4 and HubSpot numbers don't match first. For how the two source properties differ, see Original Source vs Latest Source.
Common misreads, and how to spot each one
1. Treating Direct Traffic as a channel. A report where Direct earns a big share of revenue is usually a capture problem, not loyal buyers typing your URL. Spot it: add Interaction source as a dimension and Interaction URL as a second one. If Direct credit clusters on one form page or one domain, that is the leak. Finding the Direct traffic leak walks through the tests.
2. Revenue total lower than what you closed. Deals missing a contact, an Amount or a Close date drop out without warning. Spot it: compare the report total with a normal deal report summing Amount for closed-won deals with the same close dates.
3. Reading Empirical shifts as channel shifts. Empirical weights come from your portal's history, so they move when logging habits or attribution settings change, even if your marketing did not. Spot it: put Linear and Empirical in the same table with Interaction type as the dimension. If one rare type, such as calls or event attendance, takes a much larger share under Empirical, check how consistently it is logged before you credit its channel.
4. Comparing reports with different date filters. Contact create filters by contact create date, revenue by close date. A campaign that ran this quarter shows contacts now and revenue two quarters later. Spot it: write the date property under every chart title.
5. A huge "Pages without asset type" bucket. If your site is not hosted on HubSpot, page credit lands there by default. Spot it: use Asset type as a dimension. The fix is a small snippet on each template that sets the content type, and it only applies to new interactions:
var _hsq = (window._hsq = window._hsq || [])
_hsq.push(['setContentType', 'landing-page']) // or 'standard-page', 'blog-post', 'knowledge-article'6. Credit to Sales looks tiny. Calls are usually logged on the contact or company, not the deal. Spot it: open three closed-won deals and check whether their calls and meetings show on the deal timeline, not just the contact's.
A 15-minute sanity check
- Minutes 0 to 3. Note the report type, the date property it filters on and the models selected. Write them on the chart.
- Minutes 3 to 6. For a revenue report, compare its total with a deal report of closed-won Amount for the same close dates. For a deal create report, compare deal counts the same way.
- Minutes 6 to 9. Add Interaction source. Note the share of Direct Traffic and Offline sources. Above what you expect, stop and check capture first.
- Minutes 9 to 12. Open the three largest deals in the report. Each should have at least one contact, and the contacts should have page views and form submissions on their timeline, not just "created by import".
- Minutes 12 to 15. Put First Touch and Last Touch side by side. If one channel is huge in one and zero in the other, open two of its deals and read the interaction path to see why.
To confirm capture on a live page, open DevTools on a tagged landing page and run this in the console. It should print a visitor ID before any form is submitted:
document.cookie.split('; ').find((c) => c.startsWith('hubspotutk='))If it returns undefined after you accepted cookies, the first interaction for that visitor is not being recorded, and no report built on top of it will be right.
If the check turns up more than one of these problems at once, that is usually the point where an Attribution Audit saves time: a read-only review of capture, CRM records and reports, with written findings ranked by cost and a fixed-price fix plan.