Overview
The browser Pixel is increasingly unreliable — ad blockers, iOS App Tracking Transparency, ITP cookie caps, and consent banners all suppress client-side events. A server-side Conversions API (CAPI) closes that gap by sending the conversion from your infrastructure straight to the ad platform. It is now the industry-standard signal for campaign optimisation on every major network.
Affclix runs CAPI as a first-class part of the tracking pipeline. When a conversion is attributed and saved, the tracker automatically pushes a matching server event to each active destination you have configured — Meta, TikTok, or Google. No SDK, no advertiser-side tag, and no custom middleware to maintain.
- Three destinations — Meta Conversions API, TikTok Events API, Google Offline Conversions
- Fires automatically — one event per saved conversion, per active destination — no code on your side
- Deduplicated — the conversion ID is used as the event ID so the platform never double-counts against the browser Pixel
- Consent-controlled identity — you choose exactly which match signals leave your platform
- Encrypted credentials — access tokens are encrypted at rest with AES-256-GCM and never rendered back in the UI
In the tenant dashboard, open Integrations → Conversions API. Each row is a destination that maps one campaign (or all campaigns) to one ad-platform endpoint.
How It Works
CAPI dispatch is part of the conversion save pipeline, so latency on the visitor-facing tracking edge is never affected — delivery happens on the server, asynchronously, with retries.
Click is attributed
Affclix captures the ad-platform click identifiers on landing — fbclid (Meta), ttclid (TikTok), gclid/gbraid (Google) — alongside the affiliate click ID.
Conversion is saved
When a postback or pixel fires a conversion, the tracker resolves every active destination that matches the campaign.
Event is dispatched
The tracker maps the conversion to the platform event, attaches only the allowed identity signals, and POSTs to the platform API using your encrypted credentials.
Delivery is logged
Every attempt — delivered or failed — is written to the CAPI Delivery report, keyed by an idempotency hash so a retried save is never sent twice.
Add a Destination
Open Integrations → Conversions API → Add Destination. The common fields below apply to every platform; the credential fields that follow depend on the platform you pick.
| Field | Required | Description |
|---|---|---|
Platform | Yes | Meta CAPI, TikTok Events, or Google Offline Conversions |
Name | Yes | A label for your reference, e.g. "Meta — Main Pixel" |
Campaign | No | Scope to one campaign, or leave empty to apply to every campaign in the workspace |
Active | No | Only active destinations receive events; toggle off to pause without deleting |
API version | No | Override the platform default (e.g. Meta v19.0) |
HTTP timeout (s) | No | Per-request timeout, 1–120 seconds (default 10) |
Meta Conversions API
Sends server events to your Meta Pixel / dataset via the Graph API. Create a system-user access token with the ads_management permission in Meta Events Manager → Settings.
| Field | Required | Where to find it |
|---|---|---|
pixel_id | Yes | Events Manager → Data Sources — the Pixel / dataset ID (not a secret) |
access_token | Yes | Events Manager → Settings → Conversions API — system-user token (encrypted) |
test_event_code | No | Events Manager → Test Events — routes events to the test tab without touching live data |
Meta recommends running the browser Pixel and CAPI in parallel. Affclix sends the conversion ID as the Meta event_id, so Meta deduplicates the server event against the Pixel automatically. See the Meta Ads (Web SDK) guide for the browser side.
TikTok Events API
Sends web events to TikTok Events API 2.0. Generate an access token in TikTok Events Manager for the pixel you want to feed.
| Field | Required | Where to find it |
|---|---|---|
pixel_code | Yes | Events Manager → the web pixel code (event_source_id) |
access_token | Yes | Events Manager → Settings → generate access token (encrypted) |
event_code | No | Test event code — routes events to the Test Events tab |
advertiser_id | No | Reserved for offline / Marketing API flows |
Google Offline Conversions
Imports conversions into Google Ads against a click identifier (gclid / gbraid / wbraid) using the Google Ads API. This requires a developer token and an OAuth refresh token for an account with access to the target customer.
| Field | Required | Where to find it |
|---|---|---|
customer_id | Yes | Google Ads account ID (digits only, no dashes) |
conversion_action | Yes | The conversion action resource name to import against |
developer_token | Yes | Google Ads API Center → developer token (encrypted) |
oauth_client_id / oauth_client_secret | Yes | Google Cloud → OAuth 2.0 credentials (encrypted) |
oauth_refresh_token | Yes | Long-lived refresh token from the OAuth consent flow (encrypted) |
login_customer_id | No | Manager (MCC) account ID, when access is delegated through an MCC |
Event Mapping
Your conversions carry a goal or event token (for example sale, lead, install). The event map translates each token into the platform's event name. Use "*" as a catch-all for any token you have not mapped explicitly.
{
"sale": "Purchase",
"lead": "Lead",
"signup": "CompleteRegistration",
"*": "Purchase"
} Standard events (Purchase, Lead, CompleteRegistration on Meta; CompletePayment on TikTok) unlock optimisation and reporting. Custom event names are accepted but limit what the ad platform can optimise toward.
Identity Signals (Match Keys)
Match keys are a consent allow-list. Only the signals you tick are attached to the outbound event — everything else is withheld, regardless of what the conversion carries. Leaving the list empty sends every signal that is available. Configure this to match your Data Processing Agreement and regional consent obligations.
| Signal | Sent as | Notes |
|---|---|---|
clickid | Platform click ID | fbc for Meta, ttclid for TikTok, gclid for Google — the strongest match signal |
fbc | Meta click cookie | Reconstructed from fbclid captured on landing |
email | SHA-256 hashed | Normalised and hashed before it leaves the platform |
phone | SHA-256 hashed | E.164 normalised, then hashed |
name | SHA-256 hashed | First / last name, hashed |
external_id | SHA-256 hashed | Your stable customer / order identifier |
geo | Country / region | Coarse location derived from the click |
ip | Client IP + user agent | Improves match rate; subject to consent |
Email, phone, name, and external ID are SHA-256 hashed before transmission — the ad platform never receives them in plain text. This raises Event Match Quality (EMQ) without exposing raw customer data.
Deduplication & Idempotency
Two layers protect you from double-counting: platform-side deduplication (between the browser Pixel and the server event) and Affclix-side idempotency (a saved conversion is never delivered twice).
| Layer | Key | Effect |
|---|---|---|
| Platform dedup | event_id = conversion ID | The same ID is used on the browser Pixel and the server event, so the platform counts one conversion |
| Affclix idempotency | sha256(destination | conversion | platform) | A successful delivery blocks any re-send; failed attempts stay retryable |
If a conversion is re-saved (for example after a status change), Affclix will re-attempt delivery only when no successful delivery already exists for that idempotency key — so genuine retries go through, duplicates never do.
Credential Security
Access tokens and OAuth secrets are encrypted at rest using AES-256-GCM. Non-secret identifiers — pixel ID, advertiser ID, customer ID — are stored in the clear so they remain searchable.
- Encrypted at rest — all credential columns use authenticated AES-256-GCM encryption
- Never rendered back — secret fields always display blank; leave them empty on edit to keep the stored value
- Tenant-isolated — every destination is hard-scoped to your workspace; cross-tenant access is not possible
To replace a token, paste the new value into the (blank) field and save. Leaving it blank on save preserves the existing encrypted secret — it is never overwritten with an empty value.
Testing
Use the Test button on each destination to validate the setup before it goes live. The test runs on the server against the real platform, so your credentials are exercised end-to-end.
| Platform | What the test does |
|---|---|
| Meta | Sends a Purchase test event; when a test event code is set, it appears under Events Manager → Test Events |
| TikTok | Sends a CompletePayment test event to the Events API |
| Validates credentials via an OAuth token exchange (there is no offline test bucket) |
For Meta and TikTok, add the test event code before testing so events land in the Test Events tab and never affect live campaign data. Remove it once verified.
CAPI Delivery Report
Every delivery attempt is recorded in Reports → Delivery Logs, on the CAPI Delivery tab. Filter by date, platform, destination, and status to audit exactly what reached each ad platform.
| Column | Meaning |
|---|---|
| Platform / Event | The destination and the mapped platform event that was sent |
| Status | Delivered or Failed |
| Response code | HTTP status returned by the platform |
| Attempts / Retryable | How many times it was tried, and whether a failure is transient (429 / 5xx / network) |
| Error | Trimmed platform error detail for failed attempts (e.g. Meta fbtrace_id) |
Delivery logs are retained for 180 days. Use the report to spot expiring tokens (repeated auth failures) and to reconcile platform-reported conversions against Affclix.