Skip to main content

Offline Events

Offline events allow you to track conversions that happen outside of digital channels—such as in-store purchases, phone orders, email conversions, and other non-pixelable interactions—and attribute them to your Snapchat campaigns.


What Are Offline Events?

Offline CAPI events are conversion events that occur outside of traditional web or app environments. These events enable you to:

  • Measure in-store conversions — Track purchases made at physical retail locations
  • Capture phone-based sales — Attribute call center orders to ad exposure
  • Record email conversions — Connect email marketing conversions to Snapchat campaigns
  • Track chat-based sales — Measure conversions from customer service interactions
  • Upload historical data — Send batch files of past conversion data for attribution

Offline events close the attribution gap between digital ad exposure and real-world conversions. By sharing offline conversion data, you can get a more complete picture of your campaign ROI and enable better optimization.


How Offline Events Flow to Snap

Measurement & Reporting

Offline events are available in measurement reporting with the conversion_source_types=offline breakdown:

Breakdown ValueDescription
offlineEvents reported from offline sources (in-store, phone, etc.)
totalCombined events for web, app, offline, and on-platform
total_off_platformCombined events for web, app, and offline

Action Sources for Offline Events

The action_source field determines how Snap classifies your event. You have two equivalent options for offline events:

Option 1: Snap Native Value

Use OFFLINE for a simple, explicit value that matches Snap's internal taxonomy:

"action_source": "OFFLINE"

Option 2: Meta-Compatible Aliases

Use semantic aliases if you're migrating from Meta's Conversions API or want channel-specific clarity in your own logging:

Action SourceUse Case
physical_storeIn-store / brick-and-mortar purchases
phone_callCall center or phone order conversions
phonePhone number-based conversions
emailConversions originating from email campaigns
chatLive chat or messaging-based conversions
system_generatedAutomated or backend-triggered conversions

All values are case-insensitive and map to the same OFFLINE conversion type internally. Whether you send "OFFLINE", "offline", "physical_store", or "phone_call" — they are all treated identically for attribution, reporting, and optimization.

Note: The original action_source value is not preserved in analytics — only the mapped conversion type (OFFLINE) is stored.


Offline Event Endpoint

Offline events use the same Conversions API endpoint as web events, but require a Pixel ID (not a Snap App ID):

POST https://tr.snapchat.com/v3/{PIXEL_ID}/events?access_token={TOKEN}

Create Access Token


Ingestion Methods

Snap supports three primary methods for sending offline conversion data:

1. API Upload

Send offline events directly via the Conversions API. This is ideal for:

  • Point-of-sale integrations
  • Call center systems
  • CRM triggers

Endpoints:

ServicePath
Conversions API V3POST /v3/{pixel_id}/events
Conversions API V2 (deprecated)POST /v2/conversion

Batch Requests

You can send multiple events in a single API request by including them in the data array. This is more efficient than sending individual requests for each event.

  • Max events per request: 2,000
  • Recommended QPS: 1,000 requests/sec (with Long-Lived Token)

See Rate Limits for complete details on request limits and constraints.

2. Batch File Upload

Upload CSV or JSON files containing historical offline conversion data. This method is ideal for:

  • Uploading historical sales data
  • Periodic bulk uploads from data warehouses
  • Large-scale offline conversion imports

Batch Processing Flow

Key Parameters for Batch Uploads:

ParameterDescription
offline_event_set_idGroups related offline events from batch uploads
offline_event_file_idIdentifies the specific upload file

3. Partner Integration (mParticle)

mParticle is currently the only third-party partner that can send offline conversion events directly into Snap's Conversions API. Other partners like Adjust, AppsFlyer, and Kochava receive attribution data from Snap (outbound postbacks) but do not send conversion events to Snap.

mParticle Supported Inputs

For complete setup instructions, supported events, and custom mappings, see the mParticle Snapchat Conversions integration guide.

mParticle can forward events to Snapchat from the following sources:

Input SourceEvent Conversion Type
iOSMOBILE_APP
AndroidMOBILE_APP
WebWEB
Data FeedsOFFLINE, MOBILE_APP, or WEB

Data Feeds are the key input for offline events — they allow you to forward offline conversion data (e.g., in-store purchases, call center orders) to Snap.

Connection Settings for Offline Events

When configuring a Data Feed connection for offline events in mParticle:

SettingDescription
Pixel IDRequired for offline/web events. The Pixel ID for your Ad Account.
App IDOptional. The iOS App ID or Android App URL (use this instead of Pixel ID for mobile app events).
Email TypeRequired. The mParticle identity type to forward as hashed email to Snap.

Field Mappings

mParticle automatically maps and hashes user data before sending to Snap:

mParticle FieldSnapchat FieldNotes
app_info.osevent_conversion_typeSet to WEB, MOBILE_APP, or OFFLINE
user_identities.emailhashed_emailAutomatically SHA256 hashed
user_identities.mobile_numberhashed_phone_numberAutomatically SHA256 hashed
iphashed_ip_addressAutomatically SHA256 hashed

Required Parameters

Minimum Required Fields

For offline events, you must include:

ParameterDescriptionRequired
event_nameThe type of conversion event (e.g., PURCHASE, SIGN_UP)✅ Yes
event_timeUnix timestamp (seconds or milliseconds) of when the event occurred✅ Yes
action_sourceMust be OFFLINE or a recognized offline source✅ Yes

Required Identifiers

You must include at least one of the following hashed identifiers in user_data:

ParameterDescription
emSHA256 hashed email address (normalized, lowercase)
phSHA256 hashed phone number (with country code, no special characters)
madidHashed Mobile Advertising ID

Events without at least one valid user identifier will be rejected with the error: "Incoming conversions requests must have at least one valid user ID parameter to perform the match"

ParameterDescription
event_idUnique identifier for deduplication
client_dedup_idAlternative deduplication identifier
currencyRequired if event_name is PURCHASE
valueRequired if event_name is PURCHASE
event_tagCustom label (e.g., "in-store", "call-center")

Request Limits & Validation

Rate Limits

API Upload (CAPI V3)

Limit TypeValue
Max events per batch request2,000

Batch File Upload (Genesis)

Limit TypeValue
Max purchase events per chunk100
Max non-purchase events per chunk2,000

Timestamp / Time Frame Constraints

ConstraintValueBehavior
Max Swipe/Click Attribution Window28 daysEvents can only be attributed to swipe/click ads within this window
Max View Attribution Window7 daysEvents can only be attributed to view ads within this window
API Warning - Old Timestamp62 daysWarning issued (event still processed)
API Warning - Future Timestamp10 minutesWarning issued (event still processed)

Event Deduplication

Events are deduplicated based on event_id within a time window. The deduplication window varies by event type:

Event TypeDeduplication Window
PURCHASE (with transaction_id)30 days
Standard events48 hours (2 days)
ADD_CART1 second
PAGE_VIEW1 second

Validation Errors

Error CodeError NameDescription
003INVALID_REQUEST_BODY_JSONMalformed JSON payload
501MISSING_EVENT_NAMEevent_name field is missing
502MISSING_EVENT_TIMEevent_time field is missing
505MISSING_USER_DATANo valid user identifier provided
516INVALID_EVENT_NAMEEvent name is not a valid conversion event
INVALID_OFFLINE_EVENT_SET_IDThe offline event set ID is not valid
INVALID_PIXEL_IDPixel ID is not authorized

Example Payloads

Using Snap Native Value

Use OFFLINE when you want a simple, explicit action source:

{
"data": [
{
"event_name": "PURCHASE",
"event_time": 1734567890,
"action_source": "OFFLINE",
"event_id": "offline_txn_12345",
"user_data": {
"em": [
"7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"
]
},
"custom_data": {
"value": "99.99",
"currency": "USD"
}
}
]
}

In-Store Purchase (Meta Alias)

Use physical_store for semantic clarity about the conversion channel:

{
"data": [
{
"event_name": "PURCHASE",
"event_time": 1734567890,
"action_source": "physical_store",
"event_id": "store_txn_12345",
"user_data": {
"em": [
"7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"
]
},
"custom_data": {
"value": "99.99",
"currency": "USD"
}
}
]
}

Phone Order Event

{
"data": [
{
"event_name": "PURCHASE",
"event_time": 1734567890,
"action_source": "phone_call",
"event_id": "call_order_98765",
"user_data": {
"ph": [
"959995162a8d9712427ae9c39676cde79bbfc9f560bc3911ec9edcf1f169e5f6"
]
},
"custom_data": {
"value": "299.99",
"currency": "USD"
}
}
]
}

Email Conversion Event

{
"data": [
{
"event_name": "SIGN_UP",
"event_time": 1734567890,
"action_source": "email",
"event_id": "email_signup_001",
"user_data": {
"em": [
"7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"
]
}
}
]
}

Multiple Offline Events (Batch)

{
"data": [
{
"event_name": "PURCHASE",
"event_time": 1734567000,
"action_source": "physical_store",
"event_id": "order_001",
"user_data": {
"em": [
"7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"
]
},
"custom_data": {
"value": "50.00",
"currency": "USD"
}
},
{
"event_name": "PURCHASE",
"event_time": 1734567100,
"action_source": "phone_call",
"event_id": "order_002",
"user_data": {
"ph": [
"959995162a8d9712427ae9c39676cde79bbfc9f560bc3911ec9edcf1f169e5f6"
]
},
"custom_data": {
"value": "75.00",
"currency": "USD"
}
},
{
"event_name": "SIGN_UP",
"event_time": 1734567200,
"action_source": "email",
"event_id": "signup_003",
"user_data": {
"em": [
"7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"
]
}
}
]
}

cURL Examples

Test Event (Validate Endpoint)

Use the /events/validate endpoint to test your payload without sending a live event:

curl -X POST "https://tr.snapchat.com/v3/{PIXEL_ID}/events/validate?access_token={TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"data": [
{
"event_name": "PURCHASE",
"event_time": 1734567890,
"action_source": "physical_store",
"event_id": "test_offline_001",
"user_data": {
"em": ["7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"]
},
"custom_data": {
"value": "99.99",
"currency": "USD"
}
}
]
}'

Response:

{
"status": "VALID",
"test_event": true,
"reason": "Events have been processed successfully.",
"event_logs": [{ "event": 1, "status": "VALID" }]
}

Production Event

Send an offline conversion event to be recorded and attributed:

curl -X POST "https://tr.snapchat.com/v3/{PIXEL_ID}/events?access_token={TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"data": [
{
"event_name": "PURCHASE",
"event_time": 1734567890,
"action_source": "physical_store",
"event_id": "live_offline_001",
"user_data": {
"em": ["7b17fb0bd173f625b58636fb796407c22b3d16fc78302d79f0fd30c2fc2fc068"]
},
"custom_data": {
"value": "99.99",
"currency": "USD"
}
}
]
}'

Response:

{
"status": "VALID",
"reason": "Events have been processed successfully."
}

Best Practices for Offline Events

Timing

  1. Send events promptly — Real-time or near-real-time sends improve attribution accuracy
  2. Stay within attribution windows — Events can only be attributed within 28 days (swipe/click) or 7 days (view) of ad exposure
  3. Use accurate timestamps — Ensure event_time reflects when the conversion actually occurred

Batch Uploads

  1. Keep batches under 2,000 events — Larger batches will be rejected
  2. Monitor status reports — Check the Ads API for upload success/failure rates
  3. Handle errors gracefully — Implement retry logic for transient failures

Was this page helpful?
Yes
No