Platform Guide 9 min read

Meta/Facebook Offline Conversions Guide: CAPI, Enhanced Matching, and Offline Event Uploads

The complete guide to uploading offline conversions to Meta (Facebook/Instagram) using the Conversions API (CAPI). The Upload Offline Conversions App covers event setup, PII hashing, deduplication, iOS 14 impact, and common CAPI errors.

Last verified: 2026-11-07

Meta offline conversions — uploading real-world business outcomes like phone calls, booked appointments, and closed deals to your Facebook and Instagram ad campaigns — are handled through Meta’s Conversions API (CAPI). Unlike Google Ads’ GCLID-based system, Meta relies primarily on hashed personally identifiable information (PII) to match offline events to ad clicks.

The Upload Offline Conversions App (TUOCA) supports Meta CAPI as a destination platform, handling PII normalization, SHA-256 hashing, event formatting, deduplication, and automated uploads. This guide covers everything you need to implement Meta offline conversion tracking — from initial setup through advanced optimization.

Understanding Meta’s Conversion Infrastructure

Meta’s conversion tracking ecosystem has evolved significantly. Here’s the current landscape:

Conversions API (CAPI) — The Current Standard

The Conversions API is Meta’s server-to-server event tracking system. It bypasses the browser entirely, sending conversion data directly from your server (or a tool like TUOCA) to Meta’s servers.

Key advantages over the Meta Pixel:

  • Not blocked by ad blockers
  • Not affected by browser cookie restrictions
  • Not dependent on JavaScript execution
  • Can send offline events that never happened in a browser
  • More reliable data transmission

For offline conversions specifically, CAPI is the only method. The Meta Pixel can’t track events that happen outside of a web browser.

Offline Conversions API — Deprecated

Meta previously offered a separate “Offline Conversions API” with offline event sets. This legacy system has been deprecated in favor of the unified Conversions API. If you see references to “offline event sets” in older documentation, note that this has been replaced by CAPI with action_source: "system_generated".

Event Structure

Every Meta CAPI offline event requires these components:

Required Fields

FieldTypeDescriptionExample
event_nameStringThe type of eventPurchase, Lead, CompleteRegistration
event_timeIntegerUnix timestamp (seconds)1714150200
user_dataObjectHashed PII for matchingSee below
action_sourceStringMust be system_generated for offline eventssystem_generated
FieldTypeDescription
event_idStringUnique identifier for deduplication
custom_data.valueFloatConversion value
custom_data.currencyStringISO 4217 currency code
custom_data.content_nameStringName of the product/service
custom_data.order_idStringYour internal order/job ID

Event Names

Meta supports both standard and custom event names. For offline conversions, the most relevant standard events are:

Event NameUse Case
PurchaseCompleted sale / booked job / revenue collected
LeadQualified lead / booked appointment
CompleteRegistrationSigned contract / started onboarding
ContactPhone call / form submission
SubscribeRecurring service signup
StartTrialFree trial / initial consultation

Custom events (e.g., BookedJob, CompletedInstallation) are also supported but may have limited optimization support in Meta’s ad delivery algorithms. Standard events are preferred when they match your use case.

The 7-Day Window

Unlike Google Ads’ 90-day GCLID window, Meta requires events to be uploaded within 7 days of the event occurring. The event_time field determines the event timestamp.

Critical implication: For service businesses with long sales cycles, you may need to upload intermediate conversion events (e.g., “Lead” when the appointment is booked) in addition to final conversion events (e.g., “Purchase” when the job is completed and paid).

TUOCA handles this by running automated relays on daily or hourly schedules, ensuring events are uploaded well within the 7-day window.

PII Hashing Requirements

Meta matches offline events to ad interactions using hashed PII. All PII must be SHA-256 hashed before sending. Sending unhashed PII will result in rejected events and potential privacy violations.

Supported User Data Fields

ParameterField NameNormalizationExample (Before)Example (After Hash)
EmailemLowercase, trimJohn.Doe@Gmail.COM a8b14... (SHA-256)
PhonephE.164 format, remove non-digits(555) 123-4567+15551234567 → d4f5e...
First namefnLowercase, trimJohna8cfcd...
Last namelnLowercase, trimDoe0679a...
CityctLowercase, trim, no spacesNew Yorknewyork → ceb33...
StatestLowercase 2-letterNYny → 0235c...
Zip codezpFirst 5 digits only (US)10001-123410001 → a9334...
CountrycountryISO 2-letter lowercaseUSus → 9b202...

Normalization Rules (Critical)

Before hashing, you must normalize PII exactly as Meta expects:

  1. Email: Convert to lowercase. Trim leading/trailing whitespace. Do NOT remove dots from the local part (unlike Google’s recommendation for Gmail addresses).
  2. Phone: Remove all non-digit characters. Add country code prefix. Must be in E.164 format: +15551234567
  3. Names: Convert to lowercase. Trim whitespace. Remove non-letter characters.
  4. Location: Convert to lowercase. Remove spaces from city names. Use 2-letter state abbreviations. Use first 5 digits of zip code.

Common mistakes:

  • Hashing before normalizing (the hash of “John@Email.com” ≠ the hash of “john@email.com”)
  • Using MD5 instead of SHA-256
  • Sending raw (unhashed) PII
  • Not including country code in phone numbers
  • Including dots in Gmail addresses (this differs from Google’s normalization)

TUOCA handles all normalization and hashing automatically. For manual hashing, use our SHA-256 Hasher tool.

Deduplication

Meta uses a combination of event_id and event_name for deduplication within a 48-hour window.

How It Works

If Meta receives two events with the same event_id AND event_name, it keeps only the first one. This is critical in two scenarios:

Scenario 1: Browser Pixel + CAPI (Redundant Events) If you’re sending the same event from both the browser (Pixel) and the server (CAPI), use the same event_id on both so Meta deduplicates them. This is called “redundant event setup” and is Meta’s recommended configuration for online events.

Scenario 2: Purely Offline Events For events that only come from CAPI (like offline conversions from your CRM), each event should have a unique event_id. Use your CRM’s record ID, job number, or another unique identifier.

The action_source Field

For offline conversions, action_source must be set to system_generated. This tells Meta the event didn’t happen in a browser or app — it was generated by a backend system based on offline activity.

Other action_source values (for reference):

  • website — browser-side events (Pixel)
  • app — mobile app events
  • phone_call — telephone conversions
  • email — email conversions
  • chat — messaging conversions
  • physical_store — in-store conversions

iOS 14.5 / ATT Impact

Apple’s App Tracking Transparency (ATT) framework, introduced in iOS 14.5, significantly impacts Meta’s ability to track and match user activity.

What Changed

  • Apple’s prompt asks the person to allow or refuse tracking across apps. Many people refuse. There is no single published opt-out rate.
  • Meta’s ability to observe post-click behavior on iOS devices is drastically reduced
  • The Meta Pixel fires less reliably on iOS Safari
  • Attribution windows were shortened (from 28 days to 7 days for many events)

Impact on Offline Conversions

Offline conversions uploaded via CAPI are less directly affected than online events because:

  1. Matching is done server-side based on first-party data (hashed PII), not cookies or device identifiers
  2. The conversion event is sent directly to Meta’s servers, bypassing browser restrictions
  3. First-party data you collect (email, phone from forms or calls) is unaffected by ATT

However, overall match rates may be lower because:

  • Meta’s user identification pool is smaller post-ATT
  • Cross-device matching is less reliable
  • Some users who opted out may not be matchable even with correct PII

Optimization Strategies

  1. Send multiple PII fields — Email + phone + name + zip gives Meta more matching signals
  2. Upload events quickly — The 7-day window is even more important post-ATT
  3. Use standard event names — Better optimization signal for Meta’s algorithms
  4. Include conversion values — Enables value-based optimization even with smaller matched audiences

Setting Up Meta CAPI for Offline Conversions

Prerequisites

  1. Meta Business Manager account with admin access
  2. Meta Pixel created (even for server-side events, CAPI events are associated with a Pixel)
  3. System User or App for API authentication
  4. Access Token with ads_management and business_management permissions

Configuration in TUOCA

  1. Connect Meta as a destination — OAuth flow or access token input
  2. Select your Pixel — Choose the Pixel ID to associate events with
  3. Map event names — Map your source data fields to Meta event parameters
  4. Configure PII mapping — Specify which source fields contain email, phone, name, etc.
  5. Set schedule — Daily recommended (to stay within 7-day window)
  6. Test — Use Meta’s Test Events tool to verify events are received and matched

Verifying Uploads

After uploading events, verify them in Meta Events Manager:

  1. Go to Events Manager → Select your Pixel
  2. Click “Test Events” tab during testing
  3. Click “Overview” tab for production events
  4. Check “Event Match Quality” — aim for 6.0+ out of 10.0
  5. Review match rate — percentage of events Meta could match to user profiles

Event Match Quality is Meta’s scoring system (1–10) that indicates how much user data you’re sending and how useful it is for matching. Sending more PII fields improves this score.

Common CAPI Errors

ErrorCauseFix
Invalid event_timeEvent older than 7 days, or timestamp in milliseconds instead of secondsUse Unix seconds, upload within 7 days
Duplicate eventSame event_id + event_name sent twiceEnsure unique event_ids for offline events
Invalid Pixel IDPixel doesn’t exist or isn’t accessibleVerify Pixel ID and permissions
Missing user_dataNo PII provided for matchingInclude at least email or phone
Invalid hash formatPII not properly SHA-256 hashedNormalize first, then SHA-256 hash
Permission deniedAccess token lacks required permissionsVerify ads_management scope
Rate limitToo many API calls per time periodBatch events, implement backoff
Deduplication conflictevent_id reused across different event typesUse unique event_ids per event

Comparison: Meta vs. Google Ads Offline Conversions

FeatureGoogle AdsMeta CAPI
Primary matchingGCLID (click ID)Hashed PII
Event window90 days (GCLID) / 63 days (ECL)7 days
PII hashingSHA-256 (for Enhanced Conversions)SHA-256 (mandatory)
Deduplicationorder_idevent_id + event_name
Processing delay4–6 hoursNear real-time
Offline event typeImport (conversion action setting)system_generated (action_source)
MCC supportYes (cross-account uploads)Business Manager (cross-Pixel)
Value-based biddingTarget ROAS, Max Conversion ValueValue optimization

Getting Started

  1. Set up prerequisites — Business Manager, Pixel, System User, Access Token
  2. Start with your highest-value event — Usually “Purchase” or “Lead”
  3. Ensure PII collection — Your forms, CRM, or call tracking must capture email and/or phone
  4. Test with Meta’s Test Events tool — Verify matching before going live
  5. Automate with TUOCA — Connect your data source and Meta as a destination
  6. Monitor Event Match Quality — Aim for 6.0+ score by sending multiple PII fields
  7. Verify in reports — Check Ads Manager for offline event attribution

Frequently Asked Questions

The Meta Conversions API (CAPI) is Meta's server-side event tracking system that allows advertisers to send conversion events — including offline events like phone calls, booked jobs, and completed sales — directly from their server to Meta's servers. Unlike the Meta Pixel, which runs in the browser, CAPI does not depend on that tag. GWI's April 2025 research found that about 1 in 3 internet users worldwide use an ad blocker at least sometimes, and 15% in North America. TUOCA uses CAPI to upload offline conversions to Meta, Facebook, and Instagram campaigns.

Meta requires offline events to be sent within 7 days of the event occurring (based on the event_time field). Events older than 7 days will be rejected. This is significantly shorter than Google Ads' 90-day GCLID window, so timely uploads are critical. TUOCA's automated relays can run on daily or hourly schedules to ensure events are uploaded well within this window.

Meta requires at least one piece of hashed PII for matching: email address (em), phone number (ph), first name (fn), last name (ln), city (ct), state (st), zip code (zp), or country (country). Email and phone number have the highest match rates. All PII must be SHA-256 hashed after normalization (lowercase, trimmed, E.164 phone format). Sending multiple identifiers increases match rates.

Meta deduplicates events using the combination of event_id and event_name. If two events have the same event_id and event_name, Meta keeps only the first one. This is crucial when using both browser-side Pixel tracking and server-side CAPI — the event_id must match across both to prevent double-counting. For purely offline events sent only via CAPI, each event should have a unique event_id.

Yes, but less directly than it affects online tracking. iOS 14.5's App Tracking Transparency (ATT) primarily impacts browser-side tracking and the ability to match users across apps and websites. Offline conversions uploaded via CAPI using hashed PII are less affected because the matching happens server-side based on first-party data. However, the overall reduction in Meta's user matching pool can lower match rates for offline events.

Stop Guessing. Start Proving ROI.

TUOCA connects your CRM and call tracking data directly to your ad platforms. Set up in minutes.