Prerequisites
- Meta Business Manager account (create one here)
- An active Meta ad account with billing information
- Admin access to the ad account you want to manage
- Adspirer account connected via Claude Code, Cursor, or any supported AI client
Connecting Meta Ads
Once you’ve set up Adspirer with your AI client, connect Meta:- Open your AI assistant (ChatGPT, Claude, Claude Code, etc.)
- Say: “Connect my Meta Ads account”
- Enter your email address when prompted
- Review and accept the Meta Ads disclaimer — you must check the box acknowledging that Adspirer operates independently from Meta’s account enforcement systems before proceeding
- Adspirer opens your browser for OAuth authorization
- Sign in to Meta Business Manager and select the Business Manager(s) you want to grant access to
- Approve permissions (read campaign data, create ads, manage budgets)
Asset handling across ad accounts
When you ask the agent to launch a creative the agent finds in a different ad account in the same Business Manager, Adspirer offers to copy that creative into the target account before creating the campaign. This is opt-in per call — the agent asks before copying so you stay in control of which ad account holds which assets. Per-account asset discovery (image, video, creative) is scoped to the specific ad account you’re targeting so you don’t get false “asset not found” errors when the asset lives one BM over. Cross-account safety. If you ask the agent to add an ad to an ad set — or an ad set to a campaign — that actually belongs to a different one of your accounts, Adspirer catches the mismatch up front, names both accounts, and points to the right tool to list the correct entity, instead of letting Meta return a misleading “missing creative” error. Deselected (inactive) ad accounts are also write-protected: the agent can’t create or change ads in them until you re-activate them from the Manage Accounts modal.What You Can Do (60 Tools)
Performance Analysis
get_meta_campaign_performance— Pull metrics for campaigns, ad sets, or individual adsget_meta_adset_performance— Middle-layer analysis: spend, CTR, CPA, ROAS broken down by ad set within a campaign — see which audience segments perform best without going to individual ad levelanalyze_meta_ad_performance— Deep analysis of ad-level performance with recommendationsget_meta_audience_insights— Audience breakdown by age, gender, and interestsanalyze_meta_audiences— See which audience segments perform best, ranked by the metric your objectives actually supportanalyze_meta_wasted_spend— Identify campaigns with poor ROAS and recommend cutsdetect_meta_creative_fatigue— Identify ads losing effectiveness over timeexplain_meta_anomaly— Diagnose sudden changes in performance (CPA spikes, CTR drops)get_meta_ad_creatives— View creative details for ads in a campaign
Metrics that say when they don’t apply
A traffic, awareness, engagement or link-click campaign earns no revenue, so its ROAS is0 by design — not a sign the account is failing. get_meta_campaign_performance labels the numbers accordingly instead of leaving your AI client to guess:
- The Overall ROAS row reads Not applicable on those accounts, with a line underneath naming the objectives it’s based on and the metric that does apply.
- Your account’s primary KPI is named — cost per conversion, cost per install, CPC, CPM, cost per video view — so the agent leads with the number your objectives are actually measured on.
- Lead-gen, messaging, and app accounts are treated as conversion accounts that carry no revenue, and measured on cost per conversion or cost per install. They are never described as having broken tracking.
- If Meta never recorded an objective for your campaigns, you’re told that rather than assumed to be a traffic account.
0 on every account — Adspirer was reading the wrong part of Meta’s response. Newly collected data is correct. Periods that were already collected before the fix stay at zero until they are re-collected, so a video campaign from earlier this summer can still look flat when you look back at it.advantage_state_info and bid_strategy, so you can ask whether Advantage+ is on for a campaign and what it’s bidding toward without opening Meta Ads Manager.
Audience segments are ranked honestly too. analyze_meta_audiences reports the metric it actually ranked on (ROAS where you track conversion value, CTR where you don’t), excludes Meta’s Unknown demographic bucket from best/worst rankings — it isn’t targetable and its ratio compares two different populations — and only tells you to scale a segment when that segment has the volume to support the claim. Unknown still appears in the age and gender breakdowns as a measured fact.
Targeting & Research
search_meta_targeting— Find audiences by interests, demographics, behaviorsbrowse_meta_targeting— Explore Meta’s targeting categorieslist_meta_custom_audiences— View existing custom audiences (database lists, lookalikes, website, engagement)
Location & geo targeting
Geo targeting is set as part of campaign and ad-set creation — you describe it in plain language and Adspirer builds the correct Meta targeting:- Cities, regions, ZIP/postal codes, and countries, including city + radius (“everyone within 20 miles of Austin”). Multiple cities, each with its own radius, work in a single ad set.
- Location reach modes — control who in a location you reach: people who live there, were recently there, or are traveling to / interested in it.
- Safer edits — when you change an ad set’s locations with
update_meta_ad_set, the new geo targeting merges onto the existing targeting rather than replacing all of it, so a location-only edit doesn’t wipe your audiences and placements.
Local Meta campaign with city + radius targeting.
European Union (EU/EEA) targeting — DSA disclosure
The EU Digital Services Act (DSA) requires every ad set that reaches an EU/EEA country to declare who the ad is for. When you create or update an ad set that targets the EU/EEA, supply:dsa_beneficiary— the person or organization the ad benefits (required for EU/EEA-targeted ad sets)dsa_payor— the entity paying for the ad (optional; defaults to the beneficiary)
Campaign Creation
select_meta_campaign_type— Choose between Image, Video, or Carousel based on your creativediscover_meta_assets— Check if you have existing creatives in Metavalidate_and_prepare_meta_assets— Verify images/videos meet Meta’s requirements (dimensions, file size, aspect ratio)create_meta_image_campaign— Launch single-image campaigns (supports lifetime budgets, end dates, placement controls)create_meta_video_campaign— Launch video campaigns (supports lifetime budgets, end dates, placement controls)create_meta_carousel_campaign— Launch multi-card carousel campaigns (supports lifetime budgets, end dates, placement controls)create_meta_dco_ad— Create dynamic creative optimization (DCO) ads — supply multiple headlines and body texts and Meta mixes-and-matches them; Adspirer auto-enables dynamic creative on the target ad set for both image and videoduplicate_meta_campaign— Duplicate an existing campaign with optional modifications
Choosing a Facebook Page
Every Meta ad runs from a Facebook Page. Which one depends on how many your ad account can promote:- One promotable Page — Adspirer uses it and never asks. Any Instagram account linked to that Page is picked up automatically too.
- Two or more Pages — Adspirer stops before creating anything and lists them by name and ID so you choose. Meta publishes no “default Page” and returns them in no meaningful order, so guessing would mean running your ad under a brand you didn’t ask for. It won’t guess the Instagram account in that case either.
- No promotable Page — unchanged: “No Facebook Pages found linked to this ad account. Please link a Facebook Page in Meta Business Manager.”
facebook_page_id on any create or add call and Adspirer never asks. To see your options first, use list_meta_pages.
Pick the Page before you launch.
add_meta_ad_set and add_meta_ad. Updating, pausing, resuming, and duplicating are unaffected — those act on an ad that already has its Page.
App install campaigns
App-promotion campaigns need the numeric Facebook App ID — not an iOS bundle ID (com.example.app) and not an Android package name. list_meta_promotable_apps returns the apps your ad account is allowed to promote, each with that App ID and the App Store / Google Play URLs Meta already holds, so you never have to go looking for them. Apps with no mobile store listing are returned separately with the reason.
Adspirer derives the operating system from the store URL and targets it for you — App Store means iOS, Google Play means Android — and constrains the ad set to mobile devices, since an app install can’t be fulfilled on desktop. Without that, Meta rejects the ad set with “Mobile Targeting Mismatch.” This applies to image, video, and carousel campaigns, to add_meta_ad_set, and to update_meta_ad_set when you repoint an ad set at an app on the other platform.
Pass user_os to override the derived value. If your override contradicts the store URL, Adspirer stops and tells you, instead of sending Meta the combination it will reject.
Launch a Meta app install campaign without hunting for IDs.
Catalog & commerce ads (Advantage+ Catalog / Dynamic Product Ads)
Connect a product catalog you already manage in Meta Commerce Manager (or synced from Shopify, WooCommerce, or another store platform) and Adspirer builds dynamic product ads (DPA) — Meta pulls each product’s image, name, and price straight from the catalog and renders the ad automatically. This is how e-commerce advertisers run prospecting (show relevant products to cold audiences) and retargeting (re-show the exact products a visitor viewed or added to cart) at scale without hand-building an ad per SKU.list_meta_catalogs— List the product catalogs available to your ad accountlist_meta_products— Browse the products inside a cataloglist_meta_product_sets— View existing product sets (targetable subsets of a catalog)create_meta_product_set— Create a product set with filter rules (e.g. “best sellers under $50”)compare_meta_catalog_product_sets— Compare performance across product sets to find your winnersvalidate_catalog_readiness— Pre-flight check that tells you whether your catalog + recent pixel data can support retargeting (needs view/add-to-cart/purchase events) or only prospecting — before you spendcreate_meta_catalog_campaign— Launch an Advantage+ Catalog campaign (prospecting or retargeting), created PAUSEDadd_meta_catalog_ad_set— Add a catalog ad set (audience, budget, retargeting window)add_meta_catalog_ad— Add a catalog ad (creative format + product set)update_meta_catalog_campaign— Change catalog-campaign budget, status, or settingsupdate_meta_catalog_ad_set— Update catalog ad-set targeting, budget, or retargeting windowupdate_meta_catalog_ad— Update catalog ad creative or product setanalyze_meta_catalog_performance— Product-level performance across the catalogget_meta_product_performance— Per-product spend, sales, and ROAS — see which SKUs actually selldetect_meta_catalog_waste— Flag products burning budget with no returndiagnose_meta_catalog_funnel— Walk the catalog funnel (impressions → view → add-to-cart → purchase) to find where it leaks
Lead generation
list_meta_lead_forms— View lead forms configured in your ad accountget_meta_lead_form_submissions— Pull lead submissions from a specific form
Account & pixel management
list_meta_pages— View every Facebook Page that can run ads on the ad account, with any linked Instagram accountlist_meta_instagram_accounts— View connected Instagram accountslist_meta_pixels— View Meta Pixels configured in your ad account
Optimization
optimize_meta_budget— Reallocate budget based on ROAS or CPA performanceoptimize_meta_placements— Shift spend to best-performing placements (Feed, Stories, Reels, etc.)
Ad set & ad management
add_meta_ad_set— Add ad sets to existing campaigns (supports lifetime budgets, end dates, placements, multi-advertiser opt-out)add_meta_ad— Add ads to existing ad setsupdate_meta_campaign— Change budgets, bids, or targeting, including the campaign’s bid strategy (LOWEST_COST_WITHOUT_CAP,LOWEST_COST_WITH_BID_CAP,COST_CAP,LOWEST_COST_WITH_MIN_ROAS). The capped strategies need a bid cap on the ad sets first — setbid_amountviaupdate_meta_ad_setor Meta rejects the changeupdate_meta_ad_set— Update ad set budgets, targeting, or scheduleupdate_meta_ad— Update ad creative or statuspause_meta_campaign— Stop campaigns or ad setsresume_meta_campaign— Restart paused campaignslist_meta_campaigns— List all campaigns with status and budgetget_meta_campaign_details— Detailed campaign infolist_meta_ad_sets— List ad sets in a campaignlist_meta_ads— List ads in an ad set
Campaign Creation Workflow
Meta campaigns follow a 6-step workflow. Skip steps and the campaign will fail validation.Example Prompts
Analyze Performance
Pull Meta Ads metrics and flag underperforming campaigns.
Detect Creative Fatigue
Find fatigued creatives with declining click-through rates.
Create an Image Campaign
Meta image campaign with creative validation and audience targeting.
Optimize Placements
Compare CPA across Feed, Stories, Reels and recommend shifts.
Audience Analysis
Audience breakdown by demographics and interest-based ROAS.
Launch an Advantage+ Catalog (Dynamic Product Ads) campaign
Check catalog readiness, then launch a retargeting DPA campaign from your product feed.
Creative Assets: What You Need to Know
Adspirer does NOT generate images or videos. You provide the creative URLs.Supported Asset Sources
- Google Drive (public or shared links)
- Dropbox (public links)
- Amazon S3 (public URLs)
- Any publicly accessible image/video URL
Meta’s Creative Requirements
Thevalidate_and_prepare_meta_assets tool checks these automatically:
- Image ads: 1080x1080px minimum, JPG or PNG, under 30MB, 1:1 or 4:5 aspect ratio
- Video ads: 1080x1080px minimum, MP4 or MOV, under 4GB, 1:1 or 4:5 or 9:16 aspect ratio, 1-240 seconds
- Carousel ads: 2-10 cards, each 1080x1080px, JPG or PNG
- Text limits: Primary text 125 chars (recommended), headline 27 chars, description 30 chars
How video uploads work
You give Adspirer a video URL and Meta fetches the file from that URL itself. The file is never downloaded and re-uploaded in between, so a 1 GB video is no slower and no more likely to fail than a 20 MB one.create_meta_video_campaign, add_meta_ad, and add_meta_ad_set all work this way.
The one requirement that follows from it: the URL must be reachable from the public internet. A Google Drive or Dropbox link shared with “anyone with the link” works. A private link, or one behind a sign-in, does not — Meta can’t open it. If Meta can’t fetch the file, Adspirer falls back to fetching and pushing it itself.
HTTP 503 or timed out. Fixed August 22, 2026 — if a big video ad failed on you before then, retry it as-is.Budget Guidelines
20. Adspirer converts to Meta’s internal unit for you.Descriptions on these fields previously said “cents”, which was wrong. An assistant that followed them sent 2000 for a 20/day budget and got a 100x budget. If you set a Meta budget or bid through Adspirer before August 11, 2026, check the value that actually landed.Whole-unit currencies (yen, won, and nine others)
Meta expects budgets in each currency’s smallest unit, and eleven currencies have no smaller unit — the amount is the unit. Adspirer used to apply the two-decimal multiplier to every currency, so on one of these accounts a budget reached Meta 100× larger than you asked for: a ¥20,000 daily budget was sent as ¥2,000,000. Because the display side divided by the same 100, the number read back correctly and the error stayed invisible. Fixed on both sides as of August 18, 2026. What you type is what Meta receives, and budgets, bids, and remaining spend now display with the real conversion and the real symbol —¥20,000, not $200.
Nothing changes in how you ask. Give the amount in your account’s currency either way — 20000 for a ¥20,000 daily budget — and Adspirer applies whichever multiplier Meta specifies for that currency. Budget validation follows the same rule, so a legitimate budget on a yen or won account is no longer rejected for being “too large”.
- Minimum: $5/day per ad set (Meta’s requirement)
- Recommended: $20+/day for meaningful data
- Testing: Start with $30/day split across 2-3 ad sets to find winners
- Scaling: Once you find ROAS above 3.0, increase budget 20-30% every 3 days
Best Use Cases for Meta Ads
- E-commerce: Visual products (fashion, home goods, beauty) — and with Advantage+ Catalog / dynamic product ads, show the exact SKUs from your feed to the right shopper automatically
- Demand generation: Reach cold audiences with interest-based targeting
- Retargeting: Re-engage website visitors and cart abandoners — including catalog retargeting that re-shows the precise product someone viewed (also see Google Display Ads for retargeting across the open web)
- Video storytelling: Brand awareness campaigns with Reels or Stories
- Lead generation: On-platform forms (though LinkedIn often performs better for B2B)
Troubleshooting
”Ad account not connected” error
Re-authenticate your Meta Business Manager:”Asset validation failed” error
Common causes:- Image/video URL is private (not publicly accessible)
- Wrong dimensions (Meta requires minimum 1080x1080px)
- File too large (30MB for images, 4GB for video)
- Unsupported format (use JPG/PNG for images, MP4/MOV for video)
“Campaign creation failed” error
Most common reason: skipping workflow steps. Meta campaigns require all 6 steps in order. If you jump straight tocreate_meta_image_campaign without running validate_and_prepare_meta_assets first, it will fail.
Adspirer now catches the most common failure causes before they reach Meta and explains them in plain language:
- Missing pixel on a conversion objective — a conversion-optimized ad set needs a Meta Pixel (or custom conversion). Adspirer flags this up front instead of letting Meta return the cryptic “promoted object fields missing.” Pass a pixel, or pick a non-conversion objective. Use
list_meta_pixelsto find yours. - Carousel cards — each card needs an image, a headline, and a landing-page URL (a carousel-level URL covers cards that don’t set their own). Adspirer validates every card before submitting and accepts the same
existing_image_hashits asset discovery returns, so you can build carousels straight from creatives already in your account. - Wrong account — if the campaign, ad set, or ad you referenced lives in a different one of your ad accounts, Adspirer names the right account instead of failing deep inside Meta. See Asset handling across ad accounts.
- “Mobile Targeting Mismatch” on app campaigns — fixed. Adspirer sets the ad set’s OS targeting from your app’s store URL. See App install campaigns.
- “No payment method is set” on an account that has a card — fixed. The precheck used to read a Meta field that stays empty until the account has actually spent, so it false-blocked brand-new funded accounts on their very first campaign — and pushed the real blocker, usually a missing promotable Page, down the list behind it. It now reads Meta’s
HAS_VALID_PAYMENT_METHODScapability, and doesn’t block at all if Meta’s answer comes back incomplete.
Checking what an update actually applied
Every Meta update tool — campaign, ad set, ad, and the catalog tools — echoes each field it changed together with the value it applied, and asks you to review before moving on. The values are live at that point. Money is rendered in the ad account’s own currency, so an Australian account readsA$2,000.00 and a Japanese one reads ¥20,000 — with the right number of decimals for the currency, and the right conversion behind it. That is the fastest way to catch a budget that landed wrong: read the number back, don’t assume the field name means the value was right.
Reading a campaign back tells you the same story. list_meta_campaigns, get_meta_campaign_details, and list_meta_ad_sets render budgets, bids, and remaining spend in the account’s own currency rather than assuming dollars.
Reading a Meta error Adspirer can’t explain
When Meta rejects something for a reason Adspirer can’t translate, the error now ends with a reference line carrying Meta’s own identifiers — the error code, the subcode, and thefbtrace_id.
Quote all three to Meta support. The fbtrace_id identifies your exact failing request in Meta’s logs and is the first thing they ask for; without it there is nothing for them to look up. Every Meta write path returns them, so it doesn’t matter which call failed.
An error that Meta sends without identifiers still reads as plainly as it did before — there’s no reference line to add.
Creative fatigue detection not working
The tool needs at least 14 days of data per ad. If your ads are newer, it can’t detect fatigue yet. Wait until ads have run for 2+ weeks.FAQ
Can I manage Instagram ads separately from Facebook?
Can I manage Instagram ads separately from Facebook?
Does Adspirer generate ad creatives?
Does Adspirer generate ad creatives?
Can I A/B test creatives?
Can I A/B test creatives?
analyze_meta_ad_performance to see which creative wins, then pause the losers and scale the winner.What's the difference between Meta and Google Ads?
What's the difference between Meta and Google Ads?
Do I need to build a product feed to run Catalog / dynamic product ads?
Do I need to build a product feed to run Catalog / dynamic product ads?
validate_catalog_readiness), and creates/optimizes Advantage+ Catalog campaigns. It doesn’t edit the product feed itself. Once the catalog exists, you can run everything else — prospecting, retargeting, product-set testing, per-SKU performance — from your AI assistant.How much does Adspirer cost for Meta Ads?
How much does Adspirer cost for Meta Ads?
Related Documentation
- Google Ads Integration
- LinkedIn Ads Integration
- Campaign Creation Workflows
- Meta Ads + AI Integration
- Pricing & Plans
- Prompt Engineering Playbook — A custom skill, dossier, and prompt book generated from your Meta account ($39 one-time)

