Channel mix — donut explained

Last updated: May 19, 2026

Channel mix — donut explained

The Channel mix block in Cross-Channel mode shows per-platform spend share as a current donut + trend over time as a stacked area chart. Backed by getChannelMixTrend() in apps/backend/src/services/cross-channel-analytics.service.ts. Returns ChannelMixTrendPoint per day per platform. Use to spot concentration ("Meta consuming 80% of spend") or drift over time ("we silently shifted to Google last month").

Who is this for

Mediabuyers + admins making cross-platform budget allocation decisions. PMs auditing where spend went last month.

What's in the block

The donut chart

Current spend share at the right edge of the date range:

Slice

Platform

% of total spend

Largest

Meta

45%

Next

Google

30%

Next

TikTok

20%

Smallest

Taboola

5%

Each slice colored consistently per platform across all Wevion analytics views.

The trend (stacked area)

Same data over time:

  • X-axis: dates within selected range

  • Y-axis: % share (stacked to 100%) OR absolute spend (stacked)

  • Each band = one platform

  • Watch for: shifts in band thickness over time = budget reallocation events

How to read it

Current share

Read the donut. Identify:

  • Concentration: one platform > 60-70% = high concentration; risk if that platform falters

  • Diversification: 25/25/25/25 = healthy diversification; may dilute optimization

  • Outliers: one platform <5% = either unused (consolidate) or a test (note)

Trend over time

Read the stacked area. Identify:

  • Smooth bands = stable allocation, deliberate

  • Step changes = a budget shift on a date (intentional or accidental)

  • Drift = gradual change you didn't notice (Meta's auto-scaling caused share creep)

Cross-reference with calendar: did the shift coincide with a planned change?

Companion blocks

The Channel mix block doesn't tell you whether the mix is good — only what it is. Pair with:

  • Channel comparison (an-108) — per-platform performance side-by-side. Tells you whether each platform's share is earning its keep.

  • Budget recommendation (an-109) — rule-based suggested allocation based on performance. Tells you what the share should be.

Sequence: Channel mix (what is) → Channel comparison (how is each performing) → Recommendation (what should change).

Use cases

Weekly allocation review

Look at current share vs last week's share. Did anything shift? Was it intentional?

Quarterly executive report

Donut + trend chart export → exec sees diversification + recent shifts at a glance.

Onboarding a new client

For agencies: show the client's current channel mix as a starting baseline. Set expectations for how it'll evolve.

Identifying budget leaks

Spending on a platform with no campaign activity = leak (orphan adsets, rogue automation, manual unfinished pause). Donut surfaces unexpected slices.

Constraints

  • 90-day max date range (Cross-Channel limit)

  • 10-min Redis cache (cca:v2: prefix) — small lag possible

  • Currency: all spend in target_currency (EUR intermediate)

  • Feature gating: ENABLE_CROSS_CHANNEL_ANALYTICS flag required

How donut + trend differ visually

Donut

Trend

Snapshot at end of date range

Distribution over date range

Single number per platform

Time-series per platform

Easy to grasp current state

Easy to spot changes

Bad for change-over-time

Bad for current-state-only

Use both. Donut for "where are we now"; trend for "how did we get here".

Common mistakes

  • Reading the donut and assuming it's been stable: check trend before concluding

  • Confusing % share with $ amount: same % can hide growing or shrinking absolute spend

  • Reading channel mix without channel comparison: high % doesn't mean good performance

  • Expecting real-time updates: 10-min cache + 15-min sync lag = up to 25-min delay

Common issues

  • One platform missing from donut: no spend on that platform in window OR platform not selected in scope

  • Donut total < 100%: rounding; should be very close

  • Trend looks flat: small range or stable allocation — try a longer window

  • Numbers different from platform UI: cross-channel converts to target_currency; tiny FX variance expected

Related