Ad lead quality analyzer

For paid lead-gen and participant-recruitment ads, replaces vanity CPA with true CAC per qualified lead by joining ad-platform data with downstream funnel events, surfaces tracking gaps, and classifies every creative into Scale / Keep / Investigate / Cut.

How to use it

  1. Hit Copy the whole skill.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/ads/composites/ad-lead-quality-analyzer#main ~/.claude/skills/ad-lead-quality-analyzer

For one project only, change the path to .claude/skills/ad-lead-quality-analyzer.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text199 lines
ad-lead-quality-analyzer/SKILL.md199 lines10.7 KBpushed 96d agoRawView on GitHub

Ad Lead Quality Analyzer

Meta optimizes for whatever conversion event you fire. For lead-gen and participant-recruitment campaigns that's almost always "signup" — but a signup is worthless if the lead never qualifies, never completes the requested action, or never gets paid out. The lowest-CPA campaign is often the one bringing in the worst leads.

This skill joins what the ad platform knows (spend, signups) with what your own product knows (downstream funnel) and replaces vanity CPA with true CAC per qualified lead. It then classifies every creative into actionable buckets so you stop scaling the wrong winners.

Core principle: The ad platform's CPA is a half-truth. Real optimization needs both halves of the funnel — pre-signup (the platform has it) and post-signup (you have it). Until they're joined, you're flying blind.

When to Use

  • "Which ads are bringing in real leads vs. junk?"
  • "True CAC per qualified contributor / customer / participant"
  • "Why is my lowest-CPA campaign performing worst downstream?"
  • "Audit lead quality across creatives / audiences / placements"
  • "Should I trust Meta's CPA when scaling?"
  • "Find the creatives that look like winners but aren't"

Pipeline Pattern Assumptions (Read First)

This skill is opinionated about what to measure (true CAC per qualified lead, with cohort maturation, with vanity scoring) and agnostic about how the data is sourced.

It assumes one of three standard attribution patterns:

Pattern Setup Join Key
A. UTM-only (most common) UTM params captured on signup form, stored on lead/user record. Downstream events joined by user_id inside your DB. utm_content (typically the ad ID) on both sides, or fbclid
B. UTM + CAPI send-back (best) Same as A, plus your app fires Conversions API events back to Meta when downstream stages hit. Meta then optimizes for quality, not signups. event_id / external_id
C. Meta Lead Ads + CRM sync Meta-hosted lead form, lead_id syncs to CRM/DB, joined there. lead_id

If none of these patterns is wired up, the skill switches to tracking-gap mode — it produces a fix-the-tracking report instead of an analysis.

Phase 0: Discovery Interview

6 short questions. Don't proceed until each is answered (default = "I don't know — let's find out").

  1. Where do downstream events live? (Postgres / MySQL / Airtable / custom internal admin / spreadsheet / "no idea")
  2. Can the agent query that source directly? (DB credentials / API endpoint / CSV export / "needs a person to pull it")
  3. Does the signup form capture utm_* params or fbclid? ("I don't know" → inspect the signup form's HTML / network requests)
  4. Is the app sending CAPI events back to Meta for any downstream stage? (None / signup-only / signup + qualification / full funnel)
  5. What is a "qualified lead"? (Default: ≥1 unit of value-producing action completed within 14 days of signup. Examples: first purchase; demo attended; subscription activated; trial converted; first task completed and paid out)
  6. Cost basis per qualified lead? (Flat payout, variable, tiered by quality, or N/A — needed to compute margin)

Output of Phase 0: a one-paragraph Pipeline Brief stating the assumed pattern (A/B/C), the join key, the qualification definition, and any unknowns.

Phase 1: Tracking Validation (Gating Step)

Pull a sample of 10–20 recent signups from the downstream source. For each, check:

  • Is utm_source / utm_campaign / utm_content present? (Or fbclid? Or lead_id?)
  • Does the join key resolve back to a specific Meta ad?
  • Are there orphan signups (in your DB but no Meta join key)?
  • Are there orphan Meta signups (in Meta but no matching DB record)?

Coverage thresholds:

Coverage Action
≥80% joinable Proceed to Phase 2 (analysis mode)
50–80% joinable Proceed with explicit confidence caveat on every finding
<50% joinable Switch to tracking-gap mode. Skip Phases 2–6. Output the gap report.

Output of Phase 1: a Data Quality Report with coverage %, sample of orphan records, and exact field-level findings.

Phase 2: Build the Per-Creative Funnel

For every ad / ad set / campaign with statistical volume (default ≥30 signups in the window), construct:

Stage Count Conv. from prev. What a drop here means
Impressions n
Link Clicks n CTR Hook / placement issue
Signups n Click → Signup LP / form friction (use ad-to-landing-page-auditor)
Qualified action started n Signup → Started Vanity signups — wrong promise in the ad
Qualified action approved n Started → Approved Wrong audience or fraud
Payout / value event n Approved → Paid The "real" conversion
Repeat action (configurable window) n Retention One-and-done quality

The skill should pull Meta-side data via the existing Meta Marketing API connection (MCP, native API, or pasted CSV) and downstream-side data via whichever source Phase 0 identified.

Phase 3: Compute True CAC

Per creative / ad set / campaign:

  • Platform CPA = spend ÷ signups (what Meta reports)
  • True CAC = spend ÷ qualified leads (what actually matters)
  • Quality Multiplier = True CAC ÷ Platform CPA (how badly the platform is misleading you per ad — higher = worse vanity problem)
  • Margin per qualified lead = (cost-basis or LTV-equivalent value) − True CAC

Phase 4: Score and Classify Each Creative

Compute three quality scores per creative with sufficient volume:

  • Vanity score = 1 − (Started ÷ Signups). High = clicks but no work
  • Audience-fit score = Approved ÷ Started. Low = wrong people getting through
  • Retention score = Repeat ÷ Approved. Low = one-and-done

Then classify into action buckets:

Bucket Rule Action
Scale Low True CAC + good quality + sufficient volume Increase budget, watch for diminishing returns
Keep Mid True CAC + acceptable quality Hold
Investigate High True CAC but high quality (often low volume) Give it more budget before deciding
Cut Low Platform CPA + high vanity score (the dangerous one — looks like a winner) Pause and replace
Insufficient data Below volume threshold Wait, do not act

Every classification cites the data and gets a confidence flag (sample size + CI on True CAC).

Phase 5: Cohort Maturation Handling

The biggest analysis trap: judging signups before they've had time to complete the funnel.

  • Exclude signups newer than the qualification window (default 14 days) from "Cut" decisions
  • Show two parallel views in the report:
    • Mature cohort (≥14 days old) — the basis for action
    • Recent cohort (<14 days) — leading indicator only
  • If recent-cohort True CAC is diverging sharply from mature, flag a creative-fatigue or audience-shift hypothesis for investigation in meta-ads-analyzer

Phase 6: Generate Report

Use this exact structure.

1. PIPELINE BRIEF
   - Pattern (A/B/C), join key, qualification definition, unknowns

2. DATA QUALITY
   - Coverage %, orphan counts, confidence level

3. HEADLINE
   - Overall True CAC vs. Platform CPA
   - Overall Quality Multiplier
   - Period-over-period delta

4. PER-CREATIVE TABLE
   - Ad ID | Spend | Signups | Qualified | Platform CPA | True CAC | Quality Mult. | Vanity | Class

5. ACTION LIST (prioritized)
   - Cut (dangerous winners) → Scale (proven quality) → Investigate (low-vol promising) → Keep
   - Each action: hypothesis + expected impact + rollback plan

6. AUDIENCE / PLACEMENT PATTERNS
   - Which interests / lookalikes / geos / placements correlate with qualified leads
   - Which correlate with vanity signups

7. TRACKING GAPS (if any from Phase 1)
   - Specific fields, code locations, or events to wire up

Tracking-Gap Mode (Output if Phase 1 Fails)

If <50% of signups are joinable, the skill stops the analysis and outputs:

1. WHAT'S BROKEN
   - Specific symptoms (e.g. "0 signups have utm_content; signup form's hidden fields are empty")

2. WHAT TO ADD
   - Code-level recommendations (e.g. "preserve URL params on form submit and POST to /signup as utm_source, utm_campaign, utm_content, fbclid")
   - Schema changes (e.g. "add columns to leads table: utm_source, utm_campaign, utm_content, fbclid, signup_timestamp")
   - CAPI event setup (recommended, not required)

3. HOW TO VERIFY
   - The 5-minute test: drop a tagged URL, complete signup, query DB, confirm fields populated

4. EXPECTED IMPACT
   - "Once fixed, re-run this skill in `analysis` mode in N days when you have enough signups for statistical volume"

Output Standards (Mandatory)

  • Every recommendation is a hypothesis with expected impact and rollback, not a directive
  • Never recommend cutting a creative purely on Platform CPA — that's the bug this skill exists to fix
  • Always show True CAC alongside Platform CPA in any number reported back to the user
  • Cohort-tag every figure as Mature, Recent, or Combined — never let the reader confuse them
  • Flag confidence level on every per-creative recommendation (low / medium / high based on sample size + CI)
  • Disambiguate "leads" — define "signup", "qualified", "paid" clearly in the Pipeline Brief and use them consistently

What This Skill Will Not Do

  • Will not write to ad accounts — pure analysis. Action via Meta Ads Manager or whatever write tool the calling agent has available.
  • Will not fix tracking for you — it tells you what's broken and how to fix it; the fix is a code change in your app.
  • Will not generate creative or copy variants — use messaging-ab-tester and ad-angle-miner.
  • Will not diagnose Meta system mechanics (Breakdown Effect, Learning Phase) — pass the output to meta-ads-analyzer for that layer.
  • Will not compute true LTV — uses first-payout / first-value as proxy. Multi-touch LTV modeling is a different skill.

Related Skills

  • meta-ads-analyzer — Run after this skill to interpret why a creative's quality is low using Meta's system mechanics
  • ad-campaign-analyzer — Use for cross-channel budget reallocation once true CAC is known
  • ad-to-landing-page-auditor — Pair with this when "Click → Signup" drop-off is the leak
  • messaging-ab-tester — Use to generate replacement creatives for anything in the Cut bucket
1---
2name: ad-lead-quality-analyzer
3description: For paid lead-gen and participant-recruitment ads, replaces vanity CPA with true CAC per qualified lead by joining ad-platform data with downstream funnel events, surfaces tracking gaps, and classifies every creative into Scale / Keep / Investigate / Cut.
4tags: [ads]
5---
6 
7# Ad Lead Quality Analyzer
8 
9Meta optimizes for whatever conversion event you fire. For lead-gen and participant-recruitment campaigns that's almost always "signup" — but a signup is worthless if the lead never qualifies, never completes the requested action, or never gets paid out. The lowest-CPA campaign is often the one bringing in the *worst* leads.
10 
11This skill joins what the ad platform knows (spend, signups) with what your own product knows (downstream funnel) and replaces vanity CPA with **true CAC per qualified lead**. It then classifies every creative into actionable buckets so you stop scaling the wrong winners.
12 
13**Core principle:** The ad platform's CPA is a half-truth. Real optimization needs both halves of the funnel — pre-signup (the platform has it) and post-signup (you have it). Until they're joined, you're flying blind.
14 
15## When to Use
16 
17- "Which ads are bringing in real leads vs. junk?"
18- "True CAC per qualified contributor / customer / participant"
19- "Why is my lowest-CPA campaign performing worst downstream?"
20- "Audit lead quality across creatives / audiences / placements"
21- "Should I trust Meta's CPA when scaling?"
22- "Find the creatives that look like winners but aren't"
23 
24## Pipeline Pattern Assumptions (Read First)
25 
26This skill is opinionated about **what** to measure (true CAC per qualified lead, with cohort maturation, with vanity scoring) and agnostic about **how** the data is sourced.
27 
28It assumes one of three standard attribution patterns:
29 
30| Pattern | Setup | Join Key |
31|---|---|---|
32| **A. UTM-only** *(most common)* | UTM params captured on signup form, stored on lead/user record. Downstream events joined by user_id inside your DB. | `utm_content` (typically the ad ID) on both sides, or `fbclid` |
33| **B. UTM + CAPI send-back** *(best)* | Same as A, plus your app fires Conversions API events back to Meta when downstream stages hit. Meta then optimizes for quality, not signups. | `event_id` / `external_id` |
34| **C. Meta Lead Ads + CRM sync** | Meta-hosted lead form, `lead_id` syncs to CRM/DB, joined there. | `lead_id` |
35 
36If none of these patterns is wired up, the skill switches to **`tracking-gap` mode** — it produces a fix-the-tracking report instead of an analysis.
37 
38## Phase 0: Discovery Interview
39 
406 short questions. Don't proceed until each is answered (default = "I don't know — let's find out").
41 
421. **Where do downstream events live?** (Postgres / MySQL / Airtable / custom internal admin / spreadsheet / "no idea")
432. **Can the agent query that source directly?** (DB credentials / API endpoint / CSV export / "needs a person to pull it")
443. **Does the signup form capture `utm_*` params or `fbclid`?** ("I don't know" → inspect the signup form's HTML / network requests)
454. **Is the app sending CAPI events back to Meta** for any downstream stage? (None / signup-only / signup + qualification / full funnel)
465. **What is a "qualified lead"?** (Default: ≥1 unit of value-producing action completed within 14 days of signup. Examples: first purchase; demo attended; subscription activated; trial converted; first task completed and paid out)
476. **Cost basis per qualified lead?** (Flat payout, variable, tiered by quality, or N/A — needed to compute margin)
48 
49Output of Phase 0: a one-paragraph **Pipeline Brief** stating the assumed pattern (A/B/C), the join key, the qualification definition, and any unknowns.
50 
51## Phase 1: Tracking Validation (Gating Step)
52 
53Pull a sample of 10–20 recent signups from the downstream source. For each, check:
54 
55- Is `utm_source` / `utm_campaign` / `utm_content` present? (Or `fbclid`? Or `lead_id`?)
56- Does the join key resolve back to a specific Meta ad?
57- Are there orphan signups (in your DB but no Meta join key)?
58- Are there orphan Meta signups (in Meta but no matching DB record)?
59 
60**Coverage thresholds:**
61 
62| Coverage | Action |
63|---|---|
64| ≥80% joinable | Proceed to Phase 2 (`analysis` mode) |
65| 50–80% joinable | Proceed with explicit confidence caveat on every finding |
66| <50% joinable | Switch to **`tracking-gap` mode**. Skip Phases 2–6. Output the gap report. |
67 
68Output of Phase 1: a **Data Quality Report** with coverage %, sample of orphan records, and exact field-level findings.
69 
70## Phase 2: Build the Per-Creative Funnel
71 
72For every ad / ad set / campaign with statistical volume (default ≥30 signups in the window), construct:
73 
74| Stage | Count | Conv. from prev. | What a drop here means |
75|---|---|---|---|
76| Impressions | n | — | — |
77| Link Clicks | n | CTR | Hook / placement issue |
78| Signups | n | Click → Signup | LP / form friction (use `ad-to-landing-page-auditor`) |
79| Qualified action started | n | Signup → Started | **Vanity signups** — wrong promise in the ad |
80| Qualified action approved | n | Started → Approved | Wrong audience or fraud |
81| Payout / value event | n | Approved → Paid | The "real" conversion |
82| Repeat action (configurable window) | n | Retention | One-and-done quality |
83 
84The skill should pull Meta-side data via the existing Meta Marketing API connection (MCP, native API, or pasted CSV) and downstream-side data via whichever source Phase 0 identified.
85 
86## Phase 3: Compute True CAC
87 
88Per creative / ad set / campaign:
89 
90- **Platform CPA** = spend ÷ signups *(what Meta reports)*
91- **True CAC** = spend ÷ qualified leads *(what actually matters)*
92- **Quality Multiplier** = True CAC ÷ Platform CPA *(how badly the platform is misleading you per ad — higher = worse vanity problem)*
93- **Margin per qualified lead** = (cost-basis or LTV-equivalent value) − True CAC
94 
95## Phase 4: Score and Classify Each Creative
96 
97Compute three quality scores per creative with sufficient volume:
98 
99- **Vanity score** = 1 − (Started ÷ Signups). High = clicks but no work
100- **Audience-fit score** = Approved ÷ Started. Low = wrong people getting through
101- **Retention score** = Repeat ÷ Approved. Low = one-and-done
102 
103Then classify into action buckets:
104 
105| Bucket | Rule | Action |
106|---|---|---|
107| **Scale** | Low True CAC + good quality + sufficient volume | Increase budget, watch for diminishing returns |
108| **Keep** | Mid True CAC + acceptable quality | Hold |
109| **Investigate** | High True CAC but high quality (often low volume) | Give it more budget before deciding |
110| **Cut** | Low Platform CPA + high vanity score *(the dangerous one — looks like a winner)* | Pause and replace |
111| **Insufficient data** | Below volume threshold | Wait, do not act |
112 
113Every classification cites the data and gets a confidence flag (sample size + CI on True CAC).
114 
115## Phase 5: Cohort Maturation Handling
116 
117The biggest analysis trap: judging signups before they've had time to complete the funnel.
118 
119- **Exclude signups newer than the qualification window** (default 14 days) from "Cut" decisions
120- Show two parallel views in the report:
121 - **Mature cohort** (≥14 days old) — the basis for action
122 - **Recent cohort** (<14 days) — leading indicator only
123- If recent-cohort True CAC is diverging sharply from mature, flag a **creative-fatigue** or **audience-shift** hypothesis for investigation in `meta-ads-analyzer`
124 
125## Phase 6: Generate Report
126 
127Use this exact structure.
128 
129```
1301. PIPELINE BRIEF
131 - Pattern (A/B/C), join key, qualification definition, unknowns
132 
1332. DATA QUALITY
134 - Coverage %, orphan counts, confidence level
135 
1363. HEADLINE
137 - Overall True CAC vs. Platform CPA
138 - Overall Quality Multiplier
139 - Period-over-period delta
140 
1414. PER-CREATIVE TABLE
142 - Ad ID | Spend | Signups | Qualified | Platform CPA | True CAC | Quality Mult. | Vanity | Class
143 
1445. ACTION LIST (prioritized)
145 - Cut (dangerous winners) → Scale (proven quality) → Investigate (low-vol promising) → Keep
146 - Each action: hypothesis + expected impact + rollback plan
147 
1486. AUDIENCE / PLACEMENT PATTERNS
149 - Which interests / lookalikes / geos / placements correlate with qualified leads
150 - Which correlate with vanity signups
151 
1527. TRACKING GAPS (if any from Phase 1)
153 - Specific fields, code locations, or events to wire up
154```
155 
156## Tracking-Gap Mode (Output if Phase 1 Fails)
157 
158If <50% of signups are joinable, the skill stops the analysis and outputs:
159 
160```
1611. WHAT'S BROKEN
162 - Specific symptoms (e.g. "0 signups have utm_content; signup form's hidden fields are empty")
163 
1642. WHAT TO ADD
165 - Code-level recommendations (e.g. "preserve URL params on form submit and POST to /signup as utm_source, utm_campaign, utm_content, fbclid")
166 - Schema changes (e.g. "add columns to leads table: utm_source, utm_campaign, utm_content, fbclid, signup_timestamp")
167 - CAPI event setup (recommended, not required)
168 
1693. HOW TO VERIFY
170 - The 5-minute test: drop a tagged URL, complete signup, query DB, confirm fields populated
171 
1724. EXPECTED IMPACT
173 - "Once fixed, re-run this skill in `analysis` mode in N days when you have enough signups for statistical volume"
174```
175 
176## Output Standards (Mandatory)
177 
178- **Every recommendation is a hypothesis with expected impact and rollback**, not a directive
179- **Never recommend cutting a creative purely on Platform CPA** — that's the bug this skill exists to fix
180- **Always show True CAC alongside Platform CPA** in any number reported back to the user
181- **Cohort-tag every figure** as Mature, Recent, or Combined — never let the reader confuse them
182- **Flag confidence level** on every per-creative recommendation (low / medium / high based on sample size + CI)
183- **Disambiguate "leads"** — define "signup", "qualified", "paid" clearly in the Pipeline Brief and use them consistently
184 
185## What This Skill Will Not Do
186 
187- **Will not write to ad accounts** — pure analysis. Action via Meta Ads Manager or whatever write tool the calling agent has available.
188- **Will not fix tracking for you** — it tells you what's broken and how to fix it; the fix is a code change in your app.
189- **Will not generate creative or copy variants** — use `messaging-ab-tester` and `ad-angle-miner`.
190- **Will not diagnose Meta system mechanics** (Breakdown Effect, Learning Phase) — pass the output to `meta-ads-analyzer` for that layer.
191- **Will not compute true LTV** — uses first-payout / first-value as proxy. Multi-touch LTV modeling is a different skill.
192 
193## Related Skills
194 
195- **`meta-ads-analyzer`** — Run after this skill to interpret *why* a creative's quality is low using Meta's system mechanics
196- **`ad-campaign-analyzer`** — Use for cross-channel budget reallocation once true CAC is known
197- **`ad-to-landing-page-auditor`** — Pair with this when "Click → Signup" drop-off is the leak
198- **`messaging-ab-tester`** — Use to generate replacement creatives for anything in the Cut bucket
199 

Discussion

Alternatives

Also in Ad account audit