Google Analytics files a third of your traffic under “Direct,” even though you know those people came from your WhatsApp community and your Facebook group. Instagram reports 300 link-in-bio taps, but half the leads in your CRM have no source at all. Social clearly works — and you still can’t say which post made money.

UTM tags fix that. They’re short additions to a link that tell your analytics where a visitor came from. Setup takes an evening, and after that every link in a Story, post or pinned message reports back on its own.

Below: a naming scheme you won’t have to redo next month, a spreadsheet for building links, where to read results in GA4, and what to do when sales happen in DMs and messengers instead of on your site.

What UTM tags are and why social is invisible without them

A UTM tag is a set of parameters at the end of a link:

https://shop.com/catalog?utm_source=facebook&utm_medium=social&utm_campaign=2026-10-fall-sale

When someone clicks, your analytics reads the parameters and records the source. Without them, things get messy: messaging apps like WhatsApp and Telegram often don’t pass a referrer, so visits land in “Direct.” Instagram passes a generic domain at best, so a bio click looks the same as a Stories click.

There are five parameters:

ParameterMeaningExample
utm_sourcePlatforminstagram, facebook, threads
utm_mediumTraffic typesocial for organic, paid_social for ads
utm_campaignCampaign or occasion2026-10-fall-sale, evergreen
utm_contentWhich exact linkbio, stories-1012, post-1014-prices
utm_termKeyword or audienceRarely needed for organic

Always fill in the first three. utm_content is the one that matters most for social: it answers “which post?”

Naming scheme: agree on it once

UTMs rarely break on the technical side. They break on inconsistency. One person types Instagram, another insta, a third ig, and your report shows three rows instead of one. Rules that prevent this:

  • Lowercase only. GA4 is case-sensitive.
  • No spaces — use hyphens. Spaces become %20 and look broken in reports.
  • A closed list of sources: instagram, facebook, threads, x, linkedin, youtube, whatsapp. Write it down and don’t improvise.
  • medium = social for organic, paid_social for ads. GA4 will put the first in Organic Social and the second in Paid Social: for sources it recognizes as social networks, a medium starting with paid counts as paid.
  • campaign = date + topic. 2026-10-fall-sale sorts chronologically. For permanent links, use evergreen.

Here’s the sheet for an online kids’ clothing store:

Link locationsourcemediumcampaigncontent
Instagram bioinstagramsocialevergreenbio
Story with link stickerinstagramsocial2026-10-fall-salestories-1012
Facebook group postfacebooksocial2026-10-fall-salepost-1014-prices
Threads postthreadssocial2026-10-fall-salepost-1015
Pinned post on Xxsocialevergreenpin
Reels adinstagrampaid_social2026-10-fall-salereels-ad-a

Don’t forget the bio: it’s often the most-clicked link on the account. How to make people click it in the first place is covered in our post on Instagram bios.

Create a Google Sheet with columns: page URL, source, medium, campaign, content, final link. In the last column:

=A2&"?utm_source="&B2&"&utm_medium="&C2&"&utm_campaign="&D2&"&utm_content="&E2

If the page URL already contains ?, change the first ? in the formula to &. The sheet doubles as a log: everyone sees which links exist, and nobody invents a new name for an old campaign. Google’s free Campaign URL Builder works too, but you’ll still need the log.

A long tagged link looks scary. Each platform has a workaround:

  • Facebook and LinkedIn show a link preview card, so the URL itself barely matters.
  • Instagram and Threads bios — use a short link on your own domain (shop.com/ig) that redirects to the tagged URL. Click it and confirm the tags survive in the address bar.
  • Stories — the link sticker shows custom text, not the URL.

Test every new link before publishing: open it and find your visit in GA4’s Realtime report.

Where to read the results

In GA4: Reports → Acquisition → Traffic acquisition. Set the primary dimension to “Session source / medium,” use “Session campaign” for campaigns, and add utm_content (“Session manual ad content”) as a secondary dimension. Leads and purchases need to be set up as key events.

Here’s how it reads in practice — same store, October:

utm_contentSessionsLeadsConversion
stories-101221041.9%
post-1014-prices9599.5%
bio340113.2%
reels-ad-a1,120141.3%

A conclusion you can’t reach without tags: the Facebook group post with prices brought almost 12 times fewer visitors than the ad, yet produced 9 leads to the ad’s 14. So the next ad budget should boost posts with prices instead of generic videos. Tables like this drop straight into a monthly social media report.

Plausible, Matomo and most other analytics tools read the same UTM parameters, so the scheme works whatever you use.

Getting the tag all the way to revenue

Analytics sees visits and leads. To see money, the tags need to reach your CRM along with the lead.

  • HubSpot and many other CRMs can capture UTM values from website forms — check your form settings.
  • Custom forms — hidden fields filled from the URL. That’s roughly an hour of developer work. One detail matters: the tags need to persist across pages, or a visitor who browses the catalog before opening the form loses their source.

Once UTMs live in your CRM, you’re counting revenue, not clicks: Facebook — $3,100 this month, Instagram — $5,200. How to turn that into cost per lead and ROI is covered in our guide to social media metrics.

When sales happen in DMs and messengers

UTMs only work when there’s a website. Plenty of small businesses sell in Instagram DMs and WhatsApp. These have their own tracking tricks:

  • WhatsApp with prefilled text: wa.me/15551234567?text=Hi!%20Code%20IG10. The code shows up in the first message.
  • Telegram bot deep links: t.me/shop_bot?start=ig_bio. The bot receives the parameter at start and can log the source. Up to 64 characters: letters, digits, _ and -.
  • Per-platform discount codes: INSTA10, FB10. Old-school, and it works in-store too.
  • “How did you hear about us?” — as a backup, not your main method. People misremember.

Mistakes, and when tags won’t help

  • UTMs on internal links. A tagged banner on your homepage overwrites the visitor’s real source. Tags are only for links pointing to your site from outside.
  • Inconsistent names. The only cure is the log and the closed list.
  • Tags on other people’s sites. A tagged link to a marketplace listing won’t show up in your analytics.
  • Long sales cycles. In B2B, someone sees a post and finds you via Google three weeks later. The tag records Google, not the post. UTMs show the minimum contribution of social, not the full one.
  • Offline sales. If someone saw a Reel and walked into your store, no tag will know. Discount codes and asking at checkout are your only tools.

Tags show which posts bring money; platform analytics show why some posts spread and others don’t. In Repost21 you plan posts for every network in one calendar, so it’s easy to drop the right tagged link into each version at once, with Instagram, YouTube and Threads analytics alongside. Try it free — and in a month you’ll know which post actually sold.