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

eventWhenTypical "status" in body
order_paidOrder transitioned to paidPAID
order_refundedOrder marked refundedREFUNDED
order_cancelledOrder marked cancelledCANCELLED

Payload shape (fields)

  • event โ€” order_paid, order_refunded, or order_cancelled
  • orderId, status, totalAmount, currency
  • paymentGateway, paymentReference (nullable)
  • createdAt, paidAt (nullable until paid)
  • affiliateId (nullable)
  • customer: name, email, phoneNumber
  • items: 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