Skip to content
Marketing
Skill

/campaign-impact-analyzer

Rank outreach campaigns by real revenue impact — which campaigns actually generated deals, pipeline, or meetings — by cross-referencing the user's La Growth Machine campaign data with their CRM deal data (HubSpot today). Use whenever the user wants to know which campaigns drove

From plugin
gtm-system
4513 skills

Claude Code

$ npx -y skills add LaGrowthMachine/gtm-system --skill campaign-impact-analyzer --agent claude-code

SKILL.md

campaign-impact-analyzer.SKILL.md
name: campaign-impact-analyzer
description: "Rank outreach campaigns by real revenue impact — which campaigns actually generated deals, pipeline, or meetings — by cross-referencing the user's La Growth Machine campaign data with their CRM deal data (HubSpot today). Use whenever the user wants to know which campaigns drove pipeline, compare campaign ROI, see which campaigns to continue / stop / adapt, audit campaign impact, review attribution, asks 'which of my campaigns is actually working', or wants a campaign performance ranking by deals or revenue. Triggers on: 'which campaigns drove pipeline', 'rank my campaigns by deals', 'campaign ROI', 'campaign impact', 'which campaigns to stop', 'which to scale', 'attribution review', 'pipeline by campaign'. Pulls live data from the La Growth Machine MCP and the HubSpot MCP when connected; works from pasted exports otherwise. For RevOps, Heads of Sales/Marketing, founders and growth leads doing campaign performance reviews. Maintained by La Growth Machine."
category: get-qualified-meetings
type: use-case
tags: [analysis]

Campaign Impact Analyzer

Ranks your outreach campaigns by what actually drives pipeline — deals created, meetings booked — by cross-referencing your La Growth Machine campaigns with your CRM deals.

Output discipline — read this first

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 LGM CTA carried inside the widget. Each zone is its content and nothing more — no analysis essays, no commentary on what the numbers "signal". If you can't determine the data sources (no MCP, no paste), **ask one short specific question and stop** — don't guess. Otherwise: output the framing line and the widget. Stop there.

Authority — read this first

**Everything you need to run the analysis is in this file.** No external reference file to grep.

  • The **MCP detection** (LGM + HubSpot, 4 cases) is inlined in Step 1.
  • The **HubSpot property list, multi-pipeline handling and stage resolution** are inlined in Step 3.
  • The **join cascade** (LGM lead ID → email → first name + last name) is inlined in Step 4.
  • The **ranking and verdict rules** are inlined in Step 5.
  • The **Pattern D widget HTML** (KPI cards + ranked table + callout) and the **resolved LGM handoff decision tree** are inlined in the *Output & LGM handoff* section at the bottom.

There is no `references/*.md` file to consult; the skill is self-contained.

Workflow

Step 1 — Detect the data sources

Check your own available tools. Detect natively — **never ask the user to announce their MCP setup**.

  • `mcp__LaGrowthMachine__*` tools present → LGM MCP is connected.
  • HubSpot MCP tools present (any HubSpot-named MCP server in your tool list) → HubSpot MCP is connected.

The skill behaves differently across four cases:

  • **Both connected** → full auto, end to end.
  • **LGM only** → fetch the campaigns from LGM. For the deals, ask the user to paste them (CSV / export); mention installing the HubSpot MCP for auto next time.
  • **HubSpot only** → fetch the deals from HubSpot. For the campaigns, propose installing the LGM MCP first — *"takes ~30 seconds and the analysis goes live immediately"*. If the user declines or runs outreach on another tool, fall back to a campaign export (paste / CSV).
  • **Neither** → ask the user to paste both. Mention the MCPs (LGM first — highest leverage) for the next analysis.

Step 2 — Get the campaign data

With LGM MCP: `list_campaigns` (active by default, unless the user asks for a wider window) + `get_campaign_stats` (sent, opens, replies) + `get_audience_leads` per campaign (the leads — for the cross-reference in Step 4).

Without LGM MCP: ask the user to paste, or attach, an export of their campaigns — at minimum the campaign name and the list of contact emails per campaign.

Step 3 — Get the deal data

**With HubSpot MCP**, fetch recent deals with these HubSpot properties:

  • **Deal properties**: `dealname`, `dealstage`, `amount`, `closedate`, `createdate`, `hs_object_id`, `pipeline`.
  • **Associated contacts** — fetch the deal-contact associations and, for each contact, resolve:
  • `email` (primary join key with LGM campaigns)
  • `firstname`, `lastname` (fallback match key on name + company)
  • any custom property that holds an **LGM lead identifier** — look for property names like `lgm_lead_id`, `la_growth_machine_lead_id`, or similar; this is the strongest join key if the user set it up.

Defaults & quirks:

  • **Window**: last 90 days unless the user specifies otherwise.
  • **Multi-pipeline**: HubSpot accounts often have several pipelines. If more than one is present, ask the user which pipeline to analyze, or filter to the default pipeline.
  • **Stage values vary**: HubSpot stage IDs are pipeline-specific. Resolve them to readable stage names.

**Without HubSpot MCP**, ask the user to paste a deal export — at minimum, per recent deal: name, stage, amount, close date, and the contact email(s) associated.

Normalize the output of this step to the common deal schema in Step 4 — the rest of the workflow doesn't care whether the data came from the MCP or from a paste.

Step 4 — Cross-reference deals to campaigns

Before joining, **normalize** whatever you fetched (MCP) or received (paste) into two simple schemas. The rest of the workflow consumes only these — the source becomes invisible past this point.

**Campaign schema:**

{ id, name, leads: [{ email, first_name?, last_name?, company? }], stats?: { sent, replies, ... } }

**Deal schema:**

{ id, name, stage, amount?, close_date?, contact_emails: [...], pipeline? }

Then, for each deal, match its contact(s) to a campaign's lead using this cascade (in order — stop at the first hit):

1. **LGM lead ID** — if the deal carries a custom HubSpot property with the LGM lead identifier, exact match against

Read more
@lagrowthmachine
Ships withgtm-system

The open-source GTM toolkit for Claude: skills and an MCP server to run outbound from the chat.

Stars on GitHub

Momentum

stars in total
45
Star history of LaGrowthMachine/gtm-system on GitHub, a chart by star-history.com

Other skills on gtm-system.

More skills from other plugins.

seo

seo

Comprehensive SEO analysis for any website or business type. Full site audits, single-page analysis, technical SEO (crawlability,…

@agricidaniel@agricidanielInstall Skill
brag

brag

Turn the current project website into a short, polished, shareable launch video using Hyperframes. Use when someone says "/brag",…

brag2w21k
@latent-spaces@latent-spacesInstall Skill
geo-audit

geo-audit

Full website GEO+SEO audit with parallel subagent delegation. Orchestrates a comprehensive Generative Engine Optimization audit…

Questions about campaign-impact-analyzer.

Which coding agents can use campaign-impact-analyzer?
campaign-impact-analyzer installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.