---
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:

- CTR = clicks / impressions
- CPC = spend / clicks
- CPM = spend / impressions x 1000
- CPL = spend / leads
- Lead rate = leads / clicks
- Qualification rate = qualified leads / leads
- CPQL = spend / qualified leads, which also equals CPL / qualification rate
- Cost per SQL = spend / SQLs, when sales qualified counts are supplied

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:

- Campaign or ad set performance export from Campaign Manager (CSV). Required columns in practice: campaign or ad set name, objective if available, impressions, clicks, total spend, leads, conversions. Campaign Manager exports these as CSV at account, campaign, ad set, and ad level.
- Professional demographics export for the same campaigns. This breaks delivery by company, industry, company size, location, job seniority, job title, and job function.
- Leads export or a CRM extract joined by campaign, with one row per lead and a qualified flag. Define qualified before the audit starts: the account own MQL or SQL definition, written down. If the CRM cannot join by campaign, use a lead list with campaign name, email domain, job title, company, and the sales disposition.
- The Lead Gen Form itself for each lead generation campaign: field list, custom questions and their type, headline, description, privacy policy URL, thank you screen text and link, and whether CRM sync was on.
- Campaign settings per campaign: objective, audience definition (attributes plus any Matched Audience list), Audience Expansion on or off, LinkedIn Audience Network on or off, bid strategy (Maximum Delivery, Cost Cap, or Manual), daily or lifetime budget, and run dates.

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:

- Confirm the spend in the performance export matches the amount the advertiser thinks they spent, within rounding. If it does not, fix the date range or timezone before any analysis.
- Confirm the Insight Tag status if website conversions are claimed. Without a verified tag and a defined conversion action, website conversion numbers are not trustworthy.
- Note sample size per campaign. Do not rank fixes on a campaign with under 1,000 impressions or under 10 leads without flagging low confidence.

### 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:

- Broad B2B (Metadata, 2025 data, 138 LinkedIn advertisers): CTR 0.67 percent, CPC $9.39, CPM $63.19, click to lead 5.9 percent, CPL $202.
- ABM heavy (ZenABM, 211 companies): higher CPC and CPM, with a format split. Single image CTR 0.42 percent and CPC $13.23, Thought Leader Ads CTR 2.68 percent and CPC $2.29, video CTR 0.24 percent and CPC $15.61.
- Broad B2B (Dreamdata, via Whatagraph): CTR 0.57 percent, CPC $6.88, CPM $39.48.

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:

- Within about 25 percent of the chosen benchmark: normal for LinkedIn. Look elsewhere for the problem.
- 25 to 75 percent worse: worth a fix, usually audience breadth, bid strategy, or creative fatigue.
- More than 75 percent worse, or CPL high while CPQL is fine: check tracking, objective mismatch, and qualification definitions before touching budget.

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:

- Share of impressions and spend going to target seniorities, functions, and industries. Flag any segment outside the stated ideal customer profile that takes more than 15 percent of impressions.
- Entry level, intern, and training seniority share. For most B2B offers aimed at managers and above, a large entry level share is wasted spend unless the offer is built for practitioners.
- Company size spread. A campaign aimed at 51 to 500 employee companies that delivers mostly to 10,001 plus companies has a targeting or expansion problem.
- Geography spread. Flag countries or regions outside the sales territory, especially when Audience Network or Audience Expansion is on.
- Company concentration. If a Matched Audience account list was used, check what share of impressions landed on listed companies versus everyone else. Expansion on an account list campaign dilutes the list fast.
- Audience size sanity. LinkedIn requires at least 300 matched member accounts for a segment to serve. Very small audiences drive high CPMs and fast fatigue. Very broad audiences (millions for a niche B2B offer) usually mean the criteria are stacked with OR logic or built on skills and interests alone.

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:

- Field count: LinkedIn allows up to 7 fields and recommends 4 or fewer. Three to four fields is the working target for a content offer. Count the fields and list them.
- Manual typing: flag any field that will not prefill for many members, and any free text custom question. Prefer multiple choice custom questions. Keep custom questions to one for a content offer, and justify each extra one.
- Work email: check the work email option is used where lead matching matters, and note the personal email share in the leads export if domains are visible.
- Offer match: the headline must name the exact asset or event the person gets. Vague headlines convert clicks into unqualified leads.
- Privacy and next step: a working privacy policy URL is required to publish. The thank you screen should give the asset link or a clear next step, not a dead end.
- Follow up plumbing: CRM or marketing automation sync must be on and tested with a real test lead. Manual CSV handling delays first contact and hides where leads came from. Check hidden field and campaign attribution mapping.
- Form completion maths: compute opens to submissions where the export provides form opens. A healthy click rate with a weak completion rate is a form problem, not a traffic problem.

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

- Budget floors: LinkedIn minimum daily budget is $10 per campaign and minimum lifetime budget for a new campaign is $100. Those are floors, not recommendations. A $10 per day lead generation campaign in a senior audience may take weeks to produce a readable signal. Say so with the account own CPC: expected clicks per day equals daily budget divided by CPC.
- Bid strategy: record it per campaign. Maximum Delivery spends the full budget with no cost ceiling. Cost Cap targets an average cost per result. Manual bidding sets a ceiling per click or impression. For an audit, flag any high CPC campaign on Maximum Delivery with no cost control, and any Cost Cap set below the historical CPL, which usually starves delivery.
- Learning time: do not judge a campaign on its first days alone. Note run length and whether budget or targeting changed mid flight, which resets comparability.
- Structure: one objective per campaign, one audience idea per campaign, and enough ads per campaign to see a creative difference. Flag campaigns that mix retargeting and cold prospecting, or mix a demo offer and a content offer, because their blended CPL hides both results.
- Fatigue: compare CTR in the first half of the period to the second half. A steady fall with rising CPM in a small audience reads as fatigue. The fix is new creative or a broader audience, not a higher bid.
- Schedule and placement: note Audience Network status and any day or time pattern visible in the data. Do not invent daypart rules the export does not support.

### 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:

- For a wasted segment fix: wasted spend share x campaign spend, divided by qualified leads, is the CPQL saving if that spend moves to the average segment. Show the arithmetic.
- For a form fix: model it honestly. If completion rises and qualification holds, CPQL falls in proportion. Label it a model, give the assumption, and propose a test window instead of promising the number.
- For a budget move: moving budget from the highest CPQL campaign to the lowest CPQL campaign at similar volume beats cutting the expensive campaign outright when its leads qualify at a good rate. State the volume limit: the cheap campaign may not absorb double budget at the same CPQL.

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

- Work from exports. Do not require Campaign Manager login, an MCP connection, or an API key to run this audit. If live access is offered, use it only to pull the same exports faster, and keep the audit reproducible from the files.
- Never invent a qualification rate, a form open count, a segment share, or a benchmark. If the data is not in the files, write not available and name the export that would provide it.
- Label every benchmark with its source, sample, and year. Third party medians are reference points for a named kind of advertiser. They are not LinkedIn promises and not targets for every account.
- Do not judge a campaign on CPL alone when qualification data exists. Report CPL and CPQL side by side, and explain any case where they point in opposite directions.
- Do not recommend raising budget on a campaign whose tracking or qualification definition is broken. Fix measurement first.
- Respect low volume. Flag any conclusion drawn from under 10 leads or under 1,000 impressions per campaign as low confidence, and propose a volume or time threshold before the next judgement.
- Keep personal data out of the report. Leads exports contain names and emails. Aggregate them. Never paste individual lead rows into the audit, and never send a leads file to an outside service.
- Write dates, budgets, and bids exactly as the export shows them, including currency. If exports mix currencies, stop and reconcile before computing anything.
