After checkout is completed and an order is placed, you must push status updates to Google using the order webhook.
- Endpoint:
https://shoppingdataintegration.googleapis.com/v1/webhooks/partners/[PARTNER_ID]/events/order?key=[API_KEY]
- Google will share your PARTNER_ID and API_KEY with you.
- You can provide the API key in one of two ways:
- As a URL query parameter:
?key=[API_KEY] - Using the HTTP header:
X-Goog-Api-Key: [API_KEY]
- As a URL query parameter:
For more details on how to use API keys, see Using API keys
Payload: You must send the full order entity, for all updates.
1. Auth and request signing
Refer to the version you selected for your implementation.
Version January 23 2026
You can do symmetric key signing using HMAC key shared by Google with you.
OR you can refer to following instructions for asymmetric signature:
- Select a key from the
signing_keysarray in UCP profile. - Create a detached JWT (RFC 7797) over the request body using the selected key.
- Include the JWT in the
Request-Signatureheader. - Include the key ID in the JWT header's
kidclaim to allow the receiver to identify which key to use for verification.
Version April 8 2026
Key changes in this version include the introduction of new mandatory webhook headers and specific request signing procedures.
1.1. Required webhook headers
The following HTTP headers are mandatory for all webhook requests:
Webhook-Id: A unique identifier for this specific webhook event. This ID should match theidof the primary event being sent (e.g., the fulfillment event ID or adjustment event ID).Webhook-Timestamp: The timestamp indicating when the event occurred.
These headers replace the id and created_time fields previously expected in
the order payload.
1.2. Request signing
- Compute SHA-256 digest of the raw request body and set
Content-Digestheader. - Select a signing key from
signing_keysin your UCP profile. - Build signature base per RFC
9421.
- See the spec for signed components
- Set
UCP-Agent,Signature-Input, andSignatureheaders.UCP-Agentis a link to your UCP profile in the formatprofile="https://merchant.example.com/.well-known/ucp".Signature-Inputis a dictionary structured field describing the components contained within the signature, as well as thekeyidused to sign, which must match thekidof your selected signing key fromsigning_keysin your UCP profile.Signatureheader contains your signature base which is signed using your private key and then base64 encoded.
See the signing instructions on ucp.dev
for more information.
2. Mandatory order update events
The following order event updates are required for the integration:
Reasons an order update will be rejected
The following conditions cause an update to be rejected:
- Request body does not contain an order
- Missing
checkout_id - Missing
idin the request body - this must match the order confirmation ID - An order timestamp that is older than the latest update
- Version 2026-04-08: Timestamp evaluated with the
Webhook-Timestampheader - Version 2026-01-23: Timestamp evaluated using the
created_timeproperty
- Version 2026-04-08: Timestamp evaluated with the
- An adjustment is ignored if the type is not one of:
refund,return,credit,price_adjustment,dispute, orcancellation
2.1. Order created event
- Trigger: Immediately after the order is confirmed (
status: processing).
Line item requirements
- Line items must not be empty, and must include
itemproduct information. - A line item's status must accurately reflect the
totalandfulfilledquantities (wherefulfilledrepresents delivered items), per the UCP spec:processing: whenfulfilledis 0 andtotal> 0 (for example,total: 2,fulfilled: 0).partial: whenfulfilledis greater than 0 but less thantotal(for example,total: 2,fulfilled: 1).fulfilled: whenfulfilledequalstotalandtotal> 0 (for example,total: 2,fulfilled: 2).removed: whentotalis 0 (for example,total: 0,fulfilled: 0).
Example: This example shows an order created after a buyer completes the checkout.
Version 2026-04-08
Key changes in this version in this example:
- The
currencyfield is now required at the top level of the Order object. - The
typefield within each object in thetotalsarray is now an open string (e.g., \"subtotal\", \"tax\", \"fee\", \"total\"). - The mandatory
Webhook-Idheader contains a unique identifier for the webhook event. Note that theidfield in the payload containing the order confirmation ID is still required. - The mandatory
Webhook-Timestampheader provides the creation time, replacing the formercreated_timefield in the payload.
Required Headers:
Webhook-Id: order_01Webhook-Timestamp: 2026-03-23T19:00:00Z
{ "ucp": { "version": "2026-04-08", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-04-08"}] } }, "id": "order_01", "checkout_id": "checkout_01", "currency": "USD", // Always include all line items, even for single-item checkouts. This ensures any add-ons, gifts, or separate charges are accounted for. "line_items": [ { "id": "line_1", "item": { "id": "product_123", "title": "Running Shoes", "price": 10000 }, "quantity": { "total": 1, "fulfilled": 0 }, "totals": [ {"type": "subtotal", "display_text": null, "amount": 10000}, {"type": "total", "display_text": null, "amount": 10000} ], // The status of a line item must match total and fulfilled quantities (e.g., total 1, fulfilled 0 -> status: processing). "status": "processing" } ], "totals": [ {"type": "subtotal", "display_text": "Subtotal", "amount": 10000}, {"type": "fee", "display_text": "Service Fee", "amount": 100}, {"type": "tax", "display_text": "Tax", "amount": 800}, {"type": "total", "display_text": "Total", "amount": 10900} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [{ "id": "line_1", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Arrives in 2-3 business days", // Maximum length: 200 characters. "fulfillable_on": "now" } ] }, "permalink_url": "https://merchant.example.com/orders/789" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_01", "checkout_id": "checkout_01", "created_time": "2026-03-23T19:00:00Z", // Always include all line items, even for single-item checkouts. This ensures any add-ons, gifts, or separate charges are accounted for. "line_items": [ { "id": "line_1", "item": { "id": "product_123", "title": "Running Shoes", "price": 10000 }, "quantity": { "total": 1, "fulfilled": 0 }, "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], // The status of a line item must match total and fulfilled quantities (e.g., total 1, fulfilled 0 -> status: processing). "status": "processing" } ], "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [{ "id": "line_1", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Arrives in 2-3 business days", // Maximum length: 200 characters. "fulfillable_on": "now" } ] }, "permalink_url": "https://merchant.example.com/orders/789" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_01", "checkout_id": "checkout_01", "created_time": "2026-03-23T19:00:00Z", // Full line items must be included "line_items": [ { "id": "line_1", "item": { "id": "product_123", "title": "Running Shoes", "price": 10000 }, "quantity": { "total": 1, "fulfilled": 0 }, "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], // The status of a line item must match total and fulfilled quantities (e.g., total 1, fulfilled 0 -> status: processing). "status": "processing" } ], "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [{ "id": "line_1", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Arrives in 2-3 business days", "fulfillable_on": "now" } ] }, "permalink_url": "https://merchant.example.com/orders/789" }
2.2. Fulfillment events
These events are sent as part of the fulfillment.events array.
Order shipped
When items in the order have been shipped. The tracking_number and
tracking_url fields are required for shipped events, as these are required to
group items on the "My orders" page accurately.
Order delivered
When items in the order have been delivered.
Example (shipped and delivered): This example shows an order update
after the item has been shipped and then delivered.
Version 2026-04-08
Required Headers:
Webhook-Id: fulfill_evt_2Webhook-Timestamp: 2026-02-10T14:00:00Z
{ "ucp": { "version": "2026-04-08", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-04-08"}] } }, "id": "order_01", "checkout_id": "checkout_01", "currency": "USD", "line_items": [ { "id": "line_1", "item": { "id": "product_123", "title": "Running Shoes", "price": 10000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], // Updated fulfillment details "fulfillment": { "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-08T10:30:00Z", "type": "shipped", "line_items": [{ "id": "line_1", "quantity": 1 }], "tracking_number": "123456789", "tracking_url": "https://fedex.com/track/123456789", "carrier": "FedEx", "description": "Shipping departed from warehouse" }, { "id": "fulfill_evt_2", "occurred_at": "2026-02-10T14:00:00Z", "type": "delivered", "line_items": [{ "id": "line_1", "quantity": 1 }], "tracking_number": "123456789", "tracking_url": "https://fedex.com/track/123456789", "carrier": "FedEx", "description": "Package delivered" } ], "expectations": [{ "...": "..." }] }, "permalink_url": "https://merchant.example.com/orders/123" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_01", "checkout_id": "checkout_01", "created_time": "2026-03-23T19:00:00Z", "line_items": [ { "id": "line_1", "item": { "id": "product_123", "title": "Running Shoes", "price": 10000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "total", "amount": 10000} ], // Updated fulfillment details "fulfillment": { "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-08T10:30:00Z", "type": "shipped", "line_items": [{ "id": "line_1", "quantity": 1 }], "tracking_number": "123456789", "tracking_url": "https://fedex.com/track/123456789", "carrier": "FedEx", "description": "Shipping departed from warehouse" }, { "id": "fulfill_evt_2", "occurred_at": "2026-02-10T14:00:00Z", "type": "delivered", "line_items": [{ "id": "line_1", "quantity": 1 }], "tracking_number": "123456789", "tracking_url": "https://fedex.com/track/123456789", "carrier": "FedEx", "description": "Package delivered" } ], "expectations": [{ "...": "..." }] }, "permalink_url": "https://merchant.example.com/orders/123" }
2.3 Multi-item orders
The following sections explain how multi-item orders and packages are grouped and tracked.
Multi-item package grouping
Items on the "My orders" page are grouped by packages (that have the same
tracking_url). If a package is partially returned, the returned items are
split out to a separate section on the "My orders" page.
Package status
The statuses shown for the package are one of the following: Ordered,
Shipped, Delivered, Returned, Refunded, Canceled. Package statuses are
derived from the type attribute of the fulfillment events and
adjustments objects.
How package status is determined
If there is an adjustment event with status: completed, then the package
will display the appropriate status of Returned, Refunded, or Cancelled, based
on the adjustment event type.
| Adjustment Event properties | Package status |
|---|---|
type: return, status: completed |
Returned |
type: refund, status: completed |
Refunded |
type: cancellation, status: completed |
Cancelled |
If there is no completed adjustment, then the status will be based on the fulfillment event type:
| Fulfillment Event properties | Package status |
|---|---|
type: shipped |
Shipped (Expected by <date>) |
type: delivered |
Delivered |
| No fulfillment event | Ordered |
Example (Multi-item order, same package delivery): This example shows an
order update for a single package containing multiple items. All line items are
grouped within a single shipped event sharing the same tracking number.
Version 2026-04-08
Required Headers:
Webhook-Id: fulfill_evt_1Webhook-Timestamp: 2026-02-08T10:30:00Z
{ "ucp": { "version": "2026-04-08", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-04-08"}] } }, "id": "order_multi_01", "checkout_id": "checkout_multi_01", "currency": "USD", "line_items": [ { "id": "line_1", "item": { "id": "product_1", "title": "Item 1", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "display_text": null, "amount": 5000}, {"type": "total", "display_text": null, "amount": 5000} ], "status": "fulfilled" }, { "id": "line_2", "item": { "id": "product_2", "title": "Item 2", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "display_text": null, "amount": 5000}, {"type": "total", "display_text": null, "amount": 5000} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "display_text": "Subtotal", "amount": 10000}, {"type": "fee", "display_text": "Shipping", "amount": 500}, {"type": "total", "display_text": "Total", "amount": 10500} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [ { "id": "line_1", "quantity": 1 }, { "id": "line_2", "quantity": 1 } ], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Standard Shipping", "fulfillable_on": "now" } ], "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-08T10:30:00Z", "type": "shipped", "line_items": [ { "id": "line_1", "quantity": 1 }, { "id": "line_2", "quantity": 1 } ], "tracking_number": "123456789", "tracking_url": "https://fedex.com/track/123456789", "carrier": "FedEx", "description": "Both items shipped together" } ] }, "permalink_url": "https://merchant.example.com/orders/456" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_multi_01", "checkout_id": "checkout_multi_01", "created_time": "2026-02-07T09:00:00Z", "line_items": [ { "id": "line_1", "item": { "id": "product_1", "title": "Item 1", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 5000}, {"type": "total", "amount": 5000} ], "status": "fulfilled" }, { "id": "line_2", "item": { "id": "product_2", "title": "Item 2", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 5000}, {"type": "total", "amount": 5000} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "fee", "amount": 500}, {"type": "total", "amount": 10500} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [ { "id": "line_1", "quantity": 1 }, { "id": "line_2", "quantity": 1 } ], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Standard Shipping", "fulfillable_on": "now" } ], "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-08T10:30:00Z", "type": "shipped", "line_items": [ { "id": "line_1", "quantity": 1 }, { "id": "line_2", "quantity": 1 } ], "tracking_number": "123456789", "tracking_url": "https://fedex.com/track/123456789", "carrier": "FedEx", "description": "Both items shipped together" } ] }, "permalink_url": "https://merchant.example.com/orders/456" }
Example (Multi-item order, multiple packages - Split Shipment): This example
shows an order update for split shipments. There are multiple shipped events,
each referencing the specific line_items within that respective package, with
distinct tracking numbers. Since each package represents a distinct
fulfillment commitment (e.g., different speeds and costs from a multi-group
checkout), the expectations are also split.
Version 2026-04-08
Required Headers:
Webhook-Id: fulfill_evt_2Webhook-Timestamp: 2026-02-09T14:00:00Z
{ "ucp": { "version": "2026-04-08", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-04-08"}] } }, "id": "order_multi_02", "checkout_id": "checkout_multi_02", "currency": "USD", "line_items": [ { "id": "line_1", "item": { "id": "product_1", "title": "Item 1", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "display_text": null, "amount": 5000}, {"type": "total", "display_text": null, "amount": 5000} ], "status": "fulfilled" }, { "id": "line_2", "item": { "id": "product_2", "title": "Item 2", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "display_text": null, "amount": 5000}, {"type": "total", "display_text": null, "amount": 5000} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "display_text": "Subtotal", "amount": 10000}, {"type": "fee", "display_text": "Shipping", "amount": 1500}, {"type": "total", "display_text": "Total", "amount": 11500} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [{ "id": "line_1", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Standard Shipping", "fulfillable_on": "now" }, { "id": "exp_2", "line_items": [{ "id": "line_2", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Express Shipping", "fulfillable_on": "now" } ], "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-08T10:30:00Z", "type": "shipped", "line_items": [{ "id": "line_1", "quantity": 1 }], "tracking_number": "PKG1_TRACKING", "tracking_url": "https://fedex.com/track/PKG1_TRACKING", "carrier": "FedEx", "description": "First item shipped in package 1" }, { "id": "fulfill_evt_2", "occurred_at": "2026-02-09T14:00:00Z", "type": "shipped", "line_items": [{ "id": "line_2", "quantity": 1 }], "tracking_number": "PKG2_TRACKING", "tracking_url": "https://fedex.com/track/PKG2_TRACKING", "carrier": "FedEx", "description": "Second item shipped in package 2" } ] }, "permalink_url": "https://merchant.example.com/orders/457" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_multi_02", "checkout_id": "checkout_multi_02", "created_time": "2026-02-07T09:00:00Z", "line_items": [ { "id": "line_1", "item": { "id": "product_1", "title": "Item 1", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 5000}, {"type": "total", "amount": 5000} ], "status": "fulfilled" }, { "id": "line_2", "item": { "id": "product_2", "title": "Item 2", "price": 5000 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 5000}, {"type": "total", "amount": 5000} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "amount": 10000}, {"type": "fee", "amount": 1500}, {"type": "total", "amount": 11500} ], "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [{ "id": "line_1", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Standard Shipping", "fulfillable_on": "now" }, { "id": "exp_2", "line_items": [{ "id": "line_2", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Alice", "last_name": "Example", "street_address": "123 Main St", "address_locality": "Austin", "address_region": "TX", "address_country": "US", "postal_code": "78701" }, "description": "Express Shipping", "fulfillable_on": "now" } ], "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-08T10:30:00Z", "type": "shipped", "line_items": [{ "id": "line_1", "quantity": 1 }], "tracking_number": "PKG1_TRACKING", "tracking_url": "https://fedex.com/track/PKG1_TRACKING", "carrier": "FedEx", "description": "First item shipped in package 1" }, { "id": "fulfill_evt_2", "occurred_at": "2026-02-09T14:00:00Z", "type": "shipped", "line_items": [{ "id": "line_2", "quantity": 1 }], "tracking_number": "PKG2_TRACKING", "tracking_url": "https://fedex.com/track/PKG2_TRACKING", "carrier": "FedEx", "description": "Second item shipped in package 2" } ] }, "permalink_url": "https://merchant.example.com/orders/457" }
2.4. Adjustment events
Any events involving money movement should be sent as part of the adjustments
array.
cancellation: When an entire order or specific items within an order are cancelled.return: When items in the order are returned by the customer.refund: When a refund is issued for an order or specific items.
Example (cancellation & refund): This example shows an order where the
item was cancelled and refunded shortly after the order was placed.
Version 2026-04-08
Key changes in this version in this example:
- Line items affected by a
cancellationnow use"status": "removed"in the mainline_itemsarray. - When
line_items.statusisremoved:- The
line_items.quantity.totalis set to0. - The original quantity is stored in the new
line_items.quantity.originalfield.
- The
Required Headers:
Webhook-Id: adj_refund_1Webhook-Timestamp: 2026-02-09T11:05:00Z
{ "ucp": { "version": "2026-04-08", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-04-08"}] } }, "id": "order_02", "checkout_id": "checkout_02", "currency": "USD", "line_items": [ { "id": "line_2", "item": { "id": "product_456", "title": "Smart Watch", "price": 29900 }, "quantity": { "total": 0, // Item removed from order total. "original": 1, // Original quantity before removal. "fulfilled": 0 // Item was not fulfilled before cancellation. }, "totals": [ {"type": "subtotal", "amount": 29900}, {"type": "tax", "amount": 2400}, {"type": "total", "amount": 32300} ], "status": "removed" // Item is cancelled, returned, or refunded. } ], "totals": [ {"type": "subtotal", "amount": 29900}, {"type": "tax", "amount": 2400}, {"type": "total", "amount": 32300} ], // Fulfillment expectations should still be present even if cancelled early. "fulfillment": { "expectations": [ { "id": "exp_1", "line_items": [{ "id": "line_2", "quantity": 1 }], "method_type": "shipping", "destination": { "first_name": "Bob", "last_name": "Consumer", "street_address": "456 Oak Ave", "address_locality": "Anytown", "address_region": "CA", "address_country": "US", "postal_code": "90210" }, "description": "Standard Shipping", "fulfillable_on": "now" } ] // "events": [] // No fulfillment events occurred before cancellation. }, "adjustments": [ { "id": "adj_cancel_1", "type": "cancellation", "description": "Customer changed mind", "line_items": [{ "id": "line_2", "quantity": 1 }], "occurred_at": "2026-02-09T11:00:00Z", "status": "completed" }, { "id": "adj_refund_1", "type": "refund", "description": "Refund for cancelled item", "line_items": [{ "id": "line_2", "quantity": 1 }], "totals": [ {"type": "subtotal", "amount": -29900}, // Negative amounts indicate money returned to the buyer. {"type": "tax", "amount": -2400}, {"type": "total", "amount": -32300} ], "occurred_at": "2026-02-09T11:05:00Z", "status": "completed" } ], "permalink_url": "https://merchant.example.com/orders/12345" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_02", "checkout_id": "checkout_02", "created_time": "2026-03-23T19:00:00Z", "line_items": [ { "id": "line_2", "item": { "id": "product_456", "title": "Smart Watch", "price": 29900 }, "quantity": { "total": 1, "fulfilled": 0 }, "totals": [ {"type": "subtotal", "amount": 29900}, {"type": "tax", "amount": 2400}, {"type": "total", "amount": 32300} ], "status": "processing" } ], "totals": [ {"type": "subtotal", "amount": 29900}, {"type": "tax", "amount": 2400}, {"type": "total", "amount": 32300} ], "adjustments": [ { "id": "adj_cancel_1", "type": "cancellation", "description": "Customer changed mind", "line_items": [{ "id": "line_2", "quantity": 1 }], "occurred_at": "2026-02-09T11:00:00Z", "status": "completed" }, { "id": "adj_refund_1", "type": "refund", "description": "Refund for cancelled item", "line_items": [{ "id": "line_2", "quantity": 1 }], "amount": 32300, "occurred_at": "2026-02-09T11:05:00Z", "status": "completed" } ], "permalink_url": "https://merchant.example.com/orders/12345" }
Example (return & refund): This example shows an order where the item
was shipped, delivered, and then returned and refunded.
Version 2026-04-08
Key changes in this version in this example:
- Line items affected by a
returnnow use"status": "removed"in the mainline_itemsarray. - When
line_items.statusisremoved:- The
line_items.quantity.totalis set to0. - The original quantity is stored in the new
line_items.quantity.originalfield.
- The
- In
adjustmentsof typereturn, theline_items.quantityfield within the adjustment uses a negative value (e.g.,-1) to indicate items being taken back.
Required Headers:
Webhook-Id: adj_refund_2Webhook-Timestamp: 2026-02-10T10:00:00Z
{ "ucp": { "version": "2026-04-08", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-04-08"}] } }, "id": "order_03", "checkout_id": "checkout_03", "currency": "USD", "line_items": [ { "id": "line_3", "item": { "id": "product_789", "title": "Wireless Earbuds", "price": 14900 }, "quantity": { "total": 0, // Item removed from order total. "original": 1, // Original quantity before removal. "fulfilled": 1 // Was fulfilled before return. }, "totals": [ {"type": "subtotal", "amount": 14900}, {"type": "tax", "amount": 1200}, {"type": "total", "amount": 16100} ], "status": "removed" // Item is cancelled, returned, or refunded. } ], "totals": [ {"type": "subtotal", "amount": 14900}, {"type": "tax", "amount": 1200}, {"type": "total", "amount": 16100} ], "fulfillment": { "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-05T09:00:00Z", "type": "shipped", "line_items": [{ "id": "line_3", "quantity": 1 }], "tracking_number": "987654321", "tracking_url": "https://fedex.com/track/987654321", "carrier": "FedEx", "description": "Item shipped" }, { "id": "fulfill_evt_2", "occurred_at": "2026-02-07T16:00:00Z", "type": "delivered", "line_items": [{ "id": "line_3", "quantity": 1 }], "tracking_number": "987654321", "tracking_url": "https://fedex.com/track/987654321", "carrier": "FedEx", "description": "Item delivered" } ], "expectations": [{ "...": "..." }] }, "adjustments": [ { "id": "adj_return_1", "type": "return", "description": "Item not compatible", "line_items": [{ "id": "line_3", "quantity": -1 }], // Uses a negative value (-1) to indicate a return. "occurred_at": "2026-02-09T09:00:00Z", "status": "completed" }, { "id": "adj_refund_2", "type": "refund", "description": "Refund for returned item", "line_items": [{ "id": "line_3", "quantity": 1 }], "totals": [ {"type": "subtotal", "amount": -14900}, // Negative amounts indicate money returned to the buyer. {"type": "tax", "amount": -1200}, {"type": "total", "amount": -16100} ], "occurred_at": "2026-02-10T10:00:00Z", "status": "completed" } ], "permalink_url": "https://merchant.example.com/orders/67890" }
Version 2026-01-23
{ "ucp": { "version": "2026-01-23", "capabilities": { "dev.ucp.shopping.order": [{"version": "2026-01-23"}] } }, "id": "order_03", "checkout_id": "checkout_03", "created_time": "2026-03-23T19:00:00Z", "line_items": [ { "id": "line_3", "item": { "id": "product_789", "title": "Wireless Earbuds", "price": 14900 }, "quantity": { "total": 1, "fulfilled": 1 }, "totals": [ {"type": "subtotal", "amount": 14900}, {"type": "tax", "amount": 1200}, {"type": "total", "amount": 16100} ], "status": "fulfilled" } ], "totals": [ {"type": "subtotal", "amount": 14900}, {"type": "tax", "amount": 1200}, {"type": "total", "amount": 16100} ], "fulfillment": { "events": [ { "id": "fulfill_evt_1", "occurred_at": "2026-02-05T09:00:00Z", "type": "shipped", "line_items": [{ "id": "line_3", "quantity": 1 }], "tracking_number": "987654321", "tracking_url": "https://fedex.com/track/987654321", "carrier": "FedEx", "description": "Item shipped" }, { "id": "fulfill_evt_2", "occurred_at": "2026-02-07T16:00:00Z", "type": "delivered", "line_items": [{ "id": "line_3", "quantity": 1 }], "tracking_number": "987654321", "tracking_url": "https://fedex.com/track/987654321", "carrier": "FedEx", "description": "Item delivered" } ], "expectations": [{ "...": "..." }] }, "adjustments": [ { "id": "adj_return_1", "type": "return", "description": "Item not compatible", "line_items": [{ "id": "line_3", "quantity": 1 }], "occurred_at": "2026-02-09T09:00:00Z", "status": "completed", }, { "id": "adj_refund_2", "type": "refund", "description": "Refund for returned item", "line_items": [{ "id": "line_3", "quantity": 1 }], "amount": 16100, "occurred_at": "2026-02-10T10:00:00Z", "status": "completed" } ], "permalink_url": "https://merchant.example.com/orders/67890" }
3. Recommended order update events
To provide the best user experience, we also recommend sending updates for the following events:
Adjustment events:
dispute: When a customer disputes a charge.
Fulfillment events:
canceled: When a fulfillment is canceled (sent within thefulfillment.eventsarray).