UTM Builder (Campaign URL Builder)
A UTM builder adds utm_source, utm_medium and utm_campaign parameters to a link so analytics tools such as GA4 can attribute each visit to a campaign. Build one link with a live preview, tag a whole spreadsheet in bulk, or check a link you already tagged for capital letters, spaces and typos.
Last verified October 2, 2026 against Google Analytics Help
https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=spring_saleutm_source=newsletter&utm_medium=email&utm_campaign=spring_saleNo problems found: required parameters set, lowercase, no spaces.
Runs in your browser. Nothing you type is sent anywhere.
Tagging links that lead to a form? The UTM values can travel with every submission. Capture UTM parameters in your form.
Key facts: every UTM parameter
| Parameter | What it means | Required? | Example |
|---|---|---|---|
utm_source | The referrer: who sent the visit | Required | google, newsletter4, billboard |
utm_medium | The marketing medium | Required | cpc, banner, email |
utm_campaign | Product, slogan or promo code | Required | spring_sale |
utm_term | Paid keyword | Optional | form_backend |
utm_content | Tells creatives apart, such as two links in one email | Optional | header_link, footer_link |
utm_idGA4 | Campaign ID, matching the IDs you use when uploading campaign data | Optional | spring_sale_01 |
utm_source_platformGA4 | The platform that directed the traffic, such as a buying platform | Optional | Search Ads 360, Display & Video 360 |
utm_creative_formatGA4 | Type of creative; not currently reported in GA4 | Optional | display, native, video, search |
utm_marketing_tacticGA4 | Targeting criteria; not currently reported in GA4 | Optional | remarketing, prospecting |
Source: Google Analytics Help, “URL builders: Collect campaign data with custom URLs”. Example values for utm_term, utm_content and utm_id are ours. Last verified October 2, 2026.
What are UTM parameters?
UTM parameters are tags added to a link's query string (utm_source, utm_medium, utm_campaign, utm_term and utm_content, plus utm_id and three newer GA4 parameters) that tell analytics tools which campaign sent a visit. They are plain key=value pairs after the ?, so anything that can read the page URL can read them: GA4, other analytics tools, and a script on your form. UTM stands for Urchin Tracking Module, after the Urchin software that became Google Analytics.
A tagged link looks like this: https://example.com/pricing?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale. The page loads exactly as before; the parameters only label the visit.
Which UTM parameters are required?
utm_source, utm_medium and utm_campaign. Google's help page says to always use those three when you tag a link; utm_term, utm_content, utm_id, utm_source_platform, utm_creative_format and utm_marketing_tactic are optional. A link that leaves one of the three out still loads normally, but your reports have less to group it by.
Google's wording is that you “should always use utm_source, utm_medium, and utm_campaign”. The builder above marks those three with an asterisk and warns when one is empty.
Are UTM parameters case-sensitive?
Yes. Google states that UTM parameter values are case sensitive: utm_source=google and utm_source=Google are two different values, so they show up as separate rows in GA4's source, medium and campaign reports. GA4's default channel rules are not case sensitive, so both still land in the same channel. Use lowercase everywhere; the builder above warns about capital letters and can fix them for you.
Sources: case sensitivity of values from Google Analytics Help on custom URLs; case-insensitive channel matching from GA4's default channel group page. Parameter names should be lowercase too: a script that looks up utm_source will not match UTM_Source.
UTM naming convention cheat sheet
A UTM naming convention is a short set of rules your team follows so the same channel always gets the same values. These eight cover most teams:
- Lowercase only. Values are case sensitive, so
Emailandemailsplit one channel into two rows. - One separator, no spaces. Pick underscores or hyphens and stick to it:
spring_sale, notSpring Sale. - Medium is the channel type, source is the sender.
utm_medium=email,utm_source=newsletter; not the other way round. - Reuse GA4's medium values from the table below so visits land in the right default channel.
- Make campaign names sortable. Lead with the date:
2026_10_launch. - No personal data. Never put an email address or a name in a UTM value; it ends up in analytics reports.
- Tag inbound links only. Leave links between your own pages untagged.
- Write the convention down. Keep it in a shared sheet; bulk mode reads a spreadsheet paste directly.
| Traffic | utm_source | utm_medium | GA4 default channel |
|---|---|---|---|
| Google Ads (manual tags) | google | cpc | Paid Search |
| Microsoft Advertising | bing | cpc | Paid Search |
| Meta ads | facebook, instagram | paid_social | Paid Social |
| LinkedIn ads | linkedin | paid_social | Paid Social |
| Organic social post | linkedin, facebook | social | Organic Social |
| Newsletter | newsletter | email | |
| Text message | sms | sms | SMS |
| Banner on another site | site name | display | Display |
| Paid affiliate | partner name | affiliate | Affiliates |
| Unpaid partner link | partner name | referral | Referral |
| QR code on print | flyer, poster | qr | Unassigned (no print channel) |
Channel column from Google's default channel group rules: Paid Search and Paid Social also need the source to be on Google's list of search or social sites, which google, bing, facebook, instagram and linkedin are. Anything no rule matches is reported as Unassigned. Last verified October 2, 2026.
How do I capture UTM parameters in a form submission?
Add a hidden input for each UTM parameter to the form, plus a few lines of JavaScript that copy the values from the page URL into those inputs. When the visitor submits, the UTM values are posted with the rest of the form, and the form backend saves them next to the lead.
Here is the whole thing for a splitforms form: four hidden inputs and six lines of script. Put the script after the form so the inputs exist when it runs.
<form action="https://splitforms.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
<input type="hidden" name="utm_source">
<input type="hidden" name="utm_medium">
<input type="hidden" name="utm_campaign">
<input type="hidden" name="utm_content">
<input type="email" name="email" placeholder="[email protected]" required>
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>
<script>
// Copy utm_* values from this page's URL into the hidden inputs above.
var params = new URLSearchParams(window.location.search);
document.querySelectorAll('input[type="hidden"][name^="utm_"]').forEach(function (input) {
var value = params.get(input.name);
if (value) input.value = value;
});
</script>splitforms stores every field your form sends, so utm_source and utm_campaign appear on each submission in the dashboard, CSV export and webhook payload. Free: 500 submissions total, no card.
The snippet is required. splitforms does not read UTM parameters from the page URL by itself; without the script the hidden inputs post empty. CSV export and webhooks are on the paid plans (Pro is $5/month).
This short version reads the URL of the page the form is on. If visitors land on one page and submit on another, use the session-storage version in track form submission sources with UTM fields, which also records the referrer and landing page. Need the form itself first? Start with HTML form to email.
Get a free access keyHow is this different from Google's Campaign URL Builder?
Google's Campaign URL Builder tags one link at a time with six UTM fields: campaign ID, source, medium, name, term and content. This builder makes the same kind of link and adds bulk tagging from CSV, a checker for links you already tagged, presets for common channels, case and spacing warnings, and fields for utm_source_platform, utm_creative_format and utm_marketing_tactic.
| Feature | Google's builder | This UTM builder |
|---|---|---|
| utm_source, utm_medium, utm_campaign, utm_term, utm_content, utm_id | Yes | Yes |
| utm_source_platform, utm_creative_format, utm_marketing_tactic | No fields | Yes |
| Many links at once | One link at a time | Up to 2,000 rows from CSV or a spreadsheet paste, CSV download |
| Existing tagged URLs | Pulls utm values from a pasted URL into its fields | Parameter table plus typo, duplicate, empty-value and fragment warnings |
| Case and spacing warnings | No | Yes, with a one-click fix |
| Channel presets | No | Google Ads, Meta, LinkedIn, newsletter, QR / print, partner |
| Snippet to save UTMs with form submissions | No | Yes |
Google's builder checked on October 2, 2026 at ga-dev-tools.web.app and in its open-source code. Both tools produce standard links, so if you only need one link, Google's builder works fine.
UTM builder FAQ
Does splitforms capture UTM parameters automatically?
No. splitforms saves the fields your form posts, and it does not read the page URL on its own. Add the hidden inputs and the short script from this page; once those inputs carry values, utm_source, utm_campaign and the rest are stored with each submission like any other field.
Does this UTM builder send my links anywhere?
No. Building, bulk tagging and checking all run in your browser with no network requests, and the CSV download is generated on your device. The only thing remembered is the last preset you picked, saved in your browser's localStorage.
What format does bulk mode accept?
Rows of url, source, medium, campaign, term, content, separated by commas or tabs, so you can paste straight from a spreadsheet. A header row is optional; with one, columns can be in any order and can include utm_id and the other GA4 parameters. Blank cells can take the values from the Build tab, so a plain list of URLs gets one shared campaign. Up to 2,000 rows at a time.
Why are {keyword} and {{campaign.name}} left unencoded?
They are ad-platform placeholders. Google Ads ValueTrack parameters use single braces and Meta's dynamic URL parameters use double braces, and each platform swaps in the real value when someone clicks. The builder leaves the braces as typed so the platform can find them; everything else is percent-encoded.
Should I add UTM parameters to links inside my own site?
No. UTM parameters belong on links that bring people in from somewhere else: ads, emails, social posts, QR codes and partner sites. Tagging internal links swaps the campaign the visitor really came from for your own internal tag, which muddles attribution, and the form snippet on this page would copy that internal tag into the submission.
More free tools: form action URL tester, honeypot field generator and the full tools list.
Know which campaign sent every lead.
Point your form at splitforms, add the hidden UTM inputs, and each submission arrives with its source, medium and campaign next to the name and message, with honeypot and smart spam filtering on every plan. 500 submissions total, free to start.
Try splitforms free →