Facebook Ads to BigQuery
Sync Meta Ads campaigns, ad sets, ads, creatives and daily insights into BigQuery, with actions broken out by attribution window. Weld adds custom reports with your own breakdowns and fields, and can push custom audiences back to Meta from BigQuery.
Checked against Weld and vendor docs on
- campaign_insight16 cols
- campaign_insight_actions9 cols
- ad_insight20 cols
- campaign47 cols
- ad_set91 cols
- creative47 cols
- Extract
- Load
- Keep in sync
- facebook_ads.campaign_insightSynced
- facebook_ads.campaign_insight_actionsSyncing
- facebook_ads.ad_insightSynced
- facebook_ads.campaignSynced
- facebook_ads.ad_setSynced
- facebook_ads.creativeSynced
- Facebook Ads tables
- 136
- fields, typed
- 1,790
- agent context included
- MCP
Trusted by data and AI teams
Three ways to get Facebook Ads data into BigQuery
Google's BigQuery Data Transfer Service has a generally available Facebook Ads connector. Unlike Google's own ad sources it is a paid connector, billed on the compute it uses. It covers a fixed set of tables; the question is whether those are the reports you need.
BigQuery Data Transfer Service
- Best for
- Standard Meta Ads tables inside Google Cloud
- Effort
- Medium: Meta token setup, renewed when it expires
- Freshness
- Daily at most, data from up to 30 days per run
- Good to know
- Fixed tables such as AdInsights, AdInsightsActions, Campaigns, AdSets and Ads; custom reports are not supported. The long-lived user token expires after 60 days, and runs fail after six hours.
Custom script on the Marketing API
- Best for
- Teams with engineers to own a pipeline
- Effort
- High: tokens, pagination, rate limits
- Freshness
- Whatever you schedule
- Good to know
- Full control over breakdowns and fields, but you handle token renewal and Meta's rate limits yourself.
Weld
- Best for
- Meta Ads next to Google Ads, analytics and revenue
- Effort
- Low: authorise, pick accounts and reports, schedule
- Freshness
- Incremental syncs on your schedule
- Good to know
- 172 tables, including insights at account, campaign, ad set and ad level, demographic and placement breakdowns, plus custom reports with up to 24 breakdowns.
How to sync Facebook Ads to Google BigQuery with Weld.
In the app, with the API or an agent.
What lands in Google BigQuery
Every Facebook Ads table, keys intact.
Meta reporting usually combines object tables, which describe the account structure, with insight tables, which hold daily delivery and spend. Actions such as purchases sit in separate tables with one row per action type.
- campaign_insight16 columns
- campaign_id→ campaignstring
- account_id→ accountstring
- account_namestring
- account_currencystring
- datedate
Daily spend, impressions, clicks, link clicks, reach, CPC, CPM and CTR per campaign, with the account currency on every row.
- campaign_insight_actions9 columns
- account_id→ accountstring
- campaign_id→ campaignstring
- indexint
- account_namestring
- account_currencystring
Actions per campaign and day, one row per action_type, with values for the 1-day, 7-day and 28-day click and view attribution windows.
- ad_insight20 columns
- ad_id→ adstring
- account_id→ accountstring
- campaign_id→ campaignstring
- account_namestring
- account_currencystring
The same daily metrics per ad, with ad set and campaign ids and names for rollups and creative analysis.
- campaign47 columns
- idPKstring
- account_id→ accountstring
- source_campaign_idstring
- bid_strategystring
- boosted_object_idstring
Campaign settings: objective, status, buying type, budgets and start and stop times. Joins to the insight tables on campaign id.
- ad_set91 columns
- idPKstring
- account_id→ accountstring
- campaign_id→ campaignstring
- source_ad_set_idstring
- updated_timedate
Ad set budgets, bid strategy, optimisation goal and targeting, such as age range, countries and placements.
- creative47 columns
- idPKstring
- account_id→ accountstring
- actor_idstring
- applink_treatmentstring
- authorization_categorystring
Ad creative content: title, body, call to action, link URL, image and thumbnail URLs and URL tags.
- account
- campaign
- ad
- action_canvas_component
- label
- ad_roas_insight_purchase_roas
- ad_roas_insight_website_purchase_roas
- ad_set
- campaign_roas_insight_purchase_roas
- campaign_roas_insight_website_purchase_roas
- demographics_delivery_platform_ad
- ad_insight
- ad_roas_insight
- all_level
- lead_ad
- ad_roas_insight_actions
- ad_roas_insight_action_values
- ad_roas_insight_conversions
- ad_roas_insight_conversion_values
- ad_roas_insight_cost_per_action_type
- ad_roas_insight_cost_per_conversion
- ad_roas_insight_conversion_insights
- creative
- action_carousel_card_website_purchase_roas
- action_conversion_device_website_purchase_roas
- action_product_id_website_purchase_roas
- ad_set_roas_insight_purchase_roas
- ad_set_roas_insight_website_purchase_roas
- demographics_country_ad
- ad_set_insight
- and 104 more
Monthly spend and cost per link click by campaign objective.
In Google BigQuery SQL.
Runs in BigQuery against the tables Weld lands, here in a dataset named facebook_ads. Reach is left out because it is a unique count that cannot be summed across days.
1select2 date_trunc(i.date, month) as month,3 i.account_currency,4 c.objective,5 round(sum(i.spend), 2) as spend,6 sum(i.impressions) as impressions,7 sum(i.inline_link_clicks) as link_clicks,8 round(safe_divide(sum(i.spend), sum(i.inline_link_clicks)), 2) as cost_per_link_click9from facebook_ads.campaign_insight as i10join facebook_ads.campaign as c on c.id = i.campaign_id11group by month, i.account_currency, c.objective12order by month desc, spend descAsk your agent.
It queries Google BigQuery for you.
Connect Claude, Cursor, ChatGPT or your own agent to Weld over MCP. It reads the Facebook Ads context, finds the tables it needs and runs the query in Google BigQuery.
How many campaign rows do we have per account? Use our Facebook Ads data in Google BigQuery.
Reading the Facebook Ads context first, so the query uses the right tables and keys.
Things to know.
Before you sync Facebook Ads.
ELT vs. reverse ETL: Facebook Ads and Google BigQuery
ELT (Extract, Load, Transform) moves data from Facebook Ads into Google BigQuery for analysis. This is the approach shown on this page, and the one to use for dashboards, reports, and data models.
Reverse ETL works the other direction: it pushes enriched data from Google BigQuery back into Facebook Ads. For example, you could sync computed lead scores or customer segments from your warehouse into Facebook Ads to personalize outreach.
Weld supports both directions, so you can build a complete data loop between Facebook Ads and Google BigQuery.
Google BigQuery to Facebook Ads- Actions are long tables, one row per action type
- Conversions and other actions land in tables such as campaign_insight_actions, with one row per action_type and day and separate columns per attribution window. Filter on the action types you report on before joining to spend, or totals will multiply.
- Three years of history at most
- The Facebook Ads API keeps 3 years of data, counted back from a table's initial sync. Anything older cannot be retrieved, so start syncing before you need the history.
- Some breakdown combinations return no data
- Meta does not support every combination of breakdowns and fields. If a custom report comes back empty, broaden the selection or change its level between campaign, ad set and ad.
- Rate limits are shared across your Meta account
- Meta applies global rate limits to everything that calls its APIs for your account. Weld slows down its Meta syncs once usage reaches 40% of the limit to avoid hitting it.
- Reach and frequency do not add up
- Reach counts unique people for the row's period. Summing daily reach over a month counts the same people more than once, so report reach per day or pull it from a report at the level you need.
Keep reading.
Guides, docs and schema.
Common questions.
About Facebook Ads to Google BigQuery.
Start syncing Facebook Ads to Google BigQuery.
Set up your Facebook Ads data pipeline in minutes. No credit card required. Free for 14 days.