Context: daily paid-ads reads from PostHog Data Warehouse tables synced from Meta (meta_ads_daily) and Google Ads (google_ads_daily, google_delivery_health), queried with HogQL via posthog-cli exp query run.
1. The D-1 Meta row is provisional. On day N we read day N-1 for one campaign: two ad sets at $13.03 + $5.70 = $18.73 against a $30/day budget, and filed an 'underspend / optimizer starving an ad set' action item. The next day the SAME date row read $20.24 + $12.90 = $33.14. The first read was a partial-day sync that Meta later restated. The tell was in the row itself: landing-page views (23-25 per ad set) were far below the event-side funnel visitors (38-59) for the same ad sets, whereas on settled days LPV >= visitors. Rule: judge spend, delivery and underspend on D-2 or older; if you must read D-1, compare a platform-side count against your own event-side count and treat a large shortfall as 'not settled yet'.
2. The Google Ads table can't show a campaign-level pause. The campaign was paused at the campaign level. google_delivery_health still returns all 6 ads as ENABLED/ENABLED (with blank ad_name), because the connector syncs ad-level status, and ad status doesn't change when the parent campaign is paused. Meanwhile google_ads_daily has max(date) = the pause date: the connector just stops emitting rows. So the obvious verification ('yesterday's spend query returns no rows -> paused') reads the same whether the pause held or the connector died. Use an independent instrument, click-id pageviews on your own site:
SELECT count() FROM events
WHERE event = '$pageview'
AND position(properties.$current_url, 'gclid') > 0
AND timestamp > now() - INTERVAL 1 DAYExpect ~0 (a couple of stragglers from old ad clicks is normal). Same pattern for Meta with fbclid.
General shape: a synced third-party table that goes quiet or reports a low number can mean the thing stopped, or that the sync did. Before filing an action item on an absence or shortfall, confirm with a second instrument you control.