What you can build
- Run campaigns on Meta, with an objective, a budget, and a schedule.
- Target an audience by location, demographics, interests, devices, and languages, or upload a customer list as an audience.
- Generate creatives as AI images or video from a prompt, supply your own assets, or promote a post that already exists on a connected external account.
- Read attributed performance: spend, results, cost per result, and return on ad spend, all on the campaign object itself.
Countries you cannot target
Whop doesn’t allow campaigns to target these countries:
Requests to create an ad group or update its targeted countries are rejected if they include any of these codes. Remove them from your targeted locations before submitting the request.
Before you spend
Three things gate a live ad, and all three are one-time setup:- A Facebook page for ads to run under.
GET /external_accountsmust return afacebookentry. - A payment method connected in the dashboard, either your Whop balance or a card. Drafts work without one.
- The Whop pixel on your destination, unless you send traffic to a whop.com store page. Any external landing page needs the pixel first.
Core objects
Ad campaign, ad group, ad, audience. Each is defined in Core Concepts. Advertising has one hierarchy, and every object belongs to the level above it.adcamp_
Holds the objective, the platform, and the budget strategy. See Ad Campaigns.
adgrp_
Holds targeting, the optimization goal, the schedule, and its own budget by default. See Ad Groups.
POST /ads accepts an inline ad_group, which accepts an inline ad_campaign, so one request creates the whole tree in a single transaction. Pass ad_group_id instead to attach the ad to an ad group that already exists.
To launch later rather than now, set status to draft on the inline ad_campaign, then activate it with PATCH /ad_campaigns/{id}.
Budget lives at exactly one level, never both: on the ad group by default, or on the campaign when you set budget_optimization to ad_campaign.
How results are counted
Every performance number Whop reports is attributed by the Whop pixel, not by the ad network.result_event names the conversion event a campaign is judged on, and results is the pixel-attributed count of it. cost_per_result divides spend by that count. When a campaign’s ad groups optimize toward different goals there’s no single result_event, so it’s null and results becomes the sum of each ad group’s own attributed results. When nothing Whop-attributable is being optimized for, both are null rather than zero.
Paying for ads
Spend accrues as ads deliver and is charged afterward. Billing belongs to the account, across its campaigns. Each collection combines eligible unpaid campaign spend into one payment using the account’s configured ads payment methods. You don’t configure a separate payment method or request a separate retry for each campaign. Thespend field on a campaign is the amount charged to you, in spend_currency.
Collection timing depends on accrued spend and billing thresholds. Consolidation doesn’t mean one payment per day. AI creative generation uses its own balance payment. Too little balance returns a 402 carrying a deposit_url.
When a payment fails
An account payment failure blocks delivery across its billable campaigns. Each affected campaign reportsdelivery_status: "payment_failed", while its configured status stays active or paused. Read delivery_status to determine whether a campaign can deliver, and issues for the failure reason.
The account can’t activate campaigns while it has unresolved payment failures. You can still pause a campaign to keep it off after payment recovery. Whop also schedules automatic retries. You can request a retry after fixing the payment method.
Retry a payment
- In your account’s Ads dashboard, select Update payment method in the failed-payment banner, or open Ads settings and select Billing. Update the account’s card or fund the balance it uses.
- Select Retry payment once for the account. API integrations should call Retry Failed Ads Payments with the account’s
biz_ID andad_campaign:updatepermission. - Wait for the background attempt. A
202response withqueued: trueconfirms the job was accepted, not that the payment succeeded. Read the account’s ad campaigns for the outcome. - After successful settlement, the payment block clears. Delivery can show
processingwhile it’s recalculated and synchronized. Campaigns configured as active can resume if their other delivery requirements are met. Campaigns configured as paused stay paused.
2026-09-22. Starting with 2026-09-22, it returns 410 Gone. Use the account endpoint above.
Older campaigns whose configured status was already payment_failed return to paused after successful retry, because their previous active/paused setting wasn’t retained.
Why a campaign isn’t delivering
delivery_status answers this directly. It’s the first field to read when a campaign exists but nothing is happening. Several states can be true at once, so the value is the highest one on this ladder:
Ads and ad groups carry their own
delivery_status with different values. A new ad passes through in_review before it delivers.
Where to go next
Create and launch an ad
The full flow, from creative to live ad, in two calls.
Install the pixel
Required before results can be attributed.
Build an audience
Upload a customer list to target or exclude.
Ads reference
Every advertising endpoint, with a playground.

