Docs menu · Delayed Purchase API (legacy)

Docs / Advanced Features

COD / Manual Payment

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

1
At checkout, capture all tracking cookies (fbp, fbc, ga_client_id, click IDs) and store with the order
2
When order is confirmed (status changes or admin fires manually), send the stored data to PixelFly
3
PixelFly routes to Proxy Container (direct API) or sGTM Container (/g/collect)

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
eventstring"purchase"
event_idstringUnique ID for deduplication
event_timeintegerUnix timestamp (seconds)
transaction_idstringOrder ID
valuefloatOrder subtotal
currencystringISO 4217 code (BDT, USD)
itemsarrayProduct items array
user_dataobjectCustomer information

Tracking Cookies & Click IDs

Capture these at checkout time and store with the order:

Field Source Platform
fbp_fbp cookieFacebook CAPI
fbc_fbc cookie or fbclid URL paramFacebook CAPI
ga_client_id_ga cookie (last 2 parts)GA4
gclidURL param or _gcl_aw cookieGoogle Ads
fbclidURL paramFacebook
ttclidURL param or _ttp cookieTikTok
msclkidURL paramMicrosoft 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_id for 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}"

We use cookies to enhance your experience, analyze site traffic, and for marketing purposes. By continuing to use our site, you consent to our use of cookies. Learn more