Build UTM-tagged URLs for campaign tracking. Everything runs in your browser — nothing is sent anywhere. Fill the fields, copy the URL.
Source, medium and campaign name are required by GA4. The rest are optional.
Updates as you type. Existing query params on your URL are kept; existing utm_* keys are replaced.
| Parameter | Required | Example | Use it for |
|---|---|---|---|
| utm_source | Yes | google, newsletter | Where the click came from. |
| utm_medium | Yes | cpc, email, social | How it reached the user. |
| utm_campaign | Yes | summer_sale | Which campaign gets credit. |
| utm_id | No | abc.123 | Ads campaign ID for GA4 imports. |
| utm_term | No | running_shoes | Paid-search keyword. |
| utm_content | No | top_banner | A/B variants of the same link. |
House rules: keep names lowercase, use underscores, never put personal data in UTMs.
Every control below maps to something already on this page. The output updates live — there is no submit button.
Type the left-hand values into the fields above and you get the finished URL on the right. Conventions follow Google's GA4 URL-builder docs: lowercase, underscores, no personal data.
| Scenario | Field values | Finished URL |
|---|---|---|
| Newsletter feature | source newsletter · medium email · campaign spring_sale · content hero_button | https://example.com/?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale&utm_content=hero_button |
| Paid social test | source instagram · medium social · campaign launch · content video_a | https://example.com/pricing?utm_source=instagram&utm_medium=social&utm_campaign=launch&utm_content=video_a |
| Printed QR flyer | source flyer · medium qr · campaign downtown_opening | https://example.com/visit?utm_source=flyer&utm_medium=qr&utm_campaign=downtown_opening |
GA4 treats UTM values as case sensitive and reports exactly what you send, so one spelling per concept, forever. Lowercase with underscores is the convention baked into this page's Tidy mode.
| Element | Convention | Example |
|---|---|---|
| utm_source | One lowercase name per distinct platform. | newsletter, instagram, flyer — never Newsletter and newsletter side by side. |
| utm_medium | One lowercase name per channel type. | email, social, qr, cpc — the how, not the where. |
| utm_campaign | One name matching the campaign, underscores for spaces. | spring_sale, downtown_opening — matches the campaign name everywhere it runs. |
| utm_content | Variant label for A/B comparisons. | hero_button versus text_link tells you which creative earned the click. |
| utm_term | Paid-search keyword, lowercase. | running_shoes — skip for non-search channels. |
| utm_id | Same ID used in cost-data imports. | Must match the import file exactly or costs will not join. |
Open Acquisition, then the Traffic acquisition report: Session source, Session medium and Session campaign break down the tagged visits, and the manual-tagging dimensions carry your exact values into explorations and audience building. Expect up to 24–48 hours before fresh tags settle into standard reports, and check the realtime view for an immediate sanity check that parameters arrived intact. If rows show (not set), the link went out missing a value — see the FAQ in § 05, then rebuild it here. Teams that tag often usually keep one shared sheet of approved source, medium and campaign spellings; this page enforces the formatting, the sheet enforces the vocabulary, and together they keep every quarter comparable.
Documented from the page's own script, verified Sep 2026 — no surprises.
| Situation | Behavior |
|---|---|
| Existing query params | Kept. A destination like /pricing?plan=annual keeps plan=annual and gains your UTMs alongside it. |
| Existing utm_* keys | Replaced. Old campaign tags on a pasted URL are overwritten by the values in the form, never duplicated. |
| #fragment | Preserved untouched. UTMs are appended to the query string before the fragment, which is where Analytics expects them. |
| Tidy values on | Values are trimmed, lowercased, spaces become underscores. Turn it off only when a destination system demands exact original casing. |
| Missing or bad input | The output stays parked, the buttons stay disabled, and a message names exactly which field is missing or unparseable. |
Background reading, both official: Google's GA4 URL-builder guide defines each parameter and the required trio, and the traffic-source dimensions reference explains how manual tagging maps to report dimensions and why missing values surface as (not set).
Each answer describes this tool's real behavior or cites Google's official Analytics docs. Nothing is invented.
No. UTM parameters are for inbound links from outside properties, newsletters, ads, social posts, QR codes. Tagging your own internal links overwrites the visitor's original source with your site itself, a classic self-referral that fragments campaign reports. Keep internal navigation clean and save UTMs for traffic arriving from elsewhere.
Before the fragment. This page appends UTMs to the query string and preserves your #fragment untouched, shown as fragment kept in the Live output panel. Analytics reads the query part, so page?utm_source=x#section works. Anything after the # is never sent as a query, so never place UTMs after it.
A tagged session arrived missing one or more UTM values. Google's GA4 documentation warns explicitly that if you set one UTM parameter you should set all relevant ones, especially source, medium, campaign and id, because missing values surface as (not set) in reporting. Rebuild the link on this page with every required field filled.
The campaign ID, used to identify a specific campaign or promotion and to join cost-data imports in GA4. Use the same IDs you upload when importing ad costs. It is optional for basic source, medium and campaign reporting, and needed when you import cost data. Verified Sep 2026 against Google's GA4 URL-builder docs.
No, they are different. Google documents UTM values as case sensitive, so utm_source=google and utm_source=Google split into two report rows. Keep the Tidy values box checked, this page lowercases entries and converts spaces to underscores, and pick one spelling per channel forever.
Never. UTMs travel inside URLs, visible in address bars, server logs, referrers and reports, and Google prohibits personally identifiable information in Analytics data. Use anonymous labels such as welcome_series, never a customer's name or address. Verified Sep 2026.
Behavior above was read directly from this page's script and re-verified Sep 2026: required trio of source, medium and campaign before output unlocks; existing query parameters preserved while existing utm_* keys are replaced; #fragments carried through untouched; Tidy mode lowercasing with spaces to underscores; hostname sanity check before build. Parameter meanings follow Google's GA4 URL-builder and traffic-source documentation linked in § 04. Everything is 100% client-side: no account, no network calls, no logging of your URLs — tagged links are assembled in the tab and leave only via your own clipboard.
More free client-side utilities from the same lab.