Instagram shows as direct in GA4: UTMs for bio, Stories, Reels and DMs
Published by the UTM Builder team at Limner.
When a click reaches the site with no UTM and no referrer, GA4 has no way of knowing it came from Instagram and records (direct) / (none). With a UTM on every link you control (bio, Stories, Reels and DMs) and utm_medium=social, the session lands in Organic Social under GA4’s own rule, and you also know which placement it came from.
Why it turns into direct or referral
The GA4 help defines (direct) / (none) as traffic without a clear referring source and lists the causes: links without UTMs, redirects that strip the parameters, link shorteners that strip the referral details, and ad blockers. Meta doesn’t document when a click leaving the Instagram app carries the referrer with it. Without UTMs, you depend on something you don’t control.
When the referrer does arrive, the source shows up as instagram.com or l.instagram.com, with medium referral. The source list GA4 publishes marks instagram, ig, instagram.com and l.instagram.com as social. Even so, every click from the profile arrives lumped together, and you can’t tell the bio from a Story.
The channel rule
| Channel | Rule in GA4 |
|---|---|
| Organic Social | source on the list of social sites or medium equal to social, social-network, social-media, sm, social network or social media |
| Paid Social | source on the list of social sites and medium matching ^(.*cp.*|ppc|retargeting|paid.*)$ |
| Referral | medium equal to referral, app or link |
| Direct | source (direct) and medium (not set) or (none) |
- These are the values exactly as GA4’s help page lists them. Write them the same way.
utm_medium=socialmatches on medium, whatever the source. It’s the safest route for organic.- The GA4 help says the values are case-sensitive.
Instagramandinstagrambecome two rows in the report. Use lowercase throughout. - A
paidmedium on organic links puts the session in Paid Social. Save that medium for ads, as in the guide on Meta URL parameters.
One link for each placement
The GA4 help asks for utm_source, utm_medium and utm_campaign every time. Keep source and medium fixed and use utm_content to say where the click came from:
| Placement | Parameters |
|---|---|
| Bio, first link | utm_source=instagram&utm_medium=social&utm_campaign=perfil&utm_content=bio-link1 |
| Story | utm_source=instagram&utm_medium=social&utm_campaign=lancamento-out26&utm_content=story-20261012 |
| Reels | utm_source=instagram&utm_medium=social&utm_campaign=lancamento-out26&utm_content=reels-bastidores |
| DMs and automation | utm_source=instagram&utm_medium=social&utm_campaign=lancamento-out26&utm_content=dm-palavra-chave |
A complete bio link looks like this:
https://www.seusite.com.br/curso?utm_source=instagram&utm_medium=social&utm_campaign=perfil&utm_content=bio-link1
- Each bio link gets its own UTM. If you use a link-in-bio page, tag each of its buttons, not just the link to the page.
- Link shorteners and redirects can strip the UTM. Open the short link on your phone and check that the final URL arrives with the parameters.
- If a
utm_source=igthat nobody added shows up in the report, open the link from the app and look at the URL that reaches the site. Meta doesn’t document whether the app appends parameters, so confirm it in your own case before you build a rule on it.
Where to check in GA4
In Reports, Acquisition, Traffic acquisition, change the primary dimension to Session source / medium and look for instagram / social. To separate bio, Story and Reels, add the campaign content (utm_content), as the guide on utm_content in GA4 explains. Whatever still shows as l.instagram.com / referral is a click on a link without UTMs.