Docs menu · Delayed Purchase API (legacy)
Getting Started
Integrations
Server-side GTM
COD Order Protection
Advanced Features
Downloads
Tools & Support
Docs / Advanced Features
Delayed Purchase Events API
Legacy plugin-side hold — use COD Order Protection for new setups
When to use: For Cash on Delivery (COD) or manual payment orders where you want to fire the purchase event only after the order is confirmed/paid, not at checkout time.
How It Works
Complete Payload Structure
{
"event": "purchase",
"event_id": "purchase_12345_1699012345",
"event_time": 1699012345,
"action_source": "website",
"event_source_url": "https://yoursite.com/thank-you/12345",
"transaction_id": "12345",
"value": 1500.00,
"currency": "BDT",
"tax": 0,
"shipping": 60.00,
"coupon": "SAVE10",
"items": [
{
"item_id": "SKU-001",
"item_name": "Product Name",
"price": 750.00,
"quantity": 2,
"item_category": "Category",
"item_variant": "Red / Large"
}
],
"content_ids": ["SKU-001"],
"user_data": {
"em": "customer@example.com",
"ph": "01712345678",
"fn": "john",
"ln": "doe",
"ct": "dhaka",
"st": "Dhaka",
"zp": "1205",
"country": "BD",
"external_id": "01712345678",
"fbp": "fb.1.1234567890.987654321",
"fbc": "fb.1.1234567890.AbCdEfGh",
"ga_client_id": "1234567890.0987654321"
},
// Root level for easy access
"fbp": "fb.1.1234567890.987654321",
"fbc": "fb.1.1234567890.AbCdEfGh",
"ga_client_id": "1234567890.0987654321",
"gclid": "CjwKCAjw...",
"fbclid": "IwAR3abc123xyz",
"ttclid": "E.CP...",
"msclkid": "abc123",
"context": {
"ip": "103.123.45.67",
"user_agent": "Mozilla/5.0...",
"is_delayed": true,
"utm": {
"utm_source": "facebook",
"utm_medium": "cpc",
"utm_campaign": "spring_sale"
}
}
}
Required Fields
| Field | Type | Description |
|---|---|---|
| event | string | "purchase" |
| event_id | string | Unique ID for deduplication |
| event_time | integer | Unix timestamp (seconds) |
| transaction_id | string | Order ID |
| value | float | Order subtotal |
| currency | string | ISO 4217 code (BDT, USD) |
| items | array | Product items array |
| user_data | object | Customer information |
Tracking Cookies & Click IDs
Capture these at checkout time and store with the order:
| Field | Source | Platform |
|---|---|---|
| fbp | _fbp cookie | Facebook CAPI |
| fbc | _fbc cookie or fbclid URL param | Facebook CAPI |
| ga_client_id | _ga cookie (last 2 parts) | GA4 |
| gclid | URL param or _gcl_aw cookie | Google Ads |
| fbclid | URL param | |
| ttclid | URL param or _ttp cookie | TikTok |
| msclkid | URL param | Microsoft Ads |
JavaScript: Capture Tracking Data
function getTrackingData() {
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
return null;
}
function getUrlParam(param) {
return new URLSearchParams(window.location.search).get(param);
}
// Facebook IDs
let fbp = getCookie('_fbp');
let fbc = getCookie('_fbc');
const fbclid = getUrlParam('fbclid');
if (!fbc && fbclid) {
fbc = 'fb.1.' + Date.now() + '.' + fbclid;
}
// GA Client ID (last 2 parts of _ga cookie)
let gaClientId = null;
const gaCookie = getCookie('_ga');
if (gaCookie) {
const parts = gaCookie.split('.');
if (parts.length >= 4) {
gaClientId = parts[2] + '.' + parts[3];
}
}
return {
fbp: fbp,
fbc: fbc,
fbclid: fbclid,
gclid: getUrlParam('gclid') || getCookie('_gcl_aw'),
ga_client_id: gaClientId,
ttclid: getUrlParam('ttclid') || getCookie('_ttp'),
msclkid: getUrlParam('msclkid'),
utm_source: getUrlParam('utm_source'),
utm_medium: getUrlParam('utm_medium'),
utm_campaign: getUrlParam('utm_campaign')
};
}
PHP: Capture Tracking Data
function getTrackingCookies($request) {
$data = [];
// Facebook Browser ID
$data['fbp'] = $request->cookie('_fbp') ?? $_COOKIE['_fbp'] ?? null;
// Facebook Click ID
$fbc = $request->cookie('_fbc') ?? $_COOKIE['_fbc'] ?? null;
if (!$fbc && $request->has('fbclid')) {
$fbc = 'fb.1.' . time() . '.' . $request->input('fbclid');
}
$data['fbc'] = $fbc;
$data['fbclid'] = $request->input('fbclid');
// GA Client ID (last 2 parts of _ga cookie)
$gaCookie = $request->cookie('_ga') ?? $_COOKIE['_ga'] ?? null;
if ($gaCookie) {
$parts = explode('.', $gaCookie);
if (count($parts) >= 4) {
$data['ga_client_id'] = $parts[2] . '.' . $parts[3];
}
}
// Click IDs
$data['gclid'] = $request->input('gclid');
$data['ttclid'] = $request->input('ttclid') ?? $request->cookie('_ttp');
$data['msclkid'] = $request->input('msclkid');
return array_filter($data);
}
Best Practices
- - Always include
event_idfor deduplication - - Fire delayed events within 7 days for best matching rates
- - Include IP and user_agent from original checkout
- - Format:
event_id = "purchase_{order_id}_{timestamp}"