Threads Is Now a Default Meta Ads Placement — GA4 Calls It Direct

May 8, 2026
by Cherry Rose

Threads became a default Meta Ads placement on 27 January 2026, and most WooCommerce stores running Advantage+ campaigns have been serving ads to its 400 million monthly active users without seeing a single click in their reports. The traffic is real. It just lands in GA4 Direct. Meta tags Threads ad clicks with a th=threads_stream URL parameter that GA4’s default channel grouping does not recognise, so the spike you noticed in ‘Direct’ starting late January is Threads ads you forgot you were running (ALM Corp, 2026).

Why Your January Spike in ‘Direct’ Traffic Is Threads Ads

The default-on rollout did the rounds in marketing trade press. The instrumentation problem did not.

Threads Now Has More DAU Than X

The numbers behind the rollout matter because they explain why this misattribution is not noise. Threads had 141.5 million daily active users on iOS and Android as of 7 January 2026, versus X’s 125 million (Similarweb via ALM Corp, 2026). Monthly actives passed 400 million.

Engagement is the bigger surprise. Threads’ median engagement rate sits at 6.25% versus X’s 3.6% — a 73.6% higher interaction rate based on Buffer’s analysis of 10.2 million posts (inBeat, 2026). Meta’s earnings call attributes a 35% increase in time-on-platform over the prior six months to recommendation upgrades. The placement is not a vanity addition. inBeat Agency forecasts Threads will add $11.3 billion to Meta’s annual revenue by end of 2026.

Translation: this is not a small placement that will quietly resolve itself in your reports. If you are running Advantage+ campaigns, a meaningful share of your spend is buying Threads inventory right now.

You may be interested in: Meta AI Chat Signals Now Power Advantage+. Your CAPI Decides the Lift.

The GA4 Channel Grouping Problem

GA4’s default channel grouping was built before Threads existed as an ads surface. It recognises Facebook and Instagram via the standard source/medium combinations Meta has used for years. Threads is not in the list.

The behaviour is mechanical. A click from a Threads ad lands on your store with a URL like:

https://yourstore.com/product/...?th=threads_stream&fbclid=...

GA4 reads the referrer (often empty or stripped on mobile), reads utm_source (not set by Meta on Threads placements by default), and falls through to Direct. Sometimes it catches a fb.com referrer and routes to Paid Social. The behaviour is inconsistent — and inconsistent is worse than wrong.

Default channel grouping is read-only. You cannot fix it. The fix has to be a custom channel group.

Step One: Audit Advantage+ in Meta Ads Manager

Before fixing GA4, confirm what is actually firing.

Open Meta Ads Manager, pick an active campaign, and look at the placements panel for each ad set. If placements are set to ‘Advantage+ placements’ (the default), Threads is enabled — there is no way to opt out without switching to manual placement selection.

Manual placement selection costs reach. Advantage+ optimises across surfaces. Most stores will keep Advantage+ on, which means Threads stays on, which means the GA4 fix is mandatory rather than optional.

Step Two: Build the GA4 Custom Channel Group

In GA4: Admin → Data display → Channel groups → Create custom channel group.

Add a rule above ‘Paid Social’ with these conditions (any one matches):

  • Source contains ‘threads’
  • utm_source equals ‘threads’ or ‘threads_stream’
  • Page location contains ‘th=threads_stream’

Name the channel ‘Threads’ or ‘Paid Social – Threads’. Save and apply to all reports that use channel grouping.

This catches the traffic going forward. It does not retroactively re-classify January and February sessions, which stay in Direct. The historical spike is the spike.

Step Three: Capture th Server-Side Before It Disappears

The custom channel group works as long as the URL parameter survives long enough for GA4 to read it. On many sessions it does not.

Safari ITP can strip the URL on follow-up navigations. Ad blockers occasionally drop the entire URL parameter set on the first page load. Mobile browsers sometimes redirect through interstitials that lose query strings. Capture the th parameter server-side, on the first hit, before any of that has a chance to happen.

The pattern: read the URL parameter at the WordPress hook layer when the page first loads, persist it to a first-party cookie or session variable, and include it as a custom dimension in the Measurement Protocol payload sent to GA4. Threads attribution becomes durable across the full session, not just the landing page.

You may be interested in: The Marketing Pixel Audit: Find and Remove Redundant Tracking Killing Your Store

Why Server-Side Capture Wins on This One

Threads is the cleanest possible case for first-party server-side instrumentation. The data exists at the URL layer for one moment. After that, browser policy decides what survives. Server-side capture pulls the value before the browser gets a vote.

Here’s how you actually do this. Transmute Engine™ is a first-party Node.js server that runs on your own subdomain (e.g., data.yourstore.com). The inPIPE WordPress plugin captures URL parameters at the WooCommerce hook layer — th, fbclid, gclid, all of them — batches them via API to your Transmute Engine server, and forwards a clean utm_source=threads to GA4 via Measurement Protocol. The placement attributes correctly even when client-side capture would lose the value.

Key Takeaways

  • Threads became a default Meta Ads placement on 27 January 2026 — every Advantage+ campaign opts in automatically.
  • Threads has 400M monthly and 141.5M daily active users, surpassing X.
  • GA4 default channel grouping has no Threads definition; traffic lands in Direct or Referral.
  • Threads ad URLs carry a th=threads_stream parameter that needs an explicit GA4 custom channel group rule.
  • Capture the parameter server-side at the WordPress hook layer so Safari ITP and ad blockers cannot strip it.
  • Audit Meta Ads Manager first to confirm Threads is firing on Advantage+ campaigns before building the GA4 fix.
Why is my GA4 Direct traffic spiking after I started running Meta Ads in 2026?

Threads became a default Meta Ads placement on 27 January 2026. If your campaigns use Advantage+ placements, you are running Threads ads automatically. Threads click traffic carries a th=threads_stream URL parameter that GA4’s default channel grouping does not recognise, so it lands in Direct or Referral instead of Paid Social. Your Direct bucket spike is Threads.

Are Threads ads firing on my WooCommerce campaigns even though I didn’t enable them?

Almost certainly yes if you use Advantage+ placements. Meta opted every advertiser in by default on 27 January 2026. Open Meta Ads Manager, go to placements for any active campaign, and check whether Threads is enabled. Disabling it requires manual placement selection, which Advantage+ does not allow.

How do I create a Threads channel in GA4?

Build a custom channel group: Admin → Data display → Channel groups → Create custom channel group. Add a rule that routes any session with source containing ‘threads’ or with utm_source=threads or with the th parameter present into a ‘Threads’ channel. Default channel grouping is read-only, which is why this needs to be a custom group.

What is the th URL parameter Meta added for Threads?

Meta appends th=threads_stream to clicks served from the Threads feed. It identifies the placement at the URL level so analytics platforms can attribute correctly — provided they know to look for it. GA4 does not look for it by default, which is why the traffic falls through to Direct or Referral.

How do I capture the th parameter server-side?

Read the URL parameter at the WordPress or WooCommerce hook layer when the page loads, persist it to a first-party cookie or session, and forward the value in the client_id and event_parameters payload via Measurement Protocol. Server-side capture survives Safari ITP and ad blocker stripping, which client-side capture frequently does not.

Open Meta Ads Manager, check whether Threads is firing, then build the GA4 custom channel group and capture th server-side. See how Transmute Engine handles first-party WooCommerce attribution →

Share this post
Related posts