POST one JSON object per order to your workspace webhook URL (find it in Settings → Order webhooks). One order = one conversion = one CAPI Purchase, deduped by order_id. Send upsells and OTOs as separate orders, never collapse by customer.
POST /api/wh/generic/{token}
Content-Type: application/json
{
"order_id": "string, required: your unique order id",
"email": "string, optional: buyer email (enables email matching)",
"amount_cents": 2700, // integer, required
"currency": "EUR", // 3-letter code, default EUR
"product_id": "string, optional",
"product_name": "string, optional",
"ft_vid": "string, optional: visitor id from the hidden form field",
"occurred_at": "2026-07-21T12:00:00Z" // ISO 8601, optional, default now
}Pass ft_vidwhen you have it (the snippet auto-fills it into a hidden field on every form). That gives an exact cookie match. Otherwise we match by email against captured leads. If neither matches, the order is honestly labeled unattributed. We count, we don't model.