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.

4.8 on G2
Facebook AdsSource
WeldWeld
Google BigQueryWarehouse

Checked against Weld and vendor docs on

Weld · New sync
Facebook AdsSourceFacebook AdsConnected
Tables to sync
  • campaign_insight16 cols
  • campaign_insight_actions9 cols
  • ad_insight20 cols
  • campaign47 cols
  • ad_set91 cols
  • creative47 cols
  • Extract
  • Load
  • Keep in sync
Google BigQueryDestinationGoogle BigQueryReady
facebook_ads dataset
  • 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

  • Flatpay
  • Holafly
  • eComplete
  • Dishoom
  • Danish Endurance
  • Female Invest
  • Son of a Tailor
  • Onomondo
  • Medik8
  • Pas Normal Studios
Options

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.

B

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.
C

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 it works

How to sync Facebook Ads to Google BigQuery with Weld.
In the app, with the API or an agent.

Weld · Data warehouse
Google BigQueryData warehouseGoogle BigQueryConnected
Data locationChosen when you connect
CredentialsService account or key, stored encrypted
Schema

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.

Open the schema explorer
  • 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.

All 136 tables
  • 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
Example query

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.

Google BigQuery · query
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 desc
Weld MCP server

Ask 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.

Claude CodeOpus 5
>

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.

●weld·search_available_references
⎿raw.facebook_ads.campaign
raw.facebook_ads.account
+ 134 more Facebook Ads tables
●weld·get_reference_schema
⎿campaign · 47 columns
joins account on account_id
●weld·run_query
⎿select a.id, count(*) from {{raw.facebook_ads.campaign}} c
join {{raw.facebook_ads.account}} a on c.account_id = a.id
group by 1
submitted
●weld·get_query_status
⎿DONE
●weld·get_query_result
⎿rows returned
✓Answered from Facebook Ads data in Google BigQuery
>Ask about your Facebook Ads data
Under the hood

Things to know.
Before you sync Facebook Ads.

Reverse ETL

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.
FAQ

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.

Facebook AdsSource
WeldWeld
Google BigQueryWarehouse