Pay at Table — troubleshooting

Common Pay-at-Table issues and what fixes them.

"Table not recognized" when the guest scans:
The QR encodes a 14-character guest token. If that token doesn't resolve, the most common causes are:
• The table doc was deleted but the printed sticker still exists — reprint from the current table list
• The table was created seconds ago and the server-side trigger that mints the token hasn't fired yet — wait 10 seconds and rescan
• The QR was printed from a clone restaurant before that clone was saved — reprint from the live restaurant

The guest sees the table but no check ("Welcome! Browse Menu"):
This is expected when no server has opened a check at the table yet. The guest can browse the menu and place a first order — that creates the check and the next scan will land them on the bill view directly.

The guest scans but loads forever:
• Their phone has no internet (offline QR scanning) — they need cell or wifi
• Stripe's CDN is blocked on the restaurant's guest wifi — switch to cell data
• A captive portal sits in front of the wifi — agree to it first, then rescan

Apple Pay / Google Pay button doesn't show:
The Payment Request button only appears when the browser advertises a wallet capability:
• iOS Safari + Apple Pay enrolled (Wallet has a card) → Apple Pay button
• Chrome on Android + Google Pay set up → Google Pay button
• Desktop Chrome with a Google Pay account → Google Pay button
• Anywhere else → no wallet button (use the inline card form below it)

The "Pay with Card" form (inline Stripe Payment Element) always shows, even when no wallet is available — that's the universal fallback. No more redirect to a hosted Stripe page.

Card form says "Payment did not complete":
• Stripe's 3D Secure challenge requires a redirect; the inline form opens it in a popup. If the popup is blocked, allow popups for turtini.com and retry.
• If the card was declined by the issuer (insufficient funds, fraud rule), the error message names the reason — the guest needs to use a different card.

Split payment is stuck (says "Remaining due" but no one can pay it):
The check is open and one or more sharers paid, but the remaining balance is below the minimum charge Stripe allows ($0.50 USD). Two fixes:
• Have a sharer cover slightly more (e.g. round up to absorb the remainder)
• On the admin side, mark the check Paid manually with "On Account" or a manager comp — the order flips to paid and the table frees

"Already paid by others" line doesn't update on someone else's phone:
The patron-side bill subscribes live to the order's payments subcollection. If it's stale:
• Pull-to-refresh the bill page
• Make sure they're scanning the same table's QR (not a different table)

The Google review button doesn't appear after the guest rated the meal up:
Three reasons:
1. The restaurant's Settings → Pay at Table → "Google review link" is blank — paste your GBP review URL there
2. The guest rated thumbs-down — the review prompt is intentionally positive-only
3. The split paid out but the last share hasn't cleared yet — the prompt waits for the check to fully settle

The check shows "Paid" but the table is still Occupied:
The free-the-table side effect runs after the payment posts. If the order is paid but the table didn't free:
• Open the table on the Floor Plan and tap "Mark Available"
• If this happens repeatedly, check the table doc has a status field — older seed data sometimes missed it