Channel comparison matrix

getChannelComparison service. Per-platform metrics side-by-side in a sortable matrix. Spend / ROAS / CPA / CPC / CTR / conversions per row.

Written By Salvatore Sinigaglia

Last updated About 4 hours ago

getChannelComparison service. Per-platform metrics side-by-side in a sortable matrix. Spend / ROAS / CPA / CPC / CTR / conversions per row.

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:

PlatformSpendROASCPACPCCTRConversions
Meta€4.5002.8€18.50€0.421.8%243
Google€3.2001.9€25.10€0.652.1%127
TikTok€2.1003.4€15.20€0.282.5%138
Taboola€8001.2€42.00€0.150.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

FAQ

What does the Channel comparison matrix show?

The Wevion Channel comparison matrix shows per-platform metrics side-by-side in a sortable table, with one row per selected platform. Each row lists spend, ROAS, CPA, CPC, CTR, and conversions for the selected date range in your target_currency. It's backed by getChannelComparison() and answers "which platform performs best on metric X right now?".

How do I find the best-performing platform?

Sort the Channel comparison matrix by ROAS descending to surface the most profitable platform at the top row, or sort by CPA ascending for lead-gen campaigns where lowest cost per acquisition wins. Always read ROAS together with spend — a high ROAS on tiny spend is an unvalidated test, not a proven winner.

Why are some platforms missing rows in the matrix?

By design, the Channel comparison matrix includes a platform only if its spend in the scope is greater than zero. Platforms with no spend in the selected window are excluded, so empty rows simply mean that platform wasn't active for that date range.

How do I decide whether to scale or kill a platform?

Use the matrix's scale-or-kill framework: if a platform's ROAS exceeds target by 1.2× with meaningful spend, scale it; if ROAS is below half the target with meaningful spend, kill it; anything in between means keep it and optimize creative. Pair with the Budget recommendation block for the rule-based optimal.

Why do the matrix numbers differ from a platform's native UI?

Small differences are expected because the Channel comparison matrix converts all metrics to your target_currency and applies unified attribution across platforms. Sorting by CTR can also look odd when percentages sit close together, since small differences get amplified in the ordering.