Channel comparison matrix

Last updated: May 19, 2026

Channel comparison matrix

The Channel comparison block in Cross-Channel mode shows per-platform metrics side-by-side in a sortable matrix. Backed by getChannelComparison() in apps/backend/src/services/cross-channel-analytics.service.ts. Returns ChannelComparisonRow[] — one row per platform with spend, ROAS, CPA, CPC, CTR, conversions. Answers "which platform performs best on metric X right now?".

Who is this for

Mediabuyers comparing platforms at a glance. Especially valuable when deciding budget reallocation or scoping a test campaign on a new platform.

What the matrix shows

A table with one row per selected platform:

Platform

Spend

ROAS

CPA

CPC

CTR

Conversions

Meta

€4.500

2.8

€18.50

€0.42

1.8%

243

Google

€3.200

1.9

€25.10

€0.65

2.1%

127

TikTok

€2.100

3.4

€15.20

€0.28

2.5%

138

Taboola

€800

1.2

€42.00

€0.15

0.9%

19

Sortable by any column (click header).

Per platform: all values reflect the selected date range + target_currency conversion.

How to read it

Sort by ROAS desc

Identifies the most profitable platform right now. Top row = your highest-ROAS channel.

Sort by spend desc

Identifies where most budget is going. Top row = largest channel.

Compare ROAS + spend together

The winning play is high ROAS + meaningful spend. A platform with ROAS 5 but spend €50 means it's working in a small test — not yet validated at scale.

Compare CPA across platforms

For lead-gen / non-purchase campaigns: CPA is the headline. Sort by CPA asc. Best (lowest) at the top.

Compare CTR + CPC together

CTR = engagement; CPC = cost. Best: high CTR + low CPC = engaged audience at efficient cost. Worst: low CTR + high CPC = wasting reach.

Single-screen decision frameworks

"Scale or kill?" decision

For each platform:

  • ROAS > target × 1.2 AND spend > meaningful → scale

  • ROAS < target × 0.5 AND spend > meaningful → kill

  • ROAS in between → keep, optimize creative

"Test or skip a new platform?" decision

Looking at a platform you're not currently running:

  • High CTR on competitors → audience exists, worth testing

  • Low CTR everywhere → audience problem, fix targeting first

(For new platforms: cross-link to PRD-13 ad platform integrations for connection.)

"Reallocate budget" decision

Combine with an-109 budget recommendation: comparison shows current state; recommendation shows the rule-based optimal.

Compare against previous period

Enable Compare to previous period toggle: each cell shows delta_pct alongside current value.

  • Green delta = improvement direction (ROAS up, CPA down, etc.)

  • Red delta = regression direction

Useful for: "is this platform getting better or worse?" beyond just today's snapshot.

Constraints

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

  • 10-min Redis cache (cca:v2: prefix)

  • Currency: all metrics in target_currency

  • Auth: ROLE_GROUPS.DASHBOARD + app.apiKey('insights')

  • Feature gating: ENABLE_CROSS_CHANNEL_ANALYTICS flag

What it doesn't tell you

The matrix is aggregated — it doesn't expose:

  • Per-campaign breakdown within a platform → use top campaigns cross-platform for that

  • Per-audience or per-creative breakdown → use Single Platform mode + creative-performance widget

  • Why a platform is performing the way it is → drill into the platform's own dashboard or Ads Manager

Use cases

Monday morning health check

5-minute scan: sort by ROAS desc, look for changes. Decide where to focus the week.

Pre-budget-meeting prep

Export the matrix + comparison delta to a CSV for client / leadership review.

Cross-platform A/B retro

Ran same creative on Meta vs TikTok: comparison matrix shows which won on key metrics.

Quarterly channel-strategy retro

90-day window + previous period comparison = each platform's quarter-over-quarter trajectory.

Common mistakes

  • Sorting by spend without checking ROAS: the platform with most spend isn't necessarily the best — it's just the most utilized

  • Single-row reading: comparison's value is the comparison; don't read a row in isolation

  • Ignoring spend column when comparing ROAS: low-spend ROAS is noisy; high-spend ROAS is signal

  • Expecting the matrix to tell you what to do: it shows state, not action — pair with budget recommendation + your strategy

Common issues

  • Empty rows for platforms with no spend: by design — included only if scope spend > 0

  • Numbers differ from platform native UI: currency conversion + attribution window differences; small variance expected

  • Sort by CTR shows weird order: CTR % values close together; small differences amplified

Related