meta ads5 min readBy Phloz team

Export Meta Ads data to BigQuery: the agency guide

How agencies export Meta Ads data to BigQuery: the Insights API pipeline, system-user auth, connector options, and the 28-day restatement window.

TL;DR

Meta Ads data reaches BigQuery by the same three routes as every ad platform — a connector vendor, a DIY pipeline on the Marketing API's Insights endpoint, or CSV exports — plus one route TikTok doesn't have: BigQuery's own Data Transfer Service has been adding third-party connectors, and Facebook Ads is on that list (availability and pricing have been evolving — check the current DTS connector catalog before you build). The Meta-specific realities that shape the build: auth must run on a Business Manager system user (not a person's token), the Insights API meters you with a rate-limit budget that punishes greedy pulls on big accounts, attribution settings silently change what "conversions" means per account, and Meta restates metrics for up to 28 days — so the nightly job must re-fetch a trailing window and MERGE, never blind-append. Cross-platform schema and the full restatement methodology live in the ads-data-to-BigQuery hub.


For most agencies, Meta is the largest non-Google line on every client's spend table — which makes it the platform where "the UI is a silo" hurts most. Blended CAC, Meta's claimed conversions versus GA4's independent count, creative fatigue curves across clients: all join questions, all impossible inside Ads Manager. The export is what turns Meta's version of reality into one input among several instead of the only number in the room.

The four routes

BigQuery Data Transfer Service. Worth checking first because it's the only ad platform outside Google's own with a path this direct: Google has been expanding DTS with third-party connectors, Facebook Ads among them. If it's available on your project and covers the grain you need, it's the least moving parts you can own. Verify the field coverage before committing — managed connectors trade configurability for convenience, and ad-level daily grain with the conversion actions you care about is the bar.

Connector vendors. Fivetran, Airbyte, Supermetrics, Windsor.ai, Funnel — mature Meta connectors, normalized tables, someone else absorbs Meta's API version churn (a real cost: Meta deprecates Marketing API versions on a fixed clock, and unmaintained DIY pipelines break on schedule). Same agency-scale caveat as always: per-connection pricing multiplied by a client roster. The hub has the build-vs-buy math.

The Insights API pipeline. The DIY route, detailed below.

CSV. One-off audits and verifying your pipeline against the UI. Nothing recurring.

Building on the Insights API

Auth: system user, or it breaks at the worst time. The defining Meta-specific mistake is running the pipeline on a personal access token — it dies when that person changes their password, loses ad account access, or leaves the agency. Create a system user in the agency's Business Manager, grant it the client ad accounts, and issue a long-lived token stored in Secret Manager. System users exist precisely so machine access survives the org chart. Token in code or an env file is a security incident waiting for a repo clone — never.

The pull. One endpoint does the work: the ad account's insights edge, requested at level=ad with time_increment=1 for daily rows. Core fields: spend, impressions, clicks, plus the actions and action_values arrays for conversions. For large accounts or long date ranges, submit the query as an async insights job and poll — synchronous requests on big accounts time out, and hammering retries burns your rate budget.

Rate limits are a budget, not a wall. Insights throttling is usage-based per account and app: every call spends from a budget, heavy calls spend more, and exhausting it locks you out temporarily. The pipeline design that respects it: fewest calls that fetch the most rows (daily time_increment over per-day loops), async jobs for anything big, exponential backoff on throttle responses, and accounts processed sequentially rather than in a thundering herd at 06:00.

Know your attribution setting before you trust a conversions column. Meta reports conversions according to each ad account's attribution setting (7-day click / 1-day view is the common default). Two clients with different settings produce conversions columns that are not the same metric. Record the setting alongside the data — the cross-platform schema in the hub carries an attribution-setting column for exactly this reason — and don't let a blended dashboard average apples into oranges.

Breakdowns: only what you'll query. Age, gender, placement, country — each breakdown multiplies row count and call cost. The working rule: ad-level daily unbroken is the canonical table; add one breakdown table (usually placement or country) only when a recurring report actually consumes it.

The 28-day restatement window

Meta is the platform that makes blind-append pipelines fail most visibly. Attributed conversions land for days after the impression — and Meta's own documentation is explicit that metrics can continue updating for up to 28 days. A pipeline that fetches "yesterday" once freezes numbers that Meta itself will quietly revise, and within a month your BigQuery table and Ads Manager disagree on every recent conversion figure. The dashboard loses the trust war and the pipeline dies.

Same fix as every platform, stated once and automated forever: nightly, re-fetch the trailing 28 days at the same grain and MERGE on date + ad ID. The hub post covers the pattern in full, including the SQL shape.

And the upstream dependency: the conversions Meta restates are only as good as the event layer feeding them. A Pixel + Conversions API setup that double-counts makes the export a high-fidelity record of inflated numbers — the dedupe discipline is its own post: Meta Pixel + CAPI without double counting.

Own the pipeline like infrastructure

Tokens age, API versions sunset, a client's Business Manager access gets pruned — and the only symptom is a freshness gap nobody's watching. Put "verify Meta spend table freshness" on a recurring cadence with an owner, the same discipline as any tracking verification. In Phloz, the pipeline is a node on the client's tracking infrastructure map with that recurring task attached — staleness surfaces as an overdue task instead of a client question.

Series companions: the TikTok version (no DTS option, friendlier rate limits) and the cross-platform hub where all of these land in one spend table next to the GA4 event log.