Tag campaign links so GA4 can tell where a visit came from
Fill the campaign once, paste your links, and copy the tagged URLs — one per line. Everything runs in the browser.
🔒 100% client-side · zero server upload
Lines that need attention
Malaysian rules & edge cases
A UTM parameter is a query string on the end of the link itself. This tool installs nothing: as long as the destination page already runs standard GA4 tracking, the words after ? are what GA4 reads to file the visit under a campaign. The rules below decide whether the data is usable.
| Pasted link | Parameters written |
|---|---|
| hoelee.com/promo | utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026 |
| hoelee.com/services?utm_source=old | utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026 |
| wa.me/60123456789 | utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026 |
- utm_source is the referrer, and it is not optional.
facebook,google,newsletter— one value per platform. A link without a source cannot be attributed, so this tool refuses to build one and says why instead of handing over a link that will land in “Unassigned”. - utm_medium is the channel, not the platform.
paid_social,cpc,email,affiliate. Never writeorganicfor a paid ad — that is the one label GA4 already uses for unpaid search traffic. - utm_campaign is the campaign name (
raya-2026,promo-55). utm_content separates two creatives, utm_term carries the paid keyword, utm_id carries your own campaign number and is the one parameter that survives a rename. - Values are text. GA4 files
Facebookandfacebookas two different sources, so one typo splits a campaign in half. The lower-case switch folds every value; it is off by default because it rewrites what you typed. - Existing parameters are preserved byte for byte. An affiliate id, a
ref, a marketplace's own encoding keeps its position and its%2F. Only the six UTM parameters are touched — rewritten, or left alone if you choose “Keep them”. - Never put customer data in a URL. A name, an email, a phone number or an IC number in a query string ends up in analytics, in server logs, in screenshots and in forwarded WhatsApp messages. Tag the campaign, not the person.
- Do not tag internal links. Clicking a tagged link starts a new session's campaign, so an internal link with UTMs on it overwrites the campaign that actually brought the visitor.
- Cap: 2,000 characters. Past that, chat apps and some ad networks truncate the link, so the tool refuses it rather than shipping half a link.
Parameters are written in a fixed order (source, medium, campaign, id, term, content), so two runs of the same campaign produce the same string and a diff between two exports means something.
Before and after
Before
https://hoelee.com/promo/raya-2026
hoelee.com/promo
https://www.hoelee.com/services?ref=quotation-2026
https://hoelee.com/promo?utm_source=old-poster&affiliate_id=A%2FB
wa.me/60123456789
ftp://files.hoelee.com/catalogue.pdf After
https://hoelee.com/promo/raya-2026?utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026
https://hoelee.com/promo?utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026
https://www.hoelee.com/services?ref=quotation-2026&utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026
https://hoelee.com/promo?affiliate_id=A%2FB&utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026
https://wa.me/60123456789?utm_source=facebook&utm_medium=paid_social&utm_campaign=raya-2026 How it works
- Fill in the campaign once: at least utm_source, ideally Source, Medium and Campaign together. The same values apply to every link you paste.
- Paste your links, one per line. A bare hoelee.com/promo is accepted and given https://; a line that is not http or https is refused.
- Press Run, then Copy result. Read the list underneath: every rewritten parameter, every added scheme and every refusal is named by line number.
FAQ
Why does my campaign not show up in GA4?
Three causes cover almost all of it: utm_source is missing, one of the three values has a typo or a different case than the last time, or the link was tagged but the visitor never actually arrived (a redirect that drops the query string does this). Check the tagged link in a fresh browser tab with the Network panel open — the request must carry the parameters.
Does upper or lower case matter?
Yes. GA4 compares the values as text, so utm_source=Facebook and utm_source=facebook are two separate rows in the report. Pick one spelling and keep it: either type it that way or switch on “Lower-case every value”.
Can I tag a Shopee or Lazada product link?
Yes, and it is the usual case here. Set the mode to “Keep them” and any affiliate id or Shopee tracking parameter the link already carries is left exactly as it arrived; only the UTM parameters you fill in are added. Some marketplaces rewrite their own links on redirect, which is outside this tool’s control — test one link before you spend on a whole campaign.
Why was https:// added to my link?
Because the line had no scheme. A pasted shopee.com.my/promo is not a URL until it has one, and typing http:// by hand is how a whole campaign ends up on a deprecated scheme. The added scheme is listed per line so you can see it happened.
Do my links leave the browser?
No. The page is static JavaScript with no network calls: the queries are built by string concatenation in the tab, and there is no request to a link shortener, an analytics endpoint or this site’s server.