agentleFS
thescottkingthescottking/b2b-pmm-skills/skills/linkedin-ads-audit/SKILL.md

linkedin-ads-audit

Skill0 starsChanged 26 days agoMITView on GitHub

A 35-point LinkedIn Ads audit scored against your own buyer definition, with a written pass criterion for every one of the 35 points. Reports an ICP Fit Profile: the share of paid social spend reaching the right seniority, the right function, and the right company size, each measured on its own because standard platform reporting cannot show the three together. Use when someone asks to "audit our LinkedIn ads," "review our LinkedIn campaigns," "check our paid social performance," "see how much of our LinkedIn spend is hitting the right buyers," "review our LinkedIn retargeting," "score our LinkedIn account," or "why is our LinkedIn CPA so high." Also triggers when someone uploads Campaign Manager exports or demographic breakdowns, or asks to pull paid social data from a reporting connector.

3 other projects use a version of this.

Adopted by

Most recently taken up by

The file

Show its rules and text

We split this skill into the rules it gives an agent

29 rules. 0 are common, 23 are distinctive, and 6 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 23

    Distinctive

    This author's own choices. Worth a look.

  • 6

    Very specific

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

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Read these first. They are the source of truth and this skill does not invent around them.

    line 20
  2. Very specific:

    If brand-kit/icp.md is missing or still has its template placeholders, stop.

    line 28
  3. Distinctive:

    Before a budget increase, so the increase does not scale a leak

    line 52
  4. Distinctive:

    When CPA is climbing and the demographic mix is the suspected cause

    line 53
  5. Very specific:

    Run this after company-recon, competitive-white-space, and google-ads-audit when you can.

    line 59
  6. Distinctive:

    If that note is empty, say so in the audit and recommend naming someone, because the format cannot run without a person behind it.

    line 74
  7. Very specific:

    Design audiences to the budget you have: Read Monthly paid budget in Channel Economics.

    line 76
  8. Distinctive:

    If the session has a connector or data integration that reads LinkedIn Ads, pull live.

    line 101
  9. Distinctive:

    Do not assume the third outcome without asking.

    line 180
  10. Distinctive:

    Ask for tag status, the CRM connection detail, and one traced record.

    line 275
  11. Distinctive:

    Ask for a creative export or screenshots.

    line 324
  12. Distinctive:

    Report the coverage with the score, every time: Write it as "account health 68 out of 100, from 24 of 35 points assessable" and list the 11 …

    line 377
  13. Very specific:

    Read the Palette, Typography, and Document Footer sections of brand-kit/brand.md.

    line 401
  14. Distinctive:

    Never hardcode a color or a typeface.

    line 402
  15. Distinctive:

    Run it three times:

    line 450
  16. Distinctive:

    Follow each table with a callout naming the one finding that matters for that dimension, including the dollar amount at stake.

    line 542
  17. Distinctive:

    Follow the box with the not-assessable list itself, as a short table:

    line 563
  18. Distinctive:

    Before building this table, ask the user one question: do you have a benchmark source you want this measured against, and can you give me …

    line 579
  19. Very specific:

    Follow brand-kit/voice.md in full.

    line 678
  20. Distinctive:

    No hedging on findings. State it or cut it.

    line 684
  21. Distinctive:

    Never invent a number: Every figure traces to the account data or to the brand kit.

    line 686
  22. Distinctive:

    Never supply a benchmark from memory: No CTR, CPM, CPC, CPA, conversion rate, or engagement rate presented as an industry, platform, or …

    line 688
  23. Distinctive:

    Never present the three fit dimensions as one combined figure, in any section, in any sentence, including the executive summary and the …

    line 693
  24. Very specific:

    If brand-visuals is installed, offer to turn the markdown into a branded PDF instead.

    line 709
  25. Distinctive:

    After generating the document, write three or four sentences in chat: the three fit dimensions as three numbers, the one leaking the most …

    line 714
  26. Distinctive:

    Do not reproduce the document in the chat.

    line 717
  27. Distinctive:

    If demographic data is missing, run the audit without Sections 1 and 2 and say why they are absent.

    line 718
  28. Distinctive:

    If the demographic export carried impressions and no spend, say so in chat as well as in the document.

    line 720
  29. Distinctive:

    If the account is small or newly launched, compress.

    line 723

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “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 Audit

Before you write anything

Read these first. They are the source of truth and this skill does not invent around them.

  1. brand-kit/brand.md: name, palette, fonts, CTAs
  2. brand-kit/icp.md: the fit matrix, search terms, competitors, economics
  3. brand-kit/positioning.md: the frame, pillars, traps, stats, vocabulary
  4. brand-kit/voice.md: house style and banned constructions

If brand-kit/icp.md is missing or still has its template placeholders, stop. These audits score spend against your buyer definition and produce meaningless verdicts without one. Tell the user to run brand-kit-setup.

What this produces

A formatted Word document that audits the campaign system rather than the metrics. Is the funnel built correctly? Are the right audiences in the right campaigns? Is creative doing a different job at each stage? Is budget flowing toward signal? And the demographic question: how much of the spend reached the right seniority, how much reached the right function, and how much reached the right company size?

Those last three are the headline, and they stay three numbers. Read The ICP Fit Profile below before you compute anything, because the tempting move here is to average them into one number and call it the share of spend that reached the right buyer. That number would be wrong, and it is the single easiest way to hand an executive a figure you cannot defend.

The scoring runs against The Fit Matrix in brand-kit/icp.md. Change that file and the verdicts change with it. That is the design.

When to use

  • Quarterly review of a paid social account
  • Before a budget increase, so the increase does not scale a leak
  • When CPA is climbing and the demographic mix is the suspected cause
  • Someone uploads Campaign Manager exports or demographic breakdown reports
  • Someone wants to pull the account live through a reporting connector

Optional context that improves the audit

Run this after company-recon, competitive-white-space, and google-ads-audit when you can. Each adds a layer: recon supplies the market read, white space tells you whether the ad creative is claiming what everyone else claims, and the Google audit supplies the demand gap that paid social is supposed to fill.

None of them are required. Where a section below depends on one, it says so and tells you to skip it if the prior work has not run.

Guiding philosophy

  • Paid social amplifies what already works. Position it to extend existing content, thought leadership, and channels. A net-new siloed experiment starves before it learns.
  • Warm before cold. Thought leader ads, running from the personal accounts named in the thought leadership note in Channel Economics, are the strongest cold format for a founder-led or expert-led brand. They belong in month one, not deferred to a later phase. If that note is empty, say so in the audit and recommend naming someone, because the format cannot run without a person behind it.
  • Design audiences to the budget you have. Read Monthly paid budget in Channel Economics. At a modest budget, a small number of tight, high-intent segments beats broad coverage across every plausible function. Spreading thin means nothing ever exits the learning phase.
  • Retarget on signal, not on assumption. Build retargeting from observed behavior: Insight Tag traffic, video completion, document opens, page-level visits, CRM lists. Not from a guess about who saw something.
  • Frequency is a strategic lever, in three tiers. A 90-day retarget at moderate frequency. A 180-day nurture at low frequency. A 30-day high-intent push at high frequency. Match the creative count to the projected frequency in each tier, or the tier fatigues.
  • Even distribution for retargeting. Set retargeting campaigns to rotate ads evenly rather than optimize for performance. Optimization pushes two or three ads at everyone in a small audience and burns them within weeks.
  • Right-rail placements buy cheap frequency. Text, spotlight, and follower ads accumulate many more impressions per user than in-feed formats at a lower cost per thousand. Use them to raise frequency without inflating in-feed CPMs, and take the actual ratio from this account's own CPM by format rather than from a remembered figure.
  • Think in small segments, not a vast ocean. The platform is a set of small, manageable audiences. Be the most visible expert inside the two or three functions named in the ICP column of The Fit Matrix, then expand deliberately.

Data input

Option 1: A reporting connector

If the session has a connector or data integration that reads LinkedIn Ads, pull live. Ask which one is available rather than assuming. The field names below are LinkedIn's own reporting vocabulary and hold regardless of which tool fronts them.

Pull 1: Campaign performance

fields: ["campaign", "campaign_group_name", "campaign_status", "campaign_type",
         "objective_type", "spend", "clicks", "impressions", "conversions", "ctr", "cpc",
         "cpm", "engagement_rate", "landing_page_clicks", "approximate_unique_impressions"]
date_range: last 3 months

Pull 2: Seniority demographics

fields: ["member_seniority", "spend", "clicks", "impressions"]
filter: spend > 0
date_range: last 3 months

Pull 3: Company size demographics

fields: ["member_company_size", "spend", "clicks", "impressions"]
filter: spend > 0
date_range: last 3 months

Pull 4: Job function demographics

fields: ["member_job_function", "spend", "clicks", "impressions"]
filter: spend > 200
date_range: last 3 months

Pull 5: Industry demographics

fields: ["member_industry", "spend", "clicks", "impressions"]
filter: spend > 500
date_range: last 3 months

Pull 6: Monthly trends

fields: ["campaign_group_name", "month", "spend", "clicks", "impressions", "conversions"]
date_range: last 6 months

The spend filters on pulls 4 and 5 exist to cut the long tail of rows with a few dollars in them. Lower them for a small account, or the demographic tables come back nearly empty.

Pull 7: the joint breakdown check, run this before Section 2

Pulls 2, 3, and 4 each return one demographic dimension on its own. Ask the connector for one request that crosses two or more member demographics at once, for example:

fields: ["member_seniority", "member_job_function", "member_company_size", "spend"]
date_range: last 3 months

Three outcomes, and which one you got changes what Section 2 is allowed to say:

  • The request returns spend against combinations of seniority and function and size. You have a genuine joint breakdown. Compute the real joint figure described under The ICP Fit Profile, name it the ICP Fit Score, and say in the document which pull produced it.
  • The request returns spend against two dimensions but not three. Compute the joint figure for the pair you have, name exactly which pair it covers, and treat the third dimension as a separate marginal.
  • The request is rejected, or it silently returns single-dimension rows. This is the normal case: member demographic reporting is built to pivot on one attribute at a time, so the crossed figure does not exist to be pulled. Report the profile, not a composite. Say in the document that a joint figure was checked for and is not available from the platform.

Do not assume the third outcome without asking. Do not simulate a joint breakdown by multiplying the three marginals together, which assumes the dimensions are independent and they are not.

Option 2: CSV export or pasted data

Accept the files or pasted numbers, and map them onto the data sets above before analyzing.

Check the demographic export for a spend column before you plan on one. Campaign Manager's demographics view is built around impressions and clicks, and the export most users take from it carries reach and engagement columns against each member attribute without attributing cost to those rows. Open the file and look. Do not assume the columns in Pulls 2 through 4 are there because the connector vocabulary names them.

  • Spend is present against every demographic row. Proceed exactly as with a connector. The fit numbers are spend-weighted.
  • Spend is absent, impressions are present. The spend-weighted method cannot be computed from this file at all. Fall back to impression-weighted shares: replace spend with impressions in every fit calculation, label every resulting figure "impression-weighted" in the table header and in the tile subtitle, and carry this note in the document verbatim in substance: impressions are a weaker proxy than spend. Cost per thousand varies by seniority, by function, and by company size, so a segment can hold a large share of impressions on a small share of budget and the reverse. These figures show who saw the ads, not where the money went. Never present an impression-weighted figure next to a spend-weighted one from another period without saying which is which.
  • Neither is present, or the breakdowns are missing entirely. The fit profile cannot be computed. Say that rather than estimating it, and offer to run the rest of the audit without Sections 1 and 2.

The same three-way check applies to the joint breakdown. A demographics export crosses no dimensions, so on the CSV path the answer to Pull 7 is settled before you ask: report the profile, and say the joint figure is not derivable from this export.

Reading the fit matrix

The Fit Matrix in brand-kit/icp.md is a three-by-four grid: ICP, Mixed, and Non-ICP across seniority, company size, job function, and industry. It is the only input that decides whether a dollar was well spent on the dimension being read. Read one column of it at a time. The grid does not tell you which dollars sat in the ICP column of two dimensions at once, and neither does the platform.

  • ICP is who the company wants. Spend here counts fully toward that dimension's fit figure.
  • Mixed is worth reaching but not worth optimizing for: influencers on the deal, adjacent functions, companies at the edge of the size band. Half credit.
  • Non-ICP is waste. Zero credit, and it goes in the audience waste figure.

The matrix values have to match the ad platform's own taxonomy, or the matching silently fails and every score is wrong. Use LinkedIn's seniority labels, its job function list, its company size brackets, and its industry taxonomy verbatim. If The Fit Matrix contains plain-English descriptions rather than platform values, translate them once at the start of the audit, show the user the translation you used, and note in the document that the mapping was inferred.

Where a value returned by the platform appears in none of the three columns, treat it as Mixed and list it in a short "unclassified" note under the relevant table. Do not quietly score it as ICP.

The 35-point audit framework

Six categories, 35 points. Every point carries a pass condition, a fail condition, the evidence to cite in the report, and a weight. Score each point Pass, Partial, Fail, or Not assessable, then aggregate with the arithmetic in Scoring the 35 points.

Not assessable is a real verdict and you will use it often. The six pulls above are reporting data. Several points below need account configuration, ad-level URLs, or CRM records that reporting does not carry. When the evidence is not in front of you, mark the point Not assessable, name the one input that would make it assessable, and drop it out of the arithmetic. Never score a point as a fail because you could not see it, and never score it as a pass because nothing looked wrong.

Three rules before the tables.

  • Weight is 1 unless the table says 2. Five points carry weight 2, because a failure there makes the points downstream of it unreliable rather than merely worse.
  • Partial scores half the weight, and is available only on points whose pass condition has more than one named part. Where the pass condition is a single test, the point is Pass or Fail.
  • Every numeric cutoff in these tables is this instrument's own structural threshold, not market data. No published benchmark is used anywhere in the scorecard, and none may be introduced. Where a comparison is needed, compare the account against its own distribution across the window.

Signal Integrity (points 1 to 6)

#PointWPassFailEvidence to cite
1Insight Tag installation and health2The tag is present on the site and shows a signal received inside the last 7 days, on the pages that feed retargeting and conversionsTag absent, tag status inactive, or no signal in the last 30 days while campaigns were spendingTag status and the date of the last signal received
2Conversion event setup and hierarchy2At least one conversion action is defined, one is designated primary, and Pull 1 shows conversions greater than zero on at least one spending campaignSpend across the window with zero recorded conversions everywhere, or every event treated as equally primary so no hierarchy existsConversions by campaign from Pull 1, plus the conversion action list if supplied
3CRM integration and offline conversion sync1A CRM connection exists and has imported offline conversions inside the last 30 daysNo connection, or a connection that has imported nothing in the windowThe connection name and its most recent import date
4UTM parameter discipline1Every active campaign's destination URL carries source, medium, and campaign, with consistent casing and values, and the campaign value is parseable back to the campaignAny active campaign missing a parameter, or two spellings of the same source or medium in the accountCount of active campaigns fully tagged out of the total, plus two offending URLs quoted
5Attribution model clarity and expectations1The attribution model and conversion window in force are stated, and every conversion figure in the audit is labeled with themConversion counts reported with no window named, or platform counts set against CRM counts without naming the difference in methodThe model and window, written out once in the document
6Revenue path traceability1At least one pipeline or closed record in the window traces back to a named campaign through the CRMSpend runs with no record anywhere that traces to a campaignThe count of traceable records, or the exact link in the chain that is broken

Not assessable when: points 1, 3, and 6 cannot be judged from the six reporting pulls. Ask for tag status, the CRM connection detail, and one traced record. Point 4 needs the ad-level destination URL export. Point 5 becomes assessable the moment the user states the window, so ask before marking it.

Architecture and Learning (points 7 to 14)

#PointWPassFailEvidence to cite
7Campaign group logic and funnel stage separation2Every spending campaign sits in a group whose name identifies one funnel stage, and no group mixes cold prospecting with retargetingAny group holds both cold and retargeting campaigns, or ungrouped campaigns hold more than 10% of spendSpend by group from Pull 1, and the name of the mixed group
8Objective selection per funnel stage1Each campaign's objective matches its stage: reach, engagement, or video views on cold, website conversions or lead generation at the bottomA bottom-funnel campaign running an engagement objective, or a cold campaign running lead generation with no prior touch in the accountCampaign, objective, inferred stage, spend
9Campaign naming convention clarity1One convention is in force and at least 90% of spending campaigns parse under it into stage, audience, and formatBelow 90% conforming, or two conventions running in parallelThe convention you inferred, the conforming percentage, and two offenders
10A/B test structure and isolation1Where a test is running, exactly one variable differs between the paired campaigns or ads, and both sides carry enough spend for the difference to be readableVariants differing in more than one variable at once, or a test split across two different audiencesThe pair, the variable under test, and spend on each side
11Budget allocation by funnel stage1The split of spend across stages is deliberate and stated, and retargeting carries spend wherever a retargeting audience existsRetargeting audiences exist and carry zero spend, or one stage holds nearly all budget with no stated reasonPercent of spend by group, from Pull 1
12Bid strategy appropriateness by objective1Bid strategy matches objective, and no campaign is capped below the CPM it actually achievesAutomated bidding on a campaign too small to feed it, or a manual cap under the achieved CPM with delivery collapsing as a resultCampaign, bid strategy, achieved CPM, impressions
13Learning phase stability1Campaigns under evaluation have run without a budget or targeting edit long enough that their week to week CPM and CPA sit inside the account's own trailing varianceEdits inside the last 14 days on a campaign you are about to judge, or swings wider than the account's own variance that edit history explainsTrailing weekly or monthly figures from Pull 6, plus change history if supplied
14Campaign consolidation versus fragmentation1Every active campaign holds a meaningful share of the budget in Monthly paid budget under Channel Economics, meaning fewer than a third of active campaigns sit under 5% of spend eachA third or more of active campaigns each hold under 5% of spend, so nothing accumulates enough delivery to stabilizeCount of campaigns under the 5% line and their combined spend

Not assessable when: point 10 if no test is identifiable and the user confirms none is running, which is not a failure. Point 12 if the export carries no bid strategy field. Point 13 if change history is unavailable and the trend data covers fewer than three periods.

Audience Coverage (points 15 to 20)

#PointWPassFailEvidence to cite
15Cold audience definition and alignment to The Fit Matrix2Every targeting facet on every cold campaign maps to a value in the ICP or Mixed column of The Fit MatrixAny facet maps to a Non-ICP value, or a cold campaign runs with no seniority and no company size constraint at allCampaign, the facets in use, and the matrix column each one maps to
16Retargeting audience construction1At least one retargeting audience built from observed behavior, site visit, video view, document open, or a CRM list, is live and spendingNo retargeting audiences, or retargeting built only from attribute targeting rather than behaviorAudience names, how each is defined, and spend against each
17Retargeting segmentation by recency1Retargeting is split into at least two recency bands from 30, 90, and 180 days, and the shorter band carries the higher frequency or bidOne undifferentiated retargeting audience covering the whole windowAudience names, their windows, and spend by band
18Warm audience signal quality1Each warm audience is defined by an action that carries intent: a pricing or demo page, a video watched to three quarters, a document openedAudiences built from all site traffic or any page view, which reaches bounced visitors at the same weight as buyersThe rule behind each warm audience, written out
19Lookalike usage appropriateness1Lookalikes are either absent, or seeded from a converter list and funded below the matrix-defined cold targetingLookalike campaigns carry more cold spend than matrix-defined targeting, or the seed list includes profiles in the Non-ICP columnLookalike share of cold spend, and the seed list used
20Audience overlap and frequency collision risk1No two live campaigns at the same stage target the same audience without an exclusion appliedOverlapping audiences with no exclusions, showing up as frequency above the tier's intent when you divide impressions by approximate unique impressionsComputed frequency per campaign from Pull 1, and the exclusion settings

Not assessable when: points 16 through 19 need the audience definitions, which the performance pulls do not carry. Ask for the matched audiences list. Point 20 needs approximate unique impressions in Pull 1; without it, frequency cannot be computed and the point drops out.

Creative System (points 21 to 26)

#PointWPassFailEvidence to cite
21Message-market alignment by funnel stage1Each stage's ads carry that stage's job: naming the problem cold, proving it in the middle, asking for the action at the bottomA demo ask in a cold campaign with no prior touch, or a pure awareness message in a bottom-funnel campaignOne headline quoted per stage
22Creative format mix1At least two formats live per stage, and at least one non-in-feed format where the tier needs frequencyEvery campaign on a single format, or the mid tier carrying no video and no documentSpend and engagement rate by format
23Proof density against claim density1Every quantified claim in a live ad traces to Headline Stats or External Validation Quotes in brand-kit/positioning.mdAny claim with no traceable source, or a stage where every ad claims and none provesThe claim quoted, and the source it traces to or the fact that none exists
24Differentiation clarity against category noise1The primary cold message would not survive being run unchanged by a company in the Competitors table, and it does not sell the promise named in Named TrapsThe message reads as the category default, or repeats a named trap as its own promiseThe line quoted, against Named Traps and The Pillars, and against the white space analysis only if that skill has run
25CTA appropriateness by audience temperature1Cold ads use a low-commitment CTA from Calls to Action, bottom-funnel ads use the high-commitment onesA high-commitment CTA on a cold audience, or a low-commitment CTA on a high-intent retargeting pushThe CTA used at each stage
26Creative fatigue risk and refresh cadence1No live ad shows CTR falling across consecutive periods while its frequency rises, and each tier holds enough distinct creatives for its projected frequencyA named ad whose CTR declined across consecutive periods as frequency climbed, or a high-frequency tier running on a handful of creativesThe ad, its CTR by period, its frequency, and the period the decline started

Not assessable when: points 21 through 25 need the ad copy, which no pull above returns. Ask for a creative export or screenshots. Point 26 needs ad-level performance by period. With campaign-level data only, say the fatigue analysis could not run and do not infer it from a campaign-level CTR drift, which has other causes.

Delivery and Spend Control (points 27 to 31)

#PointWPassFailEvidence to cite
27CPM levels by campaign type and audience1Each campaign's CPM sits inside the spread of the account's own campaigns of that type, or the gap is explained by audience size or formatAn outlier CPM against the account's own median for that type with no explanation offeredCPM by campaign against the account's median for the type. Never against an external benchmark unless the user supplied one
28Frequency control and saturation thresholds1Computed frequency sits inside the band the user names for that tier: moderate on a 90-day retarget, low on a 180-day nurture, high on a 30-day pushCold prospecting running at retargeting frequency, or a high-intent push running at nurture frequencyImpressions divided by approximate unique impressions, per campaign, against the stated tier
29Ad scheduling and dayparting1Either dayparting is deliberately off, or it is on and the day and hour data supports the schedule in forceA schedule applied with no supporting data behind itThe schedule and the day or hour figures behind it
30Budget distribution across funnel stages1Monthly spend by group is stable or ramping on purpose, and campaigns deliver close to the budget set against themCampaigns persistently under-delivering their budgets, or a group's spend swinging month to month with no stated causeMonthly spend by group from Pull 6, against the budgets set
31Spend efficiency against learning stability1As spend scales, CPA and CPM stay inside the account's own trailing varianceSpend up and CPA up in the same period with no named causeThe month by month figures from Pull 6

Not assessable when: point 28 if the user has not stated an intended frequency for each tier, which is a question to ask rather than an assumption to make. Point 29 if no day or hour breakdown is available, which is the common case. Point 30 if campaign budgets were not exported alongside spend.

Funnel and Revenue Alignment (points 32 to 35)

#PointWPassFailEvidence to cite
32Funnel handoff logic1Each campaign's destination matches its stage, and the page is live and consistent with the ad's promiseEvery campaign pointing at the homepage, or a bottom-funnel ad landing on a blog postThe destination per campaign, against its stage
33Retargeting depth and sequencing logic1Creative differs across recency bands and advances the argument rather than repeating itThe same creative running across every bandThe creative in each band
34Assisted conversion visibility and expectations1The document states which conversion counts are platform-reported last touch, and gives an assisted or multi-touch view where CRM data allows oneLast-touch counts presented as the full contribution of the channelBoth figures, or the plain statement that the second one is unavailable and why
35Whether the math from spend to pipeline works2The chain from spend to conversions to pipeline closes using Average deal size and Acceptable CPA band in Channel Economics, with every input named and sourced, and blended CPA sits inside the bandBlended CPA above CPA red line, or the chain cannot be built because the recorded conversions are not the qualified leads those figures describeThe arithmetic written out in full, each input labeled with where it came from

Not assessable when: point 32 needs destination URLs. Point 33 needs creative by audience. Point 35 is not assessable when the account counts MQLs and no conversion to qualified lead rate has been supplied. Say so plainly rather than inventing a rate, because this point is the one an executive will check.

Scoring the 35 points

Pass           = full weight
Partial        = half weight, only where the pass condition has more than one named part
Fail           = zero
Not assessable = excluded from both the earned total and the available total

Category score, and account health, both run on the same arithmetic:

category_score = earned weight in the category / assessable weight in the category x 100
account_health = total earned weight / total assessable weight x 100

Weighted, not averaged across categories. A category where four of six points were not assessable carries less influence than one scored in full, which is the correct behavior: the score should follow the evidence.

Report the coverage with the score, every time. Write it as "account health 68 out of 100, from 24 of 35 points assessable" and list the 11 that were not, with the input that would make each one assessable. A score reported without its coverage is a claim about the whole account built from part of it.

Below 20 of 35 assessable, do not report a number at all. Report the band, the points that failed, and what to send so the rest can be scored. A composite built on a minority of the instrument is not a measurement.

Bands, and the band is what travels:

  • 85 to 100, Healthy. Structural work is sound. Fix what failed and move on.
  • 65 to 84, Needs work. Something structural is wrong and it is costing money now.
  • Below 65, Critical. The account is not built to the strategy. Rebuild before scaling.

Two auditors working this instrument on the same account can differ by ten points or more, mostly on the points that need judgment about intent: 21, 24, and 27. Report the band and the specific failed points, which are the actionable part. Never present the number as a precise measurement to a third party.

Document structure

Document design

Read the Palette, Typography, and Document Footer sections of brand-kit/brand.md. Never hardcode a color or a typeface.

ElementReads from
All textBody under Typography
Title, 24pt boldPrimary
Section headers (H1), 16pt boldPrimary
Subsection headers (H2), 13pt boldBody text
Body text, 11pt, 1.15 line spacingBody text
Table header row fillBackground soft
Table bordersRule / border
Captions and table notesMuted text
ICP match / win fillPositive tint, from the semantic report colors
Mixed / caution fillCaution tint
Non-ICP / problem fillProblem tint
Neutral highlight boxBackground soft
Footer, right-alignedDocument Footer, in Muted text

Page size US Letter, one-inch margins. If Palette still has blank placeholders, stop and tell the user to fill it in.

Section 1: Executive dashboard

Page one. A two-by-three grid of KPI tiles built as a table with colored cell backgrounds. Each tile: metric value at 20pt bold, label at 9pt bold, subtitle at 8pt italic.

TileMetricColor logic
1Total spendNeutral
2ConversionsNeutral
3Blended CPAAgainst Acceptable CPA band and CPA red line in Channel Economics: inside the band is positive, above the band is caution, above the red line is problem
4ICP fit profile, three figures in one tile: seniority, function, company sizeColor on the lowest of the three: positive at or above 70, caution from 50 to 69, problem below 50. The subtitle names the weakest dimension
5Audience wasteProblem, as the dollar amount of spend on Non-ICP profiles. Report it per dimension, because a dollar can be Non-ICP on seniority and ICP on company size, and summing across dimensions double counts it
6Account healthScore out of 100 with its coverage on the same line, for example "68 / 100, from 24 of 35 points", plus the one-word band from Scoring the 35 points

Below the tiles, three or four sentences of narrative.

The ICP Fit Profile

Three numbers, reported side by side and never averaged into one.

For each dimension, compute the share of spend that landed in the ICP column of The Fit Matrix, giving half credit to Mixed:

dimension_score = (ICP spend + 0.5 x Mixed spend) / total spend x 100

Run it three times:

  • Seniority fit: spend reaching the seniority values in the ICP column
  • Function fit: spend reaching the job functions in the ICP column
  • Company size fit: spend reaching the size brackets in the ICP column

Spend weighting inside a dimension is the whole point: a segment holding 40% of the budget moves that dimension four times as much as one holding 10%, and an unweighted average would let a tiny well-targeted segment mask a large leaking one. On the CSV path, where the export carries impressions and no spend, substitute impressions and label every figure impression-weighted.

Do not average the three. The platform returns each demographic as its own breakdown of the same spend. Each one is a marginal distribution: it tells you how the money split across seniority, and separately how it split across function, and separately how it split across company size. Nothing in those three tables says whether any given dollar cleared all three at once. An account can score high on all three and still have put almost nothing in front of a director in the right function at a company of the right size, because the seniority match and the function match can sit in different segments of the audience.

So the three numbers are the deliverable. Each one answers its own question honestly:

  • Seniority fit answers "how much of the money reached the right level."
  • Function fit answers "how much of the money reached the right department."
  • Company size fit answers "how much of the money reached companies of the right size."

None of them answers "how much of the money reached the right buyer," and the document must not say that any of them does.

If Pull 7 returned a genuine joint breakdown, none of this applies. Compute the share of spend that landed in the ICP column on all three dimensions at once, call it the ICP Fit Score, name the pull it came from, and report the three marginals underneath it as the dimension detail.

Optional composite, and only in this form. Where no joint breakdown exists, the joint figure is still bounded by the three marginals, and the bounds are worth reporting because they show how little the marginals pin down. Compute them on the strict ICP shares with no half credit, since the arithmetic is about overlapping sets of dollars and half credit is a scoring convention rather than a share of spend:

joint_upper = min(seniority_ICP_share, function_ICP_share, size_ICP_share)
joint_lower = max(0, seniority_ICP_share + function_ICP_share + size_ICP_share - 2)

Worked arithmetic, not data from any account: strict ICP shares of 80%, 70%, and 60% give an upper bound of 60% and a lower bound of 10%. The true joint figure is somewhere in that range and the marginals cannot narrow it further. Report the range as a range, label it "joint ICP reach, bounded range," and state that it is arithmetic on the three marginals rather than a measurement. If a reader wants one number from it, the honest answer is the upper bound, described as a ceiling the account cannot have exceeded.

Carry this sentence, or its substance, in the document under the tiles: these three figures are separate breakdowns of the same spend. A combined figure for spend that reached the right seniority and the right function and the right company size at once is not derivable from standard platform reporting, and none of these numbers should be read as one.

Industry is the fourth dimension in the matrix and it is reported in Section 2 but kept out of the score. Industry classification on the platform is noisy, self-reported, and often wrong at the account level, so folding it in adds variance without adding signal. Say this in a footnote under the score so nobody assumes it was overlooked.

Exclude thought leadership campaigns from the audience waste figure but not from the fit score. Their targeting still has to be right; only their CPA is exempt.

Present the score prominently. It is the single most quotable finding in the document.

Section 2: ICP fit profile breakdown

Four sub-tables, one per dimension of The Fit Matrix. Open the section by naming what these tables are: three independent breakdowns of the same spend, read one dimension at a time.

Seniority fit:

| Seniority | Spend | % of total | Fit | Verdict | Action |

Company size fit:

| Company size | Spend | % of total | Fit | Verdict | Action |

Job function fit:

| Function | Spend | % of total | Fit | Verdict | Action |

Industry distribution (reported, not scored):

| Industry | Spend | % of total | Fit | Note |

Color every row by its column in the matrix: Positive tint for ICP, Caution tint for Mixed, Problem tint for Non-ICP. The Fit column carries the word ICP, Mixed, or Non-ICP so the classification survives a black-and-white print.

Follow each table with a callout naming the one finding that matters for that dimension, including the dollar amount at stake. Keep the dollar amounts inside their own dimension. A sentence that adds seniority waste to function waste is counting the same dollars twice.

Close the section with the bounded joint range if you computed one, and with the plain statement that the platform does not report the three dimensions crossed. If Pull 7 did return a joint breakdown, say that instead and give the figure.

Section 3: The 35-point scorecard

| Category | Score | Assessment |

Six rows: Signal Integrity, Architecture and Learning, Audience Coverage, Creative System, Delivery and Spend, Funnel and Revenue. Assessment is one sentence, specific enough to act on.

Below the six rows, add the coverage line: how many of the 35 points were assessable, how many were not, and the one input that would unlock the largest group of them. Then a highlight box with account health out of 100 computed as Scoring the 35 points defines it, its band, and a one-line verdict. Where fewer than 20 points were assessable, the box carries the band and the failed points and no number, and says why.

Follow the box with the not-assessable list itself, as a short table:

| # | Point | What would make it assessable |

Section 4: Performance trends, six months

| Month | Spend | Clicks | Conv | CPA | Trend | Notes |

Directional words in the Trend column: Baseline, Improving, Declining, Stable, Best Month, Scaled Up. Notes carries the cause when one is visible. Two or three sentences below on the trajectory.

Section 5: Spend efficiency

The benchmark column is conditional and it is never yours to fill.

Before building this table, ask the user one question: do you have a benchmark source you want this measured against, and can you give me the source name and its publication date?

  • They supply one. Include the benchmark column, use their figures unchanged, and put the source name and date in a footnote line under the table. If they give figures with no source or no date, ask for both. If they still cannot give both, treat it as no benchmark.
  • They do not. Omit the benchmark column entirely, drop the Verdict column with it, and write under the table: no external benchmark source was available, so these figures are reported against this account's own distribution across the window rather than against an outside reference. That sentence is not an apology. An account measured against itself over six months is a more defensible read than an account measured against a number nobody can source.

You may not supply a benchmark figure or a citation from your own knowledge. Not a CTR, not a CPM, not a CPC, not an engagement rate, not "typical B2B is around," and not a source name with a year attached. A remembered figure with a remembered citation is the exact failure this document promises it does not commit, and it fails in front of the one reader who will check.

Metric table, always:

| Metric | This account | Account median | Direction over the window |

Rows: in-feed image CTR, video CTR, in-feed CPC, in-feed CPM, right-rail CPM, text ad CPA, spotlight ad CPA, engagement rate. Where the user supplied benchmarks, add their column and a Verdict column beside it.

Conversion performance by campaign type:

| Campaign type | Spend | Conv | CPA | Role in the system |

Color efficient converters with the Positive tint and leave awareness and trust layers neutral, because a neutral cell is a claim that the campaign is doing a different job, not a worse one.

Add this note under the table, every time: thought leadership campaigns are not judged on CPA. Their job is trust and familiarity ahead of the search, and last-click attribution cannot see that work. Judging them on CPA reliably kills the campaigns that make everything downstream cheaper. Evaluate them on engagement rate, video completion, follower growth, and the branded search and direct traffic lift that follows them.

Section 6: Campaign architecture review

| Group | Spend | Clicks | Conv | CPA | Role |

Then two bullet lists: what is working, and what needs attention. In the second list, lead each bullet with the problem in bold, then the campaign it lives in, then the fix.

Section 7: Creative system and frequency

  • Format mix analysis with engagement rate by format
  • A messaging check against Named Traps and The Pillars in brand-kit/positioning.md. Are the ads claiming what every competitor in the Competitors table claims, or are they saying something only this company can say? Include the white space comparison only if competitive-white-space has run in this conversation.
  • Frequency assessment across the three tiers: prospecting, retargeting, high-intent push. Report actual frequency against the intended tier and name the gap.
  • Creative count against projected frequency. A tier running at high frequency on three creatives is already fatigued.
  • Fatigue risk callout, with the specific ads and the week they started declining.

Section 8: Quick wins with projected impact

| Action | Est. savings / qtr | Est. impact | Effort | Confidence |

Seven to ten actions, each specific enough to execute without a follow-up question. Anchor them to findings: exclude the company size brackets in the Non-ICP column from cold campaigns, switch retargeting to even rotation, add right-rail placements to raise frequency in the nurture tier, add a thought leader campaign under the person named in the thought leadership note, refresh the creative in whichever tier the fatigue analysis flagged.

Below the table, a Positive-tinted callout with the combined projection: savings range, additional conversions, and the estimated improvement to each fit dimension the actions touch, named dimension by dimension. Excluding a company size bracket moves company size fit and leaves seniority fit where it was.

Section 9: Cross-channel integration summary

Include this section only if a Google Ads audit has been run in the same conversation. Otherwise skip it and renumber. Do not invent search findings.

| Dimension | Google Ads | LinkedIn Ads |

Rows: primary role, biggest strength, biggest gap, retargeting, total waste, priority fix.

Below, a unified paragraph with the combined recoverable figure. The argument to make: search captures demand that exists and cannot qualify who is behind the click, while paid social qualifies the audience precisely and cannot capture demand at the moment of intent. Each one covers the other's structural blind spot. Where the Google audit found a demand gap, this is the channel that closes it.

Section 10: Key takeaways

Five to seven executive bullets: account health score with its coverage, the three fit dimensions and which one is leaking most, which campaign types quietly outperform, the six-month trajectory, the combined cross-channel impact if a Google audit ran, and the single most important next move.

Writing rules

Follow brand-kit/voice.md in full. Audit-specific additions:

  • Tie every demographic finding back to The Fit Matrix by name.
  • Tie every messaging finding back to The Pillars and Named Traps, without naming the frameworks in the document. Internal scaffolding stays internal.
  • Quantify everything. A leak described without a dollar amount does not get fixed.
  • No hedging on findings. State it or cut it.
  • Short paragraphs, two or three sentences. Tables for data.
  • Never invent a number. Every figure traces to the account data or to the brand kit. Label estimates as estimates in the same sentence.
  • Never supply a benchmark from memory. No CTR, CPM, CPC, CPA, conversion rate, or engagement rate presented as an industry, platform, or category norm may come from your own knowledge, and no citation may be attached to one. Benchmarks enter this document only when the user hands you the figure, the source, and the date. Otherwise the comparison is against this account's own history, and the document says so.
  • Never present the three fit dimensions as one combined figure, in any section, in any sentence, including the executive summary and the chat message.
  • Bold sparingly.

Word document output

Generate the document with the docx skill available in the session. Reference it by name and let the host resolve it. Follow its rules in full: US Letter page size, real bullet list formatting rather than typed characters, tables with both column widths and per-cell widths in DXA, cell margins of 80 top and bottom and 120 left and right, overridden Heading1 and Heading2 styles, no newline characters inside paragraphs. Validate the file after generating it.

If no docx skill is available in the session, output the full audit as clean markdown with every table preserved, and tell the user plainly that a Word document could not be generated and why. If brand-visuals is installed, offer to turn the markdown into a branded PDF instead. Nothing in the analysis changes; only the format does.

Output notes

  • After generating the document, write three or four sentences in chat: the three fit dimensions as three numbers, the one leaking the most spend, and the top recommendation. Then present the file. Do not compress the three into one figure in chat either.
  • Do not reproduce the document in the chat.
  • If demographic data is missing, run the audit without Sections 1 and 2 and say why they are absent. A fit figure computed from partial demographics is worse than no fit figure.
  • If the demographic export carried impressions and no spend, say so in chat as well as in the document. The user should know the headline figures changed weighting before they forward the file.
  • If the account is small or newly launched, compress. Ten sections forced out of a thin account reads as padding.

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.