DocsGuides

POS orders

The normalized order shape for point-of-sale and marketplace integrations.

Coastly normalizes orders from every vertical, marketplace, F&B, delivery, and services, into a single shape so your POS or back-office sees one consistent object regardless of where the order originated. You can read orders over REST and receive them in real time over webhooks.

The order object

{
  "id": "ord_5T8w2h",
  "status": "confirmed",
  "vendor_id": "prop_1a2b3c",
  "customer": {
    "id": "cus_2k9d",
    "name": "Ana Rivera",
    "email": "ana@example.com",
    "phone": "+50760000000"
  },
  "fulfillment": {
    "type": "delivery",
    "address": "Playa Venao, Los Santos",
    "pin": "https://maps.google.com/?q=7.4285,-80.1985",
    "scheduled_for": "2026-07-12T18:30:00Z"
  },
  "items": [
    {
      "sku": "ceviche-classic",
      "name": "Classic ceviche",
      "qty": 2,
      "unit_price": 850,
      "modifiers": [{ "name": "Extra plantain", "price": 150 }],
      "line_total": 2000
    }
  ],
  "totals": {
    "subtotal": 2000,
    "delivery_fee": 300,
    "tax": 0,
    "total": 2300,
    "currency": "USD"
  },
  "commission": { "rate": 0.15, "amount": 300 },
  "created": 1751328000,
  "updated": 1751328600
}

Field notes

Field Notes
status Order lifecycle, for example pending, confirmed, fulfilled, cancelled.
fulfillment.type delivery, pickup, or dine_in.
fulfillment.pin Map pin for delivery; Coastly is record-only, delivery is vendor-run.
items[].unit_price and all totals Integer minor units (for example cents), paired with totals.currency.
modifiers Per-item options with their own price deltas, already reflected in line_total.
commission Coastly's commission on this order; see commission.

Amounts are always integers in the currency's minor unit to avoid floating-point rounding. Divide by 100 for a two-decimal currency.

Receiving orders

Subscribe to order.created and order.updated. The webhook data is exactly the object above.

{
  "id": "evt_9Xk2",
  "type": "order.created",
  "created": 1751328000,
  "data": { "id": "ord_5T8w2h", "status": "confirmed", "totals": { "total": 2300, "currency": "USD" } }
}

Handle order.updated for every status transition rather than assuming a fixed sequence, and process by updated timestamp so an out-of-order retry never rolls state backward. See webhooks for signature verification.