$npx -y skills add gooseworks-ai/goose-skills --skill ad-lead-quality-analyzerFor 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.
| 1 | # Ad Lead Quality Analyzer |
| 2 | |
| 3 | 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. |
| 4 | |
| 5 | 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. |
| 6 | |
| 7 | **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. |
| 8 | |
| 9 | ## When to Use |
| 10 | |
| 11 | - "Which ads are bringing in real leads vs. junk?" |
| 12 | - "True CAC per qualified contributor / customer / participant" |
| 13 | - "Why is my lowest-CPA campaign performing worst downstream?" |
| 14 | - "Audit lead quality across creatives / audiences / placements" |
| 15 | - "Should I trust Meta's CPA when scaling?" |
| 16 | - "Find the creatives that look like winners but aren't" |
| 17 | |
| 18 | ## Pipeline Pattern Assumptions (Read First) |
| 19 | |
| 20 | 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. |
| 21 | |
| 22 | It assumes one of three standard attribution patterns: |
| 23 | |
| 24 | | Pattern | Setup | Join Key | |
| 25 | |---|---|---| |
| 26 | | **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` | |
| 27 | | **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` | |
| 28 | | **C. Meta Lead Ads + CRM sync** | Meta-hosted lead form, `lead_id` syncs to CRM/DB, joined there. | `lead_id` | |
| 29 | |
| 30 | 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. |
| 31 | |
| 32 | ## Phase 0: Discovery Interview |
| 33 | |
| 34 | 6 short questions. Don't proceed until each is answered (default = "I don't know — let's find out"). |
| 35 | |
| 36 | 1. **Where do downstream events live?** (Postgres / MySQL / Airtable / custom internal admin / spreadsheet / "no idea") |
| 37 | 2. **Can the agent query that source directly?** (DB credentials / API endpoint / CSV export / "needs a person to pull it") |
| 38 | 3. **Does the signup form capture `utm_*` params or `fbclid`?** ("I don't know" → inspect the signup form's HTML / network requests) |
| 39 | 4. **Is the app sending CAPI events back to Meta** for any downstream stage? (None / signup-only / signup + qualification / full funnel) |
| 40 | 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) |
| 41 | 6. **Cost basis per qualified lead?** (Flat payout, variable, tiered by quality, or N/A — needed to compute margin) |
| 42 | |
| 43 | 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. |
| 44 | |
| 45 | ## Phase 1: Tracking Validation (Gating Step) |
| 46 | |
| 47 | Pull a sample of 10–20 recent signups from the downstream source. For each, check: |
| 48 | |
| 49 | - Is `utm_source` / `utm_campaign` / `utm_content` present? (Or `fbclid`? Or `lead_id`?) |
| 50 | - Does the join key resolve back to a specific Meta ad? |
| 51 | - Are there orphan signups (in your DB but no Meta join key)? |
| 52 | - Are there orphan Meta signups (in Meta but no matching DB record)? |
| 53 | |
| 54 | **Coverage thresholds:** |
| 55 | |
| 56 | | Coverage | Action | |
| 57 | |---|---| |
| 58 | | ≥80% joinable | Proceed to Phase 2 (`analysis` mode) | |
| 59 | | 50–80% joinable | Proceed with explicit confidence caveat on every finding | |
| 60 | | <50% joinable | Switch to **`tracking-gap` mode**. Skip Phases 2–6. Output the gap report. | |
| 61 | |
| 62 | Output of Phase 1: a **Data Quality Report** with coverage %, sample of orphan records, and exact field-level findings. |
| 63 | |
| 64 | ## Phase 2: Build the Per-Creative Funnel |
| 65 | |
| 66 | For every ad / ad set / campaign with statistical volume (default ≥30 signups in the window), construct: |
| 67 | |
| 68 | | Stage | Count | Conv. from prev. | What a drop here means | |
| 69 | |---|---|---|---| |
| 70 | | Impressions | n | — | — | |
| 71 | | Link Clicks | n | CTR | Hook / placement issue | |
| 72 | | Signups | n | Click → Signup | LP / form friction (use `ad-to-landing-page-auditor`) | |
| 73 | | Qualified action started | n | Signup → Started | **Vanity signups** — wrong pr |