Skip to content
DocsChannels and campaign links

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

ChannelWhat it means
Organic searchA search engine sent the visit, without an ad.
AI searchA link in an AI assistant's answer, such as ChatGPT, Perplexity, Claude or Gemini.
Paid searchA 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.
SocialA social network or community site, from its referrer, a UTM tag or fbclid.
Paid socialA 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.
EmailA UTM medium of email or newsletter, a source of newsletter, or a webmail referrer such as Gmail or Outlook.
ReferralAnother website, or a UTM source Joinsight doesn't recognize.
App StoreA visit from your App Store page, or tagged with an App Store source.
DirectNo 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, gbraid or wbraid: 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:

  1. 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, indiehackers and producthunt. A social domain also works as a source, such as l.instagram.com or t.co. A network name followed by ads, 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, so meta gets its own network, Meta.
  2. The source is a search ad platform: google, bing or microsoft followed by ads, with or without a hyphen or underscore, such as google_ads or microsoft-ads, or adwords. Paid search, Google or Bing, whatever the medium.
  3. 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, grok and mistral, plus any AI assistant domain from step 4, such as chatgpt.com. ChatGPT adds utm_source=chatgpt.com to the links in its answers by itself, so those visits need no tagging.
  4. 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, brave and startpage.
  5. The medium is email or newsletter, or the source is newsletter. Email.
  6. The source is app_store or appstore. App Store.
  7. The medium is a paid social medium, with any other source. Paid social, with your source as the network.
  8. The medium is any other paid medium, with any other source. Paid search, with your source as the network.
  9. The medium is social or social-media, with any other source. Social, with your source as the network.
  10. 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.com and phind.com. AI assistants are checked first, so Gemini never counts as Google search. Copilot answers opened through bing.com can'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.ru and mail.yandex.com, plus any domain that starts with mail. or webmail.. 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.uk and search.brave.com are both recognized. Other properties on a search engine's domain, such as docs.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.com and producthunt.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 referrerChannelNetwork
?utm_source=newsletter&utm_medium=emailEmailnewsletter
?utm_medium=emailEmailnone
?utm_source=x&utm_medium=socialSocialX
?utm_source=producthuntSocialProduct Hunt
?utm_source=indiehackers&utm_medium=communitySocialIndie Hackers
?utm_source=discord&utm_medium=socialSocialdiscord
?utm_source=linkedin&utm_medium=cpcPaid socialLinkedIn
?utm_source=google&utm_medium=cpcPaid searchGoogle
?utm_source=meta&utm_medium=paid_socialPaid socialMeta
?utm_source=facebook_adsPaid socialFacebook
?utm_source=google&utm_medium=ads&gclid=...Paid searchGoogle
?utm_source=newsletter&utm_medium=email&gclid=...Paid searchGoogle
?utm_source=show-name&utm_medium=podcastReferralshow-name
?utm_campaign=launch, referrer t.coSocialX
?gclid=...Paid searchGoogle
?msclkid=...Paid searchBing
?fbclid=...SocialFacebook
?fbclid=..., referrer l.instagram.comSocialInstagram
?utm_source=chatgpt.comAI searchChatGPT
Referrer perplexity.aiAI searchPerplexity
Referrer gemini.google.comAI searchGemini
Referrer mail.google.comEmailGmail
Referrer www.google.co.ukOrganic searchGoogle
Referrer l.instagram.comSocialInstagram
Referrer news.ycombinator.comSocialHacker News
Referrer apps.apple.comApp StoreApp Store
Referrer someblog.comReferralsomeblog.com
No tags, no referrerDirectnone

Two rules are easy to get wrong:

  • fbclid alone never means paid. Meta adds it to organic links too, so untagged Meta ads count as Social. Tag them with a paid medium, for example utm_source=meta&utm_medium=paid_social, or with utm_source=instagram&utm_medium=paid_social when 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-March and launch-march are 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 ads cpc on search or paid_social on social networks.
  • Campaign is the push, such as pricing-launch-2026-03. Content is the specific link, such as story or 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_sourceutm_mediumChannelNetwork
xsocialSocialX
redditsocialSocialReddit
instagramsocialSocialInstagram
newsletteremailEmailnewsletter
A sponsor's newsletter nameemailEmailthat name
indiehackerscommunitySocialIndie Hackers
producthuntcommunitySocialProduct Hunt
Another forum, such as discordcommunityReferraldiscord
show-namepodcastReferralshow-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.

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.

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_campaign and utm_content already 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.

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
  • id1234567890 is your app's Apple ID, taken from your App Store Connect connection.
  • pt is 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 its pt number.
  • ct is the campaign token, the part you choose per link. Apple allows at most 40 characters, and the builder enforces it.
  • mt=8 marks 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.