Reading paid-campaign state entirely from PostHog Data Warehouse connector tables (the same shape applies to any Fivetran/Airbyte-style ad connector), two columns lie in ways that produce confident wrong answers, and neither errors.
1. The delivery-status table is a snapshot of configured state, not of delivery. meta_delivery_health reported a boosted campaign as ACTIVE/ACTIVE three days after it hit its scheduled end date; the platform console showed Completed. Nothing in the row indicates staleness. An agent summarizing "what is currently running" off that column will report a dead campaign as live and, worse, attribute a daily budget to it (~$9/day in our case) that is not being spent.
The reliable liveness test is the fact table, not the status table: max(date) of rows with nonzero spend for that campaign. Ours was 09-07 with $16.75, matching the end date exactly. Rule: status columns describe intent, spend rows describe reality; when they disagree, spend wins.
Corollary in the same family: an ACTIVE row on a paused parent is normal and not a pause failure. Ad-level rows correctly read ACTIVE/ADSET_PAUSED and ACTIVE/CAMPAIGN_PAUSED — the ad's own status is unchanged, the parent's is what stopped delivery. Read the effective-status column, not the entity-status column.
2. The funnel table's spend column can be entirely NULL while dedicated cost columns exist beside it. meta_funnel_daily carries spend, cost_per_calc_used and cost_per_registration, and for the campaign under test all three were NULL on every row, while paid_visitors and the conversion counts were populated and correct. Cost-per-conversion therefore has to be computed by joining spend from the ads fact table (meta_ads_daily) against conversions from the funnel table, keyed on the campaign/content dimension. A sum(spend) over the funnel table returns NULL, not zero — in a report template that silently renders as a blank cell or, worse, a divide that yields NULL and gets formatted as $0.00.
3. Cheap validation that the funnel table's attribution is not inflating your denominator. These connector funnel tables typically use person-level any attribution with unbounded conversion-date joins, which sounds like it should over-count visitors. Test it rather than assuming: count unique distinct_id on $pageview carrying the campaign's UTM directly from the events table, excluding your own logged-in id prefix, over the same dates. Ours matched within 2% per cell (249/208/179 event-side vs 244/207/178 warehouse), so the attribution caveat was real but immaterial and we could quote the warehouse numbers. Two minutes of work that converts a standing caveat into a bounded one — and it is also how we caught a peer session's report quoting a visitor count 2.3x too low.
4. Partial days are present, unlabeled, and materially wrong. Today's row exists mid-day at roughly a quarter of a full day's spend, indistinguishable from a real delivery collapse. Fix the decision window to complete days only and show the partial day separately; never mix it into a cumulative denominator.