TrackingDesk

analytics·attribution

GA4 keeps the session but gives your banner the sale

Published 2026-11-09

The standard warning about UTM parameters on internal links is that they break the visit in two. That was true of Universal Analytics. In GA4 it is false, and the damage moved somewhere harder to see.

Tag a homepage banner and GA4 keeps one session, credited to the ad that brought the visitor. Its attribution reports give the sale to the banner. The same property, the same purchase, two answers, depending on which report you open.

What seven tools do with a new UTM mid-visit

From each vendor’s own documentation, read on 9 November 2026.

ToolNew campaign mid-visit starts a new session?What the session is credited toWhat the sale is credited to
GA4No. 30 minutes of inactivity, no length limitWhatever came in on session_startThe attribution model you select. Data-driven by default
Universal Analytics (legacy)Yes, “even if an existing session is still open”The campaign of each sessionThe session it happened in
MatomoYes, including “updated campaign parameters or advertising click IDs”The campaign of each visitThe visit it happened in
Adobe AnalyticsNo. Not among the documented triggersYour Marketing Channels rulesYour rules, which “process for every hit … not only the first”
PlausibleNo, by the 30-minute definitionIts guide says an internal UTM “overwrites” the sourceIts guide also says sources count “only when they start a new session”
PostHogNo. 30 minutes inactive or 24 hoursThe UTMs and gclid of the session start pageNot a session property
MixpanelNo. 30 minutes or midnightThe first event where the property is definedThe UTM on the event, persisted by default

Amplitude is not in the table. Its Browser SDK pages did not render the attribution settings on the day.

Three things in that table are worth naming:

  • Only the retired tool and Matomo still split the visit. The advice to keep UTMs off internal links was written for the rule in the second row. Most tools in use now keep the visit whole.
  • Plausible’s own guide gives both answers. Within one page, an internal UTM overwrites the session’s source, and sources are counted only when a session starts. Its metrics page says a visit lasts 30 minutes; the guide says one day. Test it on your own site before trusting either.
  • Mixpanel can hand the whole session to the banner. Session properties come from the first event where the property is defined. A Google Ads click with auto-tagging carries a gclid and no utm_source, so the first event that defines utm_source is the banner click.

One visit, run through each rule

We built one visit and ran it through each tool’s documented rules with a short script. Nothing in it waits long enough to time out, so every difference below comes from a campaign rule.

TimePageWhat the URL carries
10:00/running-shoes/gclid from a Google Ads click (auto-tagging, no UTMs)
10:06/black-friday/utm_source=homepage&utm_medium=banner, from the homepage banner
10:11/running-shoes/trail-2/nothing
10:18/checkout/thanks/nothing. The purchase
ReportSessionsSession sourceThe sale goes to
Universal Analytics, Matomo2google / cpc, then homepage / bannerhomepage / banner
GA4, Traffic acquisition1google / cpcgoogle / cpc
GA4, attribution, Paid and organic last click1google / cpchomepage / banner
GA4, attribution, Google paid channels last click1google / cpcgoogle / cpc
PostHog1entry gclid set, no entry UTM(session level only)
Mixpanel, default settings1utm_source = homepagehomepage

GA4’s Traffic acquisition report uses session-scoped dimensions, which “represent what originated the session” and ignore your attribution setting. The attribution reports use event-scoped dimensions, which credit the key event through the model you select. A banner tag is not direct traffic, so every model counts it as a touch. Under last click it is the last one, and it takes 100% of the purchase.

The default, data-driven, splits the credit by weights Google does not publish, so we cannot compute it. Google’s own help page runs nearly this case. A user on a session from a Search ad clicks a link tagged utm_source=internal_promotion. In Google’s illustrative split, the tagged link ends with 1 key event and the paid search click with 0.6. The next direct session is labelled with the link’s values too, because GA4 attributes a direct session to the user’s last campaign. The example labels the tag partner / affiliate, which shows how easily an internal link gets filed as a channel.

What the reports count, and what they miss

The two GA4 reports disagree because they count different things, and neither one is wrong:

  • Traffic acquisition counts what started the session. It never sees the banner, so it cannot tell you the banner was clicked.
  • Attribution counts touches on the path to a key event. It sees the banner as a channel, so the ad’s share of the sale shrinks without any change to the ad.

The ad platform sees neither. A conversion counted by the Google Ads tag is matched to the Google Ads click, so it does not move. The gap appears only inside GA4, between the acquisition view and the attribution view, and it reads as “paid search is converting worse” when the sale did not change.

The same thing can happen on the server side. Google warns that purchases sent through the Measurement Protocol with UTM values next to an existing gclid can be credited “to UTM instead of the expected Google Ads (google/cpc) source”.

What to do differently

  1. Move internal promotion off UTMs. In GA4, send the banner click as a select_promotion event with promotion_name and creative_slot, plus the items array, which the Promotions report needs. You keep the click count and the source stays clean.
  2. Read both GA4 views before blaming a channel. If a channel’s sales in Traffic acquisition and in the attribution reports diverge, check the paths in Key event paths for your own domain’s tags.
  3. Check your tool’s actual rule. In Mixpanel, set stop_utm_persistence: true. In Adobe, look for a query-string rule that matches on internal pages. In Matomo, the tag still splits the visit.

The banner took the sale under last click and lost it under Google paid channels last click, inside one property. Google Ads, GA4 and LinkedIn all offer a last-click model too. Do they mean the same click?

Sources

  • Google Analytics 4: by default a session ends after 30 minutes of user inactivity, and there is no limit to how long a session can last. The session_start event carries the information that determines the attribution of the session, such as the gclid, UTM parameters and referrer. verified 2026-11-09
  • Google Analytics 4: session-scoped dimensions (prefixed 'Session') represent what originated the session and appear in the Traffic acquisition report. Event-scoped dimensions attribute credit for key events, using the attribution model selected in the property, data-driven by default; their source and medium for non-key events are '(not set)'. User-scoped and session-scoped dimensions use the paid and organic channels last click model and are unaffected by the attribution model setting. verified 2026-11-09
  • Google Analytics 4 help example: in the middle of a session that started from a Google Search ad, the user clicks a link with utm_source 'internal_promotion'. The session stays google / cpc. The next session, opened from a bookmark, is attributed to the UTM values, shown as partner / affiliate. In the illustrative data-driven split, partner / affiliate receives 1 key event and google / cpc 0.6. verified 2026-11-09
  • Google Analytics 4: when sending purchase events through the Measurement Protocol, avoid including manual campaign details such as utm_source, utm_medium and utm_campaign unless they reflect new campaign interactions. Including them alongside existing GCLID values can attribute events to the UTM instead of google / cpc. verified 2026-11-09
  • Google Analytics 4 attribution: Paid and organic last click ignores direct traffic and attributes 100% of the key event value to the last channel the customer clicked through before converting. Google paid channels last click attributes 100% to the last Google Ads channel clicked, and falls back to Paid and organic last click when there is no Google Ads click in the path. All models exclude direct visits unless the path consists entirely of direct visits. verified 2026-11-09
  • Universal Analytics (legacy article): every time a user's campaign source changes, Analytics opens a new session. Even if an existing session is still open, with less than 30 minutes elapsed, a campaign change mid-session closes the first session and opens a new one. The campaign updates when the user arrives through a search engine, a referring website or a campaign-tagged URL. verified 2026-11-09
  • Matomo starts a new visit by default when a visitor arrives through a new campaign source, including updated campaign parameters or advertising click IDs, after 30 minutes of inactivity, and when browsing continues past midnight in the website's time zone. verified 2026-11-09
  • Adobe Analytics: a visit ends after more than 30 minutes between hits, after 12 hours of continuous activity, after 2,500 hits, or when there are more than 100 hits in the first 100 seconds. Adobe lists deleting cookies, a tab left open over 30 minutes, another browser and another device as actions that start a new visit; a change of campaign is not on the list. verified 2026-11-09
  • Adobe Analytics Marketing Channels: processing rules run on every hit a visitor makes on the site, not only the first hit of the visit. Direct and Internal (Session Refresh) only get last-touch credit if they were also the first-touch channel. verified 2026-11-09
  • Plausible metrics definitions: a visit starts when a visitor first lands on a page and ends when no action is taken for 30 minutes. verified 2026-11-09
  • Plausible UTM tracking guide (updated 21 April 2026): UTM parameters on internal links overwrite the original referral source for that session, and a visitor who arrived from a newsletter appears as a new direct visit. The same guide says referral sources are counted only when they start a new session, and that Plausible's session length is one day. verified 2026-11-09
  • PostHog: events from the same user, browser and device share a $session_id until there is no activity for 30 minutes or the session reaches the 24-hour maximum. Session properties $entry_utm_source, $entry_utm_medium and $entry_utm_campaign are the UTM values of the session start page, and $entry_gclid is the Google Click ID when the session started. verified 2026-11-09
  • Mixpanel timeout-based sessions: the default timeout is 30 minutes and sessions reset at midnight in the project time zone. Properties on the Session Start and Session End events are attributed to the first event in the session in which the property is defined; utm_source, utm_campaign and utm_content are in the default list. verified 2026-11-09
  • Mixpanel JavaScript SDK: UTM parameters present on the page are added automatically to events fired from that page load, and are by default persisted across events as super properties. The stop_utm_persistence: true initialization option disables that persistence; Mixpanel calls it the recommended modern behavior. verified 2026-11-09
  • Google Analytics 4 recommended events: select_promotion signifies a promotion was selected from a list, with the parameters creative_name, creative_slot, promotion_id and promotion_name. Without the items array, some reports, such as the Promotions report, do not include the promotion event. verified 2026-11-09