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 social account.
- Read attributed performance: spend, results, cost per result, and return on ad spend, all on the campaign object itself.
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 /social_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. Thespend field on a campaign is the amount charged to you, in spend_currency.
A campaign whose payment fails stops delivering and reports payment_failed. Retry a Failed Ad Campaign Payment resumes it once the payment method works.
AI creative generation bills from your balance rather than from ad spend. Too little balance returns a 402 carrying a deposit_url.
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.

