Slerp order webhook payload reference
Reference for the JSON body Slerp sends to a custom webhook endpoint.
Envelope
| Field | Type | Description |
|---|---|---|
id |
UUID | Unique identifier for this webhook event, not the order. |
type |
string | Event type. See below. |
createdAt |
ISO 8601 (UTC) | When the event was generated. May lag slightly behind data.order.createdAt / updatedAt. |
data.order |
object | The order payload. |
Event types
|
Type |
Fired when | Typical field deltas |
|---|---|---|
order.created |
Order first placed. |
Full payload. On DELIVERY orders, |
order.status_updated |
Top level order status changes. |
Can carry a At the terminal event, |
order.delivery_status_updated |
Fulfilment status changes on a DELIVERY order. |
May also carry a |
order.pickup_status_updated |
Fulfilment status changes on a PICKUP order. | fulfillment.status changes while order.status stays ACCEPTED. |
There is no event filter in the Slerp webhook configuration, so all four types are delivered to every registered endpoint. Consumers must filter on type themselves.
Note that only order.status_updated carries the terminal state. If you filter to order.created alone, you will never see deliveredAt, the final total, or the tip.
data.order
| Field | Type | Description |
|---|---|---|
reference |
string | Human readable order reference shown to customer and merchant, e.g. UGE6HT. Use this as the order identifier. |
status |
enum | Overall order status. PENDING → ACCEPTED → FULFILLED (terminal). |
createdAt |
ISO 8601 (UTC) | Order creation time. |
updatedAt |
ISO 8601 (UTC) | Last update. Equal to createdAt at creation, bumped on every subsequent event. |
orderNotes |
string | null | Customer note on the order, e.g. "Lots of spice please". |
customerDetails |
object | See below. |
recipientDetails |
object | null | See below. |
deliveryAddress |
object | null | null on PICKUP orders. |
delivery |
object | null | null on PICKUP orders. |
fulfillment |
object | See below. |
store |
object | See below. |
orderItems |
array | See below. |
summary |
object | See below. |
additionalItems |
object | Container for add-on charges. {} when none selected. |
customerDetails
| Field | Type | Description |
|---|---|---|
type |
enum | GUEST for an unauthenticated checkout, CUSTOMER for a registered account. Name and email are present in both cases. |
firstName |
string | |
lastName |
string | |
email |
string | |
contactNumber |
string | E.164 format. |
There is no combined name field. Concatenate firstName and lastName.
recipientDetails
null when the recipient is the customer. Populated when the order is placed for someone else.
| Field | Type | Description |
|---|---|---|
firstName |
string | |
lastName |
string | |
contactNumber |
string | E.164 format. |
No email field. Recipient contact is phone only.
deliveryAddress
null on PICKUP orders.
| Field | Type | Description |
|---|---|---|
lineOne |
string | Primary address line. |
lineTwo |
string | null | Secondary line, e.g. company name. |
city |
string | |
zip |
string | Postal code. |
delivery
null on PICKUP orders.
| Field | Type | Description |
|---|---|---|
assignedPickupTime |
ISO 8601 (UTC) | null | Populated once a courier is assigned. |
deliveredAt |
ISO 8601 (UTC) | null | Populated on the terminal event. |
instructions |
string | null | Customer delivery instructions, e.g. "Knock 3 times". |
PICKUP orders have no equivalent collection timestamp. The COLLECTED fulfilment status is the only completion signal.
fulfillment
| Field | Type | Description |
|---|---|---|
type |
enum | DELIVERY or PICKUP. |
orderType |
enum | Timing model. SAMEDAY_SCHEDULED (customer picks a same day window), SAMEDAY_ASAP (window defaults to now to now), PREORDER (future date). |
status |
enum | Fulfilment status. PENDING at creation. The enum differs by type, see below. |
windowStart |
ISO 8601 (UTC) | Start of the requested window. Can change after creation. |
windowEnd |
ISO 8601 (UTC) | null | End of the requested window. |
Status values by type:
- DELIVERY:
PENDING→SEARCHING→PICKING→ALMOST_PICKING→DELIVERING→ALMOST_DELIVERING→DELIVERED(terminal) - PICKUP:
PENDING→PREPARING→READY_FOR_COLLECTION→COLLECTED(terminal)
Note there are two independent status fields. order.status tracks the commercial state, fulfillment.status tracks the operational one, and they advance on different schedules.
store
| Field | Type | Description |
|---|---|---|
id |
UUID | Store identifier. |
name |
string | Store display name. |
orderItems[]
| Field | Type | Description |
|---|---|---|
name |
string | Line item name as shown to the customer. |
quantity |
integer | |
product.name |
string | May differ from name where item level overrides exist. |
product.sku |
string | Product SKU. |
total.base |
decimal string | Line total before discount. This is the extended total with quantity included, so a quantity of 4 at 11.45 reports 45.80. |
total.discounted |
decimal string | Line total after discount. |
modifierGroups |
array | Selected options. [] when none. |
modifierGroups
Each group holds the options selected for that item.
| Field | Type | Description |
|---|---|---|
name |
string | Group name, e.g. Pizza size. |
sku |
string | Group SKU. |
modifiers |
array | Selected modifiers within the group. |
Each entry in modifiers:
| Field | Type | Description |
|---|---|---|
name |
string | e.g. Small 7". May contain quote characters, so escape when serialising. |
sku |
string | |
quantity |
integer | |
price.base |
decimal string | Before discount. |
price.discounted |
decimal string | After discount. |
additionalItems
Container for add-on charges. {} when nothing is selected. Currently the only key is giftWrapping.
| Field | Type | Description |
|---|---|---|
giftWrapping.message |
string | Customer gift note. |
giftWrapping.sku |
string | e.g. GIFT_WRAP. |
giftWrapping.price.base |
decimal string | Charge before discount. |
giftWrapping.price.discounted |
decimal string | Charge after discount. |
giftWrapping.price is folded into summary.subtotal rather than broken out as its own summary line, so summing the summary fields will not reveal it.
summary
| Field | Type | Description |
|---|---|---|
subtotal |
object | Sum of item totals, including any additionalItems charges. |
delivery |
object | null | Delivery fee. discounted reflects any delivery promotion. null on PICKUP orders, not an object with null members. |
storeFee |
object | null | Store service fee. |
tip |
string | null | Single value, with no base/discounted split, since tips are not discountable. null on PICKUP orders. |
total |
object | subtotal + delivery + storeFee + tip, before and after discount. When delivery and tip are null, total = subtotal + storeFee. |
Money semantics
The base / discounted naming is easy to misread. discounted is the amount payable, not the amount taken off.
On an order with a 100% off code applied:
"total": { "base": "11.00", "discounted": "0.00" }
The customer paid nothing. Mapping base into a revenue column overstates takings. The discount value is base minus discounted.
Discounts do not necessarily propagate to line items. Where a promotion applies at order level rather than line level, a line item can read { "base": "11.00", "discounted": "11.00" } while the summary reads { "base": "11.00", "discounted": "0.00" }. Do not derive an order total by summing discounted line totals.
The promotion or discount code itself is not included in the payload. Discount amounts can be derived from the base and discounted pairs, but the code applied cannot.