Skip to content
esc close · switch
LYRA/ Tools/ Diagnostic/ Campaign Health Analyzer
Diagnostic Rule-basedOn-demand

Your account, scored on demand.

Campaign Health Analyzer runs 17 rule-based diagnostic checks on any connected Google Ads account when you click Run. You get a 0–100 health score, findings grouped by severity, and the Lyra Agent's suggested action on every row — usually in under 30 seconds. Read-only — nothing in your account changes.

Rule-based, not ML · On-demand · ~30 seconds per run · Read-only access
What we read · input surface

One account, every check, every run.

Each run is scoped to one connected Google Ads account. The analyzer reads campaign, ad-group, keyword, and Quality Score data — no writes — and returns a structured report. These are the numbers behind one sample run.

Run · Sample · Basalt DTC · run #04 Completed Apr 25, 2026 · 06:15 UTC · ~30 second runtime
01 · Account 1 Per run One Google Ads account per run. Run separately on each account in your portfolio when you want a sweep.
02 · Campaigns 284 In scope Active campaigns + paused-within-window across Search, PMax, Shopping, Display.
03 · Checks 17 Diagnostic rules run Structure, spend, performance, Quality Score (7), conversion. Each check has named thresholds.
04 · Window 7 d Performance lookback Default 7-day window for spend, CTR, conversion rate, and CPA drift. Configurable per run.
The scorecard · generated artefact

Out: a health readout you can read in a minute.

Below is a sample readout from the run above. Overall health score, severity-banded findings count, and the top individual findings — each with the affected campaign, a one-line explanation, and the Lyra Agent's suggested action.

Health-report · basalt-dtc · #04 Apr 25, 2026 · 06:15 UTC 17 checks · 284 campaigns v.2.1.0 · rule-lib
Overall health
63 / 100
Needs attention ▲ +4 vs run #03 · 7 days ago
Findings by severity 47 open · of 284 campaigns
Critical 9
High 21
Medium 17
Healthy 237
# Check Scope What we found Suggested action Severity
01 Conversion tracking stalled no_conversions · conversion basalt-fr · 4 campaigns No conversions recorded for 9 days on Search · Brand · FR. Spend continued at €62/d. Verify tag fires on /checkout/success Critical
02 Budget exhausted before 10am budget_concentration · spend basalt-dtc · PMax · Autumn Daily budget of €540 consumed by 09:42 UTC on 6 of last 7 days. Lost impression share ≈ 41%. Raise budget ceiling or split campaign Critical
03 Quality Score critical · campaign average quality_score_critical · QS basalt-de · 2 campaigns Average QS dropped to 3.8 over 14d on two campaigns. CPA widened 34% in the same window. Audit ad relevance + landing-page experience Critical
04 CTR below benchmark · 14d low_ctr · performance basalt-uk · 14 ad groups Fourteen ad groups running with CTR below 1.2% over the 14d window. Combined spend = £1,340. Refresh ad copy and review keyword match types High
05 QS components below average · ad relevance qs_component_ad_relevance · QS basalt-es · 11 ad groups BELOW_AVERAGE ad relevance on 11 ad groups (>30% of QS-affected keywords). Drag on Quality Score. Tighten keyword-to-ad-headline alignment High
06 Bidding strategy mismatch bidding_automation · settings basalt-it · 3 campaigns Three campaigns on Manual CPC despite eligibility for Maximise Conversions and 6-month conv. history. Pilot Max Conversions on one campaign for 14d High
07 Campaign over-fragmentation over_fragmentation · structure basalt-dtc · 27 campaigns Twenty-seven Search campaigns averaging 1.4 ad groups each. Below the volume threshold for clean QS attribution. Consolidate to ~12 thematic campaigns Medium
08 Budget under-utilisation budget_underutilization · spend basalt-eu · 6 campaigns Six campaigns spending <50% of daily budget for 7 consecutive days. Headroom to expand targeting or raise bids. Review bid strategy or targeting scope Medium
09 QS spread · low-QS keyword share quality_score_spread · QS basalt-dtc · 19 campaigns >40% of keywords sit at QS ≤ 5 across 19 campaigns. Long-tail drag on overall account QS. Run QS-keyword report; pause/restructure low-QS terms Medium
9 of 47 findings shown · ranked by severity × spend impact Stored in ai_tool_executions · queryable per account
Methodology · how the checks work

Each check is a rule , not an opinion.

The check library is rule-based, not ML. Each finding has a predicate you can read, hardcoded thresholds, and a deterministic outcome — same inputs, same findings, same severity. The Lyra Agent only enters at the suggested-action layer; it never decides whether something is a finding.

01 · Structure4 checks

Campaign shape and organisation.

Campaign diversity, over-fragmentation, missing campaign types (Shopping/Search). The kind of thing a senior audit would flag on day one.

Critical Missing Search on conv-tracked account
High Over-fragmentation: <2 AGs/campaign
Medium Low diversity: 1 campaign type only
02 · Spend2 checks

Where the money is going and why.

Budget concentration (single campaign hogging >80% of daily spend) and budget under-utilisation (<50% used over 7d). Both flagged with absolute euro impact, not just percentage.

High Concentration > 80%
Medium Utilisation < 50% over 7d
03 · Performance2 checks

Are clicks landing and converting?

Low CTR (below threshold over the lookback window) and CTR-improvement opportunities (mid-band CTR with capacity headroom). Severity scales with spend exposure.

High CTR below sector floor
Medium Improve-CTR opportunity
04 · Quality Score7 checks

Quality Score, broken into pieces.

Account-level QS (critical < 4.0, low < 6.0), QS spread (>40% low-QS keywords), three component checks (Ad Relevance, Expected CTR, Landing Page) at the >30% BELOW_AVERAGE threshold, plus a per-keyword quick-wins check on the top 10 affected.

Critical Avg QS < 4.0
High Avg QS < 6.0
Medium >30% components BELOW_AVERAGE
05 · Conversion1 check

Whether you can measure anything.

Tag-fire continuity check: 50+ clicks with zero conversions in the lookback window. The dreaded silent-break where spend continues after conversion stops reporting.

Critical ≥ 50 clicks, 0 conversions
06 · Suggested actionsLyra Agent

Each finding gets a written next step.

Once findings are produced by the rule layer, the Lyra Agent reads the structured output and writes the suggested action per row — what to check, where to fix, what tool to run. The Agent never invents findings; it only narrates what the rules surfaced.

Layer Post-detection · narrative only
Falls back to Framework strings if Agent unavailable
Audit Stored alongside findings
Case · multi-brand agency · 11 client accounts · $120k/mo total spend
We used to spend two days a week hand-auditing across 11 accounts. Analyzer runs on demand and hands each analyst a scored report in 30 seconds — we now manage 11 accounts with two people instead of three, better coverage than before.
MA Performance Director · multi-brand agency 11 client accounts · $120k/month total · anonymized
Analyst capacityAccounts managed per analyst
Time to scored reportFrom click Run to readout ~30s
Accounts under AnalyzerConnected at last count 11
Coverage shiftHand-audit → on-demand sweep Daily
Frequently asked

The honest answers about Analyzer.

Is this AI?

Detection is rule-based — same inputs, same findings, same severity. Each check is a predicate with hardcoded thresholds (e.g. "50+ clicks with zero conversions in 7 days"). The Lyra Agent only enters at the suggested-action layer: it reads the structured findings and writes the per-row next step. The numbers and the severities are deterministic; only the suggested-action language is generated.

How often does the run happen?

On-demand. You click Run on a connected account; the analyzer returns a scored report in roughly 30 seconds. There's no overnight cron. If you want a daily sweep across multiple accounts, the workflow today is: run on each account in order (or ask the Lyra Agent in chat to do it for you).

What happens to findings I disagree with?

Today the analyzer captures thumbs up/down telemetry per finding so we can tune the check library. Per-account sticky dismissals ("this finding never applies to me") aren't a feature yet — that's on the deferred backlog.

Does it modify my Google Ads account?

Never. Analyzer has read-only scope — only SELECT queries against the Google Ads API. The output is a scored report with suggested actions; applying anything is a separate step you take in Lyra or in Google Ads directly.

Can I run it through the chat?

Yes. The Lyra Agent (in AI Advisor) has analyze_campaign_health as one of its 52 dispatch targets. Ask in chat — "run a health check on basalt-dtc" — the Agent runs it, summarises the findings, and offers to dispatch the next tool for any specific finding you want to act on.

14-day free trial · No credit card · Cancel in one click

Run the audit.
Keep the findings.

Connect your account and let Lyra run its 18 tools for 14 days. If the projected waste recovery isn't worth at least 10× the $49, don't pay. You keep every insight either way.

Read-only connect · write access opt-in per tool · SOC 2 in progress · GDPR + CCPA compliant