Attribution & the marketing funnel

The full-funnel view from impressions to closed deals, with true ROAS and channel breakdowns.

I'm using the platform as a
All help topics

The Attribution tab is where the platform earns its name. It stitches your ad spend, website behaviour and CRM deals into a single funnel, so you can see what's actually driving revenue - not just what each ad platform claims.

Attribution on your own dates

Everything below describes the tab on the last 7, 30 or 90 days. If you pick your own dates in the date control, and your revenue comes from Manual Uploads, the tab shows a shorter view instead: revenue from the channels you pay for, what you spent, and your blended ROAS for exactly those dates - worked out the same way as on the fixed periods, so the two never disagree about what the figure means. The funnel, the channel table, your wins and losses and tracking health are only worked out for the fixed periods, and the view links you back to them. See Custom date ranges.

If your revenue comes from a connected CRM, the tab keeps showing the last 30 days when you pick your own dates, and says so.

How the tab is ordered

The tab reads top to bottom as five numbered sections, so you can stop wherever you have what you need:

  1. What happened - a plain-English read on the period, then the six headline numbers behind it. If you only read one thing, read this.
  2. Where it came from - spend against revenue per channel, click-to-deal conversion, any off-platform spend you've logged, and the acquisition funnel.
  3. How far to trust it - your UTM health, the touchpoints the funnel can't see (AI Search), and the paid halo below.
  4. What it's worth - the verdicts: best and worst ROAS channel, customer payback, owned channels, and your biggest wins and losses.
  5. Every channel, side by side - the full sortable table, deliberately last. The sections above already say what it means.

A section only appears when you have the data for it, so a newer account sees a shorter page rather than empty headings.

Attribution confidence

Directly under the tab title sits a panel called Attribution confidence. Read it before the numbers, because it says how far they can be trusted given what you have connected. Attribution is only ever as good as the data behind it, and this grades that honestly rather than presenting every number with the same certainty.

There are four levels, shown as a checklist: each row is a level, what it needs, a tick if you have it, and the figure it was judged on (for example "74% tracked"). The first level you have not reached carries the one thing to do. Nothing else is listed, so you can see at a glance why you are on the level you are on.

  1. Platform-claimed - you have ads running but no CRM or online shop connected. These are the numbers each ad network reports about itself, and networks routinely claim the same conversion, so totals can overlap. Useful for spotting trends, not for counting revenue.
  2. Modelled - a CRM or online shop is connected, but either your campaign links are thinly tagged or your closed revenue is not landing on channels the platform can name. The channel split is estimated for the untagged part.
  3. CRM-validated (or Order-validated for an online shop) - a CRM or online shop is connected, tagging is healthy and revenue maps to real channels. The numbers reflect your own closed deals or orders rather than ad-network estimates.
  4. Full multi-touch - crediting every visit a customer made before buying, not only the first or the last. It sits on top of level 3, and it needs the visits themselves to be recorded, which depends on where your revenue comes from:
    • Shopify records the visits before each order. You reach this level when at least 70% of the orders in the period carry a recorded journey. Until then the panel shows how many do. Orders made in your Shopify admin, as draft orders or at a point of sale carry no visits, because nobody browsed your store to place them.
    • HubSpot, Salesforce, GoHighLevel, WooCommerce and sales you log by hand record one or two sources for each deal or order, not the visits in between. For these the row is marked Soon and says so in place of a step, because nothing you change in your own account will reach it yet.

An ad account that is connected but running nothing reads Connected, nothing running yet on level 1, not "None connected", and its step says there is nothing to connect: spend and clicks appear once a campaign is live and the account reports them. Level 3 likewise tells apart revenue that landed on no named channel from no closed revenue this period.

Your brain knows your level and the next step too, so you can ask it "how do I get multi-touch attribution?" in the dashboard chat, on Slack or through Connected AI and get the same answer the panel shows.

The platform will never split revenue across visits it did not actually observe. How long a customer's journey is does not affect your level: a shop where most people buy on their first visit has complete journeys that happen to be short.

The levels are named for how far the figures can be trusted, not for a way of crediting channels. Which channel gets the credit is a separate choice, covered under First-touch vs last-touch below.

Every headline number also carries its own short tag, because they do not all depend on the same thing. Deals Won is a straight count out of your CRM and is exactly as reliable whether your tagging is thin or perfect, so it is marked differently from Blended ROAS, which does depend on the channel split.

Below the level you will find one or two specific things to fix, each with the step that fixes it. Working through those is what moves you up.

Imported contacts

A contact you imported from a spreadsheet, or typed into your CRM by hand, is tracked: the platform knows exactly how it arrived, and it counts towards your tracked-source figure. It appears as its own channel, Imported or Added by hand, and is never credited to your marketing.

It does not count towards your level. An import records how a contact reached your CRM, not how they found you, so it says nothing about whether your campaign links are tagged. The level is worked out on the contacts a tag could have been on, with imports left out of both sides of the sum. So a large import neither lifts your level nor drags it down. When imports have been left out, the panel says "imports aside" next to the percentage.

If every new contact in a period was imported, there is no tagging to grade, and the panel tells you that instead of quoting a percentage. This applies to GoHighLevel and HubSpot, which can tell an import apart from other contacts.

If nothing closed in the period at all, the panel says No closed revenue in this period rather than asking you to fix your tracking. There is nothing to split across channels yet, and a longer period may show more.

The funnel

Attribution reconciles platform spend (Google, Meta, TikTok, and so on) plus any off-platform spend already logged (the Budget tab, where it is logged, is coming soon), then maps the journey:

Impressions - clicks - sessions - leads - deals

Each step shows the numbers and the drop-off, so you can spot where the funnel leaks.

True ROAS

Because deals come from your CRM, the platform can show blended ROAS and tie revenue back to the channels that sourced it - a far more honest number than platform-reported conversions, which tend to over-claim.

Blended ROAS here means revenue from the channels you pay for, divided by what you spent on ads, across all your paid channels combined. Revenue that your CRM attributes to unpaid sources - referrals, organic search, direct visits, email - is deliberately left out, because your advertising didn't pay for it. That keeps the number honest: it reflects what your ad spend actually brought in, not word-of-mouth you'd have won anyway. The figure shows the exact sum it's built from, so you can always see the revenue and the spend behind it. A paid channel that brings in no tracked revenue still counts in your spend, so an untagged campaign shows up as a lower number rather than quietly disappearing.

First-touch vs last-touch

A model switcher sits above the funnel, alongside the channel filter. These controls stay pinned under the header as you scroll, so you can change the model or the channel while looking at the numbers it changes. On a phone they are one row that says what is showing, with a Change button that opens the source, the model and the channel as a list; pick as many as you like, then tap Done. The switcher re-credits channel revenue and ROAS across the whole tab - the funnel, the channel table and the spend-vs-revenue chart - so you can ask two different questions:

  • First-touch (the default) - which channel introduced the contact?
  • Last-touch - which channel was present when the deal closed?

What you see depends on where your revenue comes from:

  • HubSpot records distinct first and last sources (hs_analytics_source vs hs_latest_source), and Shopify records the first and the last visit before each order, so both views are genuinely different.
  • GoHighLevel records a first and a latest source on each deal, collected automatically, so nothing needs setting up. The switch appears when at least one deal in the period has a latest source of its own. When none does, the tab shows "Single-touch (first = last)".
  • Salesforce, WooCommerce and sales you log by hand store a single source per deal or order, so there is no switch. The tab shows "Single-touch (first = last)" instead, because both would return the same numbers.

The three journey models

At level 4 of Attribution confidence the switcher gains three more models. Each shares the credit for a sale across the visits recorded before it, rather than giving all of it to one:

  • Linear - every visit gets an equal share.
  • Position-based - 40% to the first visit, 40% to the last, and the rest shared across the visits in between. With two visits it is an even split.
  • Time-decay - the closer a visit was to the sale, the more credit it gets. A visit a week earlier counts half as much.

They appear only when you are on level 4, so today that means a Shopify store where at least 70% of orders carry a recorded journey. Below that the switcher shows first-touch and last-touch only, and the panel tells you how many orders carry a journey. A locked button is never shown for a model your data cannot support.

Three things hold on every model:

  • Total revenue never changes. A model moves credit between channels. It never adds or removes revenue, orders or deals. ROAS does move, because it counts only the revenue your paid channels are credited with, and a model can move credit from a paid channel to an unpaid one such as email. So on this tab ROAS follows the model you have chosen. On Overview and Today it is always worked out on first-touch, so those figures stay put whatever you pick here.
  • A direct visit is counted, and takes no credit. Someone who typed your address was brought there by something, and "direct" only records that nobody knows what. So the credit is shared among the visits that came from somewhere. A customer whose every visit was direct still lands on Direct.
  • One visit means one answer. When a customer buys on their first visit there is nothing to share out, and every model gives that order to the same channel. Under the switcher the tab tells you what share of journeys are a single visit, so you know how far apart to expect the models to be.

First-touch and last-touch follow the same rule. First-touch is the earliest visit that came from somewhere and last-touch is the latest, so a journey that opened with a direct visit and then came through an ad is credited to the ad on both. Where a source records only a first and a last point, as HubSpot and GoHighLevel do, a direct end gives way to the end that names a channel. An order or deal whose every recorded visit was direct still reads Direct.

An order with no recorded visits - one made in your shop's admin, for example - is never split. It goes whole to the channel first-touch gives it.

If you also have an online shop

If you've connected an online shop as well as a CRM, a Revenue from: Online shop / Sales team switch appears near the top of the tab. It chooses which source the page analyses - the funnel, the channel table, the orders or deals tile, cost per acquisition and payback - so you always see one clear journey rather than two mixed together. With only one source, there's no switch.

On the Online shop view, the words follow the shop: Orders instead of deals won, cost per new customer (a repeat order isn't an acquisition), payback on the first order, no pipeline, and a funnel that ends at orders, split into new and returning customers. The confidence panel grades your shop's orders the same way it grades CRM deals.

Switching between the two leaves every card where it was, so you can compare the same card across both. A card that only one source has, such as UTM health (worked out from contacts, which a shop doesn't hold) or the list of biggest deals, keeps its place on the other view and says Not part of the Online shop view or Not part of the Sales team view, with the reason. Switching sources clears the channel filter and returns to first-touch.

The Total Revenue and Blended ROAS tiles always show your combined figure, whichever view you pick, so they match Today and Overview. The line under Total Revenue names each part.

Does your CRM also record your shop's orders? Some CRMs copy every online order in as a deal, and adding the two would count those sales twice. So we check before adding them, every time your data refreshes:

  • If your CRM's won deals are far bigger than your shop's orders and none is named like an order (the way shop integrations name the deals they copy in, such as "Order #1043"), they're treated as separate sales and added together. The card at the top of the tab says what was compared.
  • If some deals are named like orders, or your deals are about the size and number of your orders, the CRM's revenue is shown beside your shop's, not added to it, and the card asks you to confirm.
  • If there isn't enough to tell - for example your CRM doesn't list its deals by name - we treat it as "not sure" and keep them side by side.

Your own answer always wins over the check. Answer No - they record different sales and both are added together; answer Yes and only your CRM's other deals are added. You can change it at any time, here or in the Online shop section of Setup.

When your paid spend moves and your direct traffic moves the same way in the same window, some of that "direct" is almost certainly ad-driven: people who saw an ad, then came back later by typing your address or searching your name. Analytics records them as Direct visits, so your ads look less effective than they really are. The platform calls this a paid halo and raises it as a card on this tab (and, when it's the strongest thing you have waiting, as the flagship insight on Today).

It's deliberately hard to trigger. All of these have to be true:

  • Paid spend moved by at least 20%, and by at least 500 in your currency.
  • Direct sessions moved by at least 10%, and by at least 50 sessions.
  • Direct outpaced every other channel combined by at least 8 percentage points, worth at least 50 sessions. This is the test that matters: on a growing site everything rises together, so a direct rise that merely keeps pace with your organic and paid traffic is not evidence of anything, and no finding is raised.
  • Direct gained (or lost) at least a full point of your traffic mix. Smaller drift is treated as noise.
  • The two periods are comparable: your traffic sources have to account for at least 80% of your recorded sessions, and channels that appear from nothing may be no more than 20% of traffic. Otherwise the comparison is a tracking change rather than a real shift, and it's refused.

It's labelled Estimated and its confidence is capped at 70%, because this is a correlation between two periods, not user-level tracking. It is a strong prompt to go and check, never a proven fact.

Crucially, only the unexplained part is ever priced. If direct rose 800 sessions and the rest of your site grew enough to account for 500 of them, the finding is about the remaining 300 - not the headline 800.

The full breakdown

See the full breakdown on either card expands the evidence in place - it doesn't take you anywhere:

  1. What we compared - both windows side by side: spend, direct sessions, direct's share of traffic, and direct measured against the rest of your site. That last figure is what makes it a finding rather than a coincidence.
  2. Where the money actually moved - spend per ad platform, and what share of the total move each one is responsible for. The headline says "paid spend rose 31%"; this says who did it.
  3. How the whole traffic mix moved - every channel's sessions and share, before and after, with Direct highlighted. This is the evidence the finding rests on: direct rising means little if everything rose.
  4. What it's worth if it's true - the unexplained direct sessions (not the headline rise), priced at direct traffic's own conversion rate, at 25%, 50% and 100% credit. Where your ad platforms report conversions, it restates your cost per conversion for each case. If your analytics doesn't report conversions against direct traffic, this section says so rather than inventing a number.
  5. Why we think this - each of the tests above, replayed against your actual numbers, plus how the confidence score was arrived at.
  6. What would change our mind - the things that should make you discount it, such as branded search staying flat over the same dates, or a PR hit or email send that explains the rise on its own.
  7. What to do next - in order of effort, and only ever pointing at tabs you actually have.

If you disagree with the finding, use Is this right? on the card. Corrections go to the Brain and change what it tells you next time, rather than being filed away.

Filters and breakdowns

  • Channel menu - in the bar at the top of the tab, pick a channel (paid, organic, email, etc.) to filter the funnel to it, and Clear to go back to all channels. While a channel is picked, a line under the bar names it, and sessions and contacts are estimated proportionally and labelled "Estimated". The channel stays picked when you change the attribution model. The plain-English summary at the top always describes the whole period, so while a channel is picked it is set back and marked All channels.
  • Nothing moves when you compare - every model lists the same channels in the same order, so you can watch one row change as you click between models. A channel that a model gives no credit to is shown reading zero, not removed: email may have introduced nobody and still closed a third of your sales. If a card cannot be worked out for the channel you picked, such as customer payback for a channel with no ad spend, it keeps its place and says why.
  • Channel table - ROAS, cost and contribution per channel, including owned channels like email. Each row shows revenue and what it was last period, plus a share of change column: how much of the total swing in revenue that one channel is responsible for. A table of current values can tell you what happened; that column tells you who did it.
  • Export CSV - the channel table exports in full, in the order you sorted it, with CPC and any off-platform spend added as columns of their own. See Exporting a table to CSV.
  • Pipeline view - blended ROAS against your open pipeline, not just closed revenue.

What it needs, and when the tab appears

The tab appears as soon as there is something to attribute - either an ad platform actually reporting spend or impressions, or a CRM alongside a connected ad account. An ad account that is connected but has never run anything does not open the tab, because there would be nothing under the headings.

So a client running ads with no CRM yet does get the tab, at Platform-claimed. That is deliberate: it is exactly the point at which it is worth knowing the numbers are the ad networks' own, and what to connect to fix it.

Attribution is at its fullest when you have:

  • At least one ad platform reporting spend.
  • A CRM (for deals and revenue).

If something's missing you'll see a "connect this" prompt rather than a broken chart. Keeping your UTMs clean makes the channel split much sharper - the CRM tab shows a UTM health score to help.