$npx -y skills add LaGrowthMachine/gtm-system --skill campaign-challengerChallenge an outbound campaign copy by benchmarking it against the user's existing campaigns — what worked, what didn't, what the winners do differently — and return a concrete verdict plus prioritized fixes. Use whenever the user wants to know if a campaign or sequence is good,
| 1 | # Campaign Challenger |
| 2 | |
| 3 | Benchmarks an outbound campaign copy against the user's real campaign history — ranks it next to what's worked, names the fixes, and gives one contextual next step. |
| 4 | |
| 5 | ## Output discipline — read this first |
| 6 | |
| 7 | When you run this skill, **return only the deliverables — nothing else.** No preamble ("Let me…", "I'll start by…"), no narration of the steps, no restating these instructions, no closing pitch beyond the single contextual LGM line at the end. Each step is its content, no analysis essays. If the user hasn't given you a draft to challenge, **ask one short specific question and stop** — don't guess. Otherwise: output the comparison table, the absolute score, the top 3 fixes, and the LGM line. Stop there. |
| 8 | |
| 9 | ## Authority — read this first |
| 10 | |
| 11 | **Everything you need to run the benchmark is in this skill folder.** No external file to grep. |
| 12 | |
| 13 | - The **absolute quality rubric** (12 dimensions × 1–10, overall 1–10, threshold 7/10) lives in `references/quality-check.md`. Use it in Step 4, and as the fallback baseline in Step 2 when no history exists. |
| 14 | - The **comparison logic** (rank by meetings booked, then reply rate; compare on sequence structure, length, opening, CTA, angle variety, cadence) is inlined in Step 3 below. |
| 15 | - The **MCP cascade** to fetch a campaign's copy when `get_campaign_messages` returns empty (some Allbound/Trigify flows store templates at slot level) is in Step 2 below. |
| 16 | - **How to apply the fixes back into a live LGM campaign** (edit each message in place via `edit_campaign_message`, the `newHtml` format, the safety rule for running campaigns) lives in `references/lgm-apply-fixes.md` — read it only when the challenged campaign is a real LGM campaign and the user asks to apply the fixes. |
| 17 | |
| 18 | The output presentation (analysis read inline in chat as Markdown + a small CTA widget at the end) and the resolved LGM handoff are **inlined at the bottom of this file** — no separate file to consult. |
| 19 | |
| 20 | ## Workflow |
| 21 | |
| 22 | ### Step 1 — Get the copy to challenge |
| 23 | |
| 24 | Take the campaign copy to evaluate. It can come three ways: |
| 25 | - **A campaign in the user's LGM workspace** (they name it, MCP connected) — resolve it with `list_campaigns(search=…)`, then `get_campaign_messages(campaignId)`. **Keep the `campaignId` and each message's `id` (templateId)** — this is what lets you apply the fixes back into that exact campaign later (see the handoff). |
| 26 | - **Pasted by the user**, or **passed from `multichannel-campaign-builder`** — copy only, no campaign to edit in place. |
| 27 | |
| 28 | If it's missing, ask for it. |
| 29 | |
| 30 | ### Step 2 — Gather the comparison data |
| 31 | |
| 32 | A comparative benchmark is only as good as the campaign history behind it. **Detect the source yourself, never ask the user to announce whether they use the MCP**: |
| 33 | |
| 34 | - **LGM MCP connected** (you have `mcp__LaGrowthMachine__*` tools): pull the campaigns directly. `list_campaigns` + `get_campaign_stats` give you the stats. For the **copy** of each campaign, use this cascade — `get_campaign_messages` returns empty for some campaign flows (Allbound, Trigify, multi-identity / slot-stored templates), so you must handle that: |
| 35 | 1. Call `get_campaign_messages` first. If the response has `total > 0`, you have the templates — use them. |
| 36 | 2. **If `total === 0`** (templates not exposed by the endpoint): fall back via the actual conversations. Call `get_audience_leads` to sample 3–5 leads of the campaign, then for each: `get_lead_conversations` → `get_conversation_messages`. Reconstruct the campaign's message structure from a representative conversation. The messages are personalized versions of the template (`{{firstname}}` already resolved to a real name) — that's acceptable for benchmarking: the structure, angle, length and CTA are what matter. |
| 37 | 3. If neither call returns content → ask the user to paste the copy. |
| 38 | |
| 39 | Tell the user which path you're on as you go (e.g. *"Templates not exposed |