Google Ads Import - Data QA

SGA Content Engine (marketing.google_ads_campaign_daily_metrics) vs Google Ads - coverage reconciliation - generated
Verdict: our stored Google Ads spend and conversions currently UNDER-report vs Google Ads, concentrated in recent months. The cause is coverage (missing day rows), not math. A year-to-date backfill is actively re-pulling the gaps and was running at report time. This is self-correcting, but today's recent-month figures should be treated as provisional until the queue drains.

Worked example - what you flagged

PCCD Mountain View (customer 2246725370). Our database matches your "3.4k", Google shows 4.92k. The 1.5k gap is Aug 1-10, which have zero rows in our data.

September is complete (30 of 30 days) and reconciles. August is missing its first 10 days. July is worse (13 days present).

Coverage heatmap - missing weekday rows by account and month

complete 1-2 missing 3-5 6-10 11+ missing weekdays account not active P = month still has pending backfill rows
Weekend and typical Friday pauses are excluded (most practices legitimately do not run ads then). Cells count only Monday-Friday rows missing inside each account's active window. Hover a cell for present/expected weekdays and recorded spend.

Evidence - interior weekday holes (Jul to Sep 2026)

Each square is one day. Green = has data, red = weekday with no row inside an active run, light = weekend/outside run. Repeated single-weekday holes are ingest gaps, not ad scheduling.

Root causes (ranked)

  • In-progress YTD backfill (biggest). day rows across Jan-Sep 2026 are still pending re-pull. August is 0 percent backfilled (31 of 31 pending). Each pending day, when it runs, re-pulls every account for that day and fills the holes.
  • Per-account nightly misses. The live nightly pull sometimes failed for individual accounts on individual days, leaving interior holes until the backfill repairs them.
  • Excluded accounts. 18 accounts are deactivated at Google (access_revoked) and 26 are unlinked (no practice mapping). The 26 unlinked never appear in any total until their customer_id is mapped to a practice.
  • One day-level anomaly: 2026-06-09 pulled only 12 accounts (partial-pull failure).

Ruled out (not the problem)

  • Micros conversion is correct (cost_micros / 1,000,000).
  • Weekend dips are real day-parting (about 8 of 69 accounts run weekends).
  • Friday lows are real day-parting (about 33 of 69 run Fridays).
  • Conversion math is per campaign-day totals, consistent.

Recommended fixes

  • Let the backfill finish (about a week at current quota; August within a day or two as high priority).
  • Request Google Ads Standard Access (free) to remove the 15k ops/day cap and drain in hours.
  • Reconcile the chronic accounts vs Google Ads API after the drain to confirm totals close.
  • Add a freshness guard so dashboards flag any month below full coverage as provisional.
  • Map the 26 unlinked accounts to practices so their spend is captured.
Method: completeness is measured internally (weekday rows present vs expected inside each account's active window) plus the backfill queue state. The only externally confirmed point is PCCD Mountain View August (our 3,438 vs Google 4,920, 30 percent under). Internal signals locate the gaps; a Google Ads API re-pull is the gold-standard confirmation for the dollar magnitude.