Every recurring check bucketed onto a cadence spine, split by team. Each check is tagged Binary (automated pass/fail → alert or gate) or Recommendation (human judgment → task), with trigger, data source, owner, and per-check logic. Two platforms, two tabs.
Values in [brackets] are thresholds to confirm before build. Auto-remediation is called out explicitly; everything else flags, never fixes — a mismatch could mean the setup is wrong or the plan is wrong, and only a human knows which.
| Check | Type | Fail condition | Data source | On fail |
|---|---|---|---|---|
| Section A — Money & delivery | ||||
| Payment method down | Bin | Fail if account billing status = declined / primary card failure. | Ads API — billing setup | Alert + task |
| Account suspended / limited | Bin | Fail if account serving status = suspended, under review, or limited. | Ads API — customer status | Alert + task |
| Budget pacing off-track | Bin | Fail if projected month-end spend deviates from plan by [±10%] vs. pace to hit budget. | MTD cost vs. MX budget | Alert + auto task |
| Pacing about to overspend | Bin | Fail if run-rate projects ≥100% of budget before period end. References existing auto-pause automation. | Run-rate vs. remaining budget/days | Alert; task if not auto-paused |
| Not spending 2+ days | Bin | Fail if daily cost = $0 for ≥2 consecutive days on a live account/campaign. | Ads API — daily cost | Alert + task |
| HIP / active naming spend rule | Bin | Fail if spend > $0 in a campaign whose name contains HIP and the account name does not contain active. | Campaign + account name + cost | Alert + task |
| Spend anomaly | Bin | Fail if today's spend deviates from trailing [7–14 day] average by [±50%]. | Daily cost vs. baseline | Alert |
| Zero-conversion spend | Bin | Fail if account/campaign spent ≥ [$X] over last [N] days with 0 conversions. | Cost + conversions windowed | Alert + task |
| Zero serving ads | Bin | Fail if a live ad group has 0 eligible/serving ads (all disapproved or paused) — the gap "not spending" misses. | Ads API — ad_group_ad status | Alert + task |
| Ad / asset disapprovals | Bin | Fail if any ad or asset policy status = disapproved. | Ads API — policy_summary | Alert |
| Section B — Measurement integrity | ||||
| Conversion heartbeat | Bin | Fail if a primary conversion action shows "no recent conversions" or last-received > [N] days. | Ads API — conversion_action | Alert + task |
| Conversion firing (absence) | Bin | Fail if today's conversions = 0 where trailing average > 0. Detects absence via expected-vs-actual. | Conversions vs. baseline | Alert |
| Lead reconciliation | Bin | Fail if Google-reported conversions ≠ GHL/PB leads for the same window beyond [±tolerance]. The "+1 in PB but no +1 in UI" match. | Ads API vs. GHL / PracticeBeacon | Alert + task |
| MLs + $0 opportunities | Bin | Fail if manual leads / opportunities are logged with $0 value where a value is expected. | PracticeBeacon / GHL | Alert |
| Check | Type | Fail / flag condition | Data source | On fail |
|---|---|---|---|---|
| RSA spelling | Bin | Fail on spelling error in a live headline/description (dictionary + brand/offer allowlist). | RSA assets | Task |
| LP spelling (desktop + mobile) | Bin | Fail on spelling error on the rendered landing page, both viewports. | LP HTML — dual render | Task |
| Truncation | Bin | Fail if headline > 30 chars or description > 90 chars, or visibly truncated in preview. | RSA asset lengths | Task |
| Broken final URL | Bin | Fail if final or mobile URL returns non-200, a redirect chain, or a soft-404. | HTTP check on live URLs | Task |
| Offer / theme match | Bin | Fail if the live offer in ad copy or LP ≠ the current "campaign running" offer subtask / important notes. (Offer = binary; theme = recommendation.) | Ad + LP vs. ClickUp | Task |
| Address / location accuracy | Bin | Fail if # of addresses in copy/LP ≠ # of locations in ClickUp, or location-asset count ≠ website count. | Copy + ClickUp + website | Task |
| Images match offer | Rec | Flag if image assets don't reflect the current offer/theme. | Image assets vs. offer | Review flag |
| LP mobile vs. desktop parity | Rec | Flag if key content (offer, price, CTA, phone) differs between mobile and desktop. | Dual render diff | Review flag |
| Grammar | Rec | Flag likely grammar issues in live copy/LP (not a clean yes/no). | Ad + LP | Review flag |
| Check | Type | Fail condition | Data source | On fail |
|---|---|---|---|---|
| Geo presence setting | Bin | Fail if location option = "Presence or interest" (should be Presence only). | campaign.geo_target_type | Task |
| Geo / radius match | Bin | Fail if targeted geo/radius ≠ service area defined in the MX. | Location targets vs. MX | Task |
| Network settings | Bin | Fail if a Search campaign has Display expansion on or Search Partners on when the MX says off. | campaign.network_settings | Task |
| Bid strategy match | Bin | Fail if bid strategy type, or tCPA/tROAS target, ≠ MX or changed from baseline. | Bidding config + change history | Task |
| Missing negative list | Bin | Fail if the required shared negative-keyword list is not attached to the campaign. | Campaign shared sets | Task |
| Conflicting negatives | Bin | Fail if conflicting-negatives % > 0% in the recommendations column. | Recommendations page / API | Auto-remediate + post names to paid search internal |
| Conversion setup integrity | Bin | Fail if > 1 primary conversion action risks double-counting, or "include in Conversions" is misconfigured. | Ads API — conversion_action config | Task |
| Automation guardrail | Bin | Fail if auto-apply recommendations is ON, auto-created assets is ON (when unwanted), or a new Google auto-feature was switched on. | Account settings + change history | Task; auto-off where safe |
| Naming ↔ config reconciliation | Bin | Umbrella: parse campaign/ad-group name tokens and validate each against actual settings (objective, geo, offer). | Names vs. live settings | Task |
| Check | Type | Flag condition | Exclusions | On flag |
|---|---|---|---|---|
| No starts L90 | Rec | Flag accounts with 0 starts in the last 90 days. | ROAS exception = filled and AGL within 30 days | Task → Sawyer |
| No schedules L30 | Rec | Flag accounts with 0 schedules in the last 30 days. | (MX seriousness layer) | Task → Sawyer |
| Search CPL > $200 L60 | Rec | Flag accounts with search CPL > $200 over the last 60 days. | Exclude AGL < 60 days | Task → Sawyer |
| Budget-limited / Lost IS (budget) | Rec | Flag strong campaigns capped by budget — the opposite of overpacing, leaving volume on the table. | search_budget_lost_impression_share | Task / review |
| Lost IS (rank) | Rec | Flag high lost impression share due to rank (bid / Quality Score). | search_rank_lost_impression_share | Review |
| Ad strength poor | Rec | Flag ad groups with "poor" ad strength. | Ads API — ad_strength | Review |
| Search-term wasted spend | Rec | Flag spend on irrelevant/junk queries above [$X]; suggest negatives. | Ads API — search_term_view | Review + negatives |
| Brand drift + brand defense | Rec | Flag brand spend-share drift, or a competitor showing on your brand terms. | Brand-labeled campaigns + auction insights | Review |
| Check | Type | Flag condition | Data source | On flag |
|---|---|---|---|---|
| Underpacers | Rec | Accounts pacing below plan for the period. | Cost vs. MX budget | Prep item |
| Low schedule rate | Rec | Accounts below [schedule-rate threshold]. | Schedules / leads (PB) | Prep item |
| Low ROAS | Rec | Accounts below [ROAS threshold]. | Revenue / cost (PB) | Prep item |
| 0 ROAS | Rec | Accounts returning zero over the window. | Revenue / cost (PB) | Prep item |
| Check | Type | Fail condition | Data source | On fail |
|---|---|---|---|---|
| Account coverage | Bin | Fail if any account marked "active" in ClickUp is absent from the checked set for the cycle. | ClickUp active list vs. run manifest | Alert to lead |
| Existing signal | Where it lives | Note |
|---|---|---|
| Verifications needed | Slack alert | If yes, it already names them. No new check. |
| URLs down (hard down) | Existing alert | Real-time catches hard-downs. Creative QA (Job 2) adds the deeper twice-weekly "wrong URL that still resolves" check. |
| Pacing overage → auto-pause | Existing automation | Job 1 references it; only tasks when the automation didn't act. |
Four checks changed beat: conflicting negatives and conversion-setup integrity dropped from ad-hoc into the weekly integrity audit; zero-serving-ads was added into the daily sweep; and creative QA moved from launch-only to a fixed twice-weekly beat. (Offline-import, duplicate-keywords, and RSA-count checks were removed as not needed.)
MX — the media plan / declared spec each check reconciles the live account against.
AGL — account go-live date; drives the "new account" exclusions.
PB (PracticeBeacon) — source of truth for leads, starts, schedules, ROAS.
GHL — CRM used in lead reconciliation against Google-reported conversions.
CU (ClickUp) — offer subtasks, important notes, account "active" status, MX.
Starts / schedules — patient starts and booked appointments (downstream outcomes).
Schedule rate — schedules ÷ leads; a primary "unders" measure.
Thresholds to lock: pacing ±%, spend-anomaly ±%, zero-conv $/days, CPL ceiling, schedule-rate & ROAS floors, heartbeat day-windows.
Meta is the simpler build. Same cadence spine, but it collapses to 3 jobs + wrapper. No search terms, negatives, network settings, or impression share; no team-lowest / specialist-unders accountability layer; pixel checks scoped to the rare web/LP campaigns; and the disclaimer check and Advantage+ automation guardrail are intentionally out (per your call — instant forms, and you sometimes want Advantage+ on).
| Check | Type | Fail condition | Data source | On fail |
|---|---|---|---|---|
| Section A — Money & delivery | ||||
| Payment method down | Bin | Fail if the ad account funding source is declined / billing has failed. | Meta API — ad account funding | Alert + task |
| Ad account restricted / in review | Bin | Fail if account_status = disabled / unsettled / in-review, or the account is policy-restricted. | Meta API — account_status / disable_reason | Alert + task |
| Budget pacing off-track | Bin | Fail if projected spend deviates from plan by [±10%] vs. pace to hit budget. | MTD spend vs. MX budget | Alert + auto task |
| Not spending 2+ days | Bin | Fail if spend = $0 for ≥2 consecutive days on a live ad set/campaign. | Meta API — insights (daily spend) | Alert + task |
| Spend anomaly | Bin | Fail if today's spend deviates from trailing [7–14 day] average by [±50%]. | Daily spend vs. baseline | Alert |
| Zero-result spend | Bin | Fail if a campaign spent ≥ [$X] over [N] days with 0 results (leads / purchases per objective). | Spend + results windowed | Alert + task |
| Ad / creative disapprovals | Bin | Fail if any ad effective_status = DISAPPROVED or WITH_ISSUES. | Meta API — ad review status | Alert |
| Zero delivering ads | Bin | Fail if a live ad set has 0 delivering ads (all rejected or off) — the delivery gap "not spending" misses. | Meta API — ad set + ad effective_status | Alert + task |
| Section B — Measurement integrity · web / LP campaigns only | ||||
| Pixel / CAPI heartbeat | Bin | Fail if a web/LP conversion campaign's pixel/CAPI shows no events received > [N] days. Skipped for instant-form-only accounts. | Meta pixel / dataset stats | Alert + task |
| Conversion firing (absence) | Bin | Fail if a web/LP campaign's tracked conversions = 0 where trailing average > 0. Same web-only scope. | Conversions vs. baseline | Alert |
| Lead reconciliation | Bin | Fail if Meta-reported leads ≠ GHL leads for the same window beyond [±tolerance]. Applies to instant forms too. | Meta leads vs. GHL | Alert + task |
| MLs + $0 opportunities | Bin | Fail if manual leads / opportunities are logged with $0 value where a value is expected. | PracticeBeacon / GHL | Alert |
| Check | Type | Fail / flag condition | Data source | On fail |
|---|---|---|---|---|
| Ad copy spelling | Bin | Fail on spelling error in live primary text, headline, or description. | Ad creative | Task |
| LP / instant-form spelling | Bin | Fail on spelling error on the LP (desktop + mobile) for web ads, or across the instant form for lead ads. | LP HTML / form definition | Task |
| Truncation | Bin | Fail if primary text or headline is cut off in-feed on key placements. | Ad creative + placement preview | Task |
| Broken link | Bin | Fail if a web ad's final URL is non-200/redirect; for lead ads, if the form's privacy-policy link or post-submit CTA link is broken. | HTTP check | Task |
| Offer / theme match | Bin | Fail if the live offer in copy / LP / form ≠ the current "campaign running" offer subtask / important notes. (Offer = binary; theme = recommendation.) | Ad + LP/form vs. ClickUp | Task |
| Address / location accuracy | Bin | Fail if # of addresses in copy ≠ # of locations in ClickUp / on the website. | Copy + ClickUp + website | Task |
| Creative matches offer | Rec | Flag if the image/video doesn't reflect the current offer/theme. | Creative vs. offer | Review flag |
| LP mobile vs. desktop parity | Rec | Flag if key content differs between mobile and desktop (web ads only). | Dual render diff | Review flag |
| Grammar | Rec | Flag likely grammar issues in live copy / LP / form (not a clean yes/no). | Ad + LP/form | Review flag |
| Check | Type | Fail / flag condition | Data source | On fail |
|---|---|---|---|---|
| Section A — Config reconciliation (name ↔ setup) | ||||
| Objective matches name | Bin | Fail if campaign objective ≠ the name token (e.g., Leads → OUTCOME_LEADS, not Traffic/Engagement). | campaign.objective | Task |
| Budget type (CBO / ABO) | Bin | Fail if Advantage campaign budget on/off ≠ what the name declares. | campaign budget config | Task |
| Geo / radius match | Bin | Fail if ad-set geo is whole-US or ≠ the service area in the MX. (Folds the targeting check in here.) | ad set targeting — geo_locations | Task |
| Optimization event | Bin | Fail if optimization_goal ≠ intended (e.g., LEAD / OFFSITE_CONVERSIONS, not LINK_CLICKS). The one that quietly torches performance. | ad set.optimization_goal | Task |
| Placements as intended | Bin | Fail if Advantage+ vs. manual placements ≠ what the name / plan declares. | ad set targeting — placements | Task |
| Special ad category | Bin | Fail if special_ad_categories isn't set as intended for the account. | campaign.special_ad_categories | Task |
| Destination correct | Bin | Fail if the ad routes to the wrong destination — wrong instant form, or LP when a form was intended (or vice-versa). | ad creative — destination / form id | Task |
| Naming ↔ config reconciliation | Bin | Umbrella: parse campaign / ad-set / ad name tokens and validate each against the actual setting. Flag any token that lies. | Names vs. live settings | Task |
| Section B — Delivery health (recommendation) | ||||
| Frequency too high | Rec | Flag ad sets with frequency > [threshold] (audience fatigue). | Meta API — insights (frequency) | Review flag |
| Check | Type | Fail condition | Data source | On fail |
|---|---|---|---|---|
| Account coverage | Bin | Fail if any account marked "active" in ClickUp is absent from the checked set for the cycle. | ClickUp active list vs. run manifest | Alert to lead |
| Dropped | Reason |
|---|---|
| Pixel/CAPI as an always-on check | Scoped to web/LP campaigns only — instant-form-only accounts have no pixel to expect, so absence is fine, not a failure. |
| Health-claim / disclaimer check | So much of the mix runs through instant forms that a standalone disclaimer gate isn't worth the noise. |
| Advantage+ automation guardrail | You sometimes want these features on, so an auto-flag would fight the strategy. |
| Performance / accountability layer (Jobs 4 & 5) | The team-lowest + specialist-unders system is a Paid Search / Sawyer structure; not run for social. |
| HIP / active naming spend rule | Google-only. |
MX — the media plan / declared spec each check reconciles the live account against.
Instant form — Meta's native lead form; the QA target when an ad has no landing page.
CAPI — Conversions API; the server-side event feed checked only on web/LP campaigns.
CBO / ABO — campaign vs. ad-set budget optimization (Advantage campaign budget on/off).
GHL — CRM used to reconcile against Meta-reported leads.
CU (ClickUp) — offer subtasks, important notes, account "active" status, MX.
PB (PracticeBeacon) — source for logged leads / opportunities.
Thresholds to lock: pacing ±%, spend-anomaly ±%, zero-result $/days, pixel/lead-recon day-windows, audience-overlap %, frequency ceiling.