How to Shorten a UTM Link Without Losing Tracking
To shorten a UTM link, build the full tagged URL first and shorten that. The UTMs live in the destination, so they arrive intact. Tags added to the short link itself are not passed on.
To shorten a UTM link, build the full tagged URL first, then shorten that whole URL. The UTMs live in the destination, so the short link sends every visitor to the page with every tag intact. Anything added to the short link itself (snu.to/autumn-ig-bio2?utm_source=instagram) is not passed on by SendURL.
This post shows the steps, a one-line check that the tags survive, and the mistakes that quietly break GA4 reports. What each parameter means and which values GA4 accepts is in the UTM parameters guide.
Shorten a UTM link in three steps
Step 1: build the tagged URL. Start from the page and add source, medium and campaign by hand, or build the tagged URL with the UTM builder, which also shows the GA4 channel it lands in:
https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=bio-link-2Step 2: shorten the whole thing. Paste it into the box on the SendURL home page (no account needed), into the console, or send it to the API:
curl -X POST https://api.sendurl.to/api/v1/links \
-H "Authorization: Bearer $SENDURL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"destinationUrl": "https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=bio-link-2"}'The response's shortUrl is your link, for example https://snu.to/x7Kp2. Add "slug": "autumn-ig-bio2" for a readable one.
Step 3: check the redirect before you post it, as in the next section.
Check that the UTMs survive
Ask the short link where it goes without opening a browser:
curl -sI https://snu.to/x7Kp2 | grep -i '^location'
# location: https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=bio-link-2The location header is the URL the browser is sent to. If every tag is there, GA4 will see them. Add -L to follow any further redirects on your own site and make sure none of them drops the query string, or check that the UTMs survive with the redirect checker, which names the hop where they go missing.
That check is a real request, so it counts as one click in SendURL (with curl as the user agent).
Don't add UTMs to the short link
It's tempting to keep one short link and add tags per channel: snu.to/autumn?utm_source=newsletter, snu.to/autumn?utm_source=instagram. With SendURL that does nothing. The redirect goes to the stored destination, and the query string on the short link is dropped. The one exception is ?q, which marks a QR scan and is also dropped.
That isn't unusual. An HTTP redirect doesn't carry the request's query string over by itself; RFC 9110 only has it inherit the fragment. Some shorteners offer UTM forwarding as a setting. SendURL doesn't, so the rule is simple: tags go on the destination.
Make one short link per placement instead, each with its own tagged destination:
| Placement | Short link | Destination UTMs |
|---|---|---|
| Instagram bio, link 2 | snu.to/autumn-ig-bio2 | utm_source=instagram&utm_medium=social&utm_content=bio-link-2 |
| Instagram Story, 14 Oct | snu.to/autumn-ig-story | utm_source=instagram&utm_medium=social&utm_content=story-2026-10-14 |
| Newsletter button | snu.to/autumn-news | utm_source=newsletter&utm_medium=email&utm_content=hero-button |
| Store-window poster (QR) | snu.to/autumn-poster | utm_source=poster&utm_medium=qr&utm_content=store-window |
All four share utm_campaign=2026-10-autumn-sale. The short links split the clicks before GA4 is involved, and GA4 gets clean values for each. The poster row's utm_medium=qr matches no GA4 default channel, so those sessions show as Unassigned unless you add a custom channel group (why GA4 puts UTM traffic in Unassigned shows how). The social media link tracking guide has the full placement sheet.
What UTMs and short links each see
UTMs and short links answer different questions, which is why they work well together:
| UTMs (read by GA4) | Short link (SendURL) | |
|---|---|---|
| Where it records | On your page, when GA4 loads | At the redirect, before any page loads |
| Needs your own site with analytics | Yes | No: works for PDFs, partner pages, app stores |
| Counts people who leave before the page loads | No | Yes |
| Affected by consent banners and analytics blockers | Can be | No, it records the redirect, not a page script |
| Counts link previews and email scanners | Rarely, they don't run GA4 | Yes, as clicks |
| Sees what happens after landing | Yes: pages, events, key events | No |
| Records each click on the link | No, it records the visit if the page loads | Yes: time, country, device, browser, OS, referrer |
| Readable on a poster or in a bio | No | Yes |
So the short link's count is usually higher than GA4's sessions. The link analytics vs web analytics post explains the gap, and the free link tracker page shows what SendURL records per click.
Create a batch of tagged short links
For a campaign with many placements, keep them in a CSV and create the links in one go. To tag the destinations first, paste them into the bulk UTM builder and download the tagged list as CSV. This script then reads slug,destination rows and prints each short URL:
slug,destination
autumn-ig-bio2,https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=bio-link-2
autumn-news,https://example.com/autumn-sale?utm_source=newsletter&utm_medium=email&utm_campaign=2026-10-autumn-sale&utm_content=hero-buttontail -n +2 links.csv | while IFS=, read -r slug destination; do
jq -n --arg slug "$slug" --arg url "$destination" '{slug: $slug, destinationUrl: $url}' |
curl -s -X POST https://api.sendurl.to/api/v1/links \
-H "Authorization: Bearer $SENDURL_API_KEY" \
-H "Content-Type: application/json" \
-d @- |
jq -r '.shortUrl // "\(.error): \(.message)"'
doneA slug someone else already uses comes back as slug_taken: …; pick another and rerun that row, because slugs are unique across SendURL. Request and response fields are in the API reference.
Fix a UTM typo after the link is out
Because the tags live in the destination, a typo can be fixed without changing the short link or reprinting its QR code. Update the destination through the API:
curl -X PATCH "https://api.sendurl.to/api/v1/links/$LINK_ID" \
-H "Authorization: Bearer $SENDURL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"destinationUrl": "https://example.com/autumn-sale?utm_source=poster&utm_medium=qr&utm_campaign=2026-10-autumn-sale&utm_content=store-window"}'$LINK_ID is the link's id from the create response or from GET /links. The change applies within seconds. There's no form for it in the console; it's API only (update a link).
Mistakes that break tracking
- Tags on the short link instead of the destination. Covered above: they're dropped.
- UTM values in the slug.
snu.to/utm-ig-socialtells GA4 nothing. The slug is for people; the UTMs are for GA4. - A medium GA4 doesn't recognise.
utm_medium=newsletterorutm_medium=storylands in Unassigned. See why GA4 files UTM traffic as Unassigned. - UTMs on internal links. Links between your own pages should never carry them; they muddle the visitor's real source in GA4.
- The query after a
#.example.com/sale#top?utm_source=…puts the tags in the fragment, where GA4 doesn't read them. - One short link for every channel. You lose the per-placement click counts, which is the main reason to use a short link.
Checklist
- Tagged URL built first, with
utm_source,utm_mediumandutm_campaign, all lowercase - The whole tagged URL is the short link's destination
curl -sIshows every tag in thelocationheader- One short link per placement, each with its own
utm_content - Nothing appended to the short link itself
- Medium values match GA4's channel rules (or, for
qr, a custom channel group) - Destination fixes go through
PATCH /links/:id, not a new link
Frequently asked questions
Do short links keep UTM parameters?
A SendURL short link keeps every UTM that is part of its destination URL, because it redirects to the stored destination exactly as saved. Parameters added to the short URL itself are not forwarded.
Can I change the UTMs after I've shared the short link?
Yes, through the API: PATCH /links/:id with a new destinationUrl. The short link and its QR code stay the same and the next click goes to the new URL. The console has no form for this.
Do I still need UTMs if I use short links?
Only if you use GA4 or another web analytics tool. A short link counts clicks on its own, with country, device and referrer, but it can't see what people do on your site afterwards. UTMs let GA4 connect the visit to a campaign.
Start tracking links free.
Create your first short link with click analytics in seconds. No credit card, no sign-up to start.
Shorten a link