Event Catalog

This page lists every webhook event type OpenBoxes Lift delivers today (11 in all), which plans receive each one, and a sample of the data object each delivery carries.

Every plan. Every event type on this page is delivered on every plan: Shared, Dedicated and Enterprise. The order, shipment and stock-adjustment events come from your OpenBoxes instance; the platform events come from OpenBoxes Lift itself.

This page is generated from the event definitions in our webhook registry, together with a list of the event types that deliver today. Once its automated daily check is enabled, that list is compared with production every day. The event list in the portal (Webhooks in the left navigation) and GET /api/v1/webhooks/event-types come from the same registry and show the types that are switched on. How deliveries are signed, retried and managed is on the Webhooks page.

Summary#

  • Platform events (every plan): tenant.provisioned, tenant.suspended, tenant.reactivated
  • Order events (every plan): order.created, order.approved, order.updated, order.received, order.cancelled
  • Shipment events (every plan): shipment.created, shipment.shipped
  • Inventory events (every plan): inventory.stock_adjustment

Platform events#

Sent by OpenBoxes Lift itself when something happens to your instance.

tenant.provisioned#

Your OpenBoxes instance finished provisioning and became active.

It is sent once, when an instance first becomes active. A webhook you create afterwards for that same instance does not receive it.

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "subdomain": "acme",
  "status": "ACTIVE"
}

tenant.suspended#

Your instance was suspended.

It is sent when an instance is suspended for an unpaid invoice or by our team. It is not sent when a free trial ends without a subscription, or when you stop your instance yourself, so a tenant.reactivated can arrive without an earlier tenant.suspended.

reason is free text written for people, not a code, and its wording can change. Show it, but do not build a filter on its exact value.

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "status": "SUSPENDED",
  "reason": "Unpaid invoice in_1Q2w3E4r5T6y7U8i"
}

tenant.reactivated#

Your instance was reactivated.

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "status": "ACTIVE"
}

Order events#

Sent from your OpenBoxes instance, typically within a couple of minutes of the change, on every plan.

order.created#

An order was created in your OpenBoxes instance (any order type). Synthesized near-real-time (typically under 2 minutes).

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "orderId": "7e2b5d90-1a3c-4e8f-b6d7-9c0a1b2c3d4e",
  "orderNumber": "PO-00042",
  "orderType": "PURCHASE_ORDER",
  "status": "PENDING",
  "createdAt": "2026-07-27T15:11:08"
}

order.approved#

An order was approved in your OpenBoxes instance. Delivered near-real-time (typically under 2 minutes).

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "orderId": "7e2b5d90-1a3c-4e8f-b6d7-9c0a1b2c3d4e",
  "orderNumber": "PO-00042",
  "orderType": "PURCHASE_ORDER",
  "status": "APPROVED",
  "approvedAt": "2026-07-28T10:14:02",
  "occurredAt": "2026-07-28T10:14:02"
}

order.updated#

An order reached a lifecycle state without a dedicated event type, for example PLACED when a purchase order is placed. Read the status field to tell which. Do not rely on it for partial receipts: receiving part of a purchase order usually sends no event.

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "orderId": "7e2b5d90-1a3c-4e8f-b6d7-9c0a1b2c3d4e",
  "orderNumber": "PO-00042",
  "orderType": "PURCHASE_ORDER",
  "status": "PLACED",
  "occurredAt": "2026-07-28T10:20:33"
}

order.received#

A purchase order was fully received in your OpenBoxes instance: everything ordered has been received, or cancelled when it was received. A partial receipt does not send this event.

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "orderId": "7e2b5d90-1a3c-4e8f-b6d7-9c0a1b2c3d4e",
  "orderNumber": "PO-00042",
  "orderType": "PURCHASE_ORDER",
  "status": "RECEIVED",
  "occurredAt": "2026-07-30T09:31:15"
}

order.cancelled#

An order was cancelled or rejected. The status field distinguishes the two (CANCELED or REJECTED).

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "orderId": "7e2b5d90-1a3c-4e8f-b6d7-9c0a1b2c3d4e",
  "orderNumber": "PO-00042",
  "orderType": "PURCHASE_ORDER",
  "status": "CANCELED",
  "occurredAt": "2026-07-28T11:02:47"
}

Shipment events#

Sent from your OpenBoxes instance, typically within a couple of minutes of the change, on every plan.

shipment.created#

A shipment was created in your OpenBoxes instance. Synthesized near-real-time (typically under 2 minutes).

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "shipmentId": "3fa1c9e2-8b74-4f0e-9d21-5c6a7b8d9e0f",
  "shipmentNumber": "10001",
  "status": "PENDING",
  "createdAt": "2026-07-27T14:03:22"
}

shipment.shipped#

A shipment was sent (OpenBoxes SHIPPED event). Synthesized near-real-time (typically under 2 minutes).

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "shipmentId": "3fa1c9e2-8b74-4f0e-9d21-5c6a7b8d9e0f",
  "shipmentNumber": "10001",
  "eventCode": "SHIPPED",
  "status": "SHIPPED",
  "eventDate": "2026-07-27T14:00:00",
  "occurredAt": "2026-07-27T14:03:22"
}

Inventory events#

Sent from your OpenBoxes instance, typically within a couple of minutes of the change, on every plan.

inventory.stock_adjustment#

An operator adjusted stock in your OpenBoxes instance: a manual correction, or stock written off as consumed, expired or damaged. Read quantityDelta for the signed effect on stock: quantity is the raw OpenBoxes value, which is unsigned for removals.

Delivered on: every plan (Shared, Dedicated and Enterprise).

Sample data:

{
  "tenantId": "acme",
  "transactionId": "8af48a859f9da236019fa94eeb550008",
  "transactionNumber": "9483",
  "adjustmentType": "Damaged",
  "locationId": "1",
  "locationName": "Main Warehouse",
  "comment": "Pallet damaged in transit",
  "lines": [
    {
      "productCode": "TEST-003",
      "productName": "Test Gauze Roll",
      "lotNumber": "L-2026-04",
      "quantity": 12,
      "quantityDelta": -12,
      "reasonCode": "DAMAGED"
    }
  ],
  "lineCount": 1,
  "totalLineCount": 1,
  "truncated": false,
  "transactionDate": "2026-07-28T14:00:00",
  "occurredAt": "2026-07-28T14:03:22"
}

The whole delivery#

Each sample above is the data object only. A real delivery wraps it in the envelope described on the Webhooks page (id, type, created, data), and GET /api/v1/webhooks/event-types/{type}/sample-envelope returns that whole envelope for any type on this page. That call needs an API key with the admin scope that is bound to your instance (see "Managing Webhooks With an API Key" on the Webhooks page).

Sample values are illustrative: identifiers, numbers and dates in your deliveries are your own. In particular, tenantId is your instance's internal identifier, not its subdomain; the samples use acme for both, but in your deliveries the two are different.

A field with no value is left out of data rather than sent as null (for example approvedAt, lotNumber, comment or eventDate), and some fields appear only when they apply, so build your receiver so a missing field is not an error. Dates and times carry no time zone offset, and the seconds are left out when they are zero (for example 2026-07-27T14:00).

What is not a webhook event#

Apart from test deliveries (type test), any type not listed on this page is not delivered, and the portal does not offer it. In particular, billing events, data-import events, product and user changes, stock-level changes, low-stock alerts and expiry warnings are not available as webhook events. For those, poll the REST API, or use Stock alerts for below-minimum, out-of-stock and nearing-expiry stock.


This page is generated from the webhook event definitions (as of 2026-09-30) and the list of event types that deliver today. It is not edited by hand.