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.
| Tool | New campaign mid-visit starts a new session? | What the session is credited to | What the sale is credited to |
|---|---|---|---|
| GA4 | No. 30 minutes of inactivity, no length limit | Whatever came in on session_start | The attribution model you select. Data-driven by default |
| Universal Analytics (legacy) | Yes, “even if an existing session is still open” | The campaign of each session | The session it happened in |
| Matomo | Yes, including “updated campaign parameters or advertising click IDs” | The campaign of each visit | The visit it happened in |
| Adobe Analytics | No. Not among the documented triggers | Your Marketing Channels rules | Your rules, which “process for every hit … not only the first” |
| Plausible | No, by the 30-minute definition | Its guide says an internal UTM “overwrites” the source | Its guide also says sources count “only when they start a new session” |
| PostHog | No. 30 minutes inactive or 24 hours | The UTMs and gclid of the session start page | Not a session property |
| Mixpanel | No. 30 minutes or midnight | The first event where the property is defined | The 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
gclidand noutm_source, so the first event that definesutm_sourceis 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.
| Time | Page | What 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 |
| Report | Sessions | Session source | The sale goes to |
|---|---|---|---|
| Universal Analytics, Matomo | 2 | google / cpc, then homepage / banner | homepage / banner |
| GA4, Traffic acquisition | 1 | google / cpc | google / cpc |
| GA4, attribution, Paid and organic last click | 1 | google / cpc | homepage / banner |
| GA4, attribution, Google paid channels last click | 1 | google / cpc | google / cpc |
| PostHog | 1 | entry gclid set, no entry UTM | (session level only) |
| Mixpanel, default settings | 1 | utm_source = homepage | homepage |
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
- Move internal promotion off UTMs. In GA4, send the banner click as a
select_promotionevent withpromotion_nameandcreative_slot, plus theitemsarray, which the Promotions report needs. You keep the click count and the source stays clean. - 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.
- 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