agentleFS
adwarp-devadwarp-dev/paid-ads-skills/skills/linkedin-ads-performance-review/SKILL.md

linkedin-ads-performance-review

Skill0 starsChanged 26 days agoMITView on GitHub

LinkedIn Ads performance review with KPIs by campaign, ad set and ad (CTR, CPC, CPM, cost per lead or conversion, conversion rate), top and bottom performers against like-for-like peers, week over week direction, creative fatigue, and scale, pause, refresh and watch lists ranked by money at stake. Judgment floors (about 1,000 impressions or 3 results) keep small numbers from driving decisions. Works from Campaign Manager exports or live through Adwarp. Use for "how are my LinkedIn ads doing", "LinkedIn ads performance review", "what should I scale or pause on LinkedIn", "which LinkedIn ads are working", "weekly LinkedIn ads check", "why did LinkedIn cost per lead go up".

The file

We split this skill into the rules it gives an agent

3 rules. About 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Check the account's setup (tracking, targeting, toggles, UTMs).

    line 18
  2. Distinctive:

    Lag: Treat the last 2 to 3 days of conversions as incomplete ([a422513]).

    line 108
  3. Distinctive:

    All checked 2026-10-20. LinkedIn help pages show only a relative "last updated" date, so recheck them when Campaign Manager changes.

    line 172

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

LinkedIn Ads performance review

Turn a LinkedIn Ads account's numbers into a review a growth lead can act on in 10 minutes: what moved, what's winning, what's burning money, what's wearing out, and what to do first. Every verdict rests on a number that cleared a floor, and every ad is judged against peers that face the same kind of audience.

Use cases

  • A weekly or monthly read of a LinkedIn Ads account.
  • Deciding where the next dollar goes: what to scale, pause, refresh or leave alone.
  • Explaining a jump in cost per lead or cost per conversion.

Out of scope:

  • Check the account's setup (tracking, targeting, toggles, UTMs). Use linkedin-ads-audit; setup problems often explain bad numbers.
  • Set standing pause rules or switch ads off. Use linkedin-ads-pause-rules.
  • Prove a change caused a result. Use ad-experiment-lift.
  • Report across LinkedIn and Google together. Use paid-media-weekly-report.

Inputs

Names first. Since October 2025 Campaign Manager calls the old "campaign group" a campaign and the old "campaign" an ad set (Social Media Today; LinkedIn's own URL tracking values changed with it, a5968064). The ad set is where targeting, objective, bid and budget live, so it's what Google and Meta call an ad group or ad set. This skill uses the new names. In an export, "Campaign Name" means the campaign when an "Ad Set Name" column exists, and the ad set when it doesn't (an older export).

Export mode

In Campaign Manager: open the ad account, click Advertise, set the Time range, click Export, pick the Report Type, pick Column view: All columns, pick the Time breakdown, then Export (a441785).

FileReport typeTime breakdownTime rangeUsed for
Ad performanceAd performanceDailyLast 56 days, ending on the last full dayEverything by ad, rolled up to ad set and campaign; weekly trends
Ad set performanceAd set performanceAllLast 28 daysObjective, daily budget, reach and frequency
Conversions (recommended)Conversion performanceAllLast 28 daysWhich conversion actions the Conversions column counts (a421283)

Also ask whether the team has a target cost per result. Without a target, the review compares against peers inside the account.

How to read the CSVs:

  • LinkedIn puts report-info rows (report name, date range, account) above the header row. The header row is the first row with 5 or more cells where 1 cell contains "impressions" and another contains "spent", "spend" or "cost". Ignore everything above it.
  • Match columns by name, case-insensitive, ignoring punctuation and bracketed suffixes such as "(in UTC)" or a currency. Allow variations: spend may be "Total Spent", "Amount Spent", "Spent" or "Cost"; post-click may be "Post-Click Conversions" or "Click Conversions"; view-through may be "View-Through Conversions" or "View Conversions"; the date may be "Start Date (in UTC)" or "Date". List the mapping you used in the report header.
  • Recompute every rate from counts. Exported rates may be fractions or percentages and are rounded.
  • Never add 2 currencies.
  • Roll ad rows up to ad set and campaign by summing counts (spend, impressions, clicks, landing page clicks, conversions, leads). Don't sum reach or frequency, which count unique people; take them from the ad set export.

Columns used: date, campaign, ad set and ad names and IDs, ad format, spend, impressions, clicks, landing page clicks, conversions, post-click conversions, view-through conversions, leads; from the ad set file, objective, daily budget, reach and average frequency.

Connected mode

Adwarp, a free open-source MCP server and CLI for LinkedIn Ads and Google Ads, pulls the same numbers live. Read-only tools:

NeedAdwarp MCP tooladwarp CLI
Account rollupperformance_summary (startDate, endDate)adwarp report summary -p last_30_days
KPIs by levelget_performance (level: campaign_group, campaign or creative; startDate, endDate)adwarp report perf <level> -p last_30_days
Weekly trend for 1 entityperformance_trend (level, entityId, bucket: weekly)adwarp report trend <level> <id> -b weekly -p last_90_days
Names, statuses, objectives, active ad sets with no deliverylist_campaignsadwarp campaigns list
Ads in an ad setlist_adsadwarp ad list <adSetId>
What a conversion countslist_conversionsadwarp conversions list
Changes that might explain a movelist_ad_changesadwarp changelog list

Notes: Adwarp keeps the API's names (campaign_group is the campaign, campaign is the ad set, creative is the ad). Its conversions are website conversions and its leads are Lead Gen Form leads, reported separately. Costs come in USD (costInUsd). CLI periods are presets up to 90 days; use the MCP tools with startDate and endDate for the exact 28-day windows. performance_summary adds its own flags with different cutoffs; apply this skill's rules instead. For a before and after read on a logged change, compute_lift compares the 2 periods without a control group, so treat it as a signal.

Reporting: adwarp.dev/linkedin-ads/reporting. Optimization: adwarp.dev/linkedin-ads/optimization. Setup: adwarp.dev/docs/install. Overview: adwarp.dev/linkedin-ads.

Method

  1. Set the windows. Review window: the last 28 days (4 full weeks) ending on the last full day. Comparison: the 28 days before it. Direction: the last 7 days against the 7 before. If the account has fewer than 10 results in 28 days, widen both windows to 56 or 84 days and say so (default).
  2. Name the result for each ad set from its objective, and never add results across objectives.

    ObjectiveResultCost per result
    Website conversionsConversionsCost per conversion
    Lead generationLeadsCost per lead
    Website visitsLanding page clicksCost per landing page click
    EngagementClicksCPC
    Brand awarenessImpressions and reachCPM
    Video viewsViewsCost per view

    Say which conversion actions the Conversions column counts. If a page-view conversion is attached next to demo requests, the ad set's cost per conversion is a blend; if you can't tell, say so and keep conversion verdicts on that ad set in Watch.

  3. Group peers. Peers share an objective and an audience temperature: prospecting, ABM, or retargeting (read it from names, or ask). The yardstick for every ad and ad set is its peer group's cost per result (total spend divided by total results). Retargeting reaches people who already know you and will look cheap next to prospecting, so never compare across temperatures. An ad set with no peer is compared with its own prior 28 days.
  4. Compute KPIs for the account, each campaign, each ad set and each ad: spend, impressions, clicks, CTR (clicks divided by impressions), CPC, CPM, results, conversion rate (conversions divided by clicks, as LinkedIn defines it, a422513) and cost per result. For each ad set, also compute its share of the objective's spend and its share of the objective's results; the rows where those shares diverge are the story. LinkedIn counts clicks as chargeable clicks based on the objective (a445476), so compare CTR only within 1 objective.
  5. Give verdicts, floors first. Defaults the user can change: 1,000 impressions before judging CTR, CPC or CPM; 3 results before judging cost per result.

    VerdictRule
    Too earlyUnder 1,000 impressions
    Below floor1 or 2 results, or 0 results with spend under 2 times the peer cost per result
    No result0 results, 1,000 impressions or more, and spend at least 2 times the peer cost per result
    Top3 results or more and cost per result at most 0.8 times the peer cost per result
    Bottom3 results or more and cost per result at least 1.5 times the peer cost per result, or an ad taking 25% or more of its ad set's spend at 1.5 times the ad set's cost per result or worse (a budget hog)
    MiddleEverything else

    The 0.8, 1.5, 2 times and 25% lines are defaults. Budget hogs matter because "Optimize for performance" rotation sends impressions to the ads with the best CTR (a423702), so a click-heavy ad can win budget without converting. For ad sets judged on clicks, use CPC against peers with the same lines.

  6. Read week over week direction. Compare the last 7 days with the 7 before for the account, each objective and each ad set. Report a change only when it's 20% or more (default); smaller is flat. Calling CTR, CPC or CPM needs 1,000 impressions in each week; calling results or cost per result needs 10 results in each week (default), because weekly counts are small and a move from 4 leads to 3 is noise. Conversions arrive late: CSV-uploaded conversions usually take 24 to 48 hours and sometimes up to a week (a422513), and site conversions also trail the click, so treat the last 2 to 3 days as incomplete. Daily spend can run up to 2 times the daily budget on a given day (a422101), so judge spend direction over the whole week.
  7. Find creative fatigue. For each ad with 1,000 impressions or more in each of the last 3 full weeks: fatigued when CTR fell 2 weeks in a row and the last full week sits 20% or more below the ad's best 2-week average (default). LinkedIn notes CTR commonly declines when the same ad runs week after week and suggests refreshing at least monthly (a420488). Ad set frequency over 6 in 28 days (default) is supporting evidence; it's a modeled estimate (a426154).
  8. Build the lists.
    • Scale (ad sets): verdict Top against peers, or 20% or better than its own prior 28 days when it has no peer; 10 results or more in the window (a stricter default, because scaling spends more money on the verdict); spending 90% or more of its daily budget, so budget is the limit; frequency 6 or under; and no budget hog inside it, or fix the hog first. Step: raise the daily budget 20% (default), recheck after 7 days, stop when cost per result passes the peer average.
    • Pause (ads): No result or Bottom. Pausing a budget hog moves its budget to the other ads in the ad set; say where the money goes.
    • Refresh (ads): fatigued. Create a replacement next to it, run both 7 days, then pause the tired ad.
    • Watch: Too early and Below floor, week over week moves on entities that cleared the floors, frequency over 6, ad sets with an unclear conversion definition, and ad sets judged on something their objective doesn't optimize for.
  9. Rank the actions by money at stake, at most 6. Pause: the ad's spend in the window. Refresh: the fatigued ad's spend. Fix an ad set: its spend. Scale: the added budget over 28 days. Each action names the entity by name and ID, the number that convicts or crowns it, and the exact change.

Judgment floors and caveats

  • Floors are defaults. 1,000 impressions, 3 results, 10 results per week for direction, 10 results to scale. Raise them for big accounts; lowering them trades speed for more wrong calls.
  • Lag. Treat the last 2 to 3 days of conversions as incomplete (a422513).
  • Attribution shapes the numbers. Campaign Manager's default window is 90 days after a click and 90 days after a view (a426359), and the Conversions column includes view-through conversions, so report the post-click and view-through split. Under "Last touch - Each ad set", every ad set with an interaction gets credit (a426349); adding conversions across ad sets then overstates the total.
  • Some numbers are modeled. Some conversions may be modeled when they can't be tied to a member (a422513); reach and frequency are estimates (a426154).
  • Direction is a prompt to look. A week over week change shows what moved. Ask what was edited (or read list_ad_changes in Connected mode) before explaining it, and use ad-experiment-lift to test a cause.
  • Platform results aren't pipeline. LinkedIn counts leads and conversions; your CRM decides which turn into revenue. If lead quality is known, prefer it to platform cost per lead.
  • No industry benchmarks. The review compares inside the account. Published LinkedIn CTR and CPC averages vary by source, format and audience, and none was verified for this skill.

Output

LinkedIn Ads performance review: <account>, <window start> to <window end>
Data: <Export mode with file names | Connected mode with tools>; comparison <prior window>; currency <code>
Columns: <how ambiguous columns were mapped>
Results: Website conversions = <actions counted, or "not confirmed">; Lead generation = leads; Website visits = landing page clicks

Verdict: <2 or 3 sentences: direction, the biggest problem, the biggest win, each with its number>

Scoreboard
| Metric | Last 28 days | Prior 28 | Change | Last 7 | Prior 7 | Change |
| Spend | ... |
| Impressions | ... |
| CTR | ... |
| CPC | ... |
| CPM | ... |
| <result> (<objective>) | ... |
| Cost per <result> (<objective>) | ... |

By campaign
| Campaign | Spend | Share | Impressions | CTR | CPC | CPM | Results |

By ad set
| Ad set (ID) | Objective, audience | Spend | Results | Cost per result | vs peer | Pacing | Frequency | Verdict |

Ads, top and bottom (others in the appendix)
| Ad (ID) | Ad set | Spend | Results | Cost per result | vs peer | Verdict |

Week over week (floors met in both weeks)
- <entity>: <metric> <last 7> vs <prior 7> (<change>)

Creative fatigue
| Ad (ID) | Weekly CTR, last 4 weeks | Best 2-week CTR | Below best |

Scale
- <ad set (ID)>: <evidence>; <budget change>
Pause
- <ad (ID)>: <evidence>; <where the budget goes>
Refresh
- <ad (ID)>: <evidence>
Watch
- <entity>: <why>; <what would settle it>

Actions, ranked by money at stake
1. <action> [<money at stake>]: <entity (ID)>, <evidence>, <exact change>
2. ...

Safety

  • Reads only: the exports the user provides, or Adwarp's read-only tools (performance_summary, get_performance, performance_trend, list_campaigns, list_ads, list_conversions, list_ad_changes).
  • Changes nothing. It never pauses, activates, edits or deletes an ad or ad set on its own.
  • If the user asks to act on a list, show the exact change first (entity name and ID, current status or budget, new value) and wait for an explicit yes. Through Adwarp, preview with dryRun: true first: update_ad with status: PAUSED pauses 1 ad and leaves its ad set running; update_campaign changes an ad set's budget. Never set anything to ACTIVE unless the user asks for exactly that.

Sources

All checked 2026-10-20. LinkedIn help pages show only a relative "last updated" date, so recheck them when Campaign Manager changes.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.