Tag one link, or every channel in a launch at once. Ad platform macros such as {{campaign.name}} and {keyword} are left literal so the platform can still substitute them, and every link is checked for the tagging mistakes that quietly send a campaign into Unassigned.
Your tagged URL appears here.
Tidy values lower cases everything and swaps spaces for underscores, which is what keeps one campaign from splitting into four rows in a report. Macros are never touched.
| Channel | Source | Medium | Content | Tagged URL | Row |
|---|
The sheet is saved in this browser only, so it survives a refresh and never reaches a server. The CSV carries a byte order mark and CRLF endings, so Excel opens it with the accents intact.
Put the tokens in the order your team writes them. Allowed values are optional: fill them in for tokens with a fixed list, such as markets or platforms, and every name is checked against them.
The share link carries the convention in the address after the #, so it never reaches a server. Whoever opens it gets the same tokens, separator and allowed values.
Fill in the values to build a name.
The convention, the values and the list are saved in this browser under one key, and the clickTag generator bulk sheet reads the same convention to name every creative.
Useful before a launch, and useful after one, when the report is empty and nobody knows why.
utm_source and utm_medium with values GA4 maps to a channel, and offers the platform macros for the fields that change from ad to ad.| Parameter | Required | What it answers |
|---|---|---|
utm_source | Yes | Which property sent the visit. google, facebook, newsletter. |
utm_medium | Yes | What kind of marketing it was. This is the field that decides the channel group. |
utm_campaign | Recommended | Which campaign or promotion it belongs to. |
utm_content | Optional | Which creative or placement, so two ads in one ad set stay separable. |
utm_term | Optional | The keyword on paid search. |
utm_id | Optional | The campaign ID, used to join sessions to cost data imported into GA4. |
GA4 decides the channel from utm_source and utm_medium together, in a fixed rule order. Paid Search and Paid Social need a source GA4 lists as a search or social site plus a medium that contains cp, starts with paid, or is exactly ppc or retargeting. Display, Email and Affiliates can be decided by the medium alone. Organic Social matches either a listed social source or a social medium, so a listed source can still rescue a medium that is not on any list. Only a session that matches no rule at all lands in Unassigned. facebook_ads, social_paid and ppc_google break paid campaigns most often: none of them counts as paid, so the clicks report as an organic channel when the source is listed, and as Unassigned when it is not.
| Channel | Use | Not |
|---|---|---|
| Paid search, with a search source such as google | cpc, ppc, paid | google_ads, search |
| Paid social, with a social source such as facebook | paid_social, cpc | facebook_ads, social_paid |
| Organic social, from the medium alone | social | instagram |
| Display, from the medium alone | display, banner, cpm | programmatic |
| Email, from the medium alone | email | mailchimp, edm |
| Affiliates, from the medium alone | affiliate | partner |
A macro is a placeholder the ad platform swaps for a real value at click time. It has to reach the platform exactly as written, so this builder never percent encodes one, and never flags its capital letters as a casing mistake.
| Platform | Syntax | Example |
|---|---|---|
| Google Ads | ValueTrack in braces | {keyword}, {campaignid}, {creative} |
| Microsoft Ads | Braces, mixed case | {CampaignId}, {AdGroupId} |
| Meta | Double braces | {{campaign.name}}, {{ad.name}} |
| TikTok | Double underscores | __CAMPAIGN_NAME__, __CID_NAME__ |
| Display & Video 360 | Dollar and braces | ${CAMPAIGN_ID}, ${CREATIVE_ID} |
| Campaign Manager 360 | Percent and bang | %ecid!, %epid! |
ValueTrack parameters sit in single braces and are filled at click time. {campaignid} is the numeric campaign ID, which survives a rename, so it makes a steadier utm_id than the campaign name. {keyword} belongs in utm_term.
Meta uses double braces. {{campaign.name}}, {{adset.name}} and {{ad.name}} are replaced with the names as they read in Ads Manager when the ad is clicked, so a campaign renamed in flight splits into two rows. Put them in the URL parameters field of the ad.
TikTok macros sit between double underscores: __CAMPAIGN_NAME__, __AID_NAME__ for the ad group and __CID_NAME__ for the ad. They are capitals by design, so the builder leaves their case alone and still flags capitals in the text around them.
DV360 writes macros as a dollar sign and braces. ${CREATIVE_ID} in utm_content tells you which creative earned the visit, and ${CAMPAIGN_ID} or ${LINE_ITEM_ID} identify the buy.
CM360 macros start with a percent sign and end with an exclamation mark. According to the Campaign Manager 360 macro table, %ecid! expands to the creative ID, %epid! to the placement ID and %ebuy! to the campaign ID. Percent encoding one turns it into %25ecid!, which CM360 no longer recognises, so the builder never encodes them.
Analytics is case sensitive and treats every spelling as a new campaign, so the naming convention matters as much as the medium. Agree on the order of the parts once, for example client, campaign, market, platform, size and version, pick one separator, and write everything in lowercase. The Naming tab turns that agreement into a tool: define the tokens and their allowed values, generate names that follow it, check names somebody else wrote, and send the convention to the team as a link. A generated name goes straight into utm_campaign or utm_content, and the clickTag generator bulk sheet can apply the same convention to every creative.
utm_source or utm_medium. Google documents that missing UTM parameters show as (not set) in reports, and recommends always setting utm_source, utm_medium and utm_campaign.utm_medium that, with its source, matches no channel rule, or does not count as paid when it was meant to, which is the usual reason a campaign reports zero sessions.%20 or a plus sign.?, # or &) inside a value, which truncates the query string.http landing page, which most ad platforms reject or silently rewrite.None is technically required, but Google recommends always setting utm_source, utm_medium and utm_campaign. A missing one shows as (not set) in reports, and without source and medium GA4 cannot place the visit in the right channel.
Because the source and medium together matched none of the default channel rules. Usually the medium is a custom word such as programmatic and the source is a name GA4 does not list, such as dv360. Switch the medium to one the rules know, such as cpc or paid_social, and paste the link into the checker above to confirm.
Yes, as long as they reach the platform exactly as written. This builder never percent encodes a macro and never flags its capitals. It does flag a reserved character inside a macro, because that would break the query string.
Yes. GA4 treats Spring_Sale and spring_sale as two campaigns. Tidy values, or a lowercase naming convention, keeps every link consistent.
You can add them, and they help tools other than GA4 that only read UTM values. Keep the values in line with the campaign names in the account so the two sources of truth agree.
No. Links, the bulk sheet and the naming convention are built and stored in this browser only. A share link carries the convention after the #, which browsers never send to a server.
UTM parameters explained for paid media covers what each field is for and a naming convention worth adopting. Why GA4 shows unassigned traffic explains the one field that decides whether a campaign appears in reporting at all. Ad platform URL macros lists the placeholder syntax for Google Ads, Meta, TikTok, DV360 and Campaign Manager 360, and why encoding one breaks it.
Once the click URL is settled, put it into the creative with the clickTag generator, or inject it straight into a zipped banner with the HTML5 clickTag editor. Before the campaign ships, run the finished creatives through the HTML5 banner validator and check the video cuts against the safe zone checker.