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".
In this repository17 other files it gives its agents.
- AGENTS.mdAGENTS.md
- ad-budget-pacingSkill
- ad-experiment-liftSkill
- google-ads-account-auditSkill
- google-ads-search-campaign-builderSkill
- google-ads-search-termsSkill
- linkedin-abm-builderSkill
- linkedin-ad-library-teardownSkill
- linkedin-ads-auditSkill
- linkedin-ads-lead-driversSkill
- linkedin-ads-pause-rulesSkill
- linkedin-ads-spend-analysisSkill
- linkedin-audience-opsSkill
- linkedin-audience-sizingSkill
- linkedin-campaign-launchSkill
- paid-media-health-checkSkill
- paid-media-weekly-reportSkill
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
- Very specific: line 18
Check the account's setup (tracking, targeting, toggles, UTMs).
- Distinctive: line 108
Lag: Treat the last 2 to 3 days of conversions as incomplete ([a422513]).
- Distinctive: line 172
All checked 2026-10-20. LinkedIn help pages show only a relative "last updated" date, so recheck them when Campaign Manager changes.
≈ “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.
Files
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).
| File | Report type | Time breakdown | Time range | Used for |
| Ad performance | Ad performance | Daily | Last 56 days, ending on the last full day | Everything by ad, rolled up to ad set and campaign; weekly trends |
| Ad set performance | Ad set performance | All | Last 28 days | Objective, daily budget, reach and frequency |
| Conversions (recommended) | Conversion performance | All | Last 28 days | Which 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:
| Need | Adwarp MCP tool | adwarp CLI |
| Account rollup | performance_summary (startDate, endDate) | adwarp report summary -p last_30_days |
| KPIs by level | get_performance (level: campaign_group, campaign or creative; startDate, endDate) | adwarp report perf <level> -p last_30_days |
| Weekly trend for 1 entity | performance_trend (level, entityId, bucket: weekly) | adwarp report trend <level> <id> -b weekly -p last_90_days |
| Names, statuses, objectives, active ad sets with no delivery | list_campaigns | adwarp campaigns list |
| Ads in an ad set | list_ads | adwarp ad list <adSetId> |
| What a conversion counts | list_conversions | adwarp conversions list |
| Changes that might explain a move | list_ad_changes | adwarp 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
- 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).
Name the result for each ad set from its objective, and never add results across objectives.
Objective Result Cost per result Website conversions Conversions Cost per conversion Lead generation Leads Cost per lead Website visits Landing page clicks Cost per landing page click Engagement Clicks CPC Brand awareness Impressions and reach CPM Video views Views Cost 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.
- 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.
- 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.
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.
Verdict Rule Too early Under 1,000 impressions Below floor 1 or 2 results, or 0 results with spend under 2 times the peer cost per result No result 0 results, 1,000 impressions or more, and spend at least 2 times the peer cost per result Top 3 results or more and cost per result at most 0.8 times the peer cost per result Bottom 3 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) Middle Everything 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.
- 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.
- 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).
- 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.
- 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_changesin Connected mode) before explaining it, and usead-experiment-liftto 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: truefirst:update_adwithstatus: PAUSEDpauses 1 ad and leaves its ad set running;update_campaignchanges an ad set's budget. Never set anything toACTIVEunless 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.
- a441785 Export reports in Campaign Manager, https://www.linkedin.com/help/lms/answer/a441785/export-reports-in-campaign-manager
- a421283 Export LinkedIn conversion reports in Campaign Manager, https://www.linkedin.com/help/lms/answer/a421283
- a445476 Performance metrics in Campaign Manager, definitions, https://www.linkedin.com/help/lms/answer/a445476/
- a422513 LinkedIn conversion tracking reporting and metrics, https://www.linkedin.com/help/lms/answer/a422513
- a426154 Delivery metrics in Campaign Manager, https://www.linkedin.com/help/linkedin/answer/a426154
- a426359 LinkedIn conversion window, https://www.linkedin.com/help/lms/answer/a426359
- a426349 LinkedIn conversion attribution model, https://www.linkedin.com/help/lms/answer/a426349
- a423702 Ad variations with LinkedIn ad rotation, https://www.linkedin.com/help/lms/answer/a423702
- a420488 LinkedIn ad creatives best practices, https://www.linkedin.com/help/lms/answer/a420488/linkedin-ad-creatives-best-practices?lang=en
- a422101 Campaign and ad set budgets, https://www.linkedin.com/help/linkedin/answer/a422101
- a5968064 URL tracking parameters in Campaign Manager, https://www.linkedin.com/help/lms/answer/a5968064
- Social Media Today, "LinkedIn updates advertising campaign naming conventions" (published 2025-09-30), https://www.socialmediatoday.com/news/linkedin-updates-advertising-campaign-naming-conventions/761534
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
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.

