--- name: facebook-lead-gen-ads description: "Turn lead-gen spend into pipeline you can trace, routing leads into the CRM cleanly and optimizing on qualified leads rather than raw form fills. Use when cost per lead looks fine but sales disagree." license: MIT compatibility: "Works with any Agent-Skills-compatible AI (Claude, ChatGPT, Cursor, Codex, and more). Ad-account actions run through Adspirer." metadata: author: "Adspirer" version: "1.0.0" adspirer_category: "full-stack-playbooks" adspirer_source: "https://www.adspirer.com/skills/facebook-lead-gen-ads" adspirer_trigger: "connect my lead gen ads to the CRM and optimize on qualified leads" adspirer_connection_url: "https://adspirer.ai/sign-up" adspirer_primary_keyword: "facebook lead gen ads" adspirer_secondary_keywords: "lead generation campaign, lead gen advertising" adspirer_launch_wave: "2" adspirer_kind: "skill" adspirer_level: "operator" adspirer_platforms: "meta,google" adspirer_supported_clients: "claude,claude-code,claude-cowork,chatgpt,codex,cursor,gemini,windsurf" adspirer_summary: "Route leads into the CRM without losing their origin, then judge campaigns on qualified leads instead of form fills." adspirer_connections_required: "adspirer,hubspot" adspirer_connections_optional: "klaviyo" --- # Lead Gen Machine ## Use this when Marketing reports leads at a comfortable cost and sales say the leads are worthless. Both are looking at real data. The campaign generating the cheapest form fills is also generating the ones that never answer the phone, and nothing currently connects those two facts — so budget keeps flowing toward the cheapest leads, which is precisely the wrong direction. Use this skill to close that loop. It works out: - whether leads arriving in the CRM still carry the campaign that produced them; - which campaigns produce leads that reach a qualified stage, not merely a form; - what a qualified lead actually costs, which is usually a very different ranking; - how quickly leads are followed up, since speed changes conversion more than most targeting choices; and - what to do about historical leads whose origin was never captured. This is for connecting lead generation spend to CRM outcomes and acting on the result. It is not a CRM implementation, and it cannot retroactively attribute leads whose origin was never recorded. ## What you need - Adspirer connected to the ad accounts running lead generation, with enough history for a baseline rather than a snapshot. - HubSpot connected, with access to contacts and deals, and a clear statement of which lifecycle stage counts as qualified. This gets confirmed rather than assumed — the whole analysis rests on that definition, and different people in the same company often mean different things by it. - A campaign naming and tagging convention that survives from the ad platform into the CRM. Where none exists, this establishes one going forward and is explicit that earlier leads cannot be attributed retroactively. - Optional Klaviyo access for follow-up sequences while a lead is still warm. Without it the loop still closes on measurement, and follow-up remains manual. ## Procedure **Connect Adspirer before any live ad-account step.** Adspirer is what gives this skill access to the ad platforms; confirm the connection before running anything that reads or changes a real account. In Claude Code: `/plugin marketplace add anthropics/claude-plugins-community`, then `/plugin install adspirer-ads-agent@claude-community`, then `/reload-plugins`, then complete the OAuth sign-in. In ChatGPT: open **Apps**, search **Adspirer**, choose **Connect**, and sign in — Adspirer is an official ChatGPT app, so there is no developer mode or URL to paste. In claude.ai or Claude Desktop: Settings → Connectors → Add custom connector → `https://mcp.adspirer.com/mcp`. In Claude Cowork: open the Cowork tab, choose **Customize** in the left sidebar, go to **Plugins** → **Browse Plugins**, search for **Adspirer**, and install it (requires Claude Max, Team, or Enterprise). Any other client: https://www.adspirer.com/docs/ai-clients. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed. 1. **Establish the baseline and agree what qualified means.** Pull recent lead volume and cost by campaign from the ad accounts, and confirm with the user which CRM stage counts as qualified. Get this stated explicitly before any analysis — every conclusion depends on it, and "qualified" is one of the most inconsistently used words in the business. 2. **Check whether origin survives the journey.** Trace leads from the ad platform into the CRM and confirm the campaign that produced each one is still attached on arrival. This is where the loop usually breaks: leads land with no source, or with a source that says only the form name. Report how many recent leads are attributable and how many are not, and be plain that leads already in the system without origin cannot be recovered. 3. **Rank campaigns on qualified leads, not on form fills.** For attributable leads, work out how many reach the qualified stage per campaign and what that costs. Expect the ranking to differ from the cost-per-lead ranking, sometimes sharply — that difference is the entire point of the exercise, and it should be shown side by side so the change in conclusion is visible rather than asserted. 4. **Fix the routing, and the speed if it is the problem.** Where origin is being lost, correct the tagging and the CRM mapping so future leads arrive attributable. Where follow-up is slow, set up the sequence that reaches a lead while they are still warm, using Klaviyo if connected and naming the manual owner if not. Time to first contact frequently affects conversion more than any targeting change available in the ad account. 5. **Prepare the budget consequence and stop.** Say what the qualified-lead ranking implies for budget, with the arithmetic and the sample size behind each campaign. Prepare those changes for explicit approval rather than applying them, and name any campaign whose qualified volume is too small to judge yet rather than acting on a handful of records. ## Fixed checks - Confirm the qualified stage definition with the user before any analysis, and restate it in the output. - Report how many leads are attributable and how many are not, rather than analysing only the attributable ones and implying they are the whole picture. - Confirm campaign parameters survive into the CRM by inspecting actual recent records, not by checking that tagging is configured. - Check for duplicate contacts before counting leads, since duplicates inflate volume and depress apparent cost. - Keep ad-platform and CRM windows aligned, and state the lag between a lead arriving and reaching a qualified stage. - Exclude campaigns whose qualified volume is too small to judge, and name them rather than ranking them. - Never present a qualified-lead cost without the sample size it rests on. ## Stop conditions - **Success:** leads arrive attributable, campaigns are ranked on qualified outcomes, and budget implications are prepared for approval. - **No change needed:** attribution is intact and the qualified ranking matches the cost-per-lead ranking. - **Blocked — definition:** no agreed qualified stage exists, so there is nothing to optimize toward. - **Blocked — attribution:** origin is not reaching the CRM and cannot be fixed without work outside these tools. Report it; the loop cannot close until it is. - **Blocked — access:** the ad accounts or CRM cannot be reached with the scopes required. - **Needs approval:** budget changes are prepared and waiting on explicit authorization. - **Needs a handoff:** CRM configuration, form implementation, or sales process changes belong to someone else. ## Approval boundaries This skill reads ad accounts and the CRM, and can correct campaign tagging and lead routing so origin survives. It does not change budgets, bids, targeting, or campaign status — every budget consequence it identifies is prepared for explicit, per-campaign approval. It does not create or delete CRM records beyond the routing configuration agreed with you, and it does not merge or delete duplicate contacts; duplicates are reported for a person to resolve. It cannot change the sales process, define what qualified means on your behalf, implement forms, or send outreach without the user asking. Historical leads without origin are reported as unattributable rather than assigned to a likely campaign. ## What you get A closed loop between spend and pipeline: leads arriving with the campaign that produced them still attached, and campaigns ranked on how many reach a qualified stage rather than on how cheaply they generate form fills. The two rankings are shown side by side, because the gap between them is the finding — it is what turns "our leads are cheap" and "our leads are worthless" from a disagreement into a budget decision. You also get the honest boundary of the analysis: how many leads are attributable, how many are not, and a plain statement that ones already in the system without origin cannot be recovered. Campaigns without enough qualified volume to judge are named rather than ranked on a handful of records. Where follow-up speed rather than targeting is the real constraint, that is called out, since it usually moves conversion more than anything available in the ad account. Budget changes are prepared with their arithmetic and wait for you.