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.
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, edit creatives, pause, budget; created items land paused and each change is 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.
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.
We tested the write actions in Claude on 6 November 2026, on a paused test campaign in our own account. Because enabling a campaign can start spend, Windsor.ai first showed the change and waited for our approval. After we approved, Claude enabled the campaign and paused it again. Meta’s activity log lists both changes under the Windsor app, a minute apart, and the campaign spent $0.
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, ad sets and ads (image, video or carousel), edit ad copy and creatives, 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
- Delete campaigns, ad sets or ads: Windsor.ai has no delete action, so you pause them instead (or delete them in Ads Manager)
- Manage Instagram organic content, that's the separate Instagram connector (Instagram Ads are included here)
Setup takes about a minute
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.
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.
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_click, outbound_clicks_ctr_outbound_click | 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_outbound_click 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_outbound_click at the lowest cost_per_outbound_click_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
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.
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
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.
Most guides still quote 29 tools from the launch. When we connected it to Claude on 6 November 2026 it listed 104: 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, catalogs, custom audiences, A/B and lift tests, the activity log, and creating or updating campaigns, ad sets, ads and creatives. Anything Claude creates through it lands paused until you activate it. Since a July 2026 update, anyone with full control of a business portfolio can set rules on what AI agents may change in the ad account, from budgets to catalogs.
We asked it and Windsor.ai the same question about our own ad account, which Dmytro Pieikov, our PPC specialist, runs, on 6 November 2026: spend, clicks and leads by campaign for the last 30 days. Both returned $59.14, 92 clicks and 82 leads for the one campaign with spend. On our site a lead is a new user connecting their first data source, so check what fires Meta’s Lead event in your own account before comparing cost per lead.
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. start_time and end_time are ISO 8601 timestamps (e.g. 2027-01-01T00:00:00-0800); start_time defaults to now and cannot be changed once the ad set has started, even while paused. An ad set with its own budget is created with bid_strategy LOWEST_COST_WITHOUT_CAP (highest volume) unless bid_strategy or bid_amount is given; pass bid_amount with a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP). Under campaign budget optimization the campaign's bid strategy applies and none is sent. advantage_audience controls Meta's Advantage+ audience, which treats the given targeting as a suggestion and expands beyond it; it defaults to false, so the age, gender, geo and audience targeting is applied exactly as given. Meta requires the flag on every new ad set, so it is always sent; a flag already inside targeting.targeting_automation is kept when the parameter is omitted. With true, Meta fixes age_max at 65 and allows age_min from 18 to 25; give the preferred ages as targeting.age_range (e.g. [25, 35]). 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, Malaysia 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_UNIVERSAL, BRAZIL_REGULATION, AUSTRALIA_UNIVERSAL and MALAYSIA_UNIVERSAL use "universal_beneficiary" and "universal_payer"; financial service ads in Australia also declare AUSTRALIA_FINSERV with "australia_finserv_beneficiary" and "australia_finserv_payer"). These are verified identity ids from Meta Business settings > Verified identities (not page or business ids); ad account defaults are not inherited by ad sets created through the API. Meta also asks some accounts for a verified advertiser on any ad set ("Advertiser is missing"); then pass regional_regulation_identities with "universal_beneficiary" and "universal_payer" and add regional_regulated_categories only when the targeted country has a value listed above. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet. 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. For example, extra_params {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]} sets the attribution setting. Meta can reject later changes to it.
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; country declarations such as SINGAPORE_UNIVERSAL or TAIWAN_UNIVERSAL belong to regional_regulated_categories on the ad set instead. 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. A campaign with a budget (or with ad set budget sharing enabled) is created with bid_strategy LOWEST_COST_WITHOUT_CAP (highest volume) unless bid_strategy is given; its ad sets inherit it and cannot override it. Without a campaign budget leave bid_strategy unset and choose it per ad set in create_adset. When no campaign budget is set, some accounts require is_adset_budget_sharing_enabled to be specified.
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. When the ad set sends people to several messaging apps (destination_type MESSAGING_*), the creative gets the multi-destination structure Meta requires automatically; an Instagram destination uses the page's connected Instagram account unless instagram_user_id is set. 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. A degrees_of_freedom_spec or creative_features_spec anywhere in creative can only turn Advantage+ creative features off: each feature in it needs enroll_status OPT_OUT.
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; country declarations such as SINGAPORE_UNIVERSAL or TAIWAN_UNIVERSAL belong to regional_regulated_categories on the ad set (update_adset) instead. 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 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. start_time and end_time are ISO 8601 timestamps (e.g. 2027-01-01T00:00:00-0800); end_time less than one year ahead. 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, Malaysia 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_UNIVERSAL, BRAZIL_REGULATION, AUSTRALIA_UNIVERSAL and MALAYSIA_UNIVERSAL use "universal_beneficiary" and "universal_payer"; financial service ads in Australia also declare AUSTRALIA_FINSERV with "australia_finserv_beneficiary" and "australia_finserv_payer"). These are verified identity ids from Meta Business settings > Verified identities (not page or business ids); ad account defaults are not inherited by ad sets created through the API. Meta also asks some accounts for a verified advertiser on any ad set ("Advertiser is missing"); then pass regional_regulation_identities with "universal_beneficiary" and "universal_payer" and add regional_regulated_categories only when the targeted country has a value listed above. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet. 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. Meta can reject attribution_spec on an existing ad set (error subcode 1504040). To change the attribution setting, create a new ad set with create_adset.
Pause Campaign
Pause an active Meta Ads campaign (Facebook or Instagram). Reversible via enable_campaign.
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.
Enable Campaign
Activate a paused Meta Ads campaign (Facebook or Instagram). Reversible via pause_campaign.
Enable Ad
Activate a paused Meta Ads ad (Facebook or Instagram). Reversible via pause_ad.
Enable Ad Set
Activate a paused Meta Ads ad set (Facebook or Instagram). Reversible via pause_adset.
Pause Ad
Pause an active Meta Ads ad (Facebook or Instagram). Reversible via enable_ad.
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, degrees_of_freedom_spec and the multi-destination click-to-message structure, adding the latter when the ad set requires it and the creative is not post-based), 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. A passed degrees_of_freedom_spec can only turn Advantage+ creative features off: each feature in its creative_features_spec needs enroll_status OPT_OUT. Listed features replace their current setting, and features it omits keep theirs. An empty spec is not accepted. A deprecated standard_enhancements bundle inside the spec (passed or cloned) is translated into the individual enhancement features at the bundle's enroll_status, since Meta rejects the bundle on creation. To swap the ad to a different existing creative, use update_ad instead.
Pause Ad Set
Pause an active Meta Ads ad set (Facebook or Instagram). Reversible via enable_adset.
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.
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.
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.
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.
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.
Duplicate Ad Set
Duplicate an existing Meta Ads ad set (Facebook or Instagram). The copy keeps the source targeting, budget, schedule and attribution setting. 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. Meta's own deep copy copies fewer than 3 objects at once, the ad set included, and refuses creatives that still carry its retired standard-enhancements setting; in both cases the ads (up to 3) are then copied one by one, each keeping its creative's enhancement settings with that setting translated into the individual enhancement features; that copy is created paused and activated last. If copying an ad fails the partial copy is removed again; if only that final activation fails the complete copy is kept paused and named in the error, so do not run the copy again. There is no delete action, so pausing the copy does not remove it.
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.
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
How do I connect Claude to Meta Ads?
Connecting Claude to Meta Ads (Facebook Ads) with Windsor.ai takes three steps and about a minute:
- Create a free Windsor.ai account and connect your Meta Ads account via OAuth.
- In Claude, open Customize, then Connectors, search for Windsor and click Add.
- Ask Claude anything about your Meta Ads performance, or tell it to create, pause, or re-budget campaigns.
The direction does not matter: whether you think of it as connecting Meta Ads to Claude or connecting Claude to your Meta Ads account, it is the same one-minute setup. For a full walkthrough with screenshots, and Meta’s official connector side by side, see how to connect Meta Ads to Claude.
Is there a Meta Ads MCP for Claude?
Yes, several. Meta’s own ads MCP server (mcp.facebook.com/ads) is added in Claude as a custom connector; it covers Meta Ads only and, on the free plan, uses the single custom connector slot. Windsor MCP is the connector in Claude’s directory: one click, Meta Ads plus 350+ other sources in the same chat, and the same data available in BI tools and warehouses. Vendors such as Pipeboard run their own Meta Ads MCP servers, added as custom connectors. All of these can read and change campaigns; the difference is what else you can put next to Meta Ads. The Meta Ads MCP comparison has the details.
Can I use this integration with Claude Code?
Yes. The Windsor.ai connector works anywhere Claude runs: the Claude web app, Claude Desktop, and Claude Code. In Claude Code, install the Windsor.ai plugin from the terminal with claude plugin install windsor-ai and you can query your Meta Ads data (spend, ROAS, CPA, conversions, breakdowns) from your terminal sessions, alongside your other tools.
Connect Meta Ads once in Windsor.ai, then use the connector wherever you use Claude. See the Windsor MCP setup guide for Claude for each variant’s steps.
Can Claude connect to my Facebook account?
For ads, yes: this connector covers your Meta Ads accounts, Facebook and Instagram campaigns included. For your Facebook Page’s organic data (reach, followers, post performance), use the Facebook Page Insights connector for Claude. A personal Facebook profile cannot be connected to Claude.
What can I do with my Facebook Ads data in Claude?
Once your Meta Ads data is available in Claude, you can:
- Generate instant performance reports (daily/weekly/monthly) with spend, ROAS, CPA, CTR, conversions, and more, returned as a text summary, visual dashboard, table, or CSV-ready output.
- Break down results by level (account, campaign, ad set, ad, creative) to quickly spot winners and losers.
- Diagnose performance changes by comparing periods (WoW/MoM) and flagging spikes/drops in CPA, ROAS, CTR, frequency, etc.
- Uncover audience and placement insights by segment (geo, age, gender, device, placement) to find the lowest-cost converters.
- Analyze creatives for fatigue (e.g., rising frequency + declining CTR/conversion rate) and get test ideas for new angles.
- Execute write actions directly from Claude, like creating campaigns and ad sets, boosting existing posts into paid ads, pausing/enabling campaigns, ad sets, and ads, and setting budgets.
- Create client-ready outputs like visual summaries, slide/table-ready dashboards, and action plans on demand and in plain language.
- Run cross-channel analysis (if connected) by combining Facebook Ads with GA4, Google Ads, Shopify, CRM data, etc., inside the same Claude conversation.
Find more details about Windsor MCP for Claude use cases in this guide: https://windsor.ai/how-to-use-windsor-mcp-examples-use-cases/.
How much does it cost to integrate Facebook Ads into Claude using Windsor.ai?
Windsor.ai has a free forever plan (one data source, no credit card). Paid plans are priced by how many accounts and data sources you connect, from $19 a month; see the pricing plans for current rates. Windsor MCP for Claude is included in every plan.
How long does it take to connect Facebook Ads to Claude?
With Windsor.ai’s connector, the integration takes about a minute. No technical expertise is required; connecting Facebook Ads to Claude is simple, straightforward, and completely code-free.
How does Windsor MCP connect Facebook Ads data to Claude?
Windsor MCP acts as a bridge between Meta Ads and Claude:
- You connect your Facebook/Meta Ads account to Windsor.ai (OAuth) so Windsor can access your data via the Meta Ads API.
- Windsor then pulls the data in the background, normalizes/cleans it, and structures it into analysis-ready datasets.
- When you use the Windsor MCP connector in Claude, Claude can query those datasets directly (instead of you exporting CSVs), so your answers are based on fresh, structured Meta Ads data; no code, no uploads, no manual prep.
Do you have helpful links to get started with integrating Facebook Ads and Claude using Windsor.ai?
Yes, we have helpful resources to help you get started. You can explore our official documentation and tutorials for Facebook Ads to Claude integration with Windsor.ai:
- Step-by-step guide: how to connect Meta Ads to Claude, two ways
- Facebook Ads Field Reference
- Facebook Ads “Field Not Valid” error: troubleshooting guide
- How to manage Meta Ads campaigns from Claude, with the 5-rule safety protocol
- Claude Integration Video Tutorial
- For teams on Gemini Enterprise: how to connect Facebook Ads to Gemini Enterprise
How often does the Facebook Ads data refresh in Claude via Windsor MCP?
Each question runs as a query on the Meta Marketing API when you ask it, and Windsor.ai keeps the result of an identical query for up to 6 hours. On plans with hourly refresh, Claude can ask for the most recent days to be fetched again.
Two notes:
- Meta itself reports some metrics with a delay, conversions especially, so recent numbers can lag by minutes or longer.
- Results for today and yesterday can still shift as Meta finalises them.
Can I analyze Instagram data in Claude via the same connector?
Yes. Claude can analyze Instagram data via the same Windsor MCP connector. You just need to connect Instagram (Organic) as an additional data source in your Windsor.ai account, and then query it in Claude the same way you do with Facebook Ads.
A couple of quick notes:
- Instagram Organic = profile/content metrics (posts, engagement, etc., depending on what you’ve connected).
- Instagram Ads is a part of the Facebook Ads connector.
Can Claude manage my Meta Ads campaigns?
Yes. Windsor’s write-enabled MCP gives Claude full campaign management access to your Meta Ads account. Here’s what you can do:
- Create campaigns: set objective (Traffic, Leads, or Sales), budget, bid strategy, and run dates.
- Create ad sets: define your target audience, where ads appear, and how Meta optimizes delivery.
- Boost an existing post: turn a published Facebook or Instagram post into a paid ad, reusing the original content instead of building new creative.
- Pause or enable campaigns, ad sets, and individual ads.
- Adjust budgets: set daily or lifetime spend limits at campaign or ad set level.
Nothing changes without your explicit approval. Claude shows you exactly what it’s about to do and waits for your confirmation before making any change. In practice, pausing and enabling succeed almost every time, budgets and campaign creation most of the time, and creating an ad set about half the time unless the bid and Advantage+ audience settings are spelled out; the details are in what happens when an AI assistant creates Meta ad sets.
Known issue (added 6 October 2026): ad creation can fail
Right now, creating a new ad through Claude can fail. This is a bug on Meta’s side affecting many apps, not something specific to Windsor, and Meta has an open, unresolved bug report (track it here). Until Meta fixes it, create the ad directly in Meta Ads Manager instead.
Any write actions that already succeeded are unaffected; campaigns and ad sets you created stay usable. If Meta’s interface asks you to confirm something about the account, confirming there and retrying through Claude sometimes works, though not always. The bug doesn’t affect every account, so a different admin account on the same ad account is also worth trying.
Does this integration support custom Facebook Pixel conversions?
Yes. The Windsor MCP Facebook Ads connector supports custom Facebook Pixel conversions, so you can pull custom conversion metadata (e.g., custom conversion name/ID, event source, rule, retention days) and their related action counts/values, then analyze them in Claude.
In Windsor’s available Meta Ads fields, you’ll see custom conversion fields like custom_conversion_action_name, custom_conversion_id, custom_conversion_rule, plus custom conversion action count/value fields. These are what you’d use to report on Pixel custom conversions.
Example prompt:
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. Highlight the top and bottom performers and suggest optimizations.
Is my advertising data used to train Claude's public models?
Data sent through Anthropic’s API (and Windsor.ai’s pipeline) is not used to train Claude’s models by default, unlike some consumer chat interfaces.
How far back can I pull historical Facebook Ads data?
Meta’s Ads Insights API returns at most 37 months of history, whichever tool you use to query it; a start date beyond that is rejected by Meta. Within that window, Windsor.ai pulls as far back as your ad account has reporting data, subject to your Windsor plan’s limits. Data you pull and store in a warehouse through Windsor.ai keeps accumulating beyond the 37 months.
Tired of manual Facebook Ads data exports into Claude? Try Windsor.ai today to automate your reporting