Connect an ad platform
Wire a domain up to Meta, TikTok, or one of 12 other networks, and confirm postbacks are actually being delivered.
Ad Platforms connects a domain to an ad network so the events that happen on it — a click, a new subscriber, a first purchase — are sent server-side (Conversions API / postback) to that network, instead of relying only on the browser pixel. Each connection is per-domain, per-network.
Networks
14 networks are in the registry: the four mainstream ones (Meta, X/Twitter, Reddit,
TikTok — pixel + token, both browser pixel and server-side) and ten adult ad networks
(ExoClick, TrafficStars, ClickAdilla, JuicyAds, EroAdvertising, HilltopAds, TrafficHunt, PlugRush,
MyBid/TwinRed, Adsterra — server-side postback only, no browser pixel). GET /api/admin/bg/ad-platforms
returns the full registry so the connect form can render each network's exact fields.
Connect one
POST /api/admin/bg/ad-platforms?domain=<host> (or put domain in the body):
| Field | Notes |
|---|---|
platform | A registry key, e.g. meta, tiktok. Unknown key → platform_unsupported. |
pixel_id | Validated against that network's own format (e.g. Meta: 6–20 digits). Networks with no pixel field silently ignore it. |
access_token | Required up front only if the network marks its token required (capi_token_required otherwise). Never returned by any read endpoint — only has_token-style presence. |
extra | Network-specific fields (e.g. Reddit's ad_account_id). A missing required one → extra_required. |
event_map | Maps your six internal events (click, new_subscriber, first_purchase, repeat_purchase, message_received, fan_sent_3_messages) to that network's own event names. Unset entries fall back to the network's sane default. |
send_all_conversions | Defaults true. |
PUT /api/admin/bg/ad-platforms/{id} edits a connection. A blank access_token on an update
keeps the existing token — it can never accidentally wipe a real one. status can be flipped
between active and paused.
DELETE /api/admin/bg/ad-platforms/{id} removes it.
Confirm delivery, not just configuration
Saving a connection only means it's configured — it says nothing about whether events are actually reaching the network. Check that separately.
GET /api/admin/bg/ad-platforms/logs?domain=<host>&platform=<platform> returns the last 50
server-side send attempts plus counts by outcome:
- sent — delivered with an HTTP 2xx.
- failed — the network rejected or errored on it (
http_code/errorare included). - skipped — the event's mapping was
off, or there was no ad-click to attribute it to.
Drop domain for an account-wide view across every connected network.
The on-page pixel
An active Meta connection with a non-empty pixel_id is additionally mirrored onto the
landing page itself (both draft and published), so the browser fires PageView/Lead alongside
the server-side events. This mirroring is Meta-only and only happens for a connection that's
status: active with a pixel set — a paused Meta connection, or any other network, never touches
the on-page pixel. If you change a Meta connection and the on-page pixel doesn't move, check that
gate before anything else — see
Troubleshooting.
Named ad campaigns
For attributing which specific ad drove a click, POST /api/admin/bg/ad-campaigns?domain=<host>
with a name creates a named campaign; its ready link is https://<host>/?source=ig_ad_<slug>
(the base, un-named link is always https://<host>/?source=ig_ad). GET/DELETE list and remove
campaigns the same way.
What's next
Once a network is connected and its logs show sent events, record ad spend
so those clicks turn into a profit/ROI number instead of just a delivery log.