Point of sale

Staff-facing order entry for dine-in and takeout.

The POS screen at /dashboard/platform/pos is for opening orders quickly. A server, cashier, or counter staff member can start a dine-in or takeout order and send it straight to the kitchen.

What the POS does

  • switch between dine-in and takeout
  • select one or more tables for a dine-in order (required for dine-in)
  • set the guest count
  • browse menu items by category; sold-out items cannot be added
  • pick modifiers for items that have them, with required and min/max rules checked
  • set quantities and assign each line to course 1, 2, or 3
  • mark the order as urgent
  • add order-level special instructions
  • save a draft cart on the device so it survives a reload

Typical POS flow

Choose the order type

Start with dine-in or takeout. For dine-in, pick the table or tables.

Build the cart

Tap items to add them. Items with modifiers open a picker first. Adjust quantities and courses on each line.

Add urgency or instructions

Mark the order urgent if needed, and add notes for the kitchen.

Send the order

Submitting calls createPOSOrder. In one transaction it checks the tables are free and large enough, creates the RestaurantOrder with status sent_to_kitchen, creates one OrderCourse per course number (fired immediately), creates OrderItem rows with price and modifier snapshots, and marks the tables occupied. It then creates kitchen tickets.

Duplicate-safe sends

Each send carries an idempotency key. If the response is lost, retrying with the same cart reuses the same key and returns the same order instead of creating a second one. If you change the cart while an earlier send is still unresolved, the POS refuses and asks you to reload and retry the original order. When the device is offline, the POS saves the draft and does not send.

Taking payment

The payment screen is at /dashboard/platform/pos/[orderId]/payment. It is opened from the service floor, the floor map, or a split-check notice. It has four tabs:

  • Cash: records a cash payment with processPayment.
  • Card: creates a Stripe payment through processPayment and confirms it with the Stripe card element. reconcilePayment checks the status again if the result is unclear.
  • Gift card: looks up the code (lookupGiftCard) and charges up to the remaining balance (redeemGiftCard).
  • Split: plans several tenders, including equal splits. Gift cards must be applied first from the Gift card tab.

The screen also shows how the check is allocated across split checks, refund actions that need manager approval, and the manager approval queue.

Floor map

/dashboard/platform/pos/tables shows tables on a floor map. Staff can drag tables to new positions in edit mode, change table status, transfer an order to another table, and combine tables onto one order. The service floor links to it as "Floor map".

Recovery panels

The POS has a collapsed "Checkout recovery" section. It shows online checkouts that were paid but not placed, refunds and refund webhooks that need reconciling, and the queued notification list.

The POS opens orders. The service floor runs them once they are live: adding items, firing courses, splitting checks, and closing.

Current limitations

  • Courses are limited to 1, 2, and 3 in the POS. All courses are fired at send time. Use the service floor to hold or recall a course.
  • Seat numbers are not set in the POS. They are set on the service floor.
  • The POS does not send orders offline. It only keeps a draft on the device.
  • There is no printer, cash drawer, or card reader integration.

On this page