A Webstarted Toolbox widget · macOS & Windows

A UTM builder that stops Analytics from splitting your sources in two.

Campaign links built as you type: URL plus the five UTM parameters, with channel presets and a history of what you’ve already used. Every value is normalized to lowercase without spaces, so “Facebook” and “facebook” stop being two different sources in your report. Offline, in your menu bar.

Already have Toolbox? Open this widget

Free · No account · 100% offline · Installs from the Toolbox catalog
Try it here

Build your campaign link

Fill the fields and copy the URL. It is built in your browser — the URL is never sent anywhere.

Shortcuts:

source = where it comes from (google, linkedin). medium = what kind of traffic it is (cpc, email, social).


Your link

100% local · your URL never leaves the browser

NormalizedLowercase, no spaces, always
Channel presetsSource + medium in one tap
Value historyReuse what you tagged last time
OfflineNothing uploaded, nothing logged
How it works

The link is finished before you finish typing.

Paste the destination URL, then fill the parameters: source, medium, campaign, and optionally term and content. The final link is assembled live under the fields — no “generate” button, no waiting — and one tap copies it, opens it, or clears the form.

Two things make the second link faster than the first. The channel presets fill source and medium together for LinkedIn, a newsletter, Google Ads or Instagram. And the history remembers up to eight values per field, shown as chips — so the campaign name you invented last Tuesday is one tap away instead of retyped slightly differently. If one of the three parameters GA needs is missing, the widget names it and lets you continue anyway.

  • All five canonical UTM parameters, assembled live
  • Presets: linkedin/social · newsletter/email · google/cpc · instagram/social
  • History chips — up to 8 remembered values per field
  • Copy, open in your browser, or clear
  • Tells you which required parameter is missing, without blocking you
The casing problem

One capital letter is enough to split a channel in half.

UTM values are just strings, and Analytics compares them literally. Write Facebook on Monday and facebook on Thursday and you now have two sources in the report, each holding part of the truth. Add a stray space or an “Email” next to an “email” and the acquisition table becomes a list of near-duplicates that nobody trusts — which is usually the moment someone decides the analytics are broken and stops looking at them.

Nothing can fix that after the fact: the clicks are already recorded under both spellings. So the widget prevents it at the only point where prevention is possible — as you type. Everything is lowercased and de-spaced before it reaches the link, which means consistency is the default instead of a discipline you have to remember at 11pm while scheduling a post.

  • Lowercased and de-spaced automatically, every field
  • Consistent mediums via presets — no “email” vs “e-mail”
  • History chips reuse the exact string you used last time
  • Prevention at write time — the only time it works
What you typeWhat GA gets
Facebookfacebook
LinkedIn Adslinkedinads
Summer Sale 2026summersale2026
Without normalizing2-3 sources ✗
Editing existing links

Paste a tagged link and it comes apart cleanly.

Most campaign links are variations of a link that already exists. Paste one with UTMs already on it and the widget reads them back into the fields — change the campaign, keep everything else, copy the new version. Old UTM values are replaced rather than appended, so you never end up with utm_source twice in one URL.

Anything that was already on the URL survives: the existing query string and the #fragment are both preserved, because a link to a specific section of a page should still land there after you tag it.

The parsing is also careful about the things that go wrong when you prefix a string with https:// blindly. It checks the scheme before completing it, so a mailto: address doesn’t silently become a URL with credentials in the host; it rejects URLs carrying a username and password; and it still understands that localhost:3000 is a port, not a scheme.

  • Reads existing UTMs back into the form
  • Replaces old UTM values instead of duplicating them
  • Preserves the original query string and the #fragment
  • Rejects non-http(s) schemes and URLs with embedded credentials
  • localhost:3000 keeps working
Part of Webstarted Toolbox

Installed from the catalog, in one click.

UTM Builder isn’t bundled into the app — it’s a widget in the Webstarted Toolbox catalog. Download Toolbox, open the catalog tab (🧰), press the “+” next to UTM Builder, and it lands in the Marketing tab of your Business space. No reinstall, no app update. Here are a few of its neighbors:

FAQ

Questions, answered.

Why does it lowercase everything?

Because Google Analytics treats utm_source values as case-sensitive strings. Paste “Facebook” in one post and “facebook” in the next and your report shows two sources, each with half the traffic, and any comparison you make from it is wrong. The widget lowercases and removes spaces from every value as you type, so the same channel always lands in the same row. It is a small rule that quietly saves a quarter’s worth of reporting.

Will it break the query parameters my URL already has?

No. It preserves the existing query string and the fragment (the #anchor), appends the UTMs alongside them, and replaces old UTM values instead of appending a second copy. That last part matters: hand-editing a link that already carries utm_source is how you end up with the same parameter twice and an ambiguous URL.

Can I edit a link that already has UTMs?

Yes — paste it in and the widget reads its existing parameters back into the fields, so you can change the campaign name on last month’s link instead of rebuilding it from scratch. Combined with the history chips, tagging the next post is usually four taps.

Which parameters are actually required?

Source, medium and campaign are the three GA needs to attribute a visit properly; term and content are optional refinements for paid keywords and A/B variants. If one of the three is missing the widget tells you which — but it does not block you, because sometimes you genuinely want a partial link and being nagged into a fake value is worse.

What are the channel presets?

One-tap source and medium pairs for the channels most people use: LinkedIn (linkedin / social), newsletter (newsletter / email), Google Ads (google / cpc) and Instagram (instagram / social). Consistent medium values are half the battle in a clean report — “email” and “e-mail” are two mediums as far as GA is concerned.

Does my link leave my machine?

No. Everything is assembled locally and the value history lives in the widget’s own storage on your device — up to eight remembered values per field. Nothing is uploaded, which also means an unannounced campaign URL is not sitting in someone else’s logs before you publish it.

How is it different from Google’s Campaign URL Builder?

Google’s version is a web page: you open a tab, fill five boxes, copy, and lose everything you typed the moment you close it. This one lives in your menu bar, remembers the values you have already used, offers channel presets, normalizes casing for you, and works with no connection. What Google’s has that this does not: it is the canonical reference and includes the Play Store / iOS variants of the form.

Is it free?

Yes. Webstarted Toolbox is free and needs no account, and UTM Builder is a free widget in its catalog — you install it in one click from inside the app.

Get Webstarted Toolbox

Free to use. Download the app, then add UTM Builder from the catalog in one click. macOS 12+ and Windows 10+.

Free beta · macOS · Windows (x64) · Signed & notarized · No account required
Keep exploring

One icon, many small tools

This is just one of the widgets in Webstarted Toolbox. Here are the rest:

Keep Awake Stop your Mac from sleeping, on your terms. 📊 LLM Quota Pace your Claude / AI usage against the clock. 🍅 Pomodoro 25/5 focus cycles in your menu bar. Countdown Live countdowns to anything that matters. Clipboard history Your recent copies, one keystroke away. {} Dev tools JSON, Base64, JWT, regex, epoch — offline. Quick Note A scratchpad that autosaves as you type. 🌐 My IP Your public IPv4 and IPv6, copyable, with ISP and location. 📈 System Info CPU, memory and GPU in your menu bar. 🐹 Topos A 30-second reflex game in your menu bar. 💣 Minesweeper Classic minesweeper in your menu bar. 🪙 Crypto Prices Live crypto prices with 24h change, in your menu bar. 💱 Currency Converter Convert currencies with real parallel rates (blue, MEP, CCL). 🌍 World Clocks Several cities' time at once — daylight saving handled automatically. 🔳 QR Generator QR codes for text, URLs, WiFi or contacts — offline. 🔑 Password Generator Strong passwords & passphrases, fully offline. 🌤️ Weather Any city, now + the days ahead — no API key. 🔥 Habit Tracker Daily streaks — don't break the chain. 100% local. 🔤 Text Tools Change case, slugify, count, dedupe — offline. 🎲 Random Picker Pick from a list at random, or roll dice. 🎨 Color Picker Pick a color, copy hex / rgb / hsl / hsv — offline. 🌐 Translator 18 languages from the menu bar — no API key needed. 🔀 Text Diff Compare two texts line by line — 100% local. Cron Wizard Cron expressions in plain English, with the next runs. 🗃️ Dummy Data Lorem ipsum and fake rows in JSON, CSV or SQL. 🔊 Focus Sounds White, pink or brown noise — synthesized, no files. 🔁 Subscriptions What your recurring services cost per month and year. 🧾 Rates & Tax Hourly ↔ yearly, and add or extract tax. Network Fees Ethereum gas and Bitcoin fees, right now. 🌿 Git Status Which of your repos are dirty, unpushed or behind. 🧮 Calculator Type the calculation, read the result as you go. 🎬 Teleprompter Your script scrolls at the speed you read — in wpm. 📊 Stocks Stocks and ETFs with the day’s change — no API key. 🔥 Fireplace A fireplace generated on the fly — no files, no network. 💼 Job Tracker Your applications, with an OS alarm before each interview. Converter 57 units in 8 categories, converted with zero network. Alarms Clock-time alarms that ring with everything closed. 🗂️ Project Boards Kanban boards with your columns, and a due date that notifies you. 📡 Website Monitor Are your sites up? The code and the latency, from your machine. 📤 Send to another computer Text and images to another computer on your network. 📅 Calendar A month view in your menu bar.