Tracking
Channels, UTM tags and campaign links
How Joinsight classifies each first touch into a channel, how to tag links so social and email traffic is credited, and App Store campaign links.
Every first touch the snippet records gets one channel: organic search, social, email and so on. The channel is what the Channels view groups revenue by, and what the Monday brief and the MCP server mean when they say a customer came from somewhere. This page explains exactly how that decision is made, so you can predict it, and how to tag your links so the answer is the right one.
The rules are fixed and the same for every workspace. The short version is also on the metric definitions page.
The channels
| Channel | What it means |
|---|---|
| Organic search | A search engine sent the visit, without an ad. |
| AI search | A link in an AI assistant's answer, such as ChatGPT, Perplexity, Claude or Gemini. |
| Paid search | A search ad, recognized by a Google or Microsoft Ads click ID, a paid UTM medium, or an ad platform such as google_ads as the UTM source. |
| Social | A social network or community site, from its referrer, a UTM tag or fbclid. |
| Paid social | A social network tagged with a paid UTM medium, a social ad platform such as facebook_ads as the UTM source, or a paid social medium such as paid_social. |
A UTM medium of email or newsletter, a source of newsletter, or a webmail referrer such as Gmail or Outlook. | |
| Referral | Another website, or a UTM source Joinsight doesn't recognize. |
| App Store | A visit from your App Store page, or tagged with an App Store source. |
| Direct | No UTM tags, no click ID and no referrer from another site. |
Most channels also carry a network: Google or Bing for search, ChatGPT or Perplexity for AI search, Instagram or Reddit for social, the referring domain for a referral, the UTM source or webmail service for email. A customer with no first touch at all, because they were never linked through identify(), shows as Unattributed.
On screen, paid channels are named with their network, such as Paid search · Google or Paid social · LinkedIn, so they never read like their unpaid counterparts. Organic search reads Organic search · Google, and AI search reads AI search · ChatGPT. Social, email and referrals show the network alone, such as LinkedIn or Gmail.
How a visit is classified
Joinsight checks four things in order and stops at the first that applies. Values are compared in lowercase.
1. Ad click IDs
Google Ads and Microsoft Ads add a click ID to the landing URL of every ad click, and to nothing else. That makes it the most reliable signal there is, so it is read first:
gclid,gbraidorwbraid: Paid search, Google.msclkid: Paid search, Bing.
A click ID wins over UTM tags unless the tags already mark the visit as paid, that is, unless step 2 would give Paid search or Paid social. Then the tags are kept, because they can name the network more precisely, for example a YouTube ad tagged utm_source=youtube&utm_medium=paid_social.
2. UTM source and medium
If the landing URL has a utm_source or a utm_medium, the channel comes from the tags, and the referrer is ignored. Within this step, the first matching rule wins:
- The source is a known social network. Social, or Paid social when the medium is paid. Recognized sources are
ig,instagram,facebook,fb,meta,x,twitter,linkedin,tiktok,youtube,reddit,threads,bluesky,pinterest,hn,hackernews,indiehackersandproducthunt. A social domain also works as a source, such asl.instagram.comort.co. A network name followed byads, with or without a hyphen or underscore, names its ad platform and is Paid social whatever the medium:facebook_ads,linkedin-ads,metaads. Meta ads run on both Facebook and Instagram, sometagets its own network, Meta. - The source is a search ad platform:
google,bingormicrosoftfollowed byads, with or without a hyphen or underscore, such asgoogle_adsormicrosoft-ads, oradwords. Paid search, Google or Bing, whatever the medium. - The source is an AI assistant. AI search, or Paid search when the medium is paid, for ads shown inside an assistant. Recognized sources are
chatgpt,openai,perplexity,claude,gemini,copilot,deepseek,grokandmistral, plus any AI assistant domain from step 4, such aschatgpt.com. ChatGPT addsutm_source=chatgpt.comto the links in its answers by itself, so those visits need no tagging. - The source is a search engine name. Organic search, or Paid search when the medium is paid. The names are
google,bing,duckduckgo,yahoo,ecosia,qwant,yandex,baidu,braveandstartpage. - The medium is
emailornewsletter, or the source isnewsletter. Email. - The source is
app_storeorappstore. App Store. - The medium is a paid social medium, with any other source. Paid social, with your source as the network.
- The medium is any other paid medium, with any other source. Paid search, with your source as the network.
- The medium is
socialorsocial-media, with any other source. Social, with your source as the network. - Anything else. Referral, with your source as the network.
The paid social mediums are paid_social, paidsocial, paid-social, social_paid and social-paid. The other paid mediums are cpc, ppc, paid, ads, paidsearch, paid_search, paid-search, sem, cpm and display.
utm_campaign, utm_content and utm_term don't affect the channel. A link with only utm_campaign set goes on to the next step as if it had no tags.
3. fbclid
With no UTM source or medium, fbclid means Social. Meta adds it to links clicked on Facebook and Instagram, from ads and organic posts alike, so it can't tell paid from organic and never counts as paid. The network is Instagram when the referrer is an Instagram domain, Facebook otherwise.
4. The referrer
With no click ID and no tags, the referrer's domain decides:
- An AI assistant or one of its subdomains: AI search. The list is
chatgpt.com,chat.openai.com,perplexity.ai,claude.ai,gemini.google.com,bard.google.com,copilot.microsoft.com,copilot.com,deepseek.com,meta.ai,grok.com,mistral.ai,you.comandphind.com. AI assistants are checked first, so Gemini never counts as Google search. Copilot answers opened throughbing.comcan't be told apart from a Bing search and count as Organic search · Bing. - A webmail service: Email. The list is
mail.google.com(Gmail),mail.yahoo.com,outlook.live.com,outlook.office.com,outlook.office365.com,outlook.cloud.microsoft,mail.proton.me,mail.aol.com,mail.zoho.com,mail.zoho.eu,app.fastmail.com,mail.yandex.ruandmail.yandex.com, plus any domain that starts withmail.orwebmail.. Webmail is checked before search engines, so a link clicked in Gmail never counts as Google search. - A search engine: Organic search. Any domain with a search engine's name as one of its parts counts, so
google.co.ukandsearch.brave.comare both recognized. Other properties on a search engine's domain, such asdocs.google.com, count as search too. - A known social domain or one of its subdomains: Social. The list includes
instagram.com,facebook.com,fb.com,t.co,x.com,twitter.com,linkedin.com,lnkd.in,tiktok.com,youtube.com,youtu.be,reddit.com,news.ycombinator.com,threads.net,threads.com,bsky.app,pinterest.com,indiehackers.comandproducthunt.com. apps.apple.com: App Store.- Any other domain: Referral, with that domain as the network.
- No referrer: Direct.
A page reached from your own hostname isn't a landing page, so the snippet sends no session for it. Moving between your own pages never creates a referral or a Direct visit.
Examples
| Landing URL or referrer | Channel | Network |
|---|---|---|
?utm_source=newsletter&utm_medium=email | newsletter | |
?utm_medium=email | none | |
?utm_source=x&utm_medium=social | Social | X |
?utm_source=producthunt | Social | Product Hunt |
?utm_source=indiehackers&utm_medium=community | Social | Indie Hackers |
?utm_source=discord&utm_medium=social | Social | discord |
?utm_source=linkedin&utm_medium=cpc | Paid social | |
?utm_source=google&utm_medium=cpc | Paid search | |
?utm_source=meta&utm_medium=paid_social | Paid social | Meta |
?utm_source=facebook_ads | Paid social | |
?utm_source=google&utm_medium=ads&gclid=... | Paid search | |
?utm_source=newsletter&utm_medium=email&gclid=... | Paid search | |
?utm_source=show-name&utm_medium=podcast | Referral | show-name |
?utm_campaign=launch, referrer t.co | Social | X |
?gclid=... | Paid search | |
?msclkid=... | Paid search | Bing |
?fbclid=... | Social | |
?fbclid=..., referrer l.instagram.com | Social | |
?utm_source=chatgpt.com | AI search | ChatGPT |
Referrer perplexity.ai | AI search | Perplexity |
Referrer gemini.google.com | AI search | Gemini |
Referrer mail.google.com | Gmail | |
Referrer www.google.co.uk | Organic search | |
Referrer l.instagram.com | Social | |
Referrer news.ycombinator.com | Social | Hacker News |
Referrer apps.apple.com | App Store | App Store |
Referrer someblog.com | Referral | someblog.com |
| No tags, no referrer | Direct | none |
Two rules are easy to get wrong:
fbclidalone never means paid. Meta adds it to organic links too, so untagged Meta ads count as Social. Tag them with a paid medium, for exampleutm_source=meta&utm_medium=paid_social, or withutm_source=instagram&utm_medium=paid_socialwhen you know the placement.- A Google or Microsoft Ads click ID outranks tags that don't say paid. An ad whose final URL carries
utm_source=newsletter&utm_medium=email, for example because it was copied from a newsletter link, is still Paid search, Google. Tags that do say paid are kept as they are.
Why social apps lose the referrer
Instagram, TikTok, Facebook and most other apps open links in their own in-app browser, often through a redirect such as l.instagram.com. Depending on the app, the device and the browser's referrer policy, your page receives that redirect domain or no referrer at all. Email clients and messaging apps usually send none. Without a referrer and without tags, the visit is Direct.
The fix is to make the link carry its own label. A UTM-tagged link classifies the same way whatever the referrer does. Tagging recovers the people who tapped. It can't recover people who saw a post, didn't tap and typed your URL later; those stay Direct or Organic search. Instagram link-in-bio tracking goes into this for Instagram specifically.
A naming convention
The convention in UTM parameters naming convention works well with these rules:
- Lowercase everything, hyphens between words. Classification ignores case for source and medium, but the values are stored as sent, so
Launch-Marchandlaunch-marchare two campaigns in your reports. - Source is the platform:
x,reddit,instagram,newsletter. Use the names from the lists above where one exists, so the network is recognized. - Medium comes from a short fixed list:
social,email,community,podcast,referral, and for adscpcon search orpaid_socialon social networks. - Campaign is the push, such as
pricing-launch-2026-03. Content is the specific link, such asstoryor a post ID. - Don't tag internal links. A page reached from your own site never starts a session, and a first touch is never replaced, so the tags do nothing there. They only take effect when someone copies the link and opens it elsewhere, and then they label that visit with the wrong channel.
Here is how that convention's rows land:
| utm_source | utm_medium | Channel | Network |
|---|---|---|---|
x | social | Social | X |
reddit | social | Social | |
instagram | social | Social | |
newsletter | email | newsletter | |
| A sponsor's newsletter name | email | that name | |
indiehackers | community | Social | Indie Hackers |
producthunt | community | Social | Product Hunt |
Another forum, such as discord | community | Referral | discord |
show-name | podcast | Referral | show-name |
Indie Hackers and Product Hunt are known networks, so they are Social whatever the medium says. A forum Joinsight doesn't know, tagged with community, becomes a Referral with its name as the network: still separate and readable in the Channels view, just under a different heading. If you would rather have such forums counted as Social, use social as their medium.
The link builder
Content & channels → Link builder builds tagged links and keeps a list of the ones you saved, so you don't assemble them by hand. It has two modes: Website link (UTM) and App Store campaign link.
Website links
Choose where the link goes. Instagram bio, Instagram story and Instagram post preset the source to instagram, the medium to social and the campaign to bio, story or post. Custom leaves the fields for you. Then fill in:
- Name, for your list of saved links.
- Destination URL, the full
https://address of the page people should land on. Its path, other query parameters and hash are kept;utm_source,utm_medium,utm_campaignandutm_contentalready on it are replaced. - Source, Medium and Campaign, all required. Source and medium are lowercased for you.
- Content, optional, sent as
utm_content. Use it to tell links in the same campaign apart.
The preview under Your link updates as you type. Save link stores it with the date, and saved links can be copied or deleted later.
Instagram post links
For an Instagram post, utm_content carries the post's media ID. That is how Joinsight joins a post to the sessions, signups and MRR it brought: sessions and first touches whose utm_content equals a post's media ID are counted for that post, within the period picked in the Instagram view. When Joinsight has your Instagram posts, the builder lets you pick the post from a list. Otherwise it asks for the post's media ID, which you can paste yourself. Captions don't make links clickable, so publish the post first, then put its link in your bio or a story while the post is fresh. More in Connect App Store Connect and Instagram.
App Store campaign links
UTM tags mean nothing to the App Store. Apple has its own campaign links, and the builder makes them in the second mode:
https://apps.apple.com/app/apple-store/id1234567890?pt=123456&ct=newsletter-2026-07&mt=8
id1234567890is your app's Apple ID, taken from your App Store Connect connection.ptis your provider token. It identifies your developer account and is the same on every link. You add it once under Connections → App Store Connect, in the Provider token field: create one campaign link in App Store Connect, then paste that link or just itsptnumber.ctis the campaign token, the part you choose per link. Apple allows at most 40 characters, and the builder enforces it.mt=8marks the link as pointing to an app.
Until App Store Connect is connected and the provider token is saved, the App Store mode shows a pointer to the Connections screen instead of the form.
Campaign results are aggregate. Apple reports impressions, product page views and downloads per day, source type and campaign, never per person, and your app never receives the token. So an App Store campaign can't be joined to a specific customer the way a UTM link can. Joinsight shows these counts in the App Store view of Content & channels, by source type or by campaign, next to RevenueCat trials and new MRR for the same period. As the builder notes, Apple shows a campaign in the detailed reports after 24 hours and at least 5 first-time downloads, counting downloads within 24 hours of the click.
This is a different thing from the App Store channel above. That channel is for web visits: someone who followed a link from your App Store page to your website, or a web link you tagged with utm_source=app_store. Those visits are measured per person like any other first touch.
Naming tokens, one link per channel and what the reports can't tell you are covered in App Store campaign links.