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
- Staff opens Table Bills in the dashboard, picks a table, adds line items (or imports from the open order), and clicks Send to table.
- The customer scans the QR sticker on their table. Their phone opens
/pay/{tenantId}/{tableSlug}— a branded payment page with the bill. - Customer taps Pay and confirms with Stripe (card, Apple Pay, Google Pay).
- 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:
- Click Add table, enter the number + seats + area (e.g. "Patio").
- Each table is auto-assigned a stable
qrSlug. - 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:
- Open Operations → Table Bills.
- Click New bill, pick the table.
- Add line items — name + quantity + unit price. Or apply tax + tip rows.
- (Optional) Add a customer note that appears on the pay page.
- 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:
- Scan the QR with their phone camera.
- See the bill with itemised lines + total in your restaurant's brand colour.
- Tap Pay $X.XX.
- Stripe Elements prompts for a card or Apple/Google Pay.
- 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
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.
- Yes — the bill on the dashboard is independent of any POS integration. You enter the amount your POS shows, the customer pays, you mark the POS order paid when the bill turns green.
- The customer's page polls every 6 seconds while waiting for a bill, so the worst case is ~6s. Usually it's under 2s.
- Stripe shows a "Payment declined" message; the bill stays in **Open** state so they can try a different card without losing their cart.