Skip to content

Free tool · no signup

UTM builder for agencies

Paste the landing page, pick the client and the platform, and this UTM builder gives you a link or a parameter string you can paste straight into Meta Ads Manager or Google Ads. Typed values are lowercased and spaces are replaced, so one client's campaigns always come out in the same format. Platform tokens like {{campaign.name}} are left exactly as they are. It runs in your browser and saves nothing.

Your numbers
Client naming rule (Example)

Example. Client code acme is made up.

Separator

Comma-separated.

Comma-separated.

Optional.

Optional.

Optional. utm_id is a Google Analytics field for the campaign ID. Thexly doesn't read it.

Check it against payments

How agencies keep UTMs consistent across clients

Tagging one campaign is easy. Keeping ten clients tagged the same way, month after month, is the hard part. One r/marketingops thread put it well: "consistency usually breaks when campaign creation is distributed across ad platforms, lifecycle tools, agencies, and one-off launches." (r/marketingops, August 2026)

On 17 October 2026 we read Meta's and Google's help pages on URL parameters side by side. Here's what holds up.

Use lowercase. Google's Analytics help says "Parameter values are case sensitive", so utm_source=google and utm_source=Google are different values. It recommends lowercase as standard (Google Analytics help). Thexly's reports work the same way: Facebook and facebook would show as two rows.

One source per platform, one medium per channel. The same page says to use one unique utm_source for each platform and one unique utm_medium for each channel, for example paid_social (Google Analytics help).

Pick how Meta shows up. Thexly's source reports group by the exact utm_source text. If you want one Meta row per client, use a fixed utm_source=facebook. That's the builder's Meta default. Meta's {{site_source_name}} token is still there if you'd rather split by platform, but then fb, ig, an, msg and th each get their own row.

Let the platform fill in names where it can. Google's guidance is to use dynamic UTMs "to automate tagging and eliminate manual entry errors" (Google Analytics help). Meta has tokens for this, listed below.

On Meta, name the campaign before you publish. Meta's name tokens are "set to the campaign, ad set or ad name used when the ad was first published." Rename the campaign later and the URL still carries the old name (Meta help). So get the name right first.

On Google, put the name in a custom parameter. We went through Google's ValueTrack list and found {campaignid} but no parameter that returns the campaign name (Google Ads help). So the builder puts the name in a custom parameter, {_campaign} (Google Ads help), and keeps {campaignid} out of utm_campaign.

Keep one written rule per client. Client code, separator, allowed sources and mediums, campaign pattern. The builder holds the rule while you work and lets you copy it out as text for your own docs. It doesn't store it.

A small team on r/AskMarketing ran into the same thing. The poster, running Google, Meta and LinkedIn at once, said tagging with UTMs "requires discipline across every campaign." One reply: "fwiw, we use a simple shared google sheet for all utm parameters. it forces consistency and ga4 reports become much more useful." (r/AskMarketing, May 2026)

Meta Ads setup

In Ads Manager, go to Tracking for the ad and paste the builder's string into the URL parameters field, or use Build a URL parameter. Parameters in that field override duplicates in the Website URL field (Meta help).

Meta also says that as of 1 January 2024 it may add some parameters to your ad traffic on its own: campaign source, campaign medium (paid), ad ID, campaign ID, ad set ID and campaign tracking group ID (Meta help).

The 9 dynamic tokens Meta lists (Meta help):

{{ad.id}}: Ad ID.

{{adset.id}}: Ad set ID.

{{campaign.id}}: Campaign ID.

{{ad.name}}: Ad name at first publish.

{{adset.name}}: Ad set name at first publish.

{{campaign.name}}: Campaign name at first publish.

{{placement}}: Placement, e.g. facebook_feed.

{{site_source_name}}: fb, ig, an, msg or th (each its own source row in Thexly).

{{media_type}}: Advantage+ catalog ads only.

Spaces in names show up as %20 in the URL (Meta help).

See Meta Ads and Stripe: see which campaigns produced Stripe payments.

Google Ads setup

The builder gives you a tracking template. Google says {lpurl} should go at the beginning, otherwise the final URL gets escaped (Google Ads help). Example:

{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={_campaign}&utm_content={creative}&utm_term={keyword}

If you also report in Google Analytics, you can add utm_id={campaignid}. utm_id is a Google Analytics field for the campaign ID (Google Analytics help). Thexly doesn't read it.

Then add the custom parameter on each campaign, for example {_campaign} = acme-spring-sale (Example). Google allows up to 8 custom parameters at any level except account, with names up to 16 alphanumeric characters and values up to 250 characters. Changes to tracking templates take 24 to 48 hours to show in your ads (Google Ads help).

Prefer to type each name yourself? Use a Final URL suffix with static values. It attaches parameters to the end of your landing page URL and works at account, campaign, ad group, ad and keyword level (Google Ads help).

Keep auto-tagging on. It adds gclid to the URL people click through (Google Ads help), and Thexly stores it.

See Google Ads and Stripe: match ad clicks to Stripe payments.

Building links for several clients?

One workspace and one naming rule per client: Thexly for agencies.

Mistakes the builder catches

Duplicate parameters. If your landing page URL already has utm_source, the builder replaces it and tells you, so each key appears once.

Empty parameters. Meta says never to leave a parameter empty (Meta help). Blank optional fields are left out of the output.

A number in utm_campaign. Thexly's reports show a numeric utm_campaign as the raw number, with no lookup to the campaign name. The builder warns you and asks for the name instead.

Click IDs pasted into links. If a gclid or fbclid is already in the URL, the builder asks you to remove it. The ad platform adds a fresh one on each click.

data-exclude-search. If your Thexly script has data-exclude-search turned on, it drops all UTM tags and click IDs, so Thexly can't tie those visits to your campaigns. Keep it off on ad landing pages.

Sources

Start free

Start free and see the first tagged visit match to a payment.

No card required.

FAQ

Questions & answers

Related tools

Other free calculators

Calculator

Platform vs payment gap

Enter Meta claims, Google claims, and payment collected. See the dollar and % gap.

Calculator

MER / blended ROAS

Payment revenue ÷ total ad spend. The number that survives a Stripe check.

Calculator

Break-even ROAS

From gross margin, the minimum ROAS before ads lose money.

Calculator

ROAS calculator

Revenue ÷ ad spend, as x and as %.

Calculator

CPA calculator

Type in your numbers, then check the result against payments that cleared.