Order Confirmed
Published when payment, inventory, and order validation have succeeded and the order is ready for fulfilment.
1. Confirm a paid order
Confirm the ten-T-shirt bulk order after the payment is authorised and stock is reserved. Fulfilment, customer notifications and analytics treat this as the signal that the order can go ahead.
Payload details
confirmationNumberis the customer-facing reference in theORD-plus eight digits format.paymentAuthorizationIdandinventoryReservationIdpoint to the secured payment and stock reservation.totalis in integer minor units andcurrencyisGBP.confirmedAtrecords when the order was confirmed, in UTC.
The confirmed total is 49,990 pence (£499.90): ten T-shirts at 4,999 pence each.
Using this example
Use this to check that fulfilment starts only after confirmation, and that the confirmation email shows confirmationNumber rather than the internal orderId.
The examples use a fictional Acme Events SDK to publish a payload matching the OrderConfirmed schema. The package names and publish methods are illustrative.
import { EventsClient } from '@acme/events';
const client = new EventsClient({ apiKey: process.env.ACME_API_KEY,});
const event = { orderId: 'c2a6a826-8661-4bc7-aaf7-83fa8e7940d4', customerId: '6f9619ff-8b86-d011-b42d-00cf4fc964ff', confirmationNumber: 'ORD-10452230', paymentAuthorizationId: 'pa_7c21e9d4', inventoryReservationId: 'res_60318', total: 49990, currency: 'GBP', confirmedAt: '2026-09-11T10:31:12Z',};
await client.publish('OrderConfirmed', event);import osfrom acme_events import EventsClient
client = EventsClient(api_key=os.environ["ACME_API_KEY"])
event = { "orderId": "c2a6a826-8661-4bc7-aaf7-83fa8e7940d4", "customerId": "6f9619ff-8b86-d011-b42d-00cf4fc964ff", "confirmationNumber": "ORD-10452230", "paymentAuthorizationId": "pa_7c21e9d4", "inventoryReservationId": "res_60318", "total": 49990, "currency": "GBP", "confirmedAt": "2026-09-11T10:31:12Z",}
client.publish("OrderConfirmed", event)import com.acme.events.EventsClient;import java.util.Map;
public class PublishOrderConfirmed { public static void main(String[] args) { var client = new EventsClient( System.getenv("ACME_API_KEY") );
var event = Map.of( "orderId", "c2a6a826-8661-4bc7-aaf7-83fa8e7940d4", "customerId", "6f9619ff-8b86-d011-b42d-00cf4fc964ff", "confirmationNumber", "ORD-10452230", "paymentAuthorizationId", "pa_7c21e9d4", "inventoryReservationId", "res_60318", "total", 49990, "currency", "GBP", "confirmedAt", "2026-09-11T10:31:12Z" );
client.publish("OrderConfirmed", event); }}2. Confirm a free replacement order
Confirm a free replacement cap sent after the customer reported a damaged item. There is nothing to charge, so no payment is authorised.
Payload details
totalis0andpaymentAuthorizationIdis omitted.inventoryReservationIdis still present, because the replacement cap has to be reserved.confirmationNumber,currencyandconfirmedAtare required as usual.
Using this example
Use this to check that consumers accept a zero total and do not expect paymentAuthorizationId on every confirmation. Finance projections should record the order without a matching payment.
The examples use a fictional Acme Events SDK to publish a payload matching the OrderConfirmed schema. The package names and publish methods are illustrative.
import { EventsClient } from '@acme/events';
const client = new EventsClient({ apiKey: process.env.ACME_API_KEY,});
const event = { orderId: '5a8f3c2e-1d4b-4e7a-9c6f-8b2e0d1a7f43', customerId: '6f9619ff-8b86-d011-b42d-00cf4fc964ff', confirmationNumber: 'ORD-10452317', inventoryReservationId: 'res_60342', total: 0, currency: 'GBP', confirmedAt: '2026-09-12T14:05:40Z',};
await client.publish('OrderConfirmed', event);import osfrom acme_events import EventsClient
client = EventsClient(api_key=os.environ["ACME_API_KEY"])
event = { "orderId": "5a8f3c2e-1d4b-4e7a-9c6f-8b2e0d1a7f43", "customerId": "6f9619ff-8b86-d011-b42d-00cf4fc964ff", "confirmationNumber": "ORD-10452317", "inventoryReservationId": "res_60342", "total": 0, "currency": "GBP", "confirmedAt": "2026-09-12T14:05:40Z",}
client.publish("OrderConfirmed", event)import com.acme.events.EventsClient;import java.util.Map;
public class PublishOrderConfirmed { public static void main(String[] args) { var client = new EventsClient( System.getenv("ACME_API_KEY") );
var event = Map.of( "orderId", "5a8f3c2e-1d4b-4e7a-9c6f-8b2e0d1a7f43", "customerId", "6f9619ff-8b86-d011-b42d-00cf4fc964ff", "confirmationNumber", "ORD-10452317", "inventoryReservationId", "res_60342", "total", 0, "currency", "GBP", "confirmedAt", "2026-09-12T14:05:40Z" );
client.publish("OrderConfirmed", event); }}1{
2 "$schema": "http://json-schema.org/draft-07/schema#",
3 "title": "OrderConfirmed",
4 "description": "Published when an order is confirmed and ready for fulfilment",
5 "type": "object",
6 "properties": {
7 "orderId": { "type": "string", "format": "uuid" },
8 "customerId": { "type": "string", "format": "uuid" },
9 "confirmationNumber": { "type": "string", "pattern": "^ORD-[0-9]{8}$" },
10 "paymentAuthorizationId": { "type": "string" },
11 "inventoryReservationId": { "type": "string" },
12 "total": { "type": "integer", "minimum": 0, "description": "Confirmed total in minor units" },
13 "currency": { "type": "string", "pattern": "^[A-Z]{3}$" },
14 "confirmedAt": { "type": "string", "format": "date-time" }
15 },
16 "required": ["orderId", "customerId", "confirmationNumber", "total", "currency", "confirmedAt"],
17 "examples": [
18 {
19 "orderId": "7e86e1d8-cd5f-4d6f-ae8e-bdc5ed3a0d13",
20 "customerId": "5d1db561-4ce3-4f92-956a-b787c2f55342",
21 "confirmationNumber": "ORD-10428371",
22 "paymentAuthorizationId": "pa_9f38c0f0",
23 "inventoryReservationId": "res_48721",
24 "total": 12999,
25 "currency": "GBP",
26 "confirmedAt": "2026-07-29T09:42:18Z"
27 }
28 ]
29}
30