Guides · Google Ads
Tracking template or Final URL suffix? What each field does, where UTMs belong, inheritance traps, and copy-paste setups that survive parallel tracking.
Google Ads gives you two fields that both look like “the place tracking goes.” Picking the wrong one is the most common URL mistake on the platform: parameters that work when you paste a URL in a browser but vanish in production, UTMs on some clicks and not others, paid traffic landing as Direct for no obvious reason.
The tracking template controls the URL’s structure. The Final URL suffix controls its parameters.
Only adding UTMs? Use the Final URL suffix. Routing clicks through a redirect or third-party click tracker? You need the tracking template as well.
Full account-level patterns live in the Ideal tracking template setup. Naming and audits: UTM naming conventions, optimise UTM tags, monitor and fix UTM issues.
| Tracking template | Final URL suffix | |
|---|---|---|
| Purpose | URL structure the click travels through | Query parameters on the landing page URL |
Must contain {lpurl} |
Yes | No — {lpurl} does not belong here |
| Typical contents | {lpurl}, or a redirect wrapping {lpurl} |
utm_*, ValueTrack, custom params |
| Survives redirects | It is the redirect (or sits in front of one) | Yes — reattached to the final landing URL |
| Parallel tracking | Only if your tracker supports it | Yes, by design |
| Where UTMs belong | No | Yes |
| Levels | Account, campaign, ad group, ad, keyword, sitelink, asset | |
| Inheritance | Most specific level wins — does not merge | |
| Ad review | No at account / campaign / ad group; ad-level URL edits can trigger review | |
| Built-in test | Yes (Test next to the field) | No |
It is a URL pattern. At click time Google substitutes {lpurl} with your final URL
and sends the user to the result. That makes it the only correct place for anything that must sit
in front of the landing page — redirect click tracker, affiliate hop, similar.
No redirect? A complete production template is one ValueTrack token:
{lpurl}
With a click tracker:
https://track.example.com/click?url={lpurl}&cid={campaignid}
Paste-ready stacks: HubSpot, ClickCease, ClickPatrol, or merge in the template builder.
{lpurl} encodingEncoding depends on where {lpurl} sits — this breaks chained redirects when you guess wrong:
? or = → URL-encoded| Variant | Behaviour |
|---|---|
{lpurl} | Context-dependent encoding |
{unescapedlpurl} | Never encoded |
{escapedlpurl} | Encoded once |
{lpurl+2} | Encoded twice — one redirect hop |
{lpurl+3} | Encoded three times — two hops |
Each hop that re-encodes the destination consumes a layer. Count hops, pick the variant. Full token list: Google Ads ValueTrack reference.
A plain query string — no leading ?:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}
Google appends it to the landing URL and picks ? vs & correctly whether the page
already has a query string.
Two reasons UTMs live here:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={keyword}&utm_id={campaignid}&matchtype={matchtype}&device={device}&network={network}&creative={creative}&targetid={targetid}
Trim to what you report on. Every extra key lengthens the URL and adds something that can be wrong.
Prefer {campaignid} over {campaignname}. IDs are immutable; rename a campaign and
name-based rows split into before/after ghosts in GA4. Resolve IDs to labels in BI or a sheet.
No join layer? Use names and treat renames as data-breaking.
{_name})User-defined ValueTrack variables for values Google cannot derive:
Name: _channel Value: brand-search
Name: _agency Value: inhouse
Name: _lpvariant Value: v3
utm_source=google&utm_medium=cpc&utm_content={_channel}&lp={_lpvariant}
Up to 8 per level, names ≤16 characters, values ≤250. Underscore prefix; names are case-insensitive. Inheritance trap: a more specific level replaces the whole custom-parameter set above — it does not merge. Restate the full set wherever you override.
Both fields can be set at account, campaign, ad group, ad, keyword, sitelink and asset. Most specific wins and overrides completely — no merge.
A keyword-level suffix does not “add to” your account suffix; it replaces it. That is the usual root cause of “half our clicks have no UTMs” — an orphaned ad/keyword override from years ago.
Changing template or suffix at account, campaign or ad group does not send ads back for review. Ad-level URL edits can.
Need a redirect / third-party click tracker?
{lpurl}. Everything else in the suffix.{lpurl} (right encoding for hop count). Suffix: UTMs. Confirm the tracker supports parallel tracking.Need a value ValueTrack cannot provide? Custom parameter → reference from the suffix.
Only want UTMs? Suffix only. Leave template at {lpurl} or empty.
Tracking template:
{lpurl}
Final URL suffix:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={keyword}&utm_id={campaignid}
Tracking template:
https://track.example.com/click?cid={campaignid}&url={lpurl}
Final URL suffix:
utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}
Account tracking template: {lpurl}
Brand B campaign template: https://trackb.example.com/c?url={lpurl+2}
Account final URL suffix: utm_source=google&utm_medium=cpc&utm_campaign={campaignid}
Leave the suffix at account only so both brands inherit the same UTM set.
{lpurl} move to the suffix (drop leading ? / &).| Symptom | Likely cause |
|---|---|
| Params in a browser paste, absent in production | Params in the template eaten by a redirect — move to suffix |
| Some clicks tagged, others not | Orphaned ad / keyword / sitelink override |
google / (not set) in GA4 |
utm_source without utm_medium, or missing suffix on that slice |
| Paid → Direct | Landing / CDN / consent / trailing-slash redirect stripping query strings |
Google / cpc and google / cpc as two rows |
Mixed-case UTM values — enforce lowercase |
page?id=5?utm_source=google |
Hand-appended literal ?; use the suffix so Google joins correctly |
| Template rejected on save | Missing {lpurl} in template, or {lpurl} wrongly in the suffix |
| Empty parameter values | Expected when ValueTrack does not apply (e.g. {placement} on Search) |
| Truncated params | URL too long — drop keys you do not report on |
None of this replaces auto-tagging. Leave it enabled: gclid (and wbraid / gbraid
where privacy requires) powers Google Ads conversion tracking, offline imports, enhanced conversions and GA4’s
Google Ads link.
Auto-tagging and manual UTMs coexist. GA4 prefers manual UTM values when both exist — so your
utm_source must be lowercase google and utm_medium lowercase cpc,
or you override a correct auto-tagged classification with a bad manual one.
The Final URL suffix. They survive redirects and parallel tracking. Reserve the template for redirect structure.
No. Leave it as {lpurl} or empty; put parameters in the suffix.
{lpurl}?No. {lpurl} belongs only in the tracking template. Google requires it there.
No. The most specific level replaces the higher one. Restate every parameter when you override.
Account / campaign / ad group changes do not send ads for review. Ad-level URL changes can.
Eight per level (name ≤16, value ≤250). More specific levels replace rather than merge.
Yes — and you should. Auto-tagging feeds Google Ads; UTMs feed GA4 and other analytics.
ValueTrack returns an empty string when the parameter does not apply to that click. Normal, not a misconfig.