Attribution
The Attribution page answers the question every ad budget raises: which channels and campaigns actually pay for themselves? It joins two things you give it, the money you spent per channel or campaign, and the conversions your site records, and shows the return side by side under several attribution models. Where the Campaigns page tells you which ads bring visitors, this page tells you which ads bring money.
An attribution model is just a rule for splitting the credit for a sale across the visits that led to it. Different rules can tell different stories, and the honest way to handle that is to show them next to each other rather than pick one for you. When the models agree that a channel earns its budget, that conclusion is safe to act on. When they disagree, you know the answer depends on an assumption, and the page shows you exactly which one.
Before you start: the page needs two feeds
Section titled “Before you start: the page needs two feeds”Conversions. The report counts the conversions you define, like a completed purchase carrying its order value. You set this up once (define what counts as a conversion, then run a model); the page walks you through it the first time you open it. Conversions need the value on the event, the same purchase events the Ecommerce page uses.
Ad spend. Bring spend into leadmaps so it can be compared with the outcomes recorded in your own data. There are three paths:
- Manual entry. Pick a known channel or a validated custom provider, name the campaign, pick the period, enter the total you spent and the currency. A custom provider lets you measure a social network, newsletter, sponsorship, or ad source before a native connector exists.
- CSV upload. Export spend from your ads manager (or keep a spreadsheet), save it as CSV, and upload it. The page links a ready-made template. Required columns:
channel,campaign_name,date_from,cost,currency. Optional columns:external_campaign_id,date_to,impressions,clicks,utm_source,utm_campaign. - Native account sync. In an enabled preview workspace, connect selected Google Ads, Meta Ads, or LinkedIn Ads accounts from the Integration Hub. leadmaps queues the first seven-day import, then rereads the trailing seven days once per day. See Ad-platform connections for permissions, account selection, privacy, and current rollout limits.
Three behaviours worth knowing, because they make the import forgiving:
- A period total spreads evenly across its days. Enter 310 for a 31-day month and each day carries 10, with the split arranged so the days always add back to exactly 310. Reports over any narrower date range then still make sense.
- Importing the same thing twice never doubles your spend. Each campaign-day is stored once and overwritten on re-import. Upload a corrected file and the numbers simply become the corrected numbers.
- A file with any invalid row imports nothing. You get the row numbers and reasons back, fix the file, and upload again. There is no half-imported state to untangle.
Match your campaigns with UTM tags. The report can only tie a conversion to a specific campaign if it can recognise that campaign in the visitor’s traffic. That link is the utm_source + utm_campaign pair. If your ad URLs carry utm_source=google&utm_campaign=spring-sale, fill those two fields when importing spend and the report matches at campaign level. Without them, spend still joins at channel level (all Google Ads spend against all Google Ads conversions), which is coarser but already useful.
Google Ads, Meta Ads, and LinkedIn Ads have recognised provider names. Manual and CSV imports also accept a validated custom provider, so a campaign does not need to wait for a native connection. Automatic account sync remains a provider-gated private preview and is not generally available.
Attribution is workspace-wide. It uses the conversion definitions, linked journeys, and spend owned by the workspace instead of pretending that a workspace model can be narrowed by the dashboard’s current site picker. Date ranges are bounded to 366 days.
What you see
Section titled “What you see”- The model comparison. One row per channel (or per campaign if you switch the grouping), with the spend you imported and then, per attribution model, the revenue that model credits to the row. A toggle switches the per-model figures between revenue, ROAS, and CPA:
- Revenue is the money the model credits to this channel or campaign.
- ROAS (return on ad spend) is that revenue divided by the spend. Above 1 means the row returned more than it cost.
- CPA (cost per acquisition) is the spend divided by the conversions the model credits here, so it is what one conversion cost you.
- The chart. The same comparison as bars, one color per model, so a disagreement between models is visible at a glance.
- The ad spend card. The manual entry form, the CSV upload, and a list of everything you have imported in the selected range: per campaign, its period, day count, total, and whether it matches at campaign level (UTM pair supplied) or channel level. The remove action deletes only that campaign’s day rows inside the visible range. Spend outside the range stays intact, and the UTM mapping stays until no spend history remains.
- Honesty notes, only when they apply. If your spend covers only part of the selected range, the page says so, because missing days flatter ROAS. If a row contains more than one spend currency, leadmaps keeps separate currency totals and does not show ROAS or CPA unless the inputs have one compatible currency. If some models have no computed results yet, the page offers to compute them for the visible range rather than quietly showing zeros.
The models
Section titled “The models”- First touch. All credit to the channel that first brought the visitor. Answers “what starts relationships?”
- Last touch. All credit to the last channel before the conversion. This is the default in most ads tools, so it is the number your ad manager probably shows you.
- Linear. Credit split evenly across every touch on the path.
- Position based. Most credit to the first and last touch, the rest shared across the middle.
- Shapley. A sampled game-theory estimate that distributes credit from the observed journey combinations in your data. It is a model result, not proof that a channel caused a conversion.
- Data-driven (Markov). Estimates how credit changes when an observed channel is removed from the journey model. It is based on your recorded paths and is not a controlled causal experiment.
Where the journeys come from, stated plainly. Each conversion looks back across the ordered sessions linked to that known person. That means the first campaign, later return visits, and the final campaign can all take part in the model. Before somebody is identified, leadmaps keeps visits pseudonymous; once the person identifies with permission, their explicitly linked sessions can form one journey. Unrelated visitors are never joined just because they look similar.
How to read it
Section titled “How to read it”Say you imported July spend for two campaigns and pick July as the range:
- Spring Sale (Google Ads): spend 1,250, revenue 3,000 under last touch. ROAS 2.40.
- Retargeting EU (Meta Ads): spend 900, revenue 450 under last touch. ROAS 0.50.
Spring Sale returned 2.40 for every 1 spent; Retargeting EU returned half of what it cost. Before killing the retargeting campaign, switch the metric to CPA and check the other models once they have results: a campaign that looks poor on last touch can look better under models that credit earlier touches. If it stays below 1 under every model, the campaign is not paying for itself in the window you are looking at, and the budget is better moved to the row with the strong ROAS.
Use cases
Section titled “Use cases”- Monthly budget review. Import last month’s spend per campaign, set the range to last month, group by campaign, and sort out which rows sit below ROAS 1 under every model. Action: move budget from the rows every model agrees are losing toward the rows every model agrees are winning.
- Check what your ads manager claims. Ad platforms grade their own homework with their own conversion counting. Import their spend, compare their claimed return against what your own conversion data says under last touch. Action: where the two disagree badly, trust the one counting your actual orders.
- Prove a channel deserves scale. Before doubling a budget, confirm its ROAS holds under every model, not just the default one. Action: scale the campaigns whose return does not depend on which attribution rule you pick.
- The report is only as complete as the spend you import. A missing week of spend makes that week’s ROAS look infinite. The page warns you when spend covers only part of the range; take the warning seriously before drawing conclusions.
- A native connection imports only the current UTC date and previous six UTC dates. Backfill older history with manual entry or CSV, and avoid importing dates already covered by native sync because spreadsheet and provider rows cannot always be identified as the same charge.
- Read each currency separately. leadmaps does not add EUR, USD, or another currency into one total and does not invent an exchange rate. Filter or compare the currency groups independently.
- Tag your ad URLs with
utm_sourceandutm_campaign, and supply the same pair when importing spend. Campaign-level answers are far more actionable than channel-level ones. - Zero conversions on a row with real spend is itself an answer: that campaign bought traffic that never converted in the window. Check the landing page before blaming the ad.
- Removing an imported campaign from the selected range removes only its matching day rows from reports for that range. History outside the range remains. Re-import at any time; matching campaign-day rows are replaced instead of doubled.