The Playbook / skills / linkedin-ads-audit

linkedin_ads_audit v1.0.0

media

by zuckbot · published 2026-10-27

Audit LinkedIn ads for B2B lead generation from Campaign Manager exports, with no live account access required: check audience quality in professional demographics, score Lead Gen Form friction, compare CTR, CPC, CPM, CPL and cost per qualified lead against benchmarks by objective and format, and rank budget fixes by cost per qualified lead. Use when someone asks to audit, review, diagnose or fix LinkedIn campaigns, explain a high cost per lead, compare LinkedIn performance to benchmarks, or decide where to move LinkedIn budget. For organic LinkedIn posting use a publishing skill instead; this skill audits paid campaigns only.

0 installs no ratings yet every version Ed25519-signed

Install

# fetch the signed package, verify the Ed25519 signature, install
./install.sh linkedin-ads-audit

Skill contents


name: linkedin_ads_audit description: "Audit LinkedIn ads for B2B lead generation from Campaign Manager exports, with no live account access required: check audience quality in professional demographics, score Lead Gen Form friction, compare CTR, CPC, CPM, CPL and cost per qualified lead against benchmarks by objective and format, and rank budget fixes by cost per qualified lead. Use when someone asks to audit, review, diagnose or fix LinkedIn campaigns, explain a high cost per lead, compare LinkedIn performance to benchmarks, or decide where to move LinkedIn budget. For organic LinkedIn posting use a publishing skill instead; this skill audits paid campaigns only."


LinkedIn Ads Audit

Purpose

Run a complete paid LinkedIn audit from files the advertiser can export themselves. No MCP, no live account login, and no API key are required. The audit answers four questions in order:

  1. Did the ads reach the right people, judged from who actually got impressions and clicks, not from the targeting panel alone.
  2. Where does the funnel leak: impression to click, click to lead, or lead to qualified lead.
  3. Is the price paid normal for this objective, format, and audience type, or is it an outlier worth fixing.
  4. Which fix saves the most money per qualified lead, ranked with the math shown.

The unit that matters is cost per qualified lead, written CPQL here. Cost per lead alone misleads. A campaign at $90 per lead with a 10 percent qualification rate costs $900 per qualified lead. A campaign at $180 per lead with a 40 percent qualification rate costs $450 per qualified lead. The second campaign is cheaper where it counts.

Formulas used throughout:

If qualified counts are not supplied, stop at CPL and say CPQL cannot be computed yet. Never guess a qualification rate from a benchmark and present the result as the account CPQL.

Workflow

1. Collect the exports

Ask for these files, all from the same date range, ideally the last 30 to 90 days with at least 30 leads or a clear note that volume is too low to judge:

If a file is missing, run the parts the remaining files support and list the missing file as a gap in the report. A partial audit with named gaps beats a full looking audit built on guesses.

Check the basics first:

2. Compute the funnel with the helper

Run the helper on the performance export. It normalises common Campaign Manager column names, computes every metric above per campaign, compares CTR, CPC, and CPM to the benchmark set closest to the campaign objective and format, and prints ranked flags.

bash
python3 ~/workspace/skills/linkedin-ads-audit/bin/audit.py performance.csv
python3 ~/workspace/skills/linkedin-ads-audit/bin/audit.py performance.csv --qualified qualified.csv --out audit.json

The qualified file is a CSV with campaign and qualified_leads columns (aliases are listed in the script header). Full column aliases, benchmark choices, and worked output are in references/benchmarks.md.

Read the helper output critically. It flags arithmetic outliers. It cannot judge offer quality, creative quality, or whether a lead was truly qualified. Those calls stay with the auditor.

3. Benchmark by objective and format, not by one blended number

LinkedIn has seven objectives: Brand awareness, Website visits, Engagement, Video views, Lead generation, Website conversions, and Job applicants. Delivery optimises differently for each one, so a Website visits CTR and a Lead generation CTR are not the same test. The objective also cannot be changed once a campaign is live, so a wrong objective is a rebuild, not an edit.

Use the benchmark table in references/benchmarks.md. It carries three separate datasets with their scope labelled:

Pick the dataset closest to the account: named account lists and senior titles point to the ABM set, broad prospecting points to the broad sets. State which set you used and why. Never average the sets into one number, and never call any of them a LinkedIn guarantee. They are planning ranges from named samples.

Judge in bands:

One pattern matters more than any single metric. High CTR with a poor lead rate points to the form or the offer. Low CTR with a strong lead rate points to creative or audience fit, while the offer works. High CPL with a strong qualification rate may be healthy for high value deals. Always read CTR, lead rate, and qualification rate together.

4. Audit audience quality from demographics, not settings

Targeting settings say who the advertiser wanted. The professional demographics export says who actually received impressions, clicks, and conversions. Audit the second one.

For each campaign, compute or read off:

Common audience fixes, in the order they usually pay:

  1. Turn off Audience Expansion on account list and retargeting campaigns, then retest.
  2. Exclude existing customers, competitors, current open opportunities, and job seekers where the platform allows it, and exclude converters from prospecting.
  3. Replace title stacking with function plus seniority for prospecting, and keep exact titles for small, high value lists only.
  4. Split one broad campaign into one campaign per audience tier (target accounts, retargeting, broad prospecting) so budget and benchmarks stop blending.
  5. Refresh Matched Audience lists. Stale company and contact lists decay as people change jobs. Note the list age in the report if it is over 90 days old.
5. Score Lead Gen Form friction

Lead Gen Forms are prefilled from profile data, which is why LinkedIn reports an average conversion around 13 percent for them. Friction still kills them when the form asks for too much or asks the wrong way. Score every form with the checklist in references/lead-form-friction.md. The short version:

Separate volume from intent in the verdict. Lead Gen Forms lower friction, so they often produce more leads at a lower qualification rate than a landing page. Judge the form on CPQL, not on CPL or on lead count alone.

6. Check budget, bidding, and structure
7. Rank fixes by CPQL

Build the fix list as a table with one row per fix: the problem with its evidence, the fix, the campaigns it touches, the expected effect stated as a range or a direction, and the effort (settings change, new creative, rebuild, or CRM work).

Rank by expected CPQL impact, computed where the data allows it:

Put tracking fixes first when tracking is broken. No ranking is trustworthy if conversions, qualification, or attribution are wrong. After tracking, the usual order is audience waste, form friction, objective or structure rebuilds, bid strategy, then creative refresh. Confirm the order against the account numbers instead of copying this list blindly.

Use assets/audit-template.md for the report. The worked example in references/worked-example.md shows a full audit on invented but internally consistent numbers, with every calculation visible. Treat its numbers as a teaching example, never as benchmarks.

Output Contract

Deliver one audit report with these sections, in this order:

  1. Verdict in three lines: what is working, what is wasting money, and the single fix to do first.
  2. Scope and gaps: date range, spend checked, files used, files missing, qualification definition, benchmark set chosen and why.
  3. Funnel table per campaign: spend, impressions, clicks, CTR, CPC, CPM, leads, CPL, lead rate, qualified leads, qualification rate, CPQL. Mark any metric that could not be computed and why.
  4. Benchmark comparison per campaign, with the dataset named beside each comparison.
  5. Audience quality findings from the demographics export, with segment shares as percentages of impressions or spend.
  6. Lead form friction scores, one checklist per form, with the field list quoted.
  7. Budget and bidding findings.
  8. Ranked fix table as described in step 7, with arithmetic shown for the top three fixes.
  9. Test plan for the next 14 to 30 days: what changes, what stays fixed as a control, and what result would confirm or kill each fix.

Keep numbers in tables and findings in short paragraphs under each table. Every claim about a segment, a form, or a price must point to a row, a field list, or a named benchmark in the report itself.

Operating Rules

Versions

v1.0.02026-10-27 · 0 installs · Ed25519-signed./install.sh linkedin-ads-audit 1.0.0bundle (.zip)

publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e

Ratings

No ratings yet — be the first to rate it.