WebhooksEvent catalogShop
shop.order.fulfilled
Version 1 of the shop.order.fulfilled webhook event.
A manual Shop order was closed by an attributed operator action: the goods were delivered outside the platform and the order left in-progress for its terminal fulfilled state. Only a manual order reaches this event; award and code lines settle inside the placement transaction and are reported by shop.order.settled.
| Event type | shop.order.fulfilled |
| Schema version | 1 |
| Routing key | event.shop.order.fulfilled.v1 |
| Produced by | Reward Management |
| Schema | urn:defendr:contract:shop:order-fulfilled:1 |
data fields
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | yes | |
playerId | string | yes | |
listingKey | string | yes | |
listingRevision | integer | yes | |
quantity | integer | yes | |
fulfillmentKind | "manual" | yes | |
actorId | string | yes | |
note | string or null | yes | The operator's fulfilment note, if one was recorded. |
fulfilledAt | string (date-time) | yes |
Some fields are required only in particular states. The JSON Schema below is authoritative.
Example delivery
Signed with the example secret whsec_placeholder_example_webhooks_signing_secret, so you can check your verifier against it. See Verifying signatures.
POST /your/webhook/endpoint HTTP/1.1
content-type: application/json
webhook-id: whd_00000000-0000-4000-8000-000000000029
webhook-timestamp: 1800000000
webhook-signature: v1,LclhDO+q7xP2xRDTzOXkxNsBCQ/3G2raEhkWaf96VkI=
tanitar-event-type: shop.order.fulfilled
tanitar-schema-version: 1
tanitar-delivery-attempt: 1
{"messageId":"evt_00000000-0000-4000-8000-000000000029","kind":"event","type":"shop.order.fulfilled","schemaVersion":1,"occurredAt":"2027-01-15T10:00:00.000Z","producer":"reward-management-service","accountId":"acc_11111111-1111-4111-8111-111111111111","correlationId":"corr_00000000-0000-4000-8000-000000000029","data":{"orderId":"ord_0123456789abcdef0123456789abcdef","playerId":"player_demo","listingKey":"signed-jersey","listingRevision":2,"quantity":1,"fulfillmentKind":"manual","actorId":"operator_demo","note":"Shipped 2026-09-27, tracking shared in the player's inbox.","fulfilledAt":"2026-09-27T00:00:00.000Z"}}The same body, formatted:
{
"messageId": "evt_00000000-0000-4000-8000-000000000029",
"kind": "event",
"type": "shop.order.fulfilled",
"schemaVersion": 1,
"occurredAt": "2027-01-15T10:00:00.000Z",
"producer": "reward-management-service",
"accountId": "acc_11111111-1111-4111-8111-111111111111",
"correlationId": "corr_00000000-0000-4000-8000-000000000029",
"data": {
"orderId": "ord_0123456789abcdef0123456789abcdef",
"playerId": "player_demo",
"listingKey": "signed-jersey",
"listingRevision": 2,
"quantity": 1,
"fulfillmentKind": "manual",
"actorId": "operator_demo",
"note": "Shipped 2026-09-27, tracking shared in the player's inbox.",
"fulfilledAt": "2026-09-27T00:00:00.000Z"
}
}JSON Schema
urn:defendr:contract:shop:order-fulfilled:1
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:defendr:contract:shop:order-fulfilled:1",
"title": "Shop order fulfilled",
"description": "A manual Shop order was closed by an attributed operator action: the goods were delivered outside the platform and the order left `in-progress` for its terminal `fulfilled` state. Only a `manual` order reaches this event; `award` and `code` lines settle inside the placement transaction and are reported by `shop.order.settled`.",
"type": "object",
"additionalProperties": false,
"required": [
"orderId",
"playerId",
"listingKey",
"listingRevision",
"quantity",
"fulfillmentKind",
"actorId",
"note",
"fulfilledAt"
],
"properties": {
"orderId": {
"type": "string",
"pattern": "^ord_[a-f0-9]{32}$"
},
"playerId": {
"type": "string",
"minLength": 1
},
"listingKey": {
"type": "string",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
},
"listingRevision": {
"type": "integer",
"minimum": 1
},
"quantity": {
"type": "integer",
"minimum": 1
},
"fulfillmentKind": {
"const": "manual"
},
"actorId": {
"type": "string",
"minLength": 1
},
"note": {
"type": [
"string",
"null"
],
"description": "The operator's fulfilment note, if one was recorded."
},
"fulfilledAt": {
"type": "string",
"format": "date-time"
}
}
}