The Claude Ads health score is a deterministic 0 to 100 number from a production scoring engine: functionally what a Google Ads performance grader promises, but open source, never converted to a letter grade, and always published next to an evidence coverage figure that says how much of the account the audit could actually verify. Every finding behind the score carries its own confidence level, graded high, medium, low, or none. WordStream-style graders made this category familiar; Claude Ads does the same job in the open.
That is the short version. The rest of this post walks through each piece, because the details are where most scoring systems quietly cheat.
Four outputs, not one number
Every audit keeps four outputs separate:
- Health score: observed performance and implementation health, 0 to 100.
- Evidence coverage: the proportion of applicable control weight with known results.
- Regulatory exposure: an independent P0/P1 risk summary. It never pads or drags the score.
- Opportunities: optional, beta, premium, or ineligible capabilities. These stay unscored.
Collapsing these into one number is how audit tools mislead people. An account can be healthy on what was measured while most of it was unmeasurable, and a single blended number hides exactly that distinction.
How a single control becomes a score
Control states
Each control resolves to one of four states:
pass: the evidence satisfies the control.fail: the evidence does not satisfy the control.unknown: the control applies, but evidence is missing or inconclusive.not_applicable: the control does not apply to this account or campaign.
The denominators matter. not_applicable is removed from both the health and coverage denominators, so an account is never penalized for features that do not apply to it. unknown is removed from the health calculation but stays in the coverage denominator. Missing evidence lowers coverage, not health.
Severity weights
Severity reflects the impact if the control fails, and it is deliberately not inflated because a feature is new or strategically interesting.
| Severity | Weight | Meaning |
|---|---|---|
| Critical | 5 | Immediate material revenue, data, account, privacy, or policy risk |
| High | 3 | Material performance or operational risk |
| Medium | 1 | Meaningful improvement with lower urgency |
| Informational | 0 | Context or unscored opportunity |
One more rule keeps the weights honest: one canonical risk is one scored control. A root tracking failure and its five downstream symptoms are modeled as a single control with multiple observations, not six separate penalties.
Category-first math
Scoring runs category first. For each category, using known applicable controls only:
category_health = 100 * sum(pass_weight) / sum(known_control_weight)
A failed control earns zero. Platform health then applies normalized category weights:
platform_health = sum(category_health * category_weight)
Category weights come from a versioned scoring profile that must total exactly 100, and the engine validates that invariant. As a reference example, the Google profile weights measurement 25, waste 20, structure 15, keywords 15, creative 15, and settings 10. If a category has no applicable controls for a given account, it is removed and the remaining weights are renormalized for that run. A disabled or unapproved platform profile produces no health score at all, rather than a guessed one.
You trigger all of this with one command:
/ads audit
Scope it to specific platforms when you do not need the full stack. The /ads audit command page covers inputs, outputs, and the workflow in detail.
Finding confidence is separate from the score
Every finding carries its own confidence level: high, medium, low, or none. This is distinct from severity and distinct from the score. A critical-severity finding can still be low confidence if the evidence behind it is thin.
Confidence is also separate from source classification. Claims are classified as evidence based, practitioner, contested, or folklore, and contradictions between sources are surfaced instead of averaged away. When you read a Claude Ads report, you can see not just what was found but how sure the system is and what kind of evidence backs it.
Evidence coverage: graded, provisional, insufficient
Coverage answers a different question than health: how much of the applicable control weight produced a known result?
category_coverage = 100 * sum(known_control_weight) / sum(applicable_control_weight)
The reporting rule is graded, not binary:
| Coverage | Status | Reporting rule |
|---|---|---|
| 80-100% | Graded | Publish health with coverage |
| 60-79% | Provisional | Publish health, labeled provisional |
| Below 60% | Insufficient evidence | Do not present health as an account grade |
One safeguard sits on top of the bands: unknown critical controls appear in the priority output even when total coverage stays above 80%. High coverage never hides a critical blind spot.
Why health and coverage never merge
Consider two accounts that both score 85. The first was audited with 95% coverage: the score is well grounded. The second had 62% coverage: the score is real for what was seen, but more than a third of the applicable control weight returned unknown.
If unknowns counted as failures, the second account would score artificially low and the number would punish missing exports rather than actual problems. If unknowns counted as passes, the score would inflate. Keeping health and coverage separate is the only treatment that stays honest in both directions: health describes what was observed, coverage describes how much was observed.
Spend weighting across the portfolio
When an audit spans multiple platforms, portfolio health weights each platform by its spend share in the same time window:
portfolio_health = sum(platform_health * platform_spend_share)
If spend data is unavailable, platforms are equal weighted and the result is marked provisional. A platform with insufficient evidence is excluded from the numerical aggregate entirely, with its missing weight surfaced explicitly. The same applies when a platform's authentication or worker fails: the run continues for the other platforms, the failed platform gets no health score, its weight is excluded rather than zeroed, and the whole bundle is labeled partial instead of complete.
How this differs from a Google Ads performance grader
A conventional Google Ads performance grader returns a single score plus a list of recommendations. Claude Ads never publishes a letter grade, and it never publishes a score alone. An unqualified score implies a stable, universal standard, and it strips out the two qualifiers that make the number meaningful: coverage status and data window. A 92 computed from 55% coverage over an unstated date range is not information, it is decoration. Every score in a Claude Ads report is paired with its coverage status and its data window instead.
There is also no black box. The formulas in this post are the production formulas: the versioned scoring profile, the severity weights, and the invariants the engine validates all ship in the open source plugin, so anyone can read exactly how evidence becomes a number.
The same restraint applies downstream. Scores prioritize investigation; they do not authorize changes. Every recommendation must cite its finding, declare confidence, and account for sample size and conversion lag, and any account write still has to pass the mutation gate with explicit approval. The scoring engine is one part of a broader read-only-by-default design, which the features overview covers end to end.
Try it
The scoring engine ships inside the Claude Ads plugin, free and open source. Install it from the marketplace:
/plugin marketplace add AgriciDaniel/claude-ads
/plugin install claude-ads@ai-marketing-hub-claude-ads
Then run /ads audit against your own accounts and compare the health score, coverage status, and priority list with what you already believe about the account. Full install options, including manual paths, are on the install page.