FYI build-order step 1 landed — Meta ad-spend ingestion live in production
This is the first of the per-step flags Growth promised in 2026-05-22-growth-mart-silver-gap-classification: as each build-order step lands, Growth flags it on this thread so Platform can pick up any dependent compute. Step 1 — ad-platform spend-API ingestion — is done.
What landed
The Meta Marketing API spend sync is live against the production Growth database. campaign_spend_daily now carries spend, impressions, and clicks for the meta source.
This directly clears two of the six not-yet-producing metrics: ad_impressions and ad_clicks. Per the silver-gap memo their columns (migration 20260519090000) and compute (queryGrowthAdVolume) already exist, so no Platform compute change is needed — the gap was the data path, and the data path now exists.
Step 1 was lighter than scoped
The silver-gap memo scoped step 1 as "provision META_ADS_ACCESS_TOKEN, finish the external campaign-id mapping, un-stub sync:meta-ad-spend." Two of those three were already done:
- The existing
META_LEADS_ACCESS_TOKENalready carriesads_read— verified against/me/adaccountsand the Insights endpoint. No new token or app review was needed; the sync accepts it as a fallback forMETA_ADS_ACCESS_TOKEN. scripts/sync-meta-ad-spend.mjswas already a complete implementation, not a stub. The stub the memo referred to is the legacyimport-ad-spend.mjsskeleton, whichsync-meta-ad-spend.mjssupersedes.
The real work was the campaign-id mapping, plus one sync correctness fix (below).
Campaign grain
Growth wired ad spend at the market grain: two Growth campaigns, meta_oahu and meta_dallas, each mapped to the corresponding active Meta campaign in ad account act_873189361897751. The sync now aggregates Meta Insights by Growth campaign before writing, since campaign_spend_daily is keyed (campaign, date, source) and a many-to-one mapping would otherwise overwrite same-day rows. This is internal to Growth and changes nothing in the mart contract.
Verification
Production campaign_spend_daily (source meta) holds 59 rows for meta_oahu spanning 2026-03-22 to 2026-05-21 — every row carries impressions and clicks (59/59 on both). Totals: $783.17 spend, 36,644 impressions, 736 clicks. meta_dallas is mapped and ready; it has no rows yet because that Meta campaign has not spent.
Standing dependency, unchanged
ad_impressions and ad_clicks now have their data in the operational table, but the mart will surface them only once the per-domain silver layer is repopulated — the warehouse-state flag Growth raised in the silver-gap memo (the mart_* silver relations and snapshot store reported absent on 2026-05-22). That is Platform-side and unchanged by this memo. Growth's side of step 1 is complete.
What remains
Build-order steps 2 (creative_fatigue_index) and 3 (the attribution-window trio) are unstarted, sequenced as in the silver-gap memo. Growth will flag each on this thread as it lands.
References
- Build order:
2026-05-22-growth-mart-silver-gap-classification - Parent thread:
2026-05-19-platform-mart-100-percent-deployment-per-domain-asks - Growth scripts:
scripts/sync-meta-ad-spend.mjs,scripts/setup-market-campaign-mappings.mjs