ยท7 min readยทSam Wild

The UTM tracking guide for app marketers

UTMs work brilliantly for websites. Applying them to app marketing requires a different approach โ€” here's how to do it properly.

UTM parameters are one of those things that everyone in marketing knows about but surprisingly few people use well. And when it comes to app marketing specifically, there's a gap between how UTMs work on the web and how they need to work for mobile.

I want to walk through both: the basics (because getting them right matters more than people think) and the app-specific stuff that trips most developers up.

What UTMs actually are

UTM stands for Urchin Tracking Module. Urchin was a web analytics company that Google acquired in 2005 and turned into Google Analytics. The tracking parameters they invented stuck around.

A UTM is just a set of query parameters you add to a URL. When someone clicks that URL, whatever analytics tool you're using reads those parameters and records where the visitor came from.

A standard UTM link looks like this:

https://example.com/page?utm_source=tiktok&utm_medium=organic&utm_campaign=spring-launch

There are five standard UTM parameters:

  • utm_source โ€” where the traffic comes from (tiktok, instagram, newsletter)
  • utm_medium โ€” the type of channel (organic, paid, email, cpc)
  • utm_campaign โ€” the specific campaign name (spring-launch, black-friday-2026)
  • utm_term โ€” the keyword, if relevant (usually for paid search)
  • utm_content โ€” used to differentiate between variants (buttonA, buttonB, hero-image)

Most people only use the first three. That's fine for most cases.

The web version is easy

On a website, UTMs are straightforward. Someone clicks your link, lands on your site, and Google Analytics (or whatever you use) reads the parameters from the URL and logs the session source. You can then see that 40% of your traffic came from your newsletter and 25% from TikTok.

This works because the browser preserves the full URL, cookies persist across pages, and your analytics tool can tie the visit to later actions like purchases.

Simple. Reliable. Solved problem.

The app version is harder

Here's where it gets tricky. When someone clicks a link to your app, one of several things happens:

  1. They have the app installed, so the link opens the app directly
  2. They don't have the app, so the link goes to the App Store
  3. They're on desktop, so the link goes to your website or a landing page

In cases 2 and 3, the UTM parameters in your original URL get lost. The App Store doesn't pass query parameters through to your app after installation. By the time the user opens your app for the first time, the connection between "clicked a TikTok link" and "opened the app" is broken.

This is the fundamental problem with using raw UTMs for app marketing. The web assumes a continuous browser session. App installs break that session.

How people work around this

There are a few approaches, each with trade-offs.

Approach 1: Track the click, not the install

Instead of trying to pass UTMs through the App Store, you track the click on your end and then match it to the install later.

You create a link that goes through your own server first. Your server logs the click (including all UTM parameters, the user's IP, device type, and timestamp), then redirects to the App Store. When the user opens your app for the first time, your app reports back with similar device info, and your server tries to match the install to a previous click.

This is called probabilistic matching or fingerprinting. It's not perfect โ€” shared IPs, VPNs, and time delays reduce accuracy โ€” but it works well enough for most small-scale campaigns.

Approach 2: Use a tracking link service

Tools like Branch, AppsFlyer, and LinkOwl handle this matching for you. You create a tracked link in the dashboard, the service handles the redirect and click logging, and attribution happens automatically.

The advantage is you don't have to build the matching logic yourself. The disadvantage (with the bigger tools) is cost and setup complexity. LinkOwl keeps it simple โ€” create a link, share it, and purchases get attributed back to that link via RevenueCat or Superwall webhooks.

Approach 3: Campaign-specific landing pages

Some developers skip the attribution tech entirely and create separate landing pages for each campaign. The TikTok bio links to /from-tiktok, the newsletter links to /from-newsletter, and each page has its own App Store link.

You can then see traffic per page in your web analytics and get a rough idea of which channels drive installs. It's crude but it works if you only have a few channels and don't need purchase-level attribution.

UTM naming conventions that actually work

However you handle the technical side, consistent UTM naming is what makes your data useful months later. I've seen dashboards where the same TikTok campaign shows up as "tiktok", "TikTok", "tik-tok", "tt", and "social-tiktok". That's five data points that should be one.

Here's a naming convention that holds up:

Source: Always lowercase, one word. tiktok, instagram, newsletter, reddit, google.

Medium: Stick to a fixed list. organic for unpaid social posts. paid for ads. email for newsletters. cpc for cost-per-click campaigns. referral for partner links. Don't invent new mediums unless you have a good reason.

Campaign: Use a consistent format. I like YYYY-MM-description: 2026-03-spring-launch, 2026-03-influencer-batch-2. Including the date means you can sort campaigns chronologically without checking a spreadsheet.

Content: Use this for A/B testing. hero-image-v1 vs hero-image-v2, or cta-blue vs cta-green. Skip it if you're not testing variants.

Write these conventions down somewhere your team can find them. A shared doc, a Notion page, a README โ€” anywhere that's not just in your head.

Common mistakes

Putting UTMs on internal links. If you add UTM parameters to links within your own site or app, you'll overwrite the original source. Someone who came from TikTok and then clicks an internal link tagged with utm_source=homepage-banner now looks like they came from your homepage banner. Only use UTMs on external links pointing to your properties.

Using UTMs on links you don't control. If you put UTMs on a link in someone else's newsletter, that's fine โ€” you're tracking traffic they send you. But if you put UTMs on a link in your own Google Ad, you're duplicating what Google Ads tracking already does, and the data might conflict.

Forgetting that UTMs are visible. Your users can see UTM parameters in the URL bar. Don't put anything in there you'd be embarrassed by. I've seen utm_campaign=desperate-reactivation-attempt in the wild. Don't be that person.

Not URL-encoding special characters. Spaces, ampersands, and other special characters in UTM values will break your tracking. Use hyphens instead of spaces: spring-launch not spring launch.

What UTMs can and can't tell you

UTMs tell you where traffic came from. They're good at answering "which channel sent this visitor?" and "which campaign is getting the most clicks?"

They can't tell you what happened after the click โ€” at least not by themselves. To connect a click to a purchase, you need something on the other end recording that the person who clicked actually bought something. On the web, that's your analytics tool plus e-commerce tracking. For apps, that's where attribution services come in.

Think of UTMs as the first half of the story. They mark the source. Something else has to close the loop by matching that source to a conversion.

A practical setup for indie app developers

If you're a solo developer or small team, here's what I'd actually recommend:

  1. Pick a naming convention for source, medium, and campaign. Write it down.
  2. Use a tracking link service (LinkOwl, Branch, whatever fits your budget) for links you share on social media and with influencers. These handle the App Store redirect problem.
  3. Use raw UTMs for web traffic โ€” your landing page, blog posts, anywhere the destination is a website rather than an app install.
  4. Review your attribution data monthly. Look for channels that get clicks but no purchases. Those are either wasted effort or broken tracking โ€” both worth investigating.

You don't need a complicated setup. You need a consistent one. The developers who get the most out of their marketing data aren't the ones with the fanciest tools. They're the ones who name their campaigns the same way every time and actually look at the numbers.

Track your marketing links with LinkOwl

5p per sale, no subscription. Know exactly which post, influencer, or campaign drove each purchase.

Start tracking free โ†’