R
Docs
Restaurant Management

Table-side QR pay

Set up the table-pay flow in three steps — print QR stickers, queue a bill, customer pays from their phone.

2 min read Updated 5/28/2026restaurant-owner

How it works

  1. Staff opens Table Bills in the dashboard, picks a table, adds line items (or imports from the open order), and clicks Send to table.
  2. The customer scans the QR sticker on their table. Their phone opens /pay/{tenantId}/{tableSlug} — a branded payment page with the bill.
  3. Customer taps Pay and confirms with Stripe (card, Apple Pay, Google Pay).
  4. The bill flips to Paid in the dashboard the moment Stripe confirms.

No app install required. No POS dependency. Works on every modern smartphone browser.

Step 1 — Set up tables and print QRs

Open Operations → Tables & QR Codes. For each physical table:

  1. Click Add table, enter the number + seats + area (e.g. "Patio").
  2. Each table is auto-assigned a stable qrSlug.
  3. Click Download QR to get a PDF or PNG. Print and stick on the table.
Use a QR that's at least 3×3 cm and placed so the customer can scan without moving their plate.

Step 2 — Queue a bill from the dashboard

When a customer asks for the bill:

  1. Open Operations → Table Bills.
  2. Click New bill, pick the table.
  3. Add line items — name + quantity + unit price. Or apply tax + tip rows.
  4. (Optional) Add a customer note that appears on the pay page.
  5. Click Send to table. The QR pay page on the customer's phone updates within ~6 seconds.

A table can have at most one open bill at a time. To split or restart, void the open bill first.

Step 3 — Customer pays

The customer's flow:

  1. Scan the QR with their phone camera.
  2. See the bill with itemised lines + total in your restaurant's brand colour.
  3. Tap Pay $X.XX.
  4. Stripe Elements prompts for a card or Apple/Google Pay.
  5. On success, the page shows a green confirmation and the receipt details.

The customer doesn't need to create an account or download anything.

Testing without Stripe

In DEV mode (when STRIPE_SECRET_KEY is unset), the pay endpoint fabricates a pi_dev_* intent and the customer's "Pay" tap is accepted immediately — same UX, no real charge. Great for QA.

Tips & best practice

  • Pre-fill tax and tip so customers don't have to do math.
  • Offer one-tap tip presets in your tip column (10% / 15% / 20%) — easier than typing.
  • Use the customer note to suggest a follow-up: "Tag us on Instagram for a free dessert next visit".
  • Void unpaid bills when a customer leaves without paying so the table can accept a new bill the next sitting.

Ready when you are

Open Table Bills

Continue

Frequently asked

  • Phase 1 is single-payer. Split-bill support is on the roadmap — for now, ask the customer to nominate one person, then settle outside via Venmo / Swish / etc.