Skip to main content
ComparisonsBy SendURL teamUpdated 7 min read

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.

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:

The tagged URLText
https://example.com/autumn-sale?utm_source=instagram&utm_medium=social&utm_campaign=2026-10-autumn-sale&utm_content=bio-link-2

Step 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:

Create the short linkShell
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:

Read the redirectShell
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-2

The 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).

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:

PlacementShort linkDestination UTMs
Instagram bio, link 2snu.to/autumn-ig-bio2utm_source=instagram&utm_medium=social&utm_content=bio-link-2
Instagram Story, 14 Octsnu.to/autumn-ig-storyutm_source=instagram&utm_medium=social&utm_content=story-2026-10-14
Newsletter buttonsnu.to/autumn-newsutm_source=newsletter&utm_medium=email&utm_content=hero-button
Store-window poster (QR)snu.to/autumn-posterutm_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.

UTMs and short links answer different questions, which is why they work well together:

UTMs (read by GA4)Short link (SendURL)
Where it recordsOn your page, when GA4 loadsAt the redirect, before any page loads
Needs your own site with analyticsYesNo: works for PDFs, partner pages, app stores
Counts people who leave before the page loadsNoYes
Affected by consent banners and analytics blockersCan beNo, it records the redirect, not a page script
Counts link previews and email scannersRarely, they don't run GA4Yes, as clicks
Sees what happens after landingYes: pages, events, key eventsNo
Records each click on the linkNo, it records the visit if the page loadsYes: time, country, device, browser, OS, referrer
Readable on a poster or in a bioNoYes

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.

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:

links.csvText
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-button
create-links.sh (needs curl and jq)Shell
tail -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)"'
done

A 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.

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:

Replace the destination (and its UTMs)Shell
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-social tells GA4 nothing. The slug is for people; the UTMs are for GA4.
  • A medium GA4 doesn't recognise. utm_medium=newsletter or utm_medium=story lands in Unassigned. See why GA4 files UTM traffic as Unassigned.
  • Mixed case. Instagram and instagram become two rows. Agree on values with a UTM naming convention.
  • 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_medium and utm_campaign, all lowercase
  • The whole tagged URL is the short link's destination
  • curl -sI shows every tag in the location header
  • 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