Quick answer: GA4 shows Unassigned or (not set) traffic when it cannot match a session to a source, medium or channel. Fix it in this order: find the Unassigned rows in Traffic acquisition, wait for processing, standardise UTMs, turn on Google Ads auto-tagging, create a custom channel group for non-standard values, set up cross-domain tracking and referral exclusions, then check tag coverage and consent.
If you cannot tell which channels bring leads, you cannot decide where to put budget. These 10 steps clean up attribution. Allow about 45 minutes, plus 48 hours for GA4 to process your changes.
In this guide: Unassigned vs (not set) vs Direct | 10 steps | UTM cheat sheet | FAQ
Know which problem you have
| What you see | What it means | Usual cause |
|---|---|---|
| Unassigned channel | GA4 has a source and medium, but no channel rule matches | Custom UTM values, no custom channel group |
| (not set) source or medium | GA4 could not work out the source or medium | Missing session_start, duplicate tags, lost cookies, split server-side tracking |
| Direct too high | No referrer or campaign data reached GA4 | Typed URLs, untagged links, stripped parameters, cross-domain gaps |
The 10-step fix
Step 1: Find the Unassigned sessions
- In GA4 open Reports > Acquisition > Traffic acquisition.
- Set the primary dimension to Session default channel group and find the Unassigned row.
- Click the + next to the dimension and add Session source / medium as a secondary dimension.
Now you can see the exact source and medium behind the Unassigned sessions. A lot of "(not set)" here usually points to a tracking problem. Real source and medium values you did not expect point to a UTM or channel group problem.
Step 2: Identify which problem you have
Use the table above. If you see real source and medium values such as ebook / pdf, you have a channel grouping problem (Steps 4 to 6). If you see (not set), you have a tracking problem (Steps 7 to 10).
Step 3: Rule out processing delay
GA4 can take roughly 24 to 48 hours to finish processing, so recent days may show Unassigned temporarily. In the date range picker, end your range at least 48 hours before today before judging the numbers.
Step 4: Fix UTM tagging
- Tag every marketing link with utm_source, utm_medium and utm_campaign.
- Build links with Google's Campaign URL Builder instead of typing them by hand. A single typo, such as a misspelled utm_source, breaks classification.
- Use medium values that GA4's default channel rules recognise (see the cheat sheet below).
- Check that redirects and link shorteners do not strip the parameters.
Step 5: Link Google Ads and keep auto-tagging on
Link Google Ads to GA4 and turn on auto-tagging in Google Ads (Admin > Account settings > Auto-tagging) so the gclid parameter classifies paid clicks. Do not rely on manual UTMs for Google Ads. See how to link GA4 to Google Ads for the full setup.
Step 6: Create a custom channel group
If you must use non-standard source or medium values, or you want separate channels for new sources such as AI tools or newer ad networks, create a custom channel group that maps those values to the right channel. In GA4 look for it under Admin > Data display > Channel groups. Menu names change, so use the search bar if you cannot find it.
Step 7: Set up cross-domain tracking
- Go to Admin > Data streams and select your web stream.
- Click Configure tag settings > Configure your domains.
- Add every domain you own, for example your main site and a separate booking or checkout domain.
- Remove any suggested domain you do not recognise, since it may come from an injected tag.
- Test by moving between domains and watching Realtime.
Without this, a visit that jumps between domains starts a new session with no source, which often ends up as Direct or Unassigned.
Step 8: Review the unwanted referrals list
In the same Configure tag settings area, open List unwanted referrals and add domains that should not count as a traffic source, such as your payment gateway or third-party booking tools. Otherwise a customer who returns from a payment page can be credited to the payment provider instead of the real channel. Review this list regularly.
Step 9: Fix tag coverage and duplicate initialisation
- Coverage: make sure every page carries your Google tag. In GTM, Container diagnostics can show untagged pages, but treat it as a rough guide and verify in Preview mode.
- Single tag: remove extra gtag snippets from theme code or plugins. Keep one Google tag, managed in GTM.
- Load order: fire the Google tag (config) first, before event tags, so session IDs are set correctly.
- session_start: in DebugView, confirm each new session fires it.
- Server-side GTM: if some hits go to your server container and others go straight to google-analytics.com, users can be identified differently and attribution is lost. Check the browser Network tab (with Preserve log on) and confirm every request goes to your server container URL.
Step 10: Check consent and session timeout, then test
- Consent: a high share of denied consent removes the identifiers GA4 needs for attribution. Review your consent setup.
- Session timeout: the default is 30 minutes, and a long gap can start a new session without source data. You can change it under Admin > Data streams > your stream > Configure tag settings > Show all > Adjust session timeout. Longer timeouts also change your session counts, so decide this on purpose and note the date.
- Test: click a properly tagged campaign link, then open Realtime > Traffic acquisition and confirm the right source, medium and channel appear.
Some Direct and Unassigned traffic is unavoidable because of typed URLs, untagged links in PDFs and emails, privacy features that strip referrers, and automated orders such as renewals. The goal is to reduce it and understand what remains.
UTM cheat sheet
| Channel | utm_source | utm_medium |
|---|---|---|
| Email newsletter | newsletter | |
| Paid social (Meta, TikTok) | facebook, tiktok | paid_social |
| Paid search (non-Google Ads) | bing | cpc |
| Native ads (Taboola, Outbrain) | taboola, outbrain | paid_native (map to a custom channel) |
| Influencer or partner link | partner name | referral |
Keep values lowercase, consistent and free of spaces. For Google Ads, use auto-tagging instead of manual UTMs. Custom values such as paid_native will land in Unassigned until you map them in a custom channel group (Step 6), so decide whether to standardise or to map them.
Frequently asked questions
What is the difference between Unassigned and (not set) in GA4?
Unassigned means GA4 has a source and medium but no channel group rule matches them. (not set) means GA4 could not determine the source or medium at all, often because session_start is missing or attribution data was lost.
Why is my GA4 direct traffic so high?
Direct traffic includes typed URLs, bookmarks and untagged links in PDFs or emails, and browser privacy features can strip referral data. Missing UTMs, redirects that drop parameters and cross-domain gaps also push traffic into Direct.
How do I stop custom UTM values showing as Unassigned?
Either standardise your UTM values to match GA4 default channel definitions, for example utm_medium=paid_social, or create a custom channel group that maps your values to the correct channel.
How long does GA4 take to classify traffic correctly?
GA4 can need 24 to 48 hours to finish processing, so recent days may temporarily show Unassigned. End your date range at least 48 hours before the period you analyse.
Can I get Unassigned traffic down to zero?
Not usually. Some Unassigned and Direct traffic is unavoidable because of privacy features, offline links and automated orders. The goal is to reduce it and to understand what remains.
Final thoughts
Start with the Unassigned row and its source and medium, fix tagging at the source (UTMs and auto-tagging), then close the gaps that lose sessions (cross-domain, referrals, duplicate tags, consent). Clean attribution makes every other report and every bid decision more reliable.
Seeing a strange source in your Unassigned row? Share it in the comments and I will help you trace it.