Skip to content
SarvexDocs
Esc
↑↓navigate↵open⌘Jpreview

A checkout session was abandoned (versioned lifecycle contract)

RECEIVEserving.checkout.abandoned
Message
event_versionstringrequired

Semver of this event contract. Starts at "1.0"; bump on a breaking payload change.

event_idstringrequired

Fresh per emission — a ULID prefixed "evt_", lexicographically sortable by emission time.

matches ^evt_[0-9A-HJKMNP-TV-Z]{26}$
occurred_atstring<date-time>required
merchant_idstringrequired
store_idstringrequired
surfacestringrequired

Best-effort Google surface, derived from the UCP-Agent header's profile-URL host. "unknown" when the header is absent or doesn't recognizably match a known Google surface.

Allowed:google_ai_modegoogle_geminiunknown
checkout_idstring

Absent on serving.request.telemetry_recorded; the Sarvex checkout session id everywhere else.

cart_snapshotcart_snapshotrequired
Show properties
currencystringrequired
total_minorintegerrequired
line_itemscart_line_item_snapshot[]required
Show properties
Array of cart_line_item_snapshot
skustringrequired
quantityintegerrequired
unit_price_minorintegerrequired

0 when no live connector pricing was ever resolved for this session (see cart_snapshot).

stagestringrequired

The SessionState the session was in when it went quiet (added for the Lost Revenue Ledger, additive to the original contract) — distinguishes ordinary top-of-funnel drop-off from a stall right before the final complete call.

Allowed:incompleteready_for_complete
Headers
message_idstringrequired

Unique per message; consumers de-duplicate on this.

ordering_keystringrequired

The store_id. Guarantees per-store ordering; the catalog/serving tenant boundary (a store belongs to one merchant — see architecture §2a).

occurred_atstring<date-time>required
sequenceinteger<int64>

Monotonic per-connector sequence carried from the origin signal (ingest events only).

trace_idstring

Correlates a chain of events from one originating cause.

schema_versionstringrequired
Try it
Server
Payload

Live sending isn't possible for pubsub from a browser tab — copy the sample above and run it against your broker.

Message
{
  "event_version": "1.0",
  "event_id": "string",
  "occurred_at": "2019-08-24T14:15:22Z",
  "merchant_id": "string",
  "store_id": "string",
  "surface": "google_ai_mode",
  "checkout_id": "string",
  "cart_snapshot": {
    "currency": "USD",
    "total_minor": 0,
    "line_items": [
      {
        "sku": "string",
        "quantity": 0,
        "unit_price_minor": 0
      }
    ]
  },
  "stage": "incomplete"
}