Module Reference

Guest ordering

Diners scan a table QR code, order from their phone onto the table's open ticket, and ask for the bill or to cancel a dish.

Guest ordering lets diners order from their own phone. A table gets a permanent QR sticker, or staff show a one-off QR for a single ticket. Scanning it opens the menu, and what the diner sends lands on the table's open ticket in POS and goes to the kitchen like any other order. Diners can also ask for the bill, ask to cancel a dish, or call staff; those requests wait in an inbox on the register. When staff accept a bill request, they bring the bill to the table and take payment through POS like any other ticket. Guest ordering has no menu, tickets or payments of its own: it reads POS's menu and writes to POS's tickets.

Discounts from Discounts that run in Food ordering apply to a ticket a diner opened from a table's QR code. The menu shows an item's sale price with the regular price struck through and the sale's name, and badges such as "Buy 2, get 1 free". The cart and the ticket show the discount by its name, and the ticket's discount is the one the register charges. A free gift the cart earns goes in by itself, marked Free gift, and comes out if the diner removes what earned it.

What it handles

  • One sticker, many parties. The first phone to scan a table's sticker opens a ticket, and other phones at the table join the same one. Once staff clear the table, the next party gets a fresh ticket and the previous party's phones lose access. A party arriving while the last bill is being paid is turned away instead of joining it. Tested: "Guest: table QR codes"
  • Links that should stop working. A reissued QR code ends the old one, an expired one doesn't open, and moving the party to another table ends the printed code. The link keeps working while staff settle the bill so the party can watch it, refuses new dishes then, and stops once the ticket closes. Tested: "Guest: sessions"
  • What a diner can add. Dishes land on the ticket and are fired to the kitchen, marked as added by a guest. A dish sold out at this location is refused while another location can still sell it, and the order screen works as a plain form without JavaScript. If a send's answer is lost, sending again reuses the same request and the dish lands once. Tested: "Guest: ordering" Tested: "Guest: app"
  • Discounts the diner sees. A diner's dishes under a live discount show the same discount on their ticket as staff see on the check. Two iced teas put a free cookie in the cart, and the sent ticket's discount covers the cookie. Tested: "Guest: ordering"
  • Cancel and bill requests. A diner can ask to cancel a dish the kitchen hasn't started, not one that's cooking, ready or served. A server can't approve a cancellation but a manager can, and approving it marks the dish cancelled on the ticket. A diner can't ask for the bill again while a request is pending. Tested: "Guest: requests"
  • Features the owner switched off. With tables, modifiers or the kitchen switched off in POS, a QR code can't seat a party, the menu offers no options, and nothing reaches a kitchen. Switched back on, all three work again. Tested: "Guest: ordering follows the POS feature switches"
  • Staff at other locations. A register only reprints, replaces, or resolves requests for its own location's tables, and a manager stationed elsewhere can't switch a table's QR code on. Tested: "Guest: table QR codes" Tested: "Guest: requests"

What you build on top

  • POS is required. Guest ordering adds its order panel, request inbox and table QR panel to the register through POS's pos.register-panel slot, and a Table QR codes section to each Location's page. See Extend a Module.
  • A phone number at the start. With Customers on, a diner who leaves a phone number when they start ordering appears in Customers once the ticket closes.
  • A link to save the visit. With Account on, the diner's page offers a link to this visit once the ticket is paid.
  • Housekeeping. A background job expires old links and clears resolved requests. Admins with guest-maintenance:write can check and repair that state from the maintenance page.
  • In code. Your coding agent imports Guest ordering only through its public API: index.ts and server/index.ts in apps/web/src/modules/guest-ordering/. See Build on a Module.

Limits

  • Diners can't pay from their phone. They ask for the bill, and staff bring it and take payment through POS.
  • There's no menu or ticket outside POS. Guest ordering can't run without it.

Facts

  • Kind: feature Module, can be switched on and off
  • Needs: Audit log, Branches, Formatting, i18n, Identity, Infra, POS, Standard UI
  • Needed by: Nothing
  • Adds to these when they're on: Tour
  • Added to by: Nothing
  • Off by default for these business types: Spa, Clothing, Tour operator, Gym, Online classes, Car hire, Snack store

Pages

WherePath
Customer site/order
Admin/admin/guest-ordering/maintenance

Permissions

Admin holds every key. The other roles listed hold it when the app first gets the Module; after that, roles are yours to change under Settings → Roles & Permissions.

PermissionWhat it allowsOrganization roles that start with it
admin-panel:writeFull compatibility access to all module administration, including POS, catalog, storefront, and CRM staff tools.Admin
guest:issueIssue and reissue table QR codes, and print or replace permanent table QR codesAdmin, Manager, Staff
guest-maintenance:writeDiagnose and repair guest ordering reconciliation stateAdmin

Data

  • Tables: guest_session, guest_request, guest_table_code

Tested workflows

  • Guest: sessions
  • Guest: ordering
  • Guest: ordering follows the POS feature switches
  • Guest: cart
  • Guest: requests
  • Guest: reconcile
  • Guest: reconcile schedule
  • Guest: public boundary
  • Guest: table QR codes
  • Guest: optional phone at Start ordering lands in Customers
  • Guest: save this visit link