Blog · Connectors

Meta Ads (Facebook Ads) to Power BI: every route, what each costs, and where each breaks

Published · 18 min read

Power BI has no built-in Facebook Ads or Meta Ads connector as of September 2026. Microsoft's Power Query connector list has no Facebook or Meta entry, and the Facebook connector that Power BI Desktop once shipped was marked deprecated in 2020 and has since been removed from Microsoft's documentation. Five routes work instead. A partner connector from Windsor.ai, Supermetrics or Funnel sits in Power BI's own Get Data list and is the fastest way to a report that refreshes. Google's BigQuery Data Transfer Service has a Facebook Ads connector that lands the data in BigQuery, where Power BI's BigQuery connector reads it. Power Query can call Meta's Marketing API directly, provided someone owns the tokens, the paging and the API versions. Ads Manager exports a .csv or .xlsx file that Power BI imports by hand. TableBI is the fifth route and a different kind of answer: TableBI is not a Power BI connector, and it syncs Meta Ads (in beta) into its own store for an AI agent to query. This guide prices each route in money and in upkeep, names what each one gets wrong, and ends with three costs nobody quotes: numbers that keep moving for 28 days, a currency and time zone set per ad account, and a licence for every viewer.

Why there is no Meta tile in Get Data

Power BI's Get Data list is built by whoever chooses to build a connector. Microsoft builds some itself, such as Google Analytics and Google BigQuery; others are built and owned by their vendors. Microsoft's Power Query connector list, checked on September 26, 2026, includes Windsor, Supermetrics and Funnel, each listed under its own vendor's name, and no connector named Facebook or Meta. The Fabric Data Factory connector overview has none either.

There used to be one. An archived copy of Microsoft's Facebook connector page lists it for Power BI Desktop, the Power BI service and Excel with the release state Deprecated, on a page dated February 2020; the live page now returns a 404. Microsoft Support says import and refresh of Facebook data in Excel stopped working in April 2020. If a tutorial shows a Facebook tile in Get Data, check its date.

Route 1 — a partner connector

A partner connector is the shortest path from Meta to a Power BI report that refreshes on a schedule. You connect your Meta ad accounts inside the vendor's web app, save a query there, and Power BI reads the result. The vendor holds the Meta token and absorbs Marketing API changes, which is most of what the subscription pays for.

  • Windsor.ai ships a connector in Power BI's Get Data list, generally available and owned by Windsor according to Microsoft Learn; it imports only, and queries are built and saved in Windsor's web app first. Windsor.ai's pricing page listed Basic at $19 a month billed annually, or $23 month to month, for 3 data sources and 75 accounts as of September 2026. The Forever Free plan covers 1 data source, 1 account and only the past 30 days of data.
  • Supermetrics also ships a Get Data connector, owned by Supermetrics and listed as Preview on Microsoft Learn; queries are saved in the Supermetrics Hub. Supermetrics' pricing page sizes plans by data sources, users and accounts per data source, gives each plan one core destination with Power BI among the choices, and offers a 14-day free trial.
  • Funnel ships a generally available Get Data connector that requires a Funnel subscription, per Microsoft Learn, and loads 12 rolling months per data share by default. Funnel's pricing page lists Power BI as a reporting destination on its Business plan rather than on Starter.
  • Coupler.io and Power My Analytics sell Power BI as a destination without a tile in Microsoft's list, so the connection follows each vendor's own setup steps. Coupler.io's pricing page listed Starter at $24 a month billed annually, or $32 month to month, for 3 accounts, 1 destination, a daily refresh and 5,000 rows per run as of September 2026; a table with one row per campaign per day passes 5,000 rows at 14 campaigns over a year. Power My Analytics listed Business from $41.63 a month billed annually for 5 sources and 5 accounts in total.

What it costs: a subscription that grows with data sources and ad accounts. One brand's account fits every entry plan above; an agency's client list is the axis the price grows along, which the Windsor.ai comparison and the Supermetrics comparison break down.

What it gets wrong: the saved query quietly becomes your data policy. Without incremental refresh, every refresh reloads the whole table from the saved query, so the query's date range is both the history the report can show and the only window in which Meta's revisions get picked up. Microsoft documents a 30-minute timeout for polling query results on both the Windsor and Supermetrics connectors, and a Supermetrics connection whose Meta authorization has expired has to be reconnected in the Supermetrics Hub.

Route 2 — BigQuery Data Transfer Service, then the BigQuery connector

Google's BigQuery Data Transfer Service has a Facebook Ads connector, and BigQuery's pricing page lists it among the generally available paid connectors. It loads a fixed set of Meta reports, including AdInsights, AdInsightsActions, Campaigns, AdSets and Ads, into date-partitioned BigQuery tables once a day, according to Google's introduction to Facebook Ads transfers. Power BI then reads BigQuery through Microsoft's Google BigQuery connector, which supports Import and DirectQuery and signs in with a Google account or a service account.

The detail that matters most: the refresh window is 30 days, and it is fixed. Google says the connector retrieves data from up to 30 days back each time a transfer runs, and the window cannot be configured. That covers Meta's settling period with no setup, because Meta says its insights stop changing 28 days after they are reported.

What it costs: transfer runs are billed as consumption in slot-hours, on top of BigQuery storage and queries. What it costs in setup: a Google Cloud project with billing, a Meta developer app of the Business type, and a token. Google's Facebook Ads transfer guide says the long-lived user access token the transfer needs expires after 60 days and is renewed by editing the transfer; a Meta system user token is the alternative, and it can be created without an expiry.

What it gets wrong: custom reports aren't supported, transfers run at most once every 24 hours, a transfer that runs longer than six hours fails, and the tables arrive in Meta's own report structure, so joining insights to campaigns and ad sets is modelling work in SQL. The route suits a team that already runs BigQuery and wants Meta beside its other data; for one ad account it is a lot of cloud.

Route 3 — Meta's Marketing API from Power Query

Power Query's Web connector can call Meta's Marketing API directly. A GET request to an ad account's /insights edge with level=campaign (or adset, or ad) and time_increment=1 returns rows split by day, as JSON. It costs nothing in licence terms, and you need a Meta developer app first: Meta's authorization guide says standard access to the ads_read permission is enough for an app that manages only your own ad account, while managing other people's ad accounts needs advanced access, approved through App Review. After that, the work hides in four places.

  • Tokens that expire. Meta's access token guide says default user access tokens expire in hours, a long-lived token generally lasts about 60 days, and an expired token cannot be used to request a new long-lived one. Meta's system user documentation offers a token that never expires, next to a recommended one that lasts 60 days from generation or refresh. When a token dies, the refresh schedule dies with it: Microsoft's scheduled refresh documentation says Power BI deactivates a schedule after four consecutive failures, or at once on errors such as invalid or expired credentials.
  • Paging. Results come back a page at a time. Meta's pagination guide uses cursors, marks the last page by leaving out the next link, and warns that cursors go stale quickly. In M, that is a loop you write and test yourself.
  • Rate limits and big requests. Meta's rate-limiting page sets the Ads Insights budget per ad account per hour at 600 for an app in the development tier (190,000 with full Ads API access), plus 400 per active ad, minus a small charge for user errors. Meta's insights best practices warn that synchronous requests can time out and point large pulls at asynchronous report jobs, which can take up to an hour.
  • API versions. Every request names a version. Meta's versioning policy keeps the previous Marketing API version working for at least 90 days after a new one ships, after which calls to it may fail or be upgraded. Meta's version table shows Marketing API v24.0 expiring on October 6, 2026.

Then there is the Power BI service. A query that builds its URL from values returned by another call is a dynamic data source, and Microsoft says those usually can't be refreshed in the service, with exceptions for queries that keep a static base URL and pass everything else through the RelativePath and Query options of Web.Contents. So following Meta's ready-made next links works in Desktop and usually can't be refreshed once published, while passing the after cursor through Query keeps the base URL static. Web.Contents also has an ApiKeyName option that keeps the token in a Web API credential instead of in the M code, but Microsoft says that credential type isn't supported in the Power BI service, so a report that has to refresh after publishing can't rely on it. The fully supported alternative is a custom connector built with the Power Query SDK, and refreshing a custom connector in the service takes an on-premises data gateway.

Verdict: workable for one engineer and a handful of your own ad accounts, with a system user token and a static base URL. It is the only route with no vendor in the middle, and the one with the most ways to break.

Route 4 — an Ads Manager export

Every Ads Manager report can be exported. Meta's help page on exporting reports from Ads Reporting lists .xlsx and .csv files or a shareable link, with a maximum reporting window of 37 months. Break the report down by day first (the Breakdown menu, then By time, in Meta's breakdown guide) so each row carries one date, and add the ad set name when you need ad set rows. Power BI imports the file directly, or combines a folder of exports through its SharePoint folder connector.

Meta's scheduled option is built for people, not pipelines. Ads Reporting can email a recurring report, but only for single-account reports, and Meta notes that only people with permissions on the ad account can access the report.

What it costs: nothing but time. What it gets wrong: every file is a snapshot, so an export taken on a Monday understates days that are still settling. Microsoft asks for every file in a combined folder to share one schema, so a column added to the report halfway through the year can break the combine step. The recurring version of this route is a person repeating the export every reporting cycle.

The five routes, side by side

RouteMoney costSetupUpkeepGrainWhat bites
Partner connector (Windsor.ai, Supermetrics, Funnel, Coupler.io, Power My Analytics)Subscription by data sources and accounts; Windsor.ai from $19 and Coupler.io from $24 a month, billed annually (September 2026)Minutes to an hourLow: renewals, plan limits, reconnecting Meta when its authorization expiresWhatever fields the vendor exposesThe saved date range is also the revision window; 30-minute polling timeout on Windsor and Supermetrics; Supermetrics' connector is in Preview
BigQuery Data Transfer Service + BigQuery connectorPaid connector billed in slot-hours, plus BigQuery storage and queriesHours to days: Cloud project, Meta Business app, token, datasetToken renewal every 60 days unless a system user token never expires; SQL modellingMeta's report tables, down to ad sets and adsFixed tables, no custom reports; one run a day at most; a 30-day window you can't change
Marketing API from Power QueryFree in licence termsDays to weeks of engineeringTokens, paging, rate limits and version bumps, owned by youAccount, campaign, ad set or adDynamic data sources usually don't refresh in the service; an expired token switches the schedule off
Ads Manager exportFreeMinutesA person, every reporting cycleWhatever the report includesA snapshot with no refresh; a schema change can break a combined folder
TableBI (not a Power BI connector)Free for one source and one live dashboard; Operator $29 a month, by requestMinutes; Meta Ads in beta, for people added to our Meta app as test usersNone for the pipeline; the latest 28 days re-pulled on refreshCampaign by day live; ad set from an uploaded exportDoes not feed Power BI; no currency conversion across ad accounts

The costs nobody quotes

Every route above moves rows. These three costs decide whether anyone trusts the rows, and none of them appears on a connector's pricing page.

1. The last 28 days are still moving

Meta credits a purchase on your website to an ad that was clicked or seen before it: actions taken off your ad are attributed back to it if they happen within a set number of days, according to Meta's page on attributed actions, which adds that Ads Manager shows them under each ad set's attribution setting. Meta's attribution settings page lists click-through windows of 1 or 7 days after a link click and a view-through window of 1 day after an impression. The Marketing API's action_report_time parameter decides which day a conversion lands on, and reported at impression time, a purchase made today raises an earlier day's numbers. Meta's insights best practices give the end date: insights refresh every 15 minutes and do not change after 28 days of being reported. Meta's insights reference describes spend itself as an estimated metric.

So any copy of the last 28 days goes stale in place. A Power BI import that re-pulls at least 28 days on every refresh picks up the revisions. An incremental refresh policy only refreshes rows inside its refresh period, per Microsoft's incremental refresh documentation, so for Meta that period needs to be at least 28 days. Two more changes sit in the same place: since January 12, 2026 the API no longer returns 7-day and 28-day view-through windows, according to Meta's announcement, and Meta warns that results can't be compared across ad sets that use different attribution models.

2. Currency and time zone belong to the ad account

Each Meta ad account has one currency and one time zone, and neither is a report setting. Meta's insights reference returns an account_currency field, the currency used by the ad account, and counts today's spend from midnight in the ad account's time zone. Changing an ad account's time zone closes the account and creates a new one, per Meta's time zone help page, which also says new ad accounts default to Pacific Standard Time. Changing currency is allowed once every 60 days when there is no outstanding balance, and it also creates a new ad account, per Meta's currency help page.

That leaves three jobs for whoever owns the Power BI model. Spend summed across accounts in different currencies is a number with no meaning, so the model needs a conversion policy. A currency or time zone change splits one advertiser's history across two ad account IDs, so the model needs a mapping between them. And Power BI's incremental refresh decides what "today" is in UTC unless a time zone is configured, per Microsoft, while each Meta account ends its day at its own midnight.

3. Every viewer needs a licence

Power BI Pro costs $14.00 per user per month, paid yearly, on Microsoft's Power BI pricing page as of September 2026. The free account is for your own reports: Microsoft's licence guide says free users can't share or collaborate, and can view shared content only when it sits in a Premium capacity or a Fabric F64 or larger capacity. Publish to web removes the licence question by removing security: Microsoft warns that anyone on the internet can view the report without authentication, including detail-level data in the model that the report doesn't display. An agency showing Meta spend to ten client contacts therefore buys ten more Pro licences, $140 a month at list price, or a capacity; the agency reporting guide runs the same numbers.

The fifth route: TableBI, which is not a Power BI connector

TableBI is not a Power BI data source and has no Power BI connector, so it does not get Meta data into Power BI. TableBI replaces the Power BI step for recurring questions instead: it syncs Meta Ads into its own store, an AI agent such as Claude Code queries that store in read-only SQL from the terminal, and any answer can be pinned to a public, read-only dashboard URL that refreshes itself. If the destination has to be a Power BI report, routes 1 to 4 are the options.

Meta Ads is in beta. TableBI's Meta app has not passed Meta's App Review, so today only people added to the app as test users can authorize it; that is the standard-access limit from route 3, applied to our app rather than yours. The live connector syncs one row per campaign per day: spend, impressions, clicks, conversions and conversion value. It has no ad set, ad or placement split, and nothing is installed on your website.

terminal
# install the CLI, then plant the skill your agent reads
npm i -g @tablebi/cli
tablebi login
tablebi install

# a browser opens for Meta sign-in; with several ad accounts, add --account act_…
tablebi connect meta_ads

# which sources are connected, and the date each one runs through
tablebi sources

The first sync pulls the last 90 days by default, and --days asks for more. After that, every refresh re-pulls the latest 28 days instead of appending yesterday, which is the settling window from the first cost above. Every answer carries a trust block: the date each source runs through, plus caveats, including that Meta's recent results are still being revised. Spend is stored in each ad account's own currency, and TableBI does not convert currencies, so compare accounts in different currencies side by side rather than summed.

claude code → tablebi
# campaign spend, conversions and ROAS over the latest 28 days of Meta data
tablebi ask "SELECT campaign, SUM(cost) AS spend, SUM(conversions) AS conversions,
             roas(SUM(conversion_value), SUM(cost)) AS roas
             FROM facts
             WHERE platform = 'meta_ads'
               AND date > (SELECT MAX(date) FROM facts WHERE platform = 'meta_ads') - 28
             GROUP BY campaign ORDER BY spend DESC LIMIT 25"

# one row per ad account: each total stays in that account's currency
tablebi ask "SELECT account, SUM(cost) AS spend,
             roas(SUM(conversion_value), SUM(cost)) AS roas
             FROM facts
             WHERE platform = 'meta_ads'
               AND date > (SELECT MAX(date) FROM facts WHERE platform = 'meta_ads') - 28
             GROUP BY account ORDER BY spend DESC"

The window anchors on MAX(date) of the Meta rows, the newest day actually synced, rather than on the calendar. roas() and cpa() are definition macros, so the ratio is computed the same way in every answer. The raw layer, meta_ads_raw, keeps Meta's own fields beside the shared ones, reach and frequency included.

Ad set, ad and placement cuts come from an Ads Manager export instead. Upload it under a label of its own, such as meta_ads_adsets, and TableBI maps an Ad set name column onto ad_group in facts, keeps every column of the file in meta_ads_adsets_raw, placement included, and reports which columns it matched; check that spend matched when the spend column names a currency other than USD. A new upload under the same label replaces the previous one, so export the whole period you want to keep.

claude code → tablebi
# an Ads Manager export broken down by day, with an Ad set name column
tablebi connect csv --file meta-ads-export.csv --platform meta_ads_adsets

# ad sets by spend, from the uploaded rows
tablebi ask "SELECT campaign, ad_group AS ad_set, SUM(cost) AS spend,
             cpa(SUM(cost), SUM(conversions)) AS cpa
             FROM facts
             WHERE platform = 'meta_ads_adsets'
             GROUP BY campaign, ad_group ORDER BY spend DESC LIMIT 25"

The label of its own is what keeps the two apart when the same account is also connected live: the connector's campaign rows stay under meta_ads and the export's ad set rows under theirs, so you compare them rather than add them together.

Connect Google Ads as well, and the comparison that Power BI would need a second connector and a shared date table for is one statement:

claude code → tablebi
# Meta next to Google Ads, one definition of ROAS
tablebi ask "SELECT platform_label(platform) AS channel, SUM(cost) AS spend,
             roas(SUM(conversion_value), SUM(cost)) AS roas
             FROM facts
             WHERE platform IN ('meta_ads', 'google_ads')
               AND date > (SELECT MAX(date) FROM facts) - 28
             GROUP BY platform ORDER BY spend DESC"

Each platform still attributes conversions its own way, so cross-platform ROAS is a steering signal rather than a reconciled number, and the trust block says so whenever two or more conversion sources are connected. The long version is in blended ROAS.

Pin the answer to a live URL

When a view is worth keeping, tablebi pin stores the query rather than a snapshot and publishes a public, read-only URL that refreshes itself as Meta syncs. Viewers open the link without a login or a Power BI licence; anyone holding the link can see it, so it suits numbers you would put in a client email.

claude code → tablebi
tablebi pin --title "Meta Ads, latest 28 days" \
  --widget "Daily spend::line=SELECT date, SUM(cost) AS spend FROM facts WHERE platform = 'meta_ads' AND date > (SELECT MAX(date) FROM facts WHERE platform = 'meta_ads') - 28 GROUP BY date ORDER BY date" \
  --widget "Campaign ROAS=SELECT campaign, roas(SUM(conversion_value), SUM(cost)) AS roas FROM facts WHERE platform = 'meta_ads' AND date > (SELECT MAX(date) FROM facts WHERE platform = 'meta_ads') - 28 GROUP BY campaign ORDER BY roas DESC LIMIT 10"
# prints the dashboard's public URL, e.g. https://acme.tablebi.com/d/dsh_…

TableBI connects Meta Ads (beta) alongside Google Search Console, GA4 and Google Ads, which are live, and CSV upload. Nothing else connects. TableBI has no white-label reports, no scheduled PDF or email delivery and no alerts, so a report that must carry a client's logo or arrive by email belongs in another tool.

Which route should you pick

Power BI is a serious tool, and one awkward source is no reason to leave it. A straight read:

  • A partner connector when the report must live in Power BI, the account count is small, and a subscription costs less than an engineer's week. Save the query with a date range of at least 28 days.
  • BigQuery Data Transfer Service when the company already runs BigQuery, wants Meta's ad set and ad tables next to its other data, and has someone who owns a Cloud project and a Meta app.
  • The Marketing API from Power Query when there is one engineer, a few of your own ad accounts, a system user token and no budget for a vendor, and the engineer accepts paging, rate limits and version bumps as permanent work.
  • An Ads Manager export for a one-off answer, never for a recurring report.
  • TableBI when the recurring question is how Meta and the other channels did, the reader is an AI agent or someone holding a link, and nobody needs a Power BI canvas, with the understanding that TableBI does not feed Power BI and its Meta connector is in beta.

The same problem for the other sources in this series: Google Ads to Power BI, GA4 to Power BI and Google Search Console to Power BI. For Meta in Looker Studio instead, see connecting Facebook Ads to Looker Studio; for the weekly Meta workflow itself, Meta ads reporting without the spreadsheet grind.

FAQ

Does Power BI have a Facebook Ads connector?

No. Microsoft's Power Query connector list has no Facebook or Meta Ads connector as of September 2026, and Power BI's old Facebook connector was marked deprecated in 2020. Partner connectors from Windsor.ai, Supermetrics and Funnel appear in Power BI's Get Data list, but each is owned by its vendor and needs an account with that vendor.

Can I connect Facebook Ads to Power BI for free?

Partly. Exporting a .csv or .xlsx file from Ads Manager and importing it into Power BI Desktop costs nothing, but it never refreshes. Windsor.ai's Forever Free plan covers 1 data source, 1 account and the past 30 days of data, as of September 2026. Sharing is where the bill starts: Power BI Pro is $14.00 per user per month, paid yearly, and viewers need a paid licence unless the workspace runs on a Premium capacity or a Fabric F64 or larger capacity, or the report is made public with Publish to web.

What happened to the Facebook connector in Power BI?

Microsoft deprecated it. An archived copy of Microsoft's documentation lists the Facebook connector for Power BI Desktop, the Power BI service and Excel with the release state Deprecated, on a page dated February 2020. Microsoft Support says import and refresh of Facebook data in Excel stopped working in April 2020, and the documentation page no longer exists.

Can I use the Facebook Marketing API in Power BI without a connector?

Yes, through Power Query's Web connector, but you own the hard parts: a token that expires unless it is a non-expiring system user token, cursor paging, per-account rate limits, and API versions that Meta retires. To refresh in the Power BI service, keep a static base URL and pass the rest through the RelativePath and Query options of Web.Contents, or build a custom connector and refresh it through an on-premises data gateway.

Why don't my Facebook Ads numbers in Power BI match Ads Manager?

Usually timing or settings. Meta says insights keep changing until 28 days after they are reported, so a copy made earlier falls behind. Ads Manager shows conversions under each ad set's attribution setting, and an API query can report a conversion on the day of the impression or on the day of the conversion. Currency and time zone come from each ad account, while Power BI's incremental refresh counts days in UTC unless you set a time zone.

Can TableBI send Meta Ads data to Power BI?

No. TableBI is not a Power BI data source and has no Power BI connector. TableBI syncs Meta Ads (in beta, open to people added to its Meta app as test users until Meta’s App Review) into its own store at campaign level; an AI agent queries that store in read-only SQL, and any answer can be pinned to a public, read-only dashboard URL that refreshes itself.

Sources

Try it

Search Console, GA4 and Google Ads live, Meta Ads in beta, CSV by upload: in your agent today, with no BigQuery project and no licence per viewer.

terminal
npm i -g @tablebi/cli && tablebi install