Every recurring check bucketed onto a cadence spine, split by team, now with a build-readiness overlay: a Today? column (can we run it as things stand) and Viktor's notes on data access and gaps. Each check is also tagged Binary (automated pass/fail) or Recommendation (human judgment → task).
Today? reflects current data access: Meta API (20 connected accounts) + pb_data BigQuery (~240 Meta / all Google accounts), Google Ads API (full MCC, 1,098 accounts), ClickUp, and browser. No access yet: GHL / PracticeBeacon. Values in [brackets] are thresholds to confirm.
pb_data BQ has deep detail (RSA copy, search terms, lost IS, conversions). Jobs 1–3 + wrapper are essentially all green. The gaps: the GHL/PracticeBeacon dependency (lead recon, and the starts/schedules/ROAS behind most of Jobs 4–5), plus a few API blind spots (auction insights, ad extensions/PMax copy). #1 unlock: PracticeBeacon / GHL access.| Check | Type | Today? | Fail condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Section A — Money & delivery | ||||||
| Payment method down | Bin | Yes | Fail if account billing status = declined / card failure. | Ads API — billing setup | Alert + task | Proven yesterday — billing flags across both MCCs. |
| Account suspended / limited | Bin | Yes | Fail if serving status = suspended / under review / limited. | Ads API — customer status | Alert + task | Proven yesterday (suspension check). |
| Budget pacing off-track | Bin | Yes | Fail if projected month-end spend deviates from plan by [±10%]. | MTD cost vs. MX budget | Alert + auto task | BQ MTD cost vs. ClickUp MX budget. |
| Pacing about to overspend | Bin | Yes | Fail if run-rate projects ≥100% of budget before period end. | Run-rate vs. remaining | Alert; task if not paused | Flag-only; references your existing auto-pause automation. |
| Not spending 2+ days | Bin | Yes | Fail if daily cost = $0 for ≥2 consecutive days on a live campaign. | Ads API / BQ — daily cost | Alert + task | BQ daily spend. |
| HIP / active naming spend rule | Bin | Yes | Fail if spend > $0 in a campaign named HIP while the account name isn't active. | Campaign + account name + cost | Alert + task | Name + cost logic on BQ / API. |
| Spend anomaly | Bin | Yes | Fail if today's spend deviates from trailing [7–14d] average by [±50%]. | Daily cost vs. baseline | Alert | BQ trailing baseline. |
| Zero-conversion spend | Bin | Yes | Fail if spent ≥ [$X] over [N] days with 0 conversions. | Cost + conversions | Alert + task | BQ cost + conversions. |
| Zero serving ads | Bin | Yes | Fail if a live ad group has 0 eligible/serving ads. | Ads API — ad_group_ad status | Alert + task | GAQL ad_group_ad status. |
| Section B — Measurement integrity | ||||||
| Conversion heartbeat | Bin | Yes | Fail if a primary conversion action shows no recent conversions > [N] days. | Ads API / BQ — conversion_action | Alert + task | Conversion actions present in API + BQ. |
| Conversion firing (absence) | Bin | Yes | Fail if today's conversions = 0 where trailing average > 0. | Conversions vs. baseline | Alert | BQ conversions vs. baseline. |
| Lead reconciliation | Bin | No | Fail if Google-reported conversions ≠ GHL/PB leads beyond [±tol]. | Ads API vs. GHL / PB | Alert + task | Blocked — no GHL/PracticeBeacon access today. #1 unlock. |
| MLs + $0 opportunities | Bin | No | Fail if manual leads / opps are logged $0 where value is expected. | PracticeBeacon / GHL | Alert | Blocked — PracticeBeacon/GHL access needed. |
| Check | Type | Today? | Fail / flag condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| RSA spelling | Bin | Yes | Fail on spelling error in a live headline/description. | RSA assets | Task | Proven (July sweep). Blind spot: ad extensions/assets + PMax asset copy have no data source. |
| LP spelling (desktop + mobile) | Bin | Yes | Fail on spelling error on the rendered LP, both viewports. | LP HTML — dual render | Task | Browser render, both viewports. |
| Truncation | Bin | Yes | Fail if headline > 30 / description > 90 chars, or visibly cut. | RSA asset lengths | Task | Char-length rules on RSA copy. |
| Broken final URL | Bin | Yes | Fail on non-200 / redirect / soft-404. | HTTP check on live URLs | Task | HTTP checks on final URLs. |
| Offer / theme match | Bin | Yes | Fail if live offer in copy/LP ≠ current offer subtask / notes. | Ad + LP vs. ClickUp | Task | Copy/LP vs. ClickUp offer subtask + notes. |
| Address / location accuracy | Bin | Yes | Fail if # addresses in copy/LP ≠ # locations in ClickUp / assets. | Copy + ClickUp + website | Task | Copy + ClickUp + website counts. |
| Images match offer | Rec | Yes | Flag if image assets don't reflect the current offer/theme. | Image assets vs. offer | Review flag | Full-size images reviewed visually. |
| LP mobile vs. desktop parity | Rec | Yes | Flag if key content differs between mobile and desktop. | Dual render diff | Review flag | Dual render diff. |
| Grammar | Rec | Yes | Flag likely grammar issues in live copy/LP. | Ad + LP | Review flag | Same copy pipeline as spelling. |
| Check | Type | Today? | Fail condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Geo presence setting | Bin | Yes | Fail if location option = "Presence or interest" (should be Presence only). | geo_target_type_setting | Task | geo_target_type_setting. |
| Geo / radius match | Bin | Yes | Fail if targeted geo/radius ≠ MX service area. | Location criteria vs. MX | Task | Location criteria vs. ClickUp MX. |
| Network settings | Bin | Yes | Fail if Search campaign has Display expansion / Search Partners on when MX says off. | campaign.network_settings | Task | Directly queryable. |
| Bid strategy match | Bin | Partial | Fail if bid strategy / tCPA / tROAS ≠ MX or changed from baseline. | Bidding config + change history | Task | Config match ✅; change-from-baseline limited to Google's hard 30-day change-history API lookback. |
| Missing negative list | Bin | Yes | Fail if the required shared negative list isn't attached. | Campaign shared sets | Task | Campaign shared sets. |
| Conflicting negatives | Bin | Yes | Fail if conflicting-negatives % > 0%. | Recommendations / computed | Auto-remediate | Compute conflicts directly (negatives vs. serving terms); auto-remediation = draft → your approval. |
| Conversion setup integrity | Bin | Yes | Fail if > 1 primary risks double-count, or include-in-Conversions misconfigured. | conversion_action config | Task | Primary / include flags. |
| Automation guardrail | Bin | Partial | Fail if auto-apply recs on, auto-created assets on (unwanted), or a new auto-feature switched on. | Account settings + change history | Task; auto-off where safe | Auto-apply recs subscription queryable; some auto-created-asset toggles aren't API-exposed. |
| Naming ↔ config reconciliation | Bin | Yes | Parse name tokens; validate each against actual settings. | Names vs. live settings | Task | Full umbrella supported. |
| Check | Type | Today? | Flag condition | Exclusions | On flag | Viktor's notes |
|---|---|---|---|---|---|---|
| No starts L90 | Rec | Partial | Flag accounts with 0 starts in the last 90 days. | ROAS exc. + AGL within 30 | Task → Sawyer | AF has starts — usable proxy; PB is the spec's source of truth. |
| No schedules L30 | Rec | Partial | Flag accounts with 0 schedules in the last 30 days. | (MX seriousness layer) | Task → Sawyer | Same — AF proxy only. |
| Search CPL > $200 L60 | Rec | Yes | Flag accounts with search CPL > $200 over 60 days. | Exclude AGL < 60 | Task → Sawyer | BQ. |
| Budget-limited / Lost IS (budget) | Rec | Yes | Flag strong campaigns capped by budget. | search_budget_lost_impression_share | Task / review | BQ has the column. |
| Lost IS (rank) | Rec | Yes | Flag high lost impression share due to rank. | search_rank_lost_impression_share | Review | BQ. |
| Ad strength poor | Rec | Yes | Flag ad groups with "poor" ad strength. | Ads API — ad_strength | Review | BQ RSA table. |
| Search-term wasted spend | Rec | Yes | Flag spend on junk queries above [$X]; suggest negatives. | Ads API — search_term_view | Review + negatives | BQ search terms w/ cost+conv — strongest check in the job. |
| Brand drift + brand defense | Rec | Partial | Flag brand spend-share drift, or competitor on brand terms. | Brand campaigns + auction insights | Review | Spend-share drift ✅; competitor-on-brand needs auction insights — not in API or BQ, UI-only. |
| Check | Type | Today? | Flag condition | Data source | On flag | Viktor's notes |
|---|---|---|---|---|---|---|
| Underpacers | Rec | Yes | Accounts pacing below plan for the period. | Cost vs. MX budget | Prep item | BQ cost vs. MX. |
| Low schedule rate | Rec | No | Accounts below [schedule-rate threshold]. | Schedules / leads (PB) | Prep item | PracticeBeacon schedules data. |
| Low ROAS | Rec | No | Accounts below [ROAS threshold]. | Revenue / cost (PB) | Prep item | PracticeBeacon revenue. |
| 0 ROAS | Rec | No | Accounts returning zero over the window. | Revenue / cost (PB) | Prep item | PracticeBeacon revenue. |
| Check | Type | Today? | Fail condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Account coverage | Bin | Yes | Fail if any account marked "active" in ClickUp is absent from the checked set. | ClickUp active list vs. run manifest | Alert to lead | Straightforward — ClickUp active list vs. run manifest. |
| Existing signal | Where it lives | Note |
|---|---|---|
| Verifications needed | Slack alert | If yes, it already names them. |
| URLs down (hard down) | Existing alert | Real-time catches hard-downs; Creative QA adds the deeper "wrong URL that resolves" check. |
| Pacing overage → auto-pause | Existing automation | Job 1 references it; only tasks when it didn't act. |
MX — the media plan / declared spec each check reconciles against.
AGL — account go-live date; drives the "new account" exclusions.
PB (PracticeBeacon) — source of truth for leads, starts, schedules, ROAS. No access yet.
AF — Agency Framework; has starts as a usable proxy while PB is unavailable.
BQ (pb_data) — BigQuery warehouse: cost, conversions, RSA copy, search terms, lost IS.
Thresholds to lock: pacing ±%, anomaly ±%, zero-conv $/days, CPL ceiling, ROAS floors.
pb_data BQ covers ~240 Meta accounts for daily spend/results/creative copy/targeting (how the typo sweep hit every account). All of Job 1's spend/pacing, most of Job 2, Job 3 config reconciliation, and the wrapper — yes. Blockers: GHL/PracticeBeacon lead reconciliation (no access) and instant-form contents + pixel stats (Meta token scope — needs pages_manage_ads + pixel permissions).Meta is the simpler build — 3 jobs + wrapper. No search terms, negatives, network settings, or impression share; no team-lowest / specialist-unders layer; pixel checks scoped to rare web/LP campaigns; disclaimer and Advantage+ guardrail intentionally out.
| Check | Type | Today? | Fail condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Section A — Money & delivery | ||||||
| Payment method down | Bin | Partial | Fail if the ad account funding source is declined / billing failed. | Meta API — funding | Alert + task | account_status (disabled/unsettled) via API + BQ list = yes; granular funding-source detail sometimes permission-blocked. |
| Ad account restricted / in review | Bin | Yes | Fail if account_status = disabled / unsettled / in-review or restricted. | Meta API — account_status | Alert + task | account_status / disable_reason. |
| Budget pacing off-track | Bin | Yes | Fail if projected spend deviates from plan by [±10%]. | MTD spend vs. MX budget | Alert + auto task | MTD spend (BQ, all accounts) vs. MX budget on ClickUp — same plumbing as the weekly MX draft. |
| Not spending 2+ days | Bin | Yes | Fail if spend = $0 for ≥2 consecutive days on a live ad set/campaign. | Meta API / BQ — daily spend | Alert + task | BQ daily spend, all accounts. |
| Spend anomaly | Bin | Yes | Fail if today's spend deviates from trailing [7–14d] average by [±50%]. | Daily spend vs. baseline | Alert | BQ trailing baseline. |
| Zero-result spend | Bin | Yes | Fail if spent ≥ [$X] over [N] days with 0 results. | Spend + results | Alert + task | BQ spend + lead actions. |
| Ad / creative disapprovals | Bin | Partial | Fail if any ad effective_status = DISAPPROVED / WITH_ISSUES. | Meta API — ad review | Alert | effective_status via API on the 20 connected accounts; BQ has no review status — full-fleet needs a broader token. |
| Zero delivering ads | Bin | Partial | Fail if a live ad set has 0 delivering ads. | Meta API — effective_status | Alert + task | Same — API-only, 20 accounts. |
| Section B — Measurement integrity · web / LP campaigns only | ||||||
| Pixel / CAPI heartbeat | Bin | Partial | Fail if a web/LP campaign's pixel/CAPI shows no events > [N] days. Skipped for instant-form-only accounts. | Meta pixel / dataset stats | Alert + task | Pixel stats endpoint is permission-blocked on the current token; can proxy via "tracked conversions went to 0" from BQ. |
| Conversion firing (absence) | Bin | Partial | Fail if a web/LP campaign's tracked conversions = 0 where trailing average > 0. | Conversions vs. baseline | Alert | Same as pixel heartbeat — BQ proxy works; native pixel stats permission-blocked. |
| Lead reconciliation | Bin | No | Fail if Meta-reported leads ≠ GHL leads beyond [±tol]. Applies to instant forms too. | Meta leads vs. GHL | Alert + task | Blocked — no GHL/PracticeBeacon access today. #1 unlock. |
| MLs + $0 opportunities | Bin | No | Fail if manual leads / opps are logged $0 where value is expected. | PracticeBeacon / GHL | Alert | Blocked — PracticeBeacon/GHL access needed. |
pages_manage_ads scope; everything LP- and copy-based is green.| Check | Type | Today? | Fail / flag condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Ad copy spelling | Bin | Yes | Fail on spelling error in live primary text, headline, or description. | Ad creative | Task | Proven — the July sweep, incl. DC variants via creative breakdown tables. |
| LP / instant-form spelling | Bin | Partial | Fail on spelling error on the LP (both viewports) for web ads, or across the instant form for lead ads. | LP HTML / form definition | Task | LP spelling ✅ (dual-viewport render); instant-form spelling ❌ — list_lead_forms needs pages_manage_ads. |
| Truncation | Bin | Partial | Fail if primary text or headline is cut off in-feed on key placements. | Ad creative + placement preview | Task | Char-length rules yes; true in-feed placement previews no. |
| Broken link | Bin | Yes | Fail on non-200/redirect final URL; for lead ads, broken form privacy or post-submit link. | HTTP check | Task | HTTP checks on final URLs (form privacy links blocked by the same form-read gap). |
| Offer / theme match | Bin | Yes | Fail if live offer in copy / LP / form ≠ current offer subtask / notes. | Ad + LP/form vs. ClickUp | Task | Copy/LP vs. offer subtask + notes. |
| Address / location accuracy | Bin | Yes | Fail if # addresses in copy ≠ # locations in ClickUp / website. | Copy + ClickUp + website | Task | Copy + ClickUp + website. |
| Creative matches offer | Rec | Yes | Flag if the image/video doesn't reflect the current offer/theme. | Creative vs. offer | Review flag | Full-size images pull from BQ URLs; reviewed visually. |
| LP mobile vs. desktop parity | Rec | Yes | Flag if key content differs between mobile and desktop (web ads only). | Dual render diff | Review flag | Dual render diff. |
| Grammar | Rec | Yes | Flag likely grammar issues in live copy / LP / form. | Ad + LP/form | Review flag | Same copy pipeline as spelling. |
| Check | Type | Today? | Fail / flag condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Section A — Config reconciliation (name ↔ setup) | ||||||
| Objective matches name | Bin | Partial | Fail if campaign objective ≠ the name token. | campaign.objective | Task | ✅ on the 20 API-connected accounts; objective isn't in the fleet BQ targeting table. |
| Budget type (CBO / ABO) | Bin | Partial | Fail if Advantage campaign budget on/off ≠ what the name declares. | campaign budget config | Task | ✅ on 20 accts; budget type not in fleet BQ. |
| Geo / radius match | Bin | Yes | Fail if ad-set geo is whole-US or ≠ MX service area. | ad set — geo_locations | Task | API on 20; BQ FBADS_MOPS_TARGETING covers geo fleet-wide. |
| Optimization event | Bin | Yes | Fail if optimization_goal ≠ intended. | ad set.optimization_goal | Task | API on 20; targeting fields in fleet BQ. |
| Placements as intended | Bin | Yes | Fail if Advantage+ vs. manual placements ≠ plan. | ad set — placements | Task | API on 20; placements in fleet BQ. |
| Special ad category | Bin | Partial | Fail if special_ad_categories isn't set as intended. | campaign.special_ad_categories | Task | ✅ on 20 accts; campaign-level, not in the fleet targeting BQ. |
| Destination correct | Bin | Partial | Fail if the ad routes to the wrong form / LP. | ad creative — destination | Task | ✅ on 20 accts; destination not in fleet BQ. |
| Naming ↔ config reconciliation | Bin | Partial | Parse name tokens; validate each against the actual setting. | Names vs. live settings | Task | ✅ on 20 accts; fleet limited to the targeting fields BQ carries. |
| Section B — Delivery health (recommendation) | ||||||
| Frequency too high | Rec | Yes | Flag ad sets with frequency > [threshold] (audience fatigue). | Meta API — insights | Review flag | Everywhere (BQ insights). |
| Check | Type | Today? | Fail condition | Data source | On fail | Viktor's notes |
|---|---|---|---|---|---|---|
| Account coverage | Bin | Yes | Fail if any account marked "active" in ClickUp is absent from the checked set. | ClickUp active list vs. run manifest | Alert to lead | Straightforward. |
| Dropped | Reason |
|---|---|
| Pixel/CAPI as an always-on check | Scoped to web/LP campaigns only — instant-form-only accounts have no pixel to expect. |
| Health-claim / disclaimer check | So much 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. |
| Audience overlap & learning-phase flags | Removed per request; kept the delivery-health section to Frequency only. |
| 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. |
| Unlock | What it opens |
|---|---|
| 1 · GHL / PracticeBeacon access | Lead reconciliation + $0 opportunities (both platforms). Needs an API key/integration or an AF-side proxy. |
| 2 · Meta token scope | pages_manage_ads (instant forms) + pixel stats. A re-auth with those scopes fixes both. |
| 3 · Fleet-wide settings depth | Config audits beyond the 20 accounts need system-user API access to the BM or new BQ transfers (objective/budget columns). |
MX — media plan / declared spec each check reconciles against.
Instant form — Meta's native lead form; the QA target when an ad has no LP. Needs pages_manage_ads to read.
CAPI — Conversions API; checked only on web/LP campaigns.
BQ (pb_data) — BigQuery: ~240 Meta accounts, daily spend/results/copy/targeting.
20 accounts — the Meta API connection depth (ION + 19 partners) for full settings audits.
PB / GHL — lead source-of-truth systems; no access yet.