← Files Seal CopilotARCHIVED FILE

skills/channel-mix-optimizer/SKILL.md

5.44 KB · Oct 5, 2026 · 18:29 UTC

↓ Download file

---
name: channel-mix-optimizer
description: >
  Suggests how to reallocate marketing budget across paid channels without
  needing ad-spend data, using Revenue Per Entrance, CR, and AOV from
  Sealmetrics. Trigger on: "where should I invest", "budget reallocation",
  "channel mix", "scale or cut", "qué canal escalar", "shift budget",
  "media plan", "what to scale", or any allocation question. Always pairs
  the recommendation with the caveat that ROAS requires real spend from the
  ad platform.
argument-hint: "[period]"
short-description: 'Reallocate paid budget across channels by revenue per entrance. Use for "which channel is best", "where should I spend", "budget allocation", "dónde invierto".'
---

# Channel Mix Optimizer

Before writing your answer, read `examples/output.md` in this skill directory
and match its density, structure and tone. It is the reference for what a good
run of this skill looks like.

Recommend budget shifts across paid channels using **Revenue Per Entrance
(RPE)** as the proxy for ROAS. Budget: ≤10 tool calls.

## Why RPE (and why state the caveat)

Sealmetrics has no ad spend. ROAS = revenue / spend is impossible from
this data alone. But RPE = revenue / entrances is a leading proxy: at
similar CPCs, the channel with higher RPE has higher ROAS. **Always tell
the user that proportional spend is the working assumption and to pull
real CPC/CPM from the ad platform to confirm.** Never present RPE as ROAS.

## Step 1 — Map the paid channels

1. `get_top_channels(period=90d)` — full channel list.
2. `list_channel_rules` — confirm which channels the user classifies as
   paid (Paid Search, Paid Social, Display, Affiliates, Paid Email…).

If the user has not configured paid vs organic split well, run
`get_traffic_mediums(period=30d)` and treat `cpc`, `paid`, `display`,
`paidsocial`, `cpm`, `ppc` as paid by default; say so.

## Step 2 — Channel-level scorecard

For each paid channel pull (≤4 calls total via the compact `get_top_*`
where possible):

- `get_top_channels(period=this_quarter)` and `get_top_channels(period=last_quarter)`
  — volume + trend. `get_top_channels` has no `compare`; diff the pair yourself.
- `get_traffic_mediums(period=90d, compare=previous)` — conversions and
  revenue per medium in one call, which is where paid/organic actually splits.
- AOV per paid channel: `get_conversions(period=90d, utm_medium=<paid medium>)`
  once per medium (≤4 calls). There is no `group_by` on `get_conversions`.

Compute per channel:

| Metric | Formula | Use |
|---|---|---|
| Entrances | from get_channels | volume |
| CR | conversions / entrances | quality |
| AOV | revenue / conversions | ticket |
| **RPE** | revenue / entrances | the ranking metric |
| Trend | RPE this 30d vs previous 30d | momentum |

Site weighted-average RPE is the reference line.

## Step 3 — Campaign-level inside each paid channel

For the top 2 paid channels by revenue:

`get_campaigns(period=90d, sort_by=revenue, limit=20, utm_medium=<paid>,
compare=previous)`

Apply per-campaign:

- **Scale candidate** — RPE ≥ 1.3 × channel RPE AND ≥30 conversions AND
  trend ≥ flat.
- **Cut/optimize candidate** — RPE ≤ 0.5 × channel RPE AND ≥500
  entrances AND ≥30d running.
- **Maintain** — neither.

## Step 4 — Cross-channel reallocation logic

The recommendation is **relative**, not absolute. Use the form:

> "Channel A delivers €X per entrance vs Channel B's €Y. Assuming similar
> CPC, every euro shifted from B to A should produce ≈ X/Y times more
> revenue. To confirm, pull CPC from your ads platform and compare
> CPC×(1/CR_A)×AOV_A vs CPC×(1/CR_B)×AOV_B."

Never tell the user "spend more on Google, less on Meta" as an absolute —
budget decisions need their cost reality. Provide the **ratio** and the
**verification formula**.

## Output format

1. **Channel scorecard table** (paid channels only): entrances · CR · AOV
   · RPE · RPE vs site avg · 90d trend.
2. **Top 3 scale candidates** (campaign level): name · entrances · CR ·
   AOV · RPE · why · expected € lift at constant CPC.
3. **Top 3 cut/optimize candidates:** name · entrances · CR · AOV · RPE ·
   why · what to test first (creative / landing / audience) before cutting.
4. **Cross-channel ratios:** "1 € from <weakest paid channel> ≈ K € from
   <strongest paid channel>, assuming equal CPC. Verify CPC on each
   platform before shifting budget."
5. **Caveats line:** state the proportional-CPC assumption and recommend
   pulling spend from the ad platform.

## What you do NOT do

- Do not claim ROAS — repeat: Sealmetrics has no spend data.
- Do not recommend cutting an upper-funnel channel (display, broad social
  awareness) on RPE alone; last non-direct click undervalues assists — flag it.
- Do not recommend scaling a campaign with <30 conversions; flag as
  "directional only".
- Do not propose absolute budget numbers; propose ratios and tests.

---

Log the run in `<state-dir>/<site_id>/runs.jsonl` with exactly these fields
and no others: `ts` (ISO timestamp, UTC), `skill`, `calls` (the number of
Sealmetrics calls you made, counted), `budget` (this skill's documented
ceiling, a number — `10` here), `verdict` (one of `on_track`, `watch`, `act`,
`kpis_only`, `refused`, `error`, or the score for an audit), `scheduled`
(boolean), `notes` (one line). The first real audit wrote `calls_used` and a
free-text verdict because this footer said "calls used" in prose; the field
names are the contract. Skip silently if the path is not writable.

SHA-256: b2d71a2b1496562c5d60adca64ec4afe8318d4f3a8afcf0f1ebefba56c8e4e11