What Is Meta Conversions API (CAPI)? Server-Side Tracking for Facebook and Instagram Ads
Meta Conversions API (CAPI) is a server-side event tracking interface that lets you send conversion data directly from your server to Meta’s ad platform. Unlike the Meta Pixel (which runs in the user’s browser), CAPI operates independently of cookies, ad blockers, and browser restrictions.
For The Upload Offline Conversions App (TUOCA), the Conversions API is the primary method for uploading offline conversions — booked jobs, completed services, and closed deals — to Facebook and Instagram Ads.
Why CAPI Exists
The Meta Pixel has fundamental limitations in today’s privacy landscape:
| Limitation | Impact |
|---|---|
| Ad blockers | GWI’s April 2025 research found that about 1 in 3 internet users worldwide use an ad blocker at least sometimes (15% in North America). A blocker can stop the Pixel, so the browser never sends the event. |
| iOS ATT | Apple’s prompt asks the person to allow or refuse tracking across apps. Many people refuse. |
| Browser cookie restrictions | Safari ITP, Firefox ETP limit cookie lifetimes |
| Offline conversions | The Pixel can’t fire for phone calls, in-person visits, or CRM events |
| Server-side events | Backend processes (payment confirmations, lead qualification) can’t trigger browser JavaScript |
CAPI solves all of these by moving the event transmission from the browser to the server. Your server sends events directly to Meta’s /events endpoint — no browser involvement needed.
How CAPI Works
Architecture
Traditional Pixel Flow:
User Browser → Meta Pixel (JavaScript) → Meta Servers
CAPI Flow:
Your Server → HTTPS POST → Meta Conversions API → Meta Servers
Combined (Recommended):
User Browser → Meta Pixel → Meta Servers ←── Your Server → CAPI
↓
Deduplication via event_id
The CAPI Request
Events are sent as HTTP POST requests to Meta’s Graph API:
POST https://graph.facebook.com/v26.0/{PIXEL_ID}/events
Event Structure
{
"data": [{
"event_name": "Purchase",
"event_time": 1714502400,
"action_source": "system_generated",
"event_id": "order_12345",
"user_data": {
"em": ["a8b14f04b2be6c5f..."],
"ph": ["d4f5c3b1e72a9f8d..."],
"fbc": "fb.1.1714000000.IwAR3x7..."
},
"custom_data": {
"value": 4500.00,
"currency": "USD"
}
}],
"access_token": "YOUR_ACCESS_TOKEN"
}
Key Fields Explained
| Field | Required | Purpose |
|---|---|---|
event_name | Yes | What happened (Purchase, Lead, etc.) |
event_time | Yes | Unix timestamp of the event |
action_source | Yes | How the event was generated (system_generated for offline) |
event_id | Recommended | Unique ID for deduplication with Pixel |
user_data.em | Recommended | SHA-256 hashed email(s) |
user_data.ph | Recommended | SHA-256 hashed phone(s) |
user_data.fbc | Optional | Facebook click parameter (from FBCLID) |
user_data.fbp | Optional | Facebook browser ID (from _fbp cookie) |
custom_data.value | Recommended | Conversion value (revenue) |
custom_data.currency | Recommended | ISO 4217 currency code |
Action Sources
The action_source field tells Meta how the conversion was generated:
| Value | When to Use |
|---|---|
website | Online conversion (use with Pixel deduplication) |
app | Mobile app event |
phone_call | Customer called after seeing ad |
chat | Customer converted via messaging |
physical_store | In-person conversion |
system_generated | Server-side processing (CRM, automated) |
other | Catch-all |
For TUOCA’s offline conversion uploads, system_generated is the standard action source, since conversions are detected and uploaded by TUOCA’s relay pipeline.
User Data Matching
CAPI’s effectiveness depends on the quality of user data you send. Meta matches events to ad clicks using these hashed identifiers:
| Identifier | Field | Match Quality | Notes |
|---|---|---|---|
em | ★★★★★ | Highest match rates; lowercase and trim before hashing | |
| Phone | ph | ★★★★ | E.164 format before hashing |
| Facebook click (fbc) | fbc | ★★★★★ | Best when available; 7-day window |
| Facebook browser (fbp) | fbp | ★★★ | From _fbp cookie |
| First name | fn | ★★★ | Lowercase before hashing |
| Last name | ln | ★★★ | Lowercase before hashing |
| City | ct | ★★ | Lowercase, no special characters |
| State | st | ★★ | 2-letter code, lowercase |
| Zip code | zp | ★★ | First 5 digits (US) |
| Country | country | ★★ | ISO 2-letter, lowercase |
| External ID | external_id | ★★★ | Your CRM’s customer ID (hashed) |
All PII fields must be SHA-256 hashed before sending. Use the SHA-256 Hasher tool to verify your hashing.
Deduplication
When using both Pixel and CAPI (recommended), the same event may be reported twice. Meta deduplicates using the event_id field:
- Pixel fires with
event_id: "order_12345" - CAPI sends the same event with
event_id: "order_12345" - Meta recognizes the duplicate and counts it once
For offline-only conversions (TUOCA’s primary use case), deduplication isn’t an issue — there’s no Pixel event to duplicate against. However, it’s still best practice to include an event_id for idempotent retries.
CAPI Event Quality Score
Meta assigns an Event Match Quality (EMQ) score to each event, ranging from 1 (poor) to 10 (excellent). Higher scores mean better matching:
| Score Range | Meaning | Typical Cause |
|---|---|---|
| 8-10 | Excellent | fbc + email + phone + name |
| 6-7 | Good | Email + phone |
| 4-5 | Fair | Email only |
| 1-3 | Poor | No identifiers matched |
To check your EMQ: Meta Events Manager → Data Sources → Your Pixel → Event Match Quality.
How TUOCA Uses CAPI
TUOCA integrates directly with Meta’s Conversions API:
- OAuth authentication — Secure connection to your Meta Business account
- Data extraction — Pulls conversion data from your connected sources (CallRail, CRM, webhooks)
- PII processing — Normalizes email (lowercase, trim), phone (E.164), and name (lowercase) per Meta’s rules
- SHA-256 hashing — Hashes all PII fields before transmission
- fbc construction — Converts raw FBCLIDs to fbc format
- Event transmission — Sends batched events to the Conversions API
- Deduplication — Generates consistent event_ids to prevent duplicate reporting
- Error handling — Catches and logs CAPI-specific errors (invalid hash format, expired events, rate limits)
Getting Started with CAPI
- Create a Meta Business account and set up a Pixel
- Generate an access token in Events Manager → Settings → Generate Access Token
- Enable CAPI in Events Manager → Settings → Conversions API
- Configure TUOCA — Connect Meta as a destination, provide your Pixel ID and access token
- Send test events — Use the Events Manager Test Events tool to verify
- Monitor EMQ — Check your Event Match Quality score and optimize
For a complete walkthrough, see the Meta/Facebook Offline Conversions Guide.