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_vid when 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.