URL Builder — UTM-tagged campaign URLs in 60 seconds
Build UTM-tagged URLs for Meta, Google, TikTok, Klaviyo, Pinterest, Snapchat, Reddit, and Amazon. Platform-correct macros, copyable templates, and a deep-link button from every campaign row inside /marketing-acquisition.
Open the URL Builder Read the UTM playbook
Free on every plan. No row limit. No watermark on generated URLs.
What is a UTM, and why does it matter?
A UTM (Urchin Tracking Module) parameter is a query-string tag appended to a URL — utm_source, utm_medium, utm_campaign, utm_content, and utm_term — that lets your analytics tool attribute the click to a specific ad, email, or post. The five-parameter convention has been industry-standard since 2005 and is the universal layer that lets Admaxxer (and every other analytics tool) attribute clicks without depending on platform-specific tags like gclid or fbclid.
Admaxxer’s first-party pixel reads UTMs on every pageview and joins them to spend pulled directly from the Meta Marketing API and Google Ads API. The result: blended ROAS, MER, and cohort LTV broken out by campaign, ad set, and creative — without depending on platform-reported numbers. Without UTMs, paid clicks land in the (direct) bucket on /marketing-acquisition and your channel breakdown silently misattributes 30–60% of revenue.
The URL Builder exists so this never happens. Pick a platform, fill three fields, copy the URL. Done.
Platform-by-platform templates
Every platform has a different macro convention — Meta uses {{campaign.name}}, Google uses {campaignid}, TikTok uses __CAMPAIGN_NAME__, Snapchat uses {{campaignName}}, Reddit uses {{CAMPAIGN_NAME}}. Get the syntax wrong and the macro renders literally as part of your URL, which silently breaks attribution. The table below is the canonical mapping. Copy a row, paste it into the destination platform, replace yourstore.com with your storefront domain.
| Platform | utm_source | utm_medium | Campaign macro | Full template | How to install |
|---|---|---|---|---|---|
| Meta (Facebook + Instagram) | facebook |
cpc |
{{campaign.name}} |
https://yourstore.com/?utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}} |
Paste into the Website URL field at the ad level. Meta resolves macros server-side at impression time, so every click reports the campaign, ad set, and ad name verbatim. |
| Google Ads | google |
cpc |
{campaignid} |
https://yourstore.com/?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}&utm_term={keyword} |
Set as the Final URL suffix at the account level. Use lowercase ValueTrack parameters. Disable auto-tagging only if you cannot route gclid into BigQuery — otherwise leave both on. |
| TikTok Ads | tiktok |
cpc |
__CAMPAIGN_NAME__ |
https://yourstore.com/?utm_source=tiktok&utm_medium=cpc&utm_campaign=__CAMPAIGN_NAME__&utm_content=__AID_NAME__&utm_term=__CID_NAME__ |
TikTok dynamic parameters use double underscores. Set on the ad-level URL field. TikTok Pixel CAPI also forwards these to your first-party pixel. |
| Klaviyo | klaviyo |
email |
{{ campaign.name }} |
https://yourstore.com/?utm_source=klaviyo&utm_medium=email&utm_campaign={{ campaign.name }}&utm_content={{ message.id }}&utm_term={{ list.name }} |
Set in Account Settings → UTM Tracking. Klaviyo auto-applies these tags to every link in every campaign + flow email when enabled. Avoid manual UTMs in individual templates — they double-tag. |
| Pinterest Ads | pinterest |
cpc |
{campaignname} |
https://yourstore.com/?utm_source=pinterest&utm_medium=cpc&utm_campaign={campaignname}&utm_content={adid}&utm_term={adgroupname} |
Pinterest URL parameters render at click time. Add at the ad level — the Pin destination URL accepts query string macros directly. |
| Snapchat Ads | snapchat |
cpc |
{{campaignName}} |
https://yourstore.com/?utm_source=snapchat&utm_medium=cpc&utm_campaign={{campaignName}}&utm_content={{adName}}&utm_term={{adSquadName}} |
Snapchat uses double-curly camelCase macros. Set on the ad's Swipe Up URL or Web View URL. Test in the preview pane before publishing — invalid macro names render literal. |
| Reddit Ads | reddit |
cpc |
{{CAMPAIGN_NAME}} |
https://yourstore.com/?utm_source=reddit&utm_medium=cpc&utm_campaign={{CAMPAIGN_NAME}}&utm_content={{AD_NAME}}&utm_term={{AD_GROUP_NAME}} |
Reddit uses double-curly UPPER_SNAKE_CASE macros. Set at the ad level. The Reddit Pixel forwards click_id alongside UTMs to first-party pixels. |
| Amazon Ads (Sponsored Brands / DSP) | amazon |
cpc |
(manual campaign label) |
https://yourstore.com/?utm_source=amazon&utm_medium=cpc&utm_campaign=campaign_label_here&utm_content=ad_label_here |
Amazon Ads has limited macro support outside the Amazon-store-redirect funnel. For off-Amazon landing pages (Sponsored Brands → custom URL), use a static campaign label and rotate it per launch. |
How the URL Builder fits with the rest of Admaxxer
- Deep-link from /marketing-acquisition. Every campaign row on the Marketing Acquisition Summary has a "Tag a new URL" button that opens the URL Builder pre-filled with the campaign’s platform, source, and naming convention. Five seconds from "I see a row" to "I have a tagged URL".
- Connected to your live ad accounts. When you connect Meta Ads or Google Ads, the URL Builder pulls live campaign + ad-set names so the macros expand against your actual taxonomy.
- Validates against the first-party pixel. The Builder checks every generated URL against Admaxxer’s pixel UTM expectations — lowercase source/medium, no spaces in campaign names, no double-encoding — so attribution is clean from the first click.
Best practices the URL Builder enforces
- Lowercase
utm_sourceandutm_medium. Analytics tools are case-sensitive.Facebookandfacebookshow up as two separate channels and split your reporting. - No spaces. Use hyphens or underscores. Spaces become
%20on the wire and can break downstream regexes. - Use platform macros for campaign + ad names. Don’t hand-type the campaign name — use
{{campaign.name}}(Meta),{campaignid}(Google), or the platform’s equivalent. If you rename the campaign, the URLs auto-update without re-tagging. - Always tag
utm_mediumascpcfor paid social/search. Even though Meta is technicallypaid_socialand Google iscpc, usingcpcacross both is the cleanest convention — it lines up with the GA4 default channel grouping and Admaxxer’s blended-MER math. - Enable Klaviyo’s account-level UTM tagging. Don’t hand-tag individual emails — turn on the account-wide setting in Klaviyo Settings → UTM Tracking and let it apply to every campaign + flow email automatically.
The deeper playbook lives at /documentation/utm-best-practices, including the full taxonomy guide, the recommended utm_campaign naming pattern, and the “why Google auto-tagging doesn’t replace UTMs” explainer.
Frequently asked
- What is a UTM?
- A UTM (Urchin Tracking Module) parameter is a query-string tag appended to a URL — utm_source, utm_medium, utm_campaign, utm_content, and utm_term — that lets your analytics tool attribute the click to a specific ad, email, or post. UTMs were originally introduced by Urchin (the company Google bought in 2005 to build Google Analytics), and the five-parameter convention is now industry-wide. Admaxxer's first-party pixel reads UTMs on every pageview and joins them to ad-platform spend so you can see blended ROAS by campaign, ad set, and creative without depending on platform-reported numbers.
- How do I tag a Meta campaign?
- Paste this template into the Website URL field at the AD level (not the campaign or ad-set level): https://yourstore.com/?utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}. Meta resolves the {{campaign.name}}, {{adset.name}}, and {{ad.name}} macros at impression time, so every click reports the live name verbatim. If you rename the campaign mid-flight, all subsequent clicks pick up the new name without you re-editing the URL. The Admaxxer URL Builder generates this template with your store domain pre-filled.
- Does Google auto-tagging replace UTMs?
- No — they're complementary. Google Ads auto-tagging appends a gclid parameter that maps clicks back to the underlying campaign/ad inside the Google Ads UI, but gclid is invisible to non-Google analytics tools. UTMs are the universal layer: they let Admaxxer (and any other analytics tool) attribute the click without needing Google Ads API access. The recommended setup is auto-tagging ON (so Google Ads' own reporting works) and a Final URL suffix with utm_source=google&utm_medium=cpc&utm_campaign={campaignid} (so cross-platform tools see the click). They don't conflict — they're different layers of the same attribution stack.
- How do I avoid (direct) in /marketing-acquisition?
- (direct) appears in the channel breakdown when a click lands without a referrer AND without UTMs — typically a hand-typed URL, a click from a native app that strips referrers, or an ad-platform link without proper tagging. The fix is two-fold. First, tag every paid link with the templates above — every Meta, Google, TikTok, Klaviyo, Pinterest, Snapchat, Reddit, and Amazon link should carry utm_source + utm_medium + utm_campaign at minimum. Second, enable Klaviyo's automatic UTM tagging at the account level so transactional + flow emails are covered. After 7 days of fully tagged campaigns, the (direct) bucket on /marketing-acquisition typically drops below 5% of total sessions — anything above that is a tagging gap worth chasing.
Related
- UTM best practices — The full taxonomy guide.
- Marketing Acquisition Summary — Where tagged campaigns show up.
- Meta Ads integration — Connect your ad account so the Builder pulls live campaign names.
- Google Ads integration — Connect for live campaign IDs and Final URL suffix sync.
- Pricing — URL Builder is free on every plan, including the 14-day trial.