How to find dark social in GA4, step by step
Look for Direct visits that behave like shared links: new users landing deep on product pages. Then send yourself test links through each chat app to see where they land, and tag the links you share. GA4 has no dark social channel, so you build the picture from clues.
By Joris van Huët, Founder & CEOUpdated 7 min read
Run the numbers for your store: the free UTM coverage calculator.
To find dark social in GA4, look for Direct visits that behave like shared links: new users who land deep on product pages. Then send yourself test links through each chat app to see where they land, and tag the links you share yourself. GA4 has no dark social channel, so you usually build the picture from clues.
Step by step
- Size Direct for last month. Note Direct's sessions, key events and total revenue next to the site's totals. That row is where most dark social ends up, mixed with everything else that lost its source. In GA4, go to Reports > Acquisition > Traffic acquisition and keep Session default channel group as the dimension.
- See where Direct lands. In Reports > Acquisition > Traffic acquisition, switch the dimension to Session source / medium and search for (direct). Then add the secondary dimension Landing page + query string, a pairing Google's Landing page help suggests. Home page landings fit typed addresses and bookmarks; deep product pages fit pasted links and untagged sends.
- Count the newcomers. Read the Direct row of the First user default channel group, which shows how people arrived on their very first visit. A newcomer on a product page rarely typed that address from memory; usually someone or something handed it over. Go to Reports > Acquisition > User acquisition.
- Split Direct by device. In Reports > Acquisition > Traffic acquisition, click the comparison icon at the top right and choose + Create new. Build one comparison where Device category exactly matches mobile and one for desktop. If your customers chat on their phones, shared links open there too, so a phone-heavy pile of deep Direct landings points at sharing.
- Send a marked link through each chat app. Send yourself a product link ending in a marker, such as?share=wa1 for one app and?share=dm1 for another. Open each on a phone that has never visited your store, so GA4 holds no earlier campaign for that browser. Use mobile data rather than the office network.
- Read where each test landed. The next day, open Reports > Engagement > Landing page, search for share= and add the secondary dimension Session source / medium. A (direct) / (none) row means that app passed nothing. A row with the app's name means GA4 read a referrer and sorted it by its channel rules.
- Tag the links you share yourself. Bio links, broadcast lists, community chats and support replies are your own dark social. Give each link a utm_source with the app's name, utm_medium=social and a utm_campaign, so GA4's Organic Social rule picks them up. Build them with the Campaign URL Builder that Google's URL builders help links to.
- Hold Shopify's view against GA4's. Shopify calls a visit Direct when the customer entered your store's URL, and shows N/A when a shortened link hides the referrer. In Shopify admin, go to Analytics > Reports, click the Category filter, choose Acquisition and open Sessions by referrer. Use dates from 24 September 2026 on, because Shopify rolled out a new way of measuring sessions from 21 to 23 September 2026.
A worked example
Start with real shares of revenue. One store's export puts Direct at 57.7% of revenue on the Channels sheet, in last click, first click and touched alike. On the Journeys sheet, journeys of 2 or more touches add up to 20.6% of revenue (12.2% + 5.4% + 3.0%). In this one store, Direct is far too big to fit inside the multi-touch journeys, so much of it arrives on single visits. That is the shape a shared link leaves: one visit, no source, a quick order.
Now a made-up month. For illustration, say the report in step 1 shows 2,000 Direct sessions. Say the search in step 2 finds 800 of them landing on product pages. If the User acquisition report in step 3 shows that most of those visitors were new, the product page landings look like handed-over links. Say the filter in step 4 then puts most of the 800 on phones, which strengthens the case.
Then the tests come back. Say the wa1 link lands in (direct) / (none), and the dm1 link lands under the app's own name, in Organic Social. So the first app's shares feed your Direct row, and the second app's shares already have a home.
In this worked example, those 800 sessions are an upper guess for the dark social inside Direct, not a measurement. Untagged emails, printed codes and PDF links land on product pages too. That is why step 7 matters: every link you tag leaves the pile. For illustration, if tagging your broadcast list moves 200 sessions out of Direct the next month, those 200 were your own shares all along.
Repeat the chat tests whenever an app updates. Whether an app passes its name along can change, and a test only speaks for the day you ran it.
What should you check when the numbers look wrong?
Your test visit never appears. If you filter internal traffic, GA4 drops visits from the IP addresses you listed, and Google warns that a data filter's effect is permanent. Retest on mobile data. Then give GA4 a day, since standard reports take time to process.
The test shows up under an old campaign. GA4 keeps a typed or pasted return visit in the row of that browser's earlier source while it falls inside the key event lookback window. Your own phone has a history with your store. Use a phone or browser that has none.
Tagged shares sit in Unassigned. Google uses Unassigned when no channel rule matches. A medium such as whatsapp or chat matches no rule, while social does. Values are case sensitive too, so Social and social are two different mediums.
A chat app shows up as Referral, not Organic Social. Its name is not on Google's list of social sources, so its visits fall to the Referral rule. That is still progress: the app now appears by name in Session source, instead of hiding in Direct.
Shopify shows a different Direct share from GA4. The two count sessions with their own cookies and rules, and Shopify changed its session measurement in late September 2026. Compare the direction of each trend, not the totals.
What to do this week
- Run steps 1 to 4 for last month. Pass: you can say what share of Direct sessions lands on product pages, and roughly how many were new users on phones. Fail: you cannot split it, so add Session source / medium and Landing page + query string as in step 2.
- Test your two biggest chat apps. Run steps 5 and 6 with one marked link each. Pass: you know which app's shares land in Direct and which keep the app's name. Fail: neither test shows after a day, so check your data filters and retest away from the office network.
- Tag every link your team shares for a week. Apply step 7 to bio, broadcast and support links. Pass: the next week, those visits sit under Organic Social with the app as source. Fail: they land in Unassigned or Direct, so the medium is wrong or a redirect stripped the tags.
Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework
Sources, 1 October 2026: Traffic acquisition report (Google); Landing page report (Google); User acquisition report (Google); Default channel group (Google); Apply comparisons to reports (Google); GA4 default-channel-group sources and categories (Google); URL builders: Collect campaign data with custom URLs (Google); Filter out internal traffic (Google); User acquisition report vs. Traffic acquisition report (Google); Acquisition reports (Shopify); Viewing order conversion summary (Shopify); Marketing reports (Shopify)
Related answers
Frequently asked questions
Which chat apps does GA4 count as social?
The ones on Google's list of social sources, which you can download from the Default channel group help page. It includes whatsapp and messenger. A visit that arrives with one of those names as its source lands in Organic Social. A visit with no readable source lands in Direct.Should I put UTM tags on my share buttons?
Usually yes, if your theme lets you edit the link a share button copies. Use the app as utm_source and social as utm_medium, so shares land in Organic Social. Keep the values lowercase, because GA4 treats Meta and meta as two different values.Can I see dark social in Shopify instead of GA4?
Only partly. Shopify's Sessions by referrer report also files visits with no readable referrer as Direct. An order's conversion summary shows the first visit's source when one exists. Neither tool sees the chat itself, so both need your tags and your test links.
Go deeper: Causal attribution, explained.
Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.