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 Value | Description |
|---|---|
offline | Events reported from offline sources (in-store, phone, etc.) |
total | Combined events for web, app, offline, and on-platform |
total_off_platform | Combined 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 Source | Use Case |
|---|---|
physical_store | In-store / brick-and-mortar purchases |
phone_call | Call center or phone order conversions |
phone | Phone number-based conversions |
email | Conversions originating from email campaigns |
chat | Live chat or messaging-based conversions |
system_generated | Automated 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}
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:
| Service | Path |
|---|---|
| Conversions API V3 | POST /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:
| Parameter | Description |
|---|---|
offline_event_set_id | Groups related offline events from batch uploads |
offline_event_file_id | Identifies 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 Source | Event Conversion Type |
|---|---|
| iOS | MOBILE_APP |
| Android | MOBILE_APP |
| Web | WEB |
| Data Feeds | OFFLINE, 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:
| Setting | Description |
|---|---|
| Pixel ID | Required for offline/web events. The Pixel ID for your Ad Account. |
| App ID | Optional. The iOS App ID or Android App URL (use this instead of Pixel ID for mobile app events). |
| Email Type | Required. 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 Field | Snapchat Field | Notes |
|---|---|---|
app_info.os | event_conversion_type | Set to WEB, MOBILE_APP, or OFFLINE |
user_identities.email | hashed_email | Automatically SHA256 hashed |
user_identities.mobile_number | hashed_phone_number | Automatically SHA256 hashed |
ip | hashed_ip_address | Automatically SHA256 hashed |
Required Parameters
Minimum Required Fields
For offline events, you must include:
| Parameter | Description | Required |
|---|---|---|
event_name | The type of conversion event (e.g., PURCHASE, SIGN_UP) | ✅ Yes |
event_time | Unix timestamp (seconds or milliseconds) of when the event occurred | ✅ Yes |
action_source | Must be OFFLINE or a recognized offline source | ✅ Yes |
Required Identifiers
You must include at least one of the following hashed identifiers in user_data:
| Parameter | Description |
|---|---|
em | SHA256 hashed email address (normalized, lowercase) |
ph | SHA256 hashed phone number (with country code, no special characters) |
madid | Hashed 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"
Optional but Recommended
| Parameter | Description |
|---|---|
event_id | Unique identifier for deduplication |
client_dedup_id | Alternative deduplication identifier |
currency | Required if event_name is PURCHASE |
value | Required if event_name is PURCHASE |
event_tag | Custom label (e.g., "in-store", "call-center") |
Request Limits & Validation
Rate Limits
API Upload (CAPI V3)
| Limit Type | Value |
|---|---|
| Max events per batch request | 2,000 |
Batch File Upload (Genesis)
| Limit Type | Value |
|---|---|
| Max purchase events per chunk | 100 |
| Max non-purchase events per chunk | 2,000 |
Timestamp / Time Frame Constraints
| Constraint | Value | Behavior |
|---|---|---|
| Max Swipe/Click Attribution Window | 28 days | Events can only be attributed to swipe/click ads within this window |
| Max View Attribution Window | 7 days | Events can only be attributed to view ads within this window |
| API Warning - Old Timestamp | 62 days | Warning issued (event still processed) |
| API Warning - Future Timestamp | 10 minutes | Warning 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 Type | Deduplication Window |
|---|---|
PURCHASE (with transaction_id) | 30 days |
| Standard events | 48 hours (2 days) |
ADD_CART | 1 second |
PAGE_VIEW | 1 second |
Validation Errors
| Error Code | Error Name | Description |
|---|---|---|
003 | INVALID_REQUEST_BODY_JSON | Malformed JSON payload |
501 | MISSING_EVENT_NAME | event_name field is missing |
502 | MISSING_EVENT_TIME | event_time field is missing |
505 | MISSING_USER_DATA | No valid user identifier provided |
516 | INVALID_EVENT_NAME | Event name is not a valid conversion event |
| — | INVALID_OFFLINE_EVENT_SET_ID | The offline event set ID is not valid |
| — | INVALID_PIXEL_ID | Pixel 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
- Send events promptly — Real-time or near-real-time sends improve attribution accuracy
- Stay within attribution windows — Events can only be attributed within 28 days (swipe/click) or 7 days (view) of ad exposure
- Use accurate timestamps — Ensure
event_timereflects when the conversion actually occurred
Batch Uploads
- Keep batches under 2,000 events — Larger batches will be rejected
- Monitor status reports — Check the Ads API for upload success/failure rates
- Handle errors gracefully — Implement retry logic for transient failures
Related Resources
- Parameters Reference — Full list of all CAPI parameters
- Getting Started — Initial setup and access token generation
- Best Practices — General CAPI best practices
- Verify Setup — Validate your integration