Skip to main content

Cancel an order

Cancel an order before it is fulfilled — either from your app or after a restaurant intent-to-cancel.

Before you begin

Steps

Cancellation Event Flow

  1. Create the order with POST /v1/orders (same as the create flow).
  2. Cancel from your app (path A): After cancellation succeeds in your system, set status to CANCELED with POST /v1/orders/{orderId}/status.
  3. Restaurant-initiated (path B):
  4. Otter sends an Intent to cancel order (orders.cancel_order) webhook when a restaurant operator requests cancel.
  5. If your channel requires it, attempt cancel on the online delivery / marketplace side.
  6. When cancel succeeds, set status to CANCELED with POST /v1/orders/{orderId}/status and echo the webhook's event ID in X-Event-Id.

The cancellation callback contract has no decline state and no public no-response deadline. If cancellation fails, do not acknowledge it as CANCELED; follow the integration-specific reconciliation process agreed during onboarding.

Verify

Cancel a test order both ways (your app and, if available, restaurant intent). Confirm that the status endpoint returns 202 Accepted and that the eventual order state matches. A 202 response confirms queueing only; it is not a downstream completion acknowledgment.

Common failures

SymptomLikely causeFix
Intent webhook received but order still openForgot status update after channel cancelCall status endpoint with CANCELED
Status update returns 404Wrong or unknown external order idUse the same externalIdentifiers.id supplied when the order was created
Status update returns 202, but state has not changed yetThe update is still queued or downstream processing failedReconcile the order through the integration-specific process

Next