HTTPS webhooks for order lifecycle events
Point your own endpoint at a product to receive server-to-server notifications — same URL for every event type; the JSON body tells you what happened.
In the Zenofy merchant app, open the product’s integrations, choose Webhook, enter an HTTPS URL (and optional shared secret), enable the integration, and save. Each product has its own webhook settings.
We POST to your URL when an order becomes paid, refunded, or cancelled. The field "event" is order_paid, order_refunded, or order_cancelled; "status" mirrors the order (PAID, REFUNDED, or CANCELLED).
Requests use Content-Type: application/json. If you configured a secret, we also send header X-Webhook-Secret with that value so you can verify the request is from Zenofy.
Return HTTP 2xx quickly and process the payload asynchronously if needed. Delivery is best-effort; check your server logs and Zenofy admin Webhook logs if something fails.
HTTP request
POST ยท Content-Type: application/json ยท optional X-Webhook-Secret
POST /your-webhook-path HTTP/1.1
Host: api.example.com
Content-Type: application/json
X-Webhook-Secret: your-shared-secret
{ ... }
Events and "event" values
| event | When | Typical "status" in body |
|---|---|---|
order_paid | Order transitioned to paid | PAID |
order_refunded | Order marked refunded | REFUNDED |
order_cancelled | Order marked cancelled | CANCELLED |
Payload shape (fields)
eventโorder_paid,order_refunded, ororder_cancelledorderId,status,totalAmount,currencypaymentGateway,paymentReference(nullable)createdAt,paidAt(nullable until paid)affiliateId(nullable)customer:name,email,phoneNumberitems: array of line items (productId,productName,quantity,unitPrice,totalPrice,currency,isBumpProduct)
Sample JSON bodies
order_paid (abbreviated)
{
"event": "order_paid",
"orderId": "673f92b2c3d94a0012abcd01",
"status": "PAID",
"totalAmount": 149.99,
"currency": "MZN",
"paymentGateway": "EMIS_GPO",
"paymentReference": "PC673F92_1A",
"createdAt": "2026-05-01T10:30:00+02:00",
"paidAt": "2026-05-01T10:42:18+02:00",
"affiliateId": null,
"customer": {
"name": "Ada Lovelace",
"email": "ada@example.com",
"phoneNumber": "+258840000000"
},
"items": [
{
"productId": "507f1f77bcf86cd799439011",
"productName": "Starter course",
"quantity": 1,
"unitPrice": 149.99,
"totalPrice": 149.99,
"currency": "MZN",
"isBumpProduct": false
}
]
}
order_refunded (abbreviated)
{
"event": "order_refunded",
"orderId": "673f92b2c3d94a0012abcd01",
"status": "REFUNDED",
"totalAmount": 149.99,
"currency": "MZN",
"paymentGateway": "EMIS_GPO",
"paymentReference": "PC673F92_1A",
"createdAt": "2026-05-01T10:30:00+02:00",
"paidAt": "2026-05-01T10:42:18+02:00",
"affiliateId": null,
"customer": {
"name": "Ada Lovelace",
"email": "ada@example.com",
"phoneNumber": "+258840000000"
},
"items": [
{
"productId": "507f1f77bcf86cd799439011",
"productName": "Starter course",
"quantity": 1,
"unitPrice": 149.99,
"totalPrice": 149.99,
"currency": "MZN",
"isBumpProduct": false
}
]
}
order_cancelled (abbreviated)
{
"event": "order_cancelled",
"orderId": "673f92b2c3d94a0012abcd02",
"status": "CANCELLED",
"totalAmount": 49.00,
"currency": "MZN",
"paymentGateway": null,
"paymentReference": null,
"createdAt": "2026-05-01T09:15:22+02:00",
"paidAt": null,
"affiliateId": null,
"customer": {
"name": "Test Buyer",
"email": "buyer@example.org",
"phoneNumber": null
},
"items": [
{
"productId": "507f191e810c19729de860ea",
"productName": "Digital guide",
"quantity": 1,
"unitPrice": 49.00,
"totalPrice": 49.00,
"currency": "MZN",
"isBumpProduct": false
}
]
}
All tutorials