Connect Meta Ads (Facebook Ads) to Claude

The Windsor.ai connector for Claude links your Meta Ads account, Facebook and Instagram campaigns included, to Claude in one click from Claude’s directory. Ask for spend, ROAS, CPA, CTR and conversions in plain language, and create, pause or re-budget campaigns from the chat, with your approval before every change.

It works in Claude, Claude Desktop and Claude Code, and the same connector brings Google Ads, GA4, Shopify and 350+ other sources into the same conversation. Meta’s own Meta Ads AI connector is covered below as well, so you can pick the route that fits.

No CSVs, no copy and paste, no code.

Free forever plan No credit card needed
logo connect
Join over 19,000+ businesses that trust Windsor.ai to connect Facebook Ads to Claude
audi logo
colgate
asics
roche
novo nordisk logo
UBS
unicef
verisure
wpp
club med
skoda
heineken
puma
audi logo
colgate
asics
roche
novo nordisk logo
UBS
unicef
verisure
wpp
club med
skoda
heineken
puma

Which one do I need?

All four methods below get your Meta Ads (Facebook Ads) data in front of Claude. They differ in freshness, setup, whether Claude can also act on your campaigns, and whether the data can go anywhere other than the chat.

“Best for” leads so you can jump straight to the column that matches your situation.

Windsor.ai Meta’s official connector Manual CSV upload Automation platforms
Best for Live analysis and campaign management, with Meta next to your other channels Meta Ads only, straight from Meta A single one-off question Scheduled pulls into spreadsheets
Live data Yes, queried at prompt time Yes, queried at prompt time No, static snapshot Close, on a schedule
Cross-channel analysis Yes, 350+ sources No, Meta Ads only Only what you upload Limited, via Sheets
Campaign management (write) Yes: create, pause, budget, each change confirmed by you Yes: create, edit, pause; created items land paused No No
Setup One click from Claude’s directory Custom connector: paste the server URL, sign in with Facebook None, but repeated every report Medium
On the free Claude plan Works, no custom connector slot used Works, uses the plan’s single custom connector slot Works Works
Data outside Claude 25+ BI and warehouse destinations from the same connection None The file you exported The Sheet

Meta’s official connector is a real option if Meta Ads is the only channel you need in Claude; what it does and where it stops is in Method 4. Building something custom on the Marketing API is a developer task and sits outside these four.

Method 1

Windsor.ai for live analysis and campaign management

Windsor.ai connects your Meta Ads account to Claude through Windsor MCP in about a minute, with no code. Claude queries your live spend, ROAS, CPA, CTR, and conversion data at prompt time, and Windsor’s write actions let it create, pause, and re-budget campaigns from the same conversation, always with your explicit confirmation before any change. The same connector works in Claude Desktop and in Claude Code (install the Windsor.ai plugin from the terminal), so the setup below covers all three.

Skip CSV exports and manual formatting, get clean, ready-to-use answers straight in Claude
Normalises Meta Ads alongside 350+ other connectors so Claude can analyse across sources in one conversation
Tracks frequency and CTR trends at the creative level to catch ad fatigue early
Creates, pauses, and re-budgets campaigns from chat, with your approval before every change

What it can do

  • Query live Meta Ads performance, spend, ROAS, CPA, CTR, conversions, across one or many ad accounts
  • Blend Meta Ads with GA4, Google Ads, Shopify, CRM and billing data in the same conversation
  • Manage campaigns from Claude: create campaigns and ad sets, boost posts, pause or enable, set budgets, with your confirmation first
  • Pull custom Facebook Pixel conversions and full breakdowns (age, gender, geo, placement, device)

What it can't do

  • Design net-new ad creatives, boosting reuses an existing post's creative
  • Manage Instagram organic content, that's the separate Instagram connector (Instagram Ads are included here)

Setup takes about a minute

1
Connect Meta Ads to Windsor

Go to onboard.windsor.ai/app/facebook, grant access and authorise via Meta's OAuth. This pulls campaigns, ad sets, ads, creatives and conversions, with custom Pixel conversions detected automatically.

2
Add the Windsor MCP connector to Claude

In Claude, open Customize, then Connectors, search for Windsor and click Add. Sign in to your Windsor.ai account when prompted, and the connector appears in your Connectors list. You can also open the Windsor.ai listing in the Claude directory (https://claude.ai/directory/360c0c31-4bb6-42ca-8e50-5da0a100a68e) and click Connect.

3
Ask questions, or give instructions

Open a new chat and query your Meta Ads data in plain language, or tell Claude to pause, boost, or re-budget something and approve the change it proposes.

No code, API calls, or custom pipelines required. Runs on Windsor MCP for Claude.

See the 60-second setup

A walkthrough of connecting Meta Ads to Claude through Windsor.ai.

What data is available

Meta Ads level Key fields What Claude can do with it
Campaign / ad set / ad performance spend, impressions, clicks, ctr, cpc, cpm, frequency, reach Performance reports, WoW/MoM comparisons, scaling decisions
Conversions & revenue actions_purchase, action_values_purchase, actions_offsite_conversion_fb_pixel_purchase ROAS and CPA analysis, funnel drop-off detection
Custom Pixel conversions custom_conversion_action_name, custom_conversion_id, custom_conversion_rule, counts and values Reporting on your own conversion definitions
Breakdowns age, gender, geo, placement, device Audience and placement optimisation
Creative performance ad_name, creative fields, outbound_clicks, outbound_clicks_ctr Fatigue detection, winning-angle analysis
Write actions campaigns, ad sets, ads, budgets, boosted posts Acting on the analysis without leaving Claude

Queried live against the Meta Ads API, so there is no fixed sync schedule or cache delay. Full list in the Facebook Ads field reference.

Example prompts

Performance reporting

Summarize my Facebook Ads performance for the last 30 days by campaign. Include spend, impressions, clicks, CTR, CPC, conversions, CPA, and ROAS. Highlight the top 3 and bottom 3 campaigns by ROAS.
Break down performance over the last 30 days by audience (age, gender, geo) and placement/device. Show which segments have the lowest CPA and highest ROAS, and recommend targeting and placement changes.

Budget and scaling

Calculate my Return on Ad Spend by dividing action_values_purchase by spend across all active campaigns over the last 30 days. Correlate the top 3 highest-ROAS campaigns with their frequency and cpm metrics to tell me if I have room to scale the budget without exhausting the audience.
Based on the last 30 days, recommend how to reallocate the budget across campaigns and ad sets to improve overall ROAS. Specify what to scale, what to pause, and what to test next.
Review all ad sets where spend is over $500 this week. Identify any where the cost per purchase is 20% higher than my account average, and tell me if the drop in efficiency stems from a rising cpc or a drop in website conversion rate.

Creative and ad fatigue

Break down the outbound_clicks_ctr by ad_name. Look at my top 5 ads: what common themes, formats, or primary text keywords are driving the highest volume of outbound_clicks at the lowest cost_per_outbound_click?
Identify ad fatigue in my Meta Ads over the last 14 days vs the previous 14 days, at the ad and creative level. Flag ads where frequency is up and at least two of these worsened: CTR down, CPC up, CPA up, conversion rate down, ROAS down. Recommend next actions for each flagged ad.
Identify my top 10 ads by ROAS from the last 30 days. Summarize what likely makes each work (hook, offer, audience fit, CTA, tone), then generate 15 new ad copy variations inspired by these winners, labeled by angle.

Conversions and tracking

Analyze the daily trend between link_clicks and actions_offsite_conversion_fb_pixel_purchase for this month. Are there specific days of the week where the conversion rate drops significantly despite stable impressions and spend, indicating a potential tracking drop-off?
Show me performance for my custom Facebook Pixel conversions over the last 30 days. Break down by custom conversion name and include spend, conversions, CPA, and ROAS.

True ROAS

Calculate true ROAS across all my Meta Ads accounts for the last 30 days. Use Meta spend and Shopify revenue attributed to Meta (utm_source/utm_medium). Show total spend, attributed revenue, ROAS, and a daily trend table.

Campaign management (write actions)

Act as a senior media buyer. Based on the current spend, cpc, and purchase data across the whole account, give me a prioritized, 3-step optimization plan, and pause the ads suffering from fatigue after I confirm.
Pause every ad set with a CPA above my 30-day account average and frequency above 4. Show me the list and wait for my approval before pausing anything.

Cross-channel questions to ask next

  • Which Meta campaigns produce revenue in GA4 or Shopify, not just link clicks
  • How Meta CPAs compare with Google Ads on the same conversion
  • Whether rising frequency on Meta correlates with falling branded search demand
  • Blended ROAS across Meta and LinkedIn Ads for the same launch
Method 2

Manual CSV export and upload

The zero-setup route: export a report from Meta Ads Manager as a CSV and upload it into a Claude conversation. For a single question about a fixed period, this works fine on any Claude plan.

What it can do

  • One-off analysis with no account connection or new tools
  • Works on any Claude plan, including free
  • Good enough for a fixed-period question you will not repeat

What it can't do

  • Stay current, the data is a static snapshot that goes stale the moment you export it
  • Avoid repeat work, every follow-up period means another export and upload
  • Handle big accounts well, file-size and row limits arrive fast
  • Act on campaigns, Claude can only read what you uploaded

How: Ads Manager, Reports, Export table data as CSV, then drag the file into Claude and ask your question.

Method 3

Automation platforms

Workflow automation platforms can pull Meta Ads data into Google Sheets on a schedule, and Claude reads the Sheet. This suits teams that want a spreadsheet that stays roughly current without manual exports, or an event-triggered workflow where Meta Ads is one step among several tools. It is a different job from Methods 1 and 2: those answer questions on demand, this keeps a copy of the data flowing on a timer.

What it can do

  • Scheduled refreshes into a Sheet the whole team can also use
  • Trigger actions off events as one step in a broader workflow spanning other tools

What it can't do

  • Deliver truly live numbers, you get whatever the last scheduled run pulled
  • Run itself, workflow maintenance is on you and broken runs fail without warning
  • Manage campaigns from Claude, and Sheets caps how much history fits
Method 4

Meta's official Meta Ads AI connector

Meta launched Meta Ads AI Connectors on 29 April 2026, in open beta. For Claude it is a remote MCP server (mcp.facebook.com/ads) that you add as a custom connector: open Customize, then Connectors, click +, choose Add custom connector, paste the URL, sign in with your Facebook login and choose the ad accounts to allow. Custom connectors work on every Claude plan; the free plan allows one.

It exposes 29 tools: performance at account, campaign, ad set and ad level with breakdowns, a summary of your account for context, trend and anomaly signals, industry and auction benchmarks, delivery-error sweeps, pixel and dataset health, catalog browsing and diagnostics, and creating or updating campaigns, ad sets and ads. Anything Claude creates through it lands paused until you activate it.

What it can do

  • Everything Meta exposes, straight from Meta, at no cost during the open beta
  • Read and write on your Meta accounts, with created items paused by default
  • Benchmarks, anomaly signals and pixel diagnostics that only Meta can provide

What it can't do

  • See any other channel, so no blending with Google Ads, GA4 or Shopify in one answer
  • Send data anywhere but the chat, no BI tool, warehouse or scheduled report
  • Limit what Claude sees, it inherits everything your Facebook login can reach, including client accounts
  • Leave your free plan's custom connector slot free, it uses the one you have

Choose it when Meta Ads is the only channel you need in Claude. If you also want Google Ads, GA4 or Shopify next to it, or the same data in a BI tool, Method 1 does that from one connection. Need something neither covers? Meta’s Marketing API with a custom MCP server is the developer route, with auth, token refresh and rate limits on you. The two connector routes are compared step by step in how to connect Meta Ads to Claude.


Available actions


Create Ad Set Create a new ad set in an existing Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. Budget amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget; omit both only when the campaign uses campaign budget optimization. lifetime_budget requires end_time. Some optimization goals require promoted_object, a Meta spec naming what is optimized (e.g. {"pixel_id": "<id>", "custom_event_type": "PURCHASE"} for conversions, or {"page_id": "<id>"} for page likes). destination_type sets where the ad sends people; for boosting an existing post (boost_post) use ON_POST with optimization_goal POST_ENGAGEMENT to keep engagement on the post (no call to action needed). A website or undefined destination instead makes Meta require a website URL and call to action in the creative. bid_strategy defaults to the campaign setting; use LOWEST_COST_WITHOUT_CAP for an uncapped ad set, and pass bid_amount with a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP). Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Create a new ad set in an existing Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. Budget amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget; omit both only when the campaign uses campaign budget optimization. lifetime_budget requires end_time. Some optimization goals require promoted_object, a Meta spec naming what is optimized (e.g. {"pixel_id": "<id>", "custom_event_type": "PURCHASE"} for conversions, or {"page_id": "<id>"} for page likes). destination_type sets where the ad sends people; for boosting an existing post (boost_post) use ON_POST with optimization_goal POST_ENGAGEMENT to keep engagement on the post (no call to action needed). A website or undefined destination instead makes Meta require a website URL and call to action in the creative. bid_strategy defaults to the campaign setting; use LOWEST_COST_WITHOUT_CAP for an uncapped ad set, and pass bid_amount with a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP). Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Parameters
campaign_idstringRequirednamestringRequiredoptimization_goalstringRequiredbilling_eventstringRequiredtargetingobjectRequireddaily_budgetstringlifetime_budgetstringbid_amountstringbid_strategystringdsa_beneficiarystringdsa_payorstringregional_regulated_categoriesstringregional_regulation_identitiesstringend_timestringpromoted_objectstringdestination_typestringstatusstringextra_paramsstring
Create Campaign Create a new Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. objective is a Meta campaign objective (e.g. OUTCOME_TRAFFIC, OUTCOME_LEADS, OUTCOME_SALES). special_ad_categories must list any regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or be empty. Setting a campaign budget enables campaign budget optimization; amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget. When no campaign budget is set, some accounts require is_adset_budget_sharing_enabled to be specified.

Create a new Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. objective is a Meta campaign objective (e.g. OUTCOME_TRAFFIC, OUTCOME_LEADS, OUTCOME_SALES). special_ad_categories must list any regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or be empty. Setting a campaign budget enables campaign budget optimization; amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget. When no campaign budget is set, some accounts require is_adset_budget_sharing_enabled to be specified.

Parameters
namestringRequiredobjectivestringRequiredspecial_ad_categoriesarraydaily_budgetstringlifetime_budgetstringbid_strategystringis_adset_budget_sharing_enabledstringstatusstring
Create Ad Create a new ad in an existing Meta Ads ad set (Facebook or Instagram). Created paused by default so it does not spend until enabled. The simplest way is to provide page_id and link plus optional text (message, headline, description), image_url or image_hash (from create_ad_image) and call_to_action_type; these build a single-image link ad creative automatically. For a Click-to-Message ad, set messaging_destination (MESSENGER or INSTAGRAM_DIRECT) instead of link; the message opens a conversation with the page. For a video ad, upload the video first with create_ad_video and pass its video_id here with page_id and a required thumbnail image_url or image_hash; message becomes the primary text, headline the title, description the caption, and call_to_action_type (with link) adds a button. For advanced cases, pass a full Meta creative spec via creative instead (e.g. {"creative_id": "<id>"} to reuse an existing creative, or {"object_story_spec": {...}}). Provide either the individual creative fields or creative, not both.

Create a new ad in an existing Meta Ads ad set (Facebook or Instagram). Created paused by default so it does not spend until enabled. The simplest way is to provide page_id and link plus optional text (message, headline, description), image_url or image_hash (from create_ad_image) and call_to_action_type; these build a single-image link ad creative automatically. For a Click-to-Message ad, set messaging_destination (MESSENGER or INSTAGRAM_DIRECT) instead of link; the message opens a conversation with the page. For a video ad, upload the video first with create_ad_video and pass its video_id here with page_id and a required thumbnail image_url or image_hash; message becomes the primary text, headline the title, description the caption, and call_to_action_type (with link) adds a button. For advanced cases, pass a full Meta creative spec via creative instead (e.g. {"creative_id": "<id>"} to reuse an existing creative, or {"object_story_spec": {...}}). Provide either the individual creative fields or creative, not both.

Parameters
adset_idstringRequirednamestringRequiredpage_idstringlinkstringmessagestringheadlinestringdescriptionstringimage_urlstringimage_hashstringcall_to_action_typeenumvideo_idstringmessaging_destinationstringcreativestringstatusstring
Update Campaign Update editable attributes of a Meta Ads campaign (Facebook or Instagram). Provide only the fields to change; at least one is required. spend_cap is a lifetime spend limit in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. special_ad_categories lists the regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or is empty. Use pause_campaign/enable_campaign to change status and set_campaign_budget to change the budget. objective is fixed at creation and cannot be updated.

Update editable attributes of a Meta Ads campaign (Facebook or Instagram). Provide only the fields to change; at least one is required. spend_cap is a lifetime spend limit in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. special_ad_categories lists the regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or is empty. Use pause_campaign/enable_campaign to change status and set_campaign_budget to change the budget. objective is fixed at creation and cannot be updated.

Parameters
campaign_idstringRequirednamestringbid_strategystringspecial_ad_categoriesstringspend_capstring
Update Ad Set Update editable attributes of a Meta Ads ad set (Facebook or Instagram). Provide only the fields to change; at least one is required. bid_amount is in the account currency minor unit (e.g. cents: 500 means 5.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Switching bid_strategy to a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP) requires bid_amount in the same call. end_time is an ISO 8601 timestamp less than one year ahead (e.g. 2027-01-01T00:00:00-0800). Use pause_adset/enable_adset to change status and set_adset_budget to change the budget. Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Update editable attributes of a Meta Ads ad set (Facebook or Instagram). Provide only the fields to change; at least one is required. bid_amount is in the account currency minor unit (e.g. cents: 500 means 5.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Switching bid_strategy to a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP) requires bid_amount in the same call. end_time is an ISO 8601 timestamp less than one year ahead (e.g. 2027-01-01T00:00:00-0800). Use pause_adset/enable_adset to change status and set_adset_budget to change the budget. Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Parameters
adset_idstringRequirednamestringtargetingstringoptimization_goalstringbid_amountstringbid_strategystringdestination_typestringdsa_beneficiarystringdsa_payorstringregional_regulated_categoriesstringregional_regulation_identitiesstringend_timestringextra_paramsstring
Pause Campaign Pause an active Meta Ads campaign (Facebook or Instagram). Reversible via enable_campaign.

Pause an active Meta Ads campaign (Facebook or Instagram). Reversible via enable_campaign.

Parameters
campaign_idstringRequired
Set Campaign Budget Set the daily or lifetime budget of a Meta Ads campaign (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta rejects frequent budget changes on the same campaign; space out repeated changes instead of adjusting in rapid succession.

Set the daily or lifetime budget of a Meta Ads campaign (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta rejects frequent budget changes on the same campaign; space out repeated changes instead of adjusting in rapid succession.

Parameters
campaign_idstringRequiredbudget_typestringRequiredamountintegerRequired
Enable Campaign Activate a paused Meta Ads campaign (Facebook or Instagram). Reversible via pause_campaign.

Activate a paused Meta Ads campaign (Facebook or Instagram). Reversible via pause_campaign.

Parameters
campaign_idstringRequired
Enable Ad Activate a paused Meta Ads ad (Facebook or Instagram). Reversible via pause_ad.

Activate a paused Meta Ads ad (Facebook or Instagram). Reversible via pause_ad.

Parameters
ad_idstringRequired
Enable Ad Set Activate a paused Meta Ads ad set (Facebook or Instagram). Reversible via pause_adset.

Activate a paused Meta Ads ad set (Facebook or Instagram). Reversible via pause_adset.

Parameters
adset_idstringRequired
Pause Ad Pause an active Meta Ads ad (Facebook or Instagram). Reversible via enable_ad.

Pause an active Meta Ads ad (Facebook or Instagram). Reversible via enable_ad.

Parameters
ad_idstringRequired
Update Ad Creative Edit the creative of an existing Meta Ads ad (Facebook or Instagram): ad copy (message), headline, description, destination link, image, call-to-action button, URL tracking tags and Advantage+ enhancement settings. Meta treats ad creatives as immutable, so this copies the ad's current creative (keeping its name, url_tags and degrees_of_freedom_spec), applies the changes, creates the result as a new creative and re-points the ad at it; the ad keeps its id, but the returned creative id is new. Provide ad_id plus at least one field to change. Editable content fields depend on the creative's media type: link ads support all of them; video ads support message, headline, description, image_url (thumbnail), link and call_to_action_type (the link lives on the button, so adding a link to a video ad without a button also requires call_to_action_type); photo ads only message (the caption) and image_url; text ads only message. For carousel ads (link ads with cards), message edits the text above the cards; headline, description, link, image_url and call_to_action_type live on the cards, so also pass card_index (0-based) to edit one specific card. url_tags (e.g. 'utm_source=x&utm_medium=y') and degrees_of_freedom_spec (a raw Meta spec) can be edited on any creative, including ads that promote an existing organic post (e.g. boosted posts) — but content fields on those ads cannot be edited; edit the post itself instead. Dynamic/catalog creatives cannot be edited at all. Omitted fields keep their current values; to clear url_tags pass an empty string, and to reset degrees_of_freedom_spec to Meta's default enhancement behavior pass an empty object. To swap the ad to a different existing creative, use update_ad instead.

Edit the creative of an existing Meta Ads ad (Facebook or Instagram): ad copy (message), headline, description, destination link, image, call-to-action button, URL tracking tags and Advantage+ enhancement settings. Meta treats ad creatives as immutable, so this copies the ad's current creative (keeping its name, url_tags and degrees_of_freedom_spec), applies the changes, creates the result as a new creative and re-points the ad at it; the ad keeps its id, but the returned creative id is new. Provide ad_id plus at least one field to change. Editable content fields depend on the creative's media type: link ads support all of them; video ads support message, headline, description, image_url (thumbnail), link and call_to_action_type (the link lives on the button, so adding a link to a video ad without a button also requires call_to_action_type); photo ads only message (the caption) and image_url; text ads only message. For carousel ads (link ads with cards), message edits the text above the cards; headline, description, link, image_url and call_to_action_type live on the cards, so also pass card_index (0-based) to edit one specific card. url_tags (e.g. 'utm_source=x&utm_medium=y') and degrees_of_freedom_spec (a raw Meta spec) can be edited on any creative, including ads that promote an existing organic post (e.g. boosted posts) — but content fields on those ads cannot be edited; edit the post itself instead. Dynamic/catalog creatives cannot be edited at all. Omitted fields keep their current values; to clear url_tags pass an empty string, and to reset degrees_of_freedom_spec to Meta's default enhancement behavior pass an empty object. To swap the ad to a different existing creative, use update_ad instead.

Parameters
ad_idstringRequiredmessagestringheadlinestringdescriptionstringlinkstringimage_urlstringcall_to_action_typeenumurl_tagsstringdegrees_of_freedom_specstringcard_indexstring
Pause Ad Set Pause an active Meta Ads ad set (Facebook or Instagram). Reversible via enable_adset.

Pause an active Meta Ads ad set (Facebook or Instagram). Reversible via enable_adset.

Parameters
adset_idstringRequired
Set Ad Set Budget Set the daily or lifetime budget of a Meta Ads ad set (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta allows at most 4 budget changes per ad set per hour; further changes are rejected until the hour passes.

Set the daily or lifetime budget of a Meta Ads ad set (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta allows at most 4 budget changes per ad set per hour; further changes are rejected until the hour passes.

Parameters
adset_idstringRequiredbudget_typestringRequiredamountintegerRequired
Update Ad Update editable attributes of a Meta Ads ad (Facebook or Instagram). Provide only the fields to change; at least one is required. creative swaps the ad to a different creative and is a Meta creative reference (e.g. {"creative_id": "<id>"}). conversion_domain is the registrable domain the ad drives conversions to (e.g. example.com), used for conversion attribution. display_sequence orders the ad within a sequenced campaign. Use pause_ad/enable_ad to change status.

Update editable attributes of a Meta Ads ad (Facebook or Instagram). Provide only the fields to change; at least one is required. creative swaps the ad to a different creative and is a Meta creative reference (e.g. {"creative_id": "<id>"}). conversion_domain is the registrable domain the ad drives conversions to (e.g. example.com), used for conversion attribution. display_sequence orders the ad within a sequenced campaign. Use pause_ad/enable_ad to change status.

Parameters
ad_idstringRequirednamestringcreativestringconversion_domainstringdisplay_sequencestring
Boost Post Boost (promote) an existing organic Facebook or Instagram post by creating a paid ad for it in an existing Meta Ads ad set. Provide the full post id (in '{page_id}_{post_id}' form, as it appears in the connector data) and the ad set to place the ad in. The ad reuses the published post as its creative via object_story_id, so no new copy or media is created. The target ad set MUST belong to an engagement campaign (objective OUTCOME_ENGAGEMENT) and name the post's page in its promoted_object; build it with create_campaign and create_adset first if needed. Two ad set shapes work: an ON_POST destination with optimization_goal POST_ENGAGEMENT (engagement on the post itself, no call-to-action needed), or a FACEBOOK_PAGE destination with optimization_goal PROFILE_AND_PAGE_ENGAGEMENT, which additionally requires a call-to-action button on the ad — pass call_to_action_type (e.g. VISIT_PROFILE) for that case, otherwise Meta rejects the ad with a 'call-to-action required' error. The page promoted by the ad set and the post's page must match, and the access token must have ads permission on that page. Created paused by default so it does not spend until enabled; use enable_ad to activate it.

Boost (promote) an existing organic Facebook or Instagram post by creating a paid ad for it in an existing Meta Ads ad set. Provide the full post id (in '{page_id}_{post_id}' form, as it appears in the connector data) and the ad set to place the ad in. The ad reuses the published post as its creative via object_story_id, so no new copy or media is created. The target ad set MUST belong to an engagement campaign (objective OUTCOME_ENGAGEMENT) and name the post's page in its promoted_object; build it with create_campaign and create_adset first if needed. Two ad set shapes work: an ON_POST destination with optimization_goal POST_ENGAGEMENT (engagement on the post itself, no call-to-action needed), or a FACEBOOK_PAGE destination with optimization_goal PROFILE_AND_PAGE_ENGAGEMENT, which additionally requires a call-to-action button on the ad — pass call_to_action_type (e.g. VISIT_PROFILE) for that case, otherwise Meta rejects the ad with a 'call-to-action required' error. The page promoted by the ad set and the post's page must match, and the access token must have ads permission on that page. Created paused by default so it does not spend until enabled; use enable_ad to activate it.

Parameters
adset_idstringRequiredpost_idstringRequirednamestringRequiredcall_to_action_typestringstatusstring
Set Page Welcome Message Set or update the automated welcome message (greeting / ice breaker) shown when a user opens the conversation from a Meta Ads Click-to-Message ad (Messenger or Instagram, OUTCOME_ENGAGEMENT / CONVERSATIONS). The welcome message lives on the ad creative, which Meta treats as immutable, so this builds a new creative that copies the ad's existing creative and only swaps the welcome message, then re-points the ad at it. Provide ad_id plus either welcome_message (plain greeting text, the common case) or welcome_message_spec (a full page_welcome_message structure for ice breakers / quick replies), not both. The change is verified by reading the new creative back; the action fails if Meta did not persist the value.

Set or update the automated welcome message (greeting / ice breaker) shown when a user opens the conversation from a Meta Ads Click-to-Message ad (Messenger or Instagram, OUTCOME_ENGAGEMENT / CONVERSATIONS). The welcome message lives on the ad creative, which Meta treats as immutable, so this builds a new creative that copies the ad's existing creative and only swaps the welcome message, then re-points the ad at it. Provide ad_id plus either welcome_message (plain greeting text, the common case) or welcome_message_spec (a full page_welcome_message structure for ice breakers / quick replies), not both. The change is verified by reading the new creative back; the action fails if Meta did not persist the value.

Parameters
ad_idstringRequiredwelcome_messagestringwelcome_message_specstring
Create Ad Video Upload a video to a Meta Ads ad account from a public URL so it can be used in a video ad. Meta fetches the file from video_url and transcodes it; the action waits until the video is ready and returns its video_id. Pass that video_id to create_ad together with page_id and a thumbnail image_url to build the video ad. The upload cannot be undone via an action.

Upload a video to a Meta Ads ad account from a public URL so it can be used in a video ad. Meta fetches the file from video_url and transcodes it; the action waits until the video is ready and returns its video_id. Pass that video_id to create_ad together with page_id and a thumbnail image_url to build the video ad. The upload cannot be undone via an action.

Parameters
video_urlstringRequirednamestringRequired
Duplicate Ad Set Duplicate an existing Meta Ads ad set (Facebook or Instagram). The copy keeps the source targeting, budget and schedule. Copied paused by default so it does not spend until enabled. Set status_option to active to launch it, or inherited to keep the source status. Set campaign_id to move the copy to another campaign, or omit it to keep the copy in the source campaign. Set deep_copy to also duplicate the ads in the ad set; a synchronous copy is limited to 3 ads. There is no delete action, so pausing the copy does not remove it.

Duplicate an existing Meta Ads ad set (Facebook or Instagram). The copy keeps the source targeting, budget and schedule. Copied paused by default so it does not spend until enabled. Set status_option to active to launch it, or inherited to keep the source status. Set campaign_id to move the copy to another campaign, or omit it to keep the copy in the source campaign. Set deep_copy to also duplicate the ads in the ad set; a synchronous copy is limited to 3 ads. There is no delete action, so pausing the copy does not remove it.

Parameters
adset_idstringRequiredcampaign_idstringdeep_copybooleanstatus_optionstring
Create Ad Image Upload one or more images (JPEG, PNG or GIF, up to 30 MB each, at most 20 images and 100 MB per request) to a Meta Ads ad account and return one image_hash per image, in the order the files were sent. The images are sent as files uploaded with the request, not as params or URLs; Meta's image endpoint has no URL option. Each image appears in the account's image library under its filename. Use each image_hash in create_ad via the creative field, e.g. object_story_spec.link_data.child_attachments[].image_hash for carousel cards. Meta deduplicates images by content, so re-uploading the same file returns the same image_hash. The upload cannot be undone via an action.

Upload one or more images (JPEG, PNG or GIF, up to 30 MB each, at most 20 images and 100 MB per request) to a Meta Ads ad account and return one image_hash per image, in the order the files were sent. The images are sent as files uploaded with the request, not as params or URLs; Meta's image endpoint has no URL option. Each image appears in the account's image library under its filename. Use each image_hash in create_ad via the creative field, e.g. object_story_spec.link_data.child_attachments[].image_hash for carousel cards. Meta deduplicates images by content, so re-uploading the same file returns the same image_hash. The upload cannot be undone via an action.

Conclusions: which method wins for your use case

Your situation Recommended Why
“I want to analyze live results and act on them, create, pause, re-budget, without leaving Claude” Windsor.ai Live data, write actions and every other channel from one connection
“I need Meta Ads next to GA4, Google Ads, or Shopify revenue” Windsor.ai Cross-channel analysis across 350+ sources is what the connector is built for
“I only run Meta Ads and want Meta’s own route” Meta’s official connector Direct from Meta, read and write, no other channels needed
“I have one quick question about last month’s numbers” Manual CSV upload Fastest path for a true one-off, no account connection needed
“I want a spreadsheet that stays roughly current for the team” Automation platforms Scheduled pulls into Sheets are exactly that job
“None of the above cover what I need, and I have dev resources” Custom build on the Marketing API Full flexibility, at the cost of build and maintenance effort

FAQs

What is Windsor.ai's Meta Ads (Facebook Ads) connector for Claude?

Windsor.ai’s Meta Ads connector for Claude (via Windsor MCP) is a no-code integration that pulls your Meta Ads data directly from the Meta Ads API, cleans and normalizes it, and streams it into Claude as structured, analysis-ready datasets.

Instead of exporting CSVs and uploading them manually, you can query your live Facebook Ads performance (spend, ROAS, CPA, CTR, conversions, breakdowns) using plain-language prompts across one or many ad accounts, and manage your campaigns directly in Claude.

Tired of manual Facebook Ads data exports into Claude? Try Windsor.ai today to automate your reporting

Access your data from various sources in one place. Get started for free.
g logo
fb logo
big query data
youtube logo
power logo
looker logo