Skip to content

Webhook events

Hub webhooks are subscribed per community and use the platform-standard transport: the same X-Quiqqy-Signature HMAC-SHA256 signing, headers, 10-second timeout and retry ladder documented in Webhooks. Verify the signature against the raw body before trusting a payload, and dedupe on X-Quiqqy-Delivery-Id.

POST /communities/{communityId}/webhooks
{
"name": "Ops relay",
"url": "https://ops.example.com/hooks/quiqqy",
"events": ["order.created", "order.status_changed"],
"is_active": true
}

Omit events (or include "*") to receive everything. The subscription’s signing secret is shown once on creation — store it server-side. Manage subscriptions with GET/PUT/DELETE on /webhooks/{webhookId}, send a test delivery with POST /webhooks/{webhookId}/test, and inspect attempts — event type, your response status, the start of your response body — at GET /webhooks/{webhookId}/deliveries.

A community order was placed — through your app, the community storefront, or an operator. Fires once for the parent order, after Hub has split it into child orders and begun forwarding. The payload uses the same generic envelope as every platform webhook; data.order carries the full parent order, including child_orders[].

{
"event_type": "order.created",
"event_id": "evt_7c6d5e4f3a2b",
"community_id": "com_8f14e45fce9a",
"timestamp": "2026-07-30T09:14:22.108Z",
"data": {
"order": {
"order_id": "ord_3e5f7a9b1c2d",
"order_number": "CQ-10428",
"community_id": "com_8f14e45fce9a",
"status": "pending",
"fulfillment_type": "delivery",
"payment_status": "pending",
"currency": "INR",
"subtotal": 68000,
"tax": 3400,
"delivery_fee": 4000,
"discount": 6800,
"tip": 2000,
"total_amount": 74250,
"customer": {
"customer_id": "cus_c7d8e9f01a2b",
"name": "Anita R.",
"phone": "+919812345678"
},
"items": [
{
"line_id": "lin_1a0b9c8d7e6f",
"item_id": "itm_9f8e7d6c5b4a",
"store_id": "st_6a1f0b2e9c3d",
"name": "Kerala Fish Curry",
"quantity": 2,
"unit_price": 32000,
"subtotal": 64000,
"modifiers": [
{ "modifier_id": "mod_3c4d5e6f7a8b", "name": "Medium", "price": 0, "quantity": 1 }
]
}
],
"child_orders": [
{
"order_id": "ord_4f6a8b0c2d3e",
"store_id": "st_6a1f0b2e9c3d",
"store_name": "Cayibel Kochi",
"status": "pending",
"subtotal": 64000,
"line_ids": ["lin_1a0b9c8d7e6f"]
}
],
"created_at": "2026-07-30T09:14:22.000Z",
"updated_at": "2026-07-30T09:14:22.000Z"
}
}
}

The parent order’s status advanced — including roll-ups from child orders. Same envelope: data.previous_status carries the status it moved from, and data.order the full order as it now stands.

{
"event_type": "order.status_changed",
"event_id": "evt_8d7e6f5a4b3c",
"community_id": "com_8f14e45fce9a",
"timestamp": "2026-07-30T09:31:05.442Z",
"data": {
"previous_status": "confirmed",
"order": {
"order_id": "ord_3e5f7a9b1c2d",
"order_number": "CQ-10428",
"community_id": "com_8f14e45fce9a",
"status": "preparing",
"fulfillment_type": "delivery",
"payment_status": "completed",
"currency": "INR",
"total_amount": 74250,
"customer": { "customer_id": "cus_c7d8e9f01a2b", "name": "Anita R." },
"": "items and child_orders as in order.created",
"created_at": "2026-07-30T09:14:22.000Z",
"updated_at": "2026-07-30T09:31:05.000Z"
}
}
}

data.order.status follows the ladder: pending, confirmed, preparing, ready, out_for_delivery, delivered, cancelled. The payload carries the full parent order, but you can always re-fetch GET /communities/{communityId}/orders/{orderId} for the latest state.