B2C Commerce fires an order placed event when an order reaches a placed state and the placement transaction commits. The webhook body is the order representation from the Orders API, and you can route the event by site.
Available in: B2C Commerce release 26.10 and later.
Event ID
| Event ID | Description | When fired |
|---|---|---|
sf.cc.order.placed |
Order placed successfully | When an order reaches a placed state and the placement transaction commits |
HTTP headers
The order placed event uses the standard Commerce Cloud platform headers documented in
Common HTTP Headers for B2C
Commerce Events. For this event, x-sf-cc-event-id is
sf.cc.order.placed, and x-sf-cc-site-id is the site
where the order was placed. That site ID is also the site used to resolve a site-scoped
route. The event is site-specific, so you can register an organization-wide route or a
route for an individual site.
JSON payload
The webhook body is the Order resource from the B2C Commerce Orders API. Field presence and values
vary with the order, customer, payment, promotion, shipping, fulfillment, and
environment configuration. The event type identifier is carried in
x-sf-cc-event-id, not in the body.
The body groups order data as follows.
| Field group | Examples | Description |
|---|---|---|
| Order identity and status | orderNo, externalOrderNo,
status, confirmationStatus
|
Identifies the order and its order-level state |
| Dates and references | placeDate, creationDate,
createdBy, invoiceNo
|
Order timestamps and business references |
| Customer and addresses | customerInfo, billingAddress,
shippingAddress
|
Customer information and order addresses |
| Financial values | currency, productSubTotal,
productTotal, orderTotal,
taxTotal
|
Order totals and currency |
| Products | productItems |
Products on the order, including item prices, quantities, discounts, and taxes |
| Payments and shipping | paymentInstruments, shipments,
shippingItems
|
Payment instruments and fulfillment data |
Example: order placed event
Values in this example are synthetic. Payment tokens and transaction identifiers are non-functional. Optional fields can be omitted on a real order.
{
"adjustedMerchandizeTotalTax": 2.45,
"adjustedShippingTotalTax": 0.30,
"billingAddress": {
"address1": "123 Example Street",
"address2": "Suite 100",
"city": "Example City",
"countryCode": "US",
"firstName": "Test",
"fullName": "Test User",
"lastName": "User",
"phone": "5550100000",
"postalCode": "00000",
"stateCode": "CA"
},
"confirmationStatus": "confirmed",
"createdBy": "storefront",
"creationDate": "2026-01-15T12:00:00.000Z",
"currency": "USD",
"customerInfo": {
"customerId": "test-customer-id",
"customerName": "Test User",
"email": "test.user@example.com",
"guest": true
},
"customerLocale": "en_US",
"exportStatus": "ready",
"invoiceNo": "TEST-INVOICE-001",
"lastModified": "2026-01-15T12:00:00.000Z",
"merchandizeTotalTax": 2.45,
"orderNo": "TEST-ORDER-001",
"orderTotal": 57.74,
"paymentInstruments": [
{
"paymentCard": {
"cardType": "Visa",
"creditCardExpired": false,
"creditCardToken": "test-token",
"expirationMonth": 12,
"expirationYear": 2030,
"holder": "Test User",
"maskedNumber": "************1111",
"numberLastDigits": "1111"
},
"paymentInstrumentId": "test-payment-instrument",
"paymentMethodId": "CREDIT_CARD",
"paymentTransaction": {
"amount": 57.74,
"transactionId": "test-transaction-001"
}
}
],
"paymentStatus": "not_paid",
"placeDate": "2026-01-15T12:00:00.000Z",
"productItems": [
{
"adjustedTax": 2.45,
"basePrice": 49.00,
"bonusProductLineItem": false,
"gift": false,
"grossPrice": 51.45,
"itemId": "test-item-001",
"itemText": "Test Product",
"minOrderQuantity": 1,
"netPrice": 49.00,
"position": 1,
"priceAfterItemDiscount": 49.00,
"priceAfterOrderDiscount": 49.00,
"productId": "TEST-PRODUCT-001",
"productName": "Test Product",
"quantity": 1,
"shipmentId": "test-shipment-001",
"stepQuantity": 1,
"tax": 2.45,
"taxBasis": 49.00,
"taxRate": 0.05
}
],
"productSubTotal": 49.00,
"productTotal": 49.00,
"shipments": [
{
"adjustedMerchandizeTotalTax": 2.45,
"adjustedShippingTotalTax": 0.30,
"gift": false,
"merchandizeTotalTax": 2.45,
"productSubTotal": 49.00,
"productTotal": 49.00,
"shipmentId": "test-shipment-001",
"shipmentNo": "TEST-SHIPMENT-001",
"shipmentTotal": 57.74,
"shippingAddress": {
"address1": "456 Sample Avenue",
"address2": "Unit 200",
"city": "Sample City",
"countryCode": "US",
"firstName": "Test",
"fullName": "Test User",
"lastName": "User",
"phone": "5550100001",
"postalCode": "00000",
"stateCode": "CA"
},
"shippingMethod": {
"id": "TEST-SHIPPING-METHOD"
},
"shippingStatus": "not_shipped",
"shippingTotal": 5.99,
"shippingTotalTax": 0.30,
"taxTotal": 2.75
}
],
"shippingItems": [
{
"adjustedTax": 0.30,
"basePrice": 5.99,
"grossPrice": 6.29,
"itemId": "test-shipping-item-001",
"itemText": "Shipping",
"netPrice": 5.99,
"priceAfterItemDiscount": 5.99,
"shipmentId": "test-shipment-001",
"tax": 0.30,
"taxBasis": 5.99,
"taxRate": 0.05,
"type": "fixed_price"
}
],
"shippingStatus": "not_shipped",
"shippingTotal": 5.99,
"shippingTotalTax": 0.30,
"siteId": "TestSite",
"status": "new",
"taxation": "net",
"taxTotal": 2.75
}
Order placed implementation notes
- The event is fired asynchronously after the order placement transaction commits.
- The event is site-specific. Configure a connector for one site, or use an organization-wide route.
- The body follows the Orders API order representation. Adding fields to that representation can add fields to later events. Don't rely on a field that the order doesn't populate.