Features
Everything your cafe & restaurant needs
From QR code generation to real-time order tracking, AI-powered content to multi-language menus — Thmenu is the complete digital solution for your growing business.
- 01
A QR Menu for Every Table
Every table gets its own QR code that opens your menu in the browser — guests need no app and no account.
- 02
31 Languages
The menu opens in the language of the guest's phone when it is one of 31 supported languages. Dish names and descriptions are translated automatically in the background, and you can correct any translation.
- 03
Table Ordering
Guests order from their table and the order appears in your dashboard live, with a sound alert and a push notification for your staff.
- 04
Menu Analytics
See how often each dish was opened, added to the cart and ordered, your orders and revenue day by day, and a heatmap of your busiest hours.
- 05
AI Dish Details
Type a dish name and AI suggests a description, ingredients and allergens for you to check before saving. The whole menu can then be translated into every language you serve.
- 06
Your Colours and Layout
Pick your own colours or a preset, and show the menu as a grid, a list or a compact list with your choice of card style.
- 07
Security built in
Orders are checked for Tor or VPN use, signs of a faked location and sudden bursts, and risky ones are flagged for your staff. Ordering is rate-limited, and a repeated submission does not create a second order.
- 08
Campaigns and Promo Codes
Show promotion banners on your menu for a date range or a weekly time window such as happy hour, and offer discount codes with start and end dates.
- 09
On the Home Screen
Guests can add your menu to their home screen on iOS and Android. A menu opened on the phone in the last day stays readable without a connection, and orders placed offline are sent when it returns.
- 10
Global Speed — Cloudflare CDN
Served from Cloudflare's global edge network, so your menu loads from a node near your guest. Actual speed depends on their connection.
- 11
Guest Ratings
When the bill is closed at a table, guests can rate their visit, and every rating appears in your dashboard.
- 12
Digital Waiter & Bill Calls
Guests can call a waiter or ask for the bill from their table, and your staff see and close each call in the panel.
- 13
Staff Roles
Role presets for waiters, cashiers, kitchen staff and managers, each with its own permissions. Staff sign in with a PIN on the kitchen display and the staff watch app, and key changes are logged.
- 14
Manual Order Entry
Enter table, takeaway and phone orders from your dashboard; a printable receipt opens after each one.
- 15
Accessibility Support
Built-in font size controls and high-contrast mode on every menu. Customers with visual impairments can adjust the display to their needs — no extra setup required.
- 16
Paperless
Change a price or a dish whenever you want and the menu updates; the printed QR codes stay the same, so there is nothing to reprint.
- 17
Payments, Your Way
Guests pay by card from their own phone through Stripe, with Apple Pay and Google Pay on supported devices, in countries where Stripe is available.
- 18
Self-Service Kiosk
Turn a tablet into a full-screen self-service menu at your counter: guests browse and place takeaway orders, and the screen resets between customers.
- 19
Loyalty Points
Members earn points on every order and move up tiers that earn faster, and you can see and adjust each member's balance from your dashboard.
- 20
Reservations & Waitlist
Take bookings — guests who leave an email address get a confirmation and updates by email — and keep a walk-in waitlist in your dashboard.
Full List
Every Feature225
Thmenu's complete end-to-end capabilities — every category, nothing hidden.
Installable App (PWA)4
- Install to home screen (iOS & Android) — The admin dashboard and the guest menu install as an app from the browser — no app store, no download.
- Works offline — A menu already opened keeps working without a connection.
- Push notifications — New orders, waiter calls and bill requests arrive as push notifications on the installed app.
- Full-screen standalone mode — Once installed it runs without browser chrome, like a native app.
Notifications & Push10
- Web Push (VAPID, RFC 8291) — ES256 VAPID-signed Web Push to admin browsers and customers (order-ready); urgency:high, ~10-min TTL
- Order received → owner — Fires on successful customer order POST ("new order from table N, total $X") across native + web
- Order ready → owner — Fires when an order moves to 'ready'; auto-collapses same-order updates
- Order ready → customer (Web Push) — Customer-side VAPID push when their order becomes ready; opt-in on the order-details page
- Order cancelled → owner — Fires when a customer cancels within the 90-second window
- Waiter call → owner/staff — Customer "Call Waiter" fires a per-table push to smartwatch + staff phone + admin web with haptic vocabulary
- Bill request → owner/staff — Customer "Get Bill" fires a per-table push to smartwatch, phone, and web
- Inventory stockout prediction → owner — AI-predicted 3-day stockout alert, once/day/restaurant when confidence ≥ 50%
- Reservation created → owner — Per-restaurant push to owner smartwatch/phone/web on a new booking
- Real-time SSE notifications → admin web — 5-second D1 polling pushes pending order counts, waiter calls, bill requests, and ready orders to the admin
Ordering, KDS & Kitchen23
- QR menu (core customer menu) — Public-facing digital menu via QR or direct URL with categories, products, and images
- Order cart & checkout — Shopping cart for selecting products with modifiers and quantities before payment
- Customer ordering (5-step lifecycle) — Place → pending → confirmed → preparing → ready → served with real-time status updates; server-side canonical
- Order modifiers & customization — Per-product modifier groups (size, toppings, extras) with per-option price deltas stored as a JSON snapshot
- Product notes (special instructions) — Free-text per-item notes ("no onions") surfaced on the KDS receipt
- ETA / order countdown — Customer-visible 25-min prep timer from 'preparing' to 'ready' (target_ready_at), 30s polling, green pulse on
- Order tip adjustment (post-payment) — Customer adds/modifies tip after placement, server-capped by tip_max_percent (default 50%)
- Order cancellation (90s window) — Customer cancels pending orders within 90s with atomic race-check, loyalty-earn reversal, and shadowban
- Order refunds (cumulative tracking) — Admin partial/full refunds tracked cumulatively in refunded_amount_cents with OCC race-guard (409)
- Multi-currency & tax breakdown — Order total with per-rate tax-breakdown JSON, tax-inclusive vs exclusive, currency snapshot
- Order sharing (Web Share API) — Customer shares live order status to other phones via the native OS share sheet or clipboard
- KDS (Kitchen Display System) — Real-time SSE/poll order queue with status transitions (pending → confirmed → preparing → ready → served)
- KDS stations & PIN login — Multiple KDS stations per restaurant, each with a 4–6 digit PIN and per-station category filtering
- KDS order-status workflow (OCC) — Atomic kitchen transitions with `AND status=<prev>` race-check and optional per-status button labels
- Orders list & detail — All orders grouped by status; drill into items/totals/customer; manual partial refunds, tip adjuster
- Order entry (manual POS) — Staff create orders table → category → product → qty → confirm; idempotency-keyed POST; handles phone/cash
- Bar tabs (session-based tab tracking) — Persistent per-customer tab across multiple orders with running balance and per-item tracking
- ESC/POS thermal printer support — Raw ESC/POS byte builder (32/42/48/56 char widths) with CP857 Turkish encoding for receipts
- Thermal printer bridge (Web Serial/USB/Bluetooth) — Browser transport layer for ESC/POS communication via Web Serial, USB, and Bluetooth
- Printer setup & pairing UI — Discover, pair, and test printers with model/width/encoding selection
- Kitchen receipt ticket — Specialized ESC/POS kitchen printout: restaurant, table, items, qty, notes, modifiers, elapsed time
- Customer receipt / bill ticket — Customer-facing thermal receipt: restaurant, table, items, unit price, total, payment method, timestamp
- Auto-86 on stock-out — Atomic inventory decrement on order placement unpublishes products at stock ≤ 0 and pushes an owner alert
Kiosk2
- Kiosk mode (self-service) — Full-screen kiosk on any tablet: a tap-to-start screen, the live menu and cart, and a reset after 60 seconds idle; orders are placed as pickup orders
- Kiosk device registration — Register and manage kiosk devices from the developer/integrations surface
Payments2
- Stripe Checkout & Payment Intents — Customer checkout sessions + payment intents for agent orders; SCA/3D-Secure, metadata attribution, refund
- Stripe Connect — Restaurant payouts & commission splits (restaurant keeps subtotal share, platform commission); webhook-driven
AI Suite29
- AI product description generator — LLaMA 3.1 8B generates a 2-sentence menu description from name/category/price with sanitized input
- AI product details auto-fill — Populates nutrition (kcal/fat/carbs/protein/salt), ingredients, and EU-14 allergen whitelist with a 7-day KV
- AI menu generator (bulk) — One-prompt full menu structure (categories, products, descriptions, suggested prices, allergens, portions)
- AI menu cleanup — Detects duplicate/inactive products, inconsistent naming, typos, and low performers as culling candidates
- AI pricing suggestions — Analyzes 30-day unit sales/revenue against anonymized cross-restaurant category medians; returns suggested
- AI recipe suggestions — Suggests seasonal/themed recipes from available ingredients, cuisine, and dietary trends with allergen tags
- AI daily specials generator — Generates daily/weekly specials + marketing copy from ingredients, seasonality, and trends, with suggested
- AI shift schedule optimizer — Suggests staff shift patterns from historical volume, peak hours, reservations, availability, and labor cost
- AI menu translate — Context-aware food/beverage translation of names + descriptions to 31 languages, preserving HTML markup
- AI review reply generator — Drafts owner replies to guest reviews in a selectable tone, including an apology tone; the owner edits and sends
- AI bio generator — Generates a 200-word SEO-optimized restaurant bio from cuisine, location, specialties, and founding story
- AI insights (daily/weekly/monthly) — Cron-generated narrative reports (3–5 paragraphs) comparing YoY/WoW revenue/AOV/top products/funnels with 3–5
- AI menu chat (customer-facing) — Natural-language menu search ("vegetarian pasta?", "what's gluten-free?") returning 3–5 matched products with
- AI product recommendations — Cart-aware 3–5 product suggestions using menu context + cart contents + exclude list, anchored to primary
- AI smart upsells — 2–4 complementary items (pairings, add-ons, desserts, beverages, starters) classified by upsell_type from the
- AI voice ordering (speech-to-cart) — Web Speech API → LLaMA parses intent → matches products → returns cart items with ambiguity flags; localized
- AI wine/beverage pairing — Pairing suggestions for ordered dishes by flavor profile, cuisine, and wine list, with price tier and
- AI dish suggestions (customer form) — Customers submit dish ideas (name, description, cuisine hint); admin triages by status
- AI content cleanup (bulk moderation) — Batch review of customer feedback for profanity/spam with bulk delete + flag
- Sentiment analysis (feedback/reviews) — Cron classifies guest feedback as positive/neutral/negative/critical with themes
- MCP: start_order_session — Mints agent_session_id + customer_confirm_url (30-min TTL); checks the restaurant's agent_enabled flag
- MCP: place_order — Atomically inserts order + items, validates products, snapshots currency, decrements stock, auto-86s on zero;
- MCP: cancel_order — Atomically cancels with ownership + session-TTL checks, OCC race-guard, and loyalty-earn reversal
- MCP: get_order_status — Polls status + ETA + items; 30s cache; scope orders:read
- MCP: request_bill — Inserts a bill_request, triggers admin push, can pre-populate total for split-bill UI
- MCP: waiter_call — Inserts a waiter_call, triggers admin + smartwatch push with vibration vocabulary; optional note
- MCP: get_restaurant_menu — Public menu schema (no scope) returning categories + products + prices + allergens
- MCP: check_loyalty — Returns loyalty balance + tier + next-tier threshold; scope loyalty:read
- MCP: apply_promo — Atomically reserves/claims a promo discount, checks max-uses + per-customer limit; scope orders:write
Marketing & Loyalty22
- Email campaigns — HTML email blasts to subscriber lists with status tracking (draft/queued/sending/sent/failed) and delivery
- Email templates — Reusable branded HTML templates with custom sender name and reply-to
- Email subscribers — Subscriber list with status (subscribed/unsubscribed/bounced/complained), source tracking, and per-subscriber
- Email drip sequences — Trigger-based multi-step lifecycle emails (signup/first_order/birthday/reservation_complete, Day-1/7/30
- Email newsletter signup + unsubscribe — Checkout email capture with admin-configured list and one-click unsubscribe
- Promotional banner campaigns — Featured menu banners with custom colors, badge text, images, date windows, and sort order
- Announcements (in-menu banners) — Sticky in-menu banners ("Happy Hour 5-7pm") with custom color/icon/text and scheduled date ranges /
- Promo codes — Admin-created codes with percent/fixed discounts, min-order amounts, usage caps, per-customer redemption
- Promo code customer application — Checkout application with server-side validation, usage-cap enforcement, spend-floor check, and per-IP
- Loyalty program (earn + redeem) — Points per order with redemption for discounts/rewards; atomic balance-check guards, reward-stock inventory
- Loyalty signup — Customer email/phone account creation with tier-based earning rates and visit history
- Loyalty tiers — Bronze/Silver/Gold/Platinum classification by spend/visit thresholds with tier-specific earn rates and redeem
- Loyalty tier automation — Daily cron auto-promotes tiers based on cumulative 90-day spend; applies bonus boosts and loyalty discounts
- Loyalty points expiry — 12-month expiry with daily 11:00 UTC sweep that writes counter-entries, decrements balance, and notifies
- Loyalty admin adjust — Manual point delta (positive/negative) with optional admin notes for the audit trail
- Loyalty members list — Admin view of all members: email/phone/name, points balance, lifetime points/spend, visit count, last visit
- Loyalty wallet stats — Customer wallet showing lifetime points, balance, tier, earned-this-period, and redeemable rewards inventory
- Marketing AI (content + segmentation) — AI generation of social posts, email templates, and promo copy plus customer segmentation/campaign
- Auto-spotlight — Monday cron auto-promotes low-stock items to featured status to reduce waste and clear inventory
- Daily specials — AI-suggested or manual time-limited specials with a "Today's Special" badge and auto-rotation
- Product featured flag — Manual flag to highlight/promote menu items, visually emphasized on the customer menu
- Product likes / wishlist — Customer bookmarks favorite dishes via localStorage with cross-restaurant resolution via an email profile;
Reservations / Waitlist10
- Reservations + booking calendar — Customer date/time-slot booking with party size, guest name/email/phone, and notes; admin day-view calendar
- Reservation admin queue — Status transitions (pending → confirmed → seated/no-show/completed) with sortable upcoming/history views
- Reservation cancellation (customer) — Cancel via confirmation-code link with atomic race-check (status='pending')
- Reservation confirmation code — Unique per-reservation code for reference, status checking, and cancellation
- Reservation iCalendar export — Customer .ics export with reservation details for calendar import
- Reservation no-show tracking — Admin marks no-show for policy enforcement
- Reservation party-size cap — Per-restaurant max party size enforced at booking (default 50)
- Active-slot dedup index — Partial UNIQUE index enforcing one pending/confirmed reservation per (restaurant, table, time-window)
- Table sessions (QR join, 1-hour TTL) — Multiple customers scan the same table QR to form a session (session_token, join_code, host_device_id); host
- Waitlist management — Self-service queue join (party size, phone, notes) with admin status transitions (waiting → notified →
Analytics & BI11
- Analytics dashboard — Real-time KPI cards (24h revenue, order count, AOV, completion rate), 30-day revenue trend, hourly heatmap
- Order analytics — Order volume, revenue, AOV, payment-method breakdown, refund tracking, cumulative refund ledger, cancellation
- Menu ABC (Pareto) analysis — Classifies products A (top ~80% revenue) / B / C from 30-day history with cumulative revenue share, rank
- Menu health score — Setup validator: image presence, description completeness, allergen coverage, pricing consistency, featured
- Order heatmap — Time-of-day × day-of-week order-volume visualization to identify peaks and slow periods
- AI customer insights — Daily narrative (DoD/WoW metrics, at-risk customers, top loyalty member, 3 action CTAs) + weekly deep-dive
- Revenue goals / KPI targets — Admin-set daily/weekly/monthly revenue/order/customer goals with progress visualization and variance analysis
- Popular times heatmap (public API) — Public endpoint exposing restaurant popularity by hour for customer decision-making
- Z-report (end-of-day reconciliation) — End-of-shift cash & card totals with variance detection, refund summary, pending items, tip column, and
- Tax report export — Monthly/quarterly P&L: revenue, tax collected, refunds, net taxable income; downloadable CSV for accountants
- COGS tracking — Product-level cost-of-goods with automated margin calculation and monthly P&L reporting; recipes link
Staff & Operations14
- Staff management (roles + permissions) — Owner/admin/manager/kitchen/server/cashier/KDS roles with granular permission gates (view_orders
- Staff PIN authentication — 4–6 digit PIN login for KDS/floor staff with PBKDF2 200k-iter hashing, per-credential 16-byte salt, atomic D1
- Time clock (punch in/out) — PIN-based clock-in/out with shift duration, breaks, labor-cost calculation, overtime auto-flag, and KDS token
- Shift scheduling — Recurring/one-off shift calendar with staff assignment, date-range scheduling, per-restaurant timezone
- Shift handovers — Structured shift-to-shift notes (open orders, issues, incidents, inventory notes) with confirmation and
- Tip pools / service charge — Daily tip aggregation with per-staff distribution rules, role/shift-based shares, manual override
- Staff audit logs — 24-month rolling retention of staff actions (logins, PIN/password changes, permission changes, refunds
- Inbox (unified alert feed) — 5-second poll of waiter calls, bill requests, low-stock, reviews, reservations, allergen incidents, and shift
- Waiter call (bell system) — Customer "Call Waiter" button creates a waiter_calls record and pushes to staff watches + admin web;
- Waiter call acknowledgment — Staff view/prioritize/acknowledge calls from dashboard or smartwatch with response-time tracking
- Bill request (adisyon) — Customer "Get Bill" creates a bill_requests record with a closure state machine; bill freeze blocks new
- Bill request acknowledgment — Staff confirm receipt and completion from dashboard or smartwatch
- Activity feed — Real-time feed of all actions (order created, refund, staff login, menu edit), searchable and filterable
- Business hours + holiday mode — Per-day-of-week operating hours (with breaks) that disable ordering outside hours, plus a holiday-mode toggle
Menu, Inventory & Pricing15
- Menu editor (products/categories/modifiers) — Full menu CRUD: create/edit/delete items, bulk restock CSV, allergen tagging, tax-rate override, AI nutrition
- Menu categories (hierarchical) — Product groupings (appetizers/mains/desserts/drinks) with drag-reorder and optional parent nesting
- Product management (CRUD) — Full product lifecycle: name, description, price, image, availability, prep time, allergens, ingredients
- Product recipe editor + COGS — Recipe ingredient list with per-unit COGS and margin % calculation
- Product bulk import/export
- Product bulk pricing update — Apply percentage markup/markdown to multiple products with preview before commit
- Product restock tracking — Log manual restocks with quantity and timestamp for inventory reconciliation
- Product gallery (multi-image) — Upload multiple product photos (angles, ingredients, prep shots) with a gallery viewer; on-device
- Nutrition info (AI + manual) — Calories, macros, allergens populated by AI or manually, with per-item tax rates
- Allergen tracking + customer warnings — EU-14 allergen list on products; customer allergy input surfaces cart warnings; incident log
- Inventory management — Per-product stock tracking with auto-86 at ≤ 0, owner notifications, and availability status
- Inventory movements ledger — Detailed log of all stock adjustments (reconcile, fulfillment, waste, spoilage, transfers) with reason codes
- Inventory predictive analytics & reorder — AI 14-day stockout forecast (depletion rate + confidence) alerting when days-until-stockout < 3 with
- COGS nightly refresh — 02:30 UTC recompute of product COGS from recipes, detecting margin drops > 10% and surfacing admin alerts
- Tax settings & rates — Multi-rate tax config with per-product overrides and restaurant default, tax-inclusive vs added toggle
Customer Experience / PWA / i18n14
- PWA (installable, offline-first) — Installable customer menu + admin dashboard with Service Worker offline support, network-first mutations
- Background sync (offline queue) — Orders/feedback queued offline and replayed by the Service Worker on reconnect, with an offline indicator and
- Localization (31 languages + RTL) — TR/EN/DE/FR/ES/IT/PT/RU/AR/HE/FA/ZH/JA/KO/NL/PL/RO/EL and more, with Arabic/Hebrew RTL mirroring
- Live currency conversion — Customer-facing live FX toggle (EUR/USD/GBP/SAR/AED) so tourists see menu prices in their home currency
- Dark mode — System-theme detection + manual toggle persisted to localStorage
- Accessibility (WCAG 2.1 AA) — Aria labels, semantic HTML, keyboard navigation, focus-visible, and 44×44 touch targets
- Menu theme editor — Color picker, font selection, logo/cover, and layout toggle (grid vs list) applied across the menu and web
- Gallery / restaurant images — Upload interior/dish gallery photos with captions for the menu header and landing page
- Social links management — Configurable Instagram/TikTok/Facebook/LinkedIn links on the menu footer with safeHref validation
- Wi-Fi info display — Guest Wi-Fi SSID + password shown in the menu footer
- Feedback / NPS (post-order) — 5★ + category + 280-char message after served, with once-per-order dedup, entity-encoding, and per-IP
- Feedback admin dashboard — All feedback with sentiment chips, date-range and source filtering, and critical-alert push
- Dish suggestions triage — Customer-submitted dish ideas queued for admin triage with status and admin notes
- Customer Web Push subscriptions — Order-ready/cancelled notifications with deep-link back to the order detail; subscription persistence with
Customer CRM4
- Customer list / CRM — Dashboard aggregating loyalty members + reservations + feedback into a searchable contact list with detail
- CRM contact info (dedup) — Unified email/phone contact storage deduplicated across orders, reservations, loyalty, and feedback
- CRM win-back candidates — Flags customers with no visit in 60+ days as churn risk for re-engagement
- CRM tagging — Arbitrary tags (VIP/regular/one-time) for segmentation
Automation5
- Daily operations digest email — Opt-in per-restaurant-timezone daily email: revenue, orders, tips, top products, feedback rollup, new
- Low-stock daily digest email — Resend HTML email listing products with stock_qty ≤ threshold; 09:00 UTC, idempotency-guarded
- Ingredient reorder alerts — Daily email of reorder-needed products with usage-velocity-based quantities and supplier links; 09:30 UTC
- Backup (weekly) + verify (daily) — Sunday 02:00 UTC AES-256-GCM snapshot of all D1 DBs to R2 (PII tables skipped), with a daily 05:00 UTC
- GDPR/KVKK deletion processing — Daily 14:00 UTC hard-delete of accounts past the 30-day grace period via an erase-tables allowlist with
Affiliate Program30
- Affiliate program (Phases 1–3) — Referral system: signup, commission tracking, payouts, 1099, anomaly detection across web-affiliate +
- Affiliate signup (OTP + Turnstile) — Email/password signup with anti-bot Turnstile, per-IP 24h rate limit (3/day) via daily-salted hash, and
- OTP authentication — Worker-managed ephemeral OTP (5-min TTL, scope-bound: payout_request/balance_check/kyc_approve) via cookie or
- Affiliate dashboard (KPI cards) — Total earned / pending / available / paid balances, commission rate, tier + referral code (copy), active
- Earnings history & breakdown — Monthly earnings bar chart, anonymized referred-restaurants list, and earnings filtered by status/date range
- Payout request flow — OTP-gated request (min $50) validating 15-day cooldown AND monthly cap (default 2/mo) atomically, capturing a
- Wise payout settlement — Super-admin approval creates a Wise quote/recipient/transfer; webhooks track pending →
- Money movement journal (audit ledger) — Immutable ledger of every balance mutation (commission_released, payout_requested/settled, dormancy_forfeit
- Payout info KYC (encrypted) — Country, US-person flag, tax form, Wise recipient email, legal address, beneficiary name encrypted at rest
- KYC document upload — W-9/W-8BEN/tax-cert/ID/IBAN-proof upload (5MB, JPEG/PNG/HEIC/PDF), base64 + pgcrypto-encrypted; iOS/Android
- Payout rails (Wise/SEPA/ACH/SWIFT) — Four payout rails with IBAN + SWIFT/BIC + ACH routing + tax ID capture
- 1099-NEC threshold alert (IRS $600) — Daily 13:00 UTC scan flagging US affiliates ≥ $600 YTD for 1099-NEC issuance, idempotent per (affiliate
- 1099 filing state machine — Tracks 1099 lifecycle (issued/filed/sent_to_irs) with super-admin completion and audit email copy
- Anomaly detection (heuristic scoring) — Scans 6 signal types (coupon-without-click, dup-IP signup, rapid refund, self-purchase, same-IP peer cluster
- Anomaly auto-suspend (critical) — Opt-in daily auto-suspend of affiliates with unresolved critical anomalies (severity ≥ 80)
- Dormancy appeal — Suspended affiliate files an appeal; super-admin reviews; RPC resets the 12-month clock on approval; 60-day
- S2S postback webhook (HMAC) — Signed POST to the affiliate's URL on commission created/refunded/released with X-thMenu-Signature, 5s
- Postback secret rotation (dual-sign) — 7-day overlap signing with both current + previous secrets (X-thMenu-Signature + -Previous), then cron NULLs
- Postback retry + dead-letter queue — Hourly retry (5× exp backoff) with unreachable endpoints flagged dead_letter for ops inspection
- Coupon daily count (spam gate) — Per-affiliate daily coupon-claim cap (default 100/day) via atomic UPSERT…WHERE used<cap to prevent oversell;
- Coupon click tracking — Registers shares in affiliate_clicks (affiliate_id, coupon_code, timestamp, ip_hash) feeding the conversion
- Coupon stats / analytics — Per-coupon clicks vs conversions (90-day active customers), click-to-conversion rate, attributed revenue, and
- Journal timeline (native + web) — Paginated newest-first money-movement rows with operation-aware tone and localized copy
- Refund clawback (pro-rata) — On invoice refund, claws back (refund/original × commission), cancelling future drip slices first; balance
- Chargeback clawback (dispute lost) — Full clawback on charge.dispute.closed outcome=lost (closed disputes only), journaled separately from refunds
- Payout/clawback reversal (Wise refund) — On Wise transfer refund/chargeback/cancel, reverse_affiliate_payout RPC re-credits the ledger
- Affiliate marketing assets (R2 proxy) — Branded banners, email templates, QR codes, and a sales playbook + objection-handling guide stored in R2
- Marketing playbook (onboarding guide) — Program facts, the mandatory commission-disclosure rule, and a dashboard section for ready-made materials as they are published
- Affiliate payout calendar (projection) — Forecasts anticipated earnings by month from the drip schedule + pending holds (static projection)
- Affiliate authentication (mobile) — Magic-link OTP + password sign-in with auto-fill, forgot-password reset, and Turnstile signup
Integrations / API9
- Public API keys & REST API — Operator-generated API keys for third-party integrations, rate-limited (60 req/min), with read/write scopes
- Webhook subscriptions & dispatcher — Operator-defined webhooks for customer events (orders, feedback, reviews) with HMAC-SHA256 signing
- OAuth client authentication (RFC 7009/6749) — OAuth apps revoke their own tokens; client-credentials validation (basic auth + body); refresh-token rotation
- Custom domain + CNAME verification (serving not available yet) — Add a custom domain (menu.myrestaurant.com) and verify its CNAME record; serving the menu from it is not available yet
- QR code generation + PDF export — Generate printable menu/table/room QR codes as individual or batch PDFs with branding overlay and SRI
- Email service (Resend) — Operator & customer transactional emails (digests, alerts, payout status, password reset, billing, OTP
- Google review link & Maps import — The restaurant's Google review link for the review hand-off, and a Google Maps link import that fills in the business name and coordinates
- OpenAPI specification — Auto-generated, discoverable REST API schema at /openapi.json
- llms.txt (AI instruction file) — Machine-readable platform overview (product, features, pricing, auth) for LLM/AI search engines
Security & Compliance19
- Email/password + magic-link auth — Owner login with email/password or passwordless magic link
- Supabase Auth — JWT-based auth for operators, affiliates, and super-admins with magic-link recovery, password reset, and RLS
- JWT bearer token authentication — HMAC-SHA256 signed JWTs for API access and Cloudflare worker middleware
- Supabase RLS (row-level security) — Operators see only their restaurants, affiliates only their commissions/payouts, customers only their own
- TOTP 2FA (super-admin) — RFC 6238 authenticator-app 2FA required for super-admin login
- CSRF double-submit cookie protection — State-changing endpoints require an X-CSRF-Token header verified against a secure cookie
- Content Security Policy (nonce + strict-dynamic) — script-src 'self' 'nonce-…' 'strict-dynamic' to prevent inline-script injection
- Rate limiting (Next.js route handler) — Per-isolate daily-salted SHA-256 IP-hash sliding windows on 14 menu endpoints
- Shadowban detection — Detects repeat cancellations and suspicious IP patterns, silently blocking orders without an error
- Fake GPS detection — Flags impossible location changes between order timestamps
- URL scheme validator (safeHref) — Whitelists http(s)/mailto/tel to prevent stored XSS via social_links, logo_url, cover_url, and review links
- PIN/password hash hardening — PBKDF2 200k iterations, per-credential 16-byte salt, transparent legacy re-hash on next login
- PIN lockout counter (D1-backed) — Atomic UPSERT in pin_failures with a 30-min rotating window
- GDPR Data Subject Rights (DSR) — 30-day deletion window from request, JSON data export, and 90-day order-anonymization grace; personal-data
- KVKK compliance (Türkiye) — GDPR-equivalent 30-day deletion, DSR, and consent logs with multi-jurisdictional cron logic
- Account deletion workflow — Owner-requested deletion with 30-day grace period and cascading PII erase via an allowlist
- Consent log (cookie banner) — Tracks opt-in/opt-out for analytics/email persisted per session
- Allergen & safety incident tracking — Staff log allergen cross-contact/injury/violation reports with photos/timestamp/location; 12mo PII NULL /
- Policies (privacy/terms/house rules) — Customizable privacy policy, terms, and in-house policies displayed in the menu footer
Admin2
- Settings / restaurant configuration — Metadata, currency, timezone, tip settings, and operational flags
- Admin notification inbox — Centralized inbox for orders, refunds, staff alerts, and admin messages with mark-read state
THE GUEST PATH
From scan to payment — all from the guest’s own phone
No app to install, no hardware to buy. The guest scans the code and these six steps work on their own.
The guest’s language, automatically
The menu opens in the language of the guest’s phone — 31 languages, with nobody asked to choose.
The guest’s country currency
Prices show in the guest’s currency alongside the local one — no calculator needed.
Ordering from the table
The guest adds to the cart and sends the order — it lands straight on the kitchen display.
Calling the waiter
One button at the table alerts the team with the table number — no raised hand, no waiting to catch an eye.
Requesting the bill
The guest asks for the bill from their phone and the request reaches the team with the table and running total.
Paying at the table
The guest pays by card from their phone in the provider’s secure form. Pay-first is the default: the order does not reach the kitchen before it is paid.
FAQ
Frequently asked questions
Didn't find what you were looking for? Our team is happy to help.
Ask UsDo my customers need to download an app?
No. Customers simply scan the QR code with their phone camera. The menu opens instantly in the browser — no app download, no account, no registration required.
How many languages does Thmenu support?
Thmenu supports 31 languages including Arabic (RTL), Japanese, Chinese, Korean, and all major European languages. The visitor's device language is automatically detected.
Is Thmenu really free?
Yes. There are no plans, no subscription and no feature locked behind an upgrade. Thmenu’s only revenue is a 1% platform fee on payments guests make to you online through Thmenu; cash and your own card terminal cost nothing.
Can I use my own domain?
Not yet. In the panel you can add your domain and check its DNS, but the menu cannot be served from your own domain yet. Your menu has its own link on menu.thmenu.com, and that is what your QR codes open.
How does real-time ordering work?
Customers add items to their cart and place an order from the table. The order appears instantly in your admin dashboard where you update status steps.
Is my data secure?
Thmenu is built on Cloudflare's global security infrastructure and encrypts data in transit (TLS) and at rest. Our platform is designed to meet GDPR, KVKK, and CCPA/CPRA requirements — see our compliance, privacy, and terms pages for the full disclosure.
Can I import my existing menu?
Yes. The AI menu importer takes your menu three ways: paste the text, photograph the printed menu, or upload a spreadsheet. It proposes categories, products and prices, and nothing is applied until you review the proposal and approve it.
Does the menu work without internet?
Yes. Thmenu uses Progressive Web App (PWA) technology. The cached menu on the customer's device can be viewed without an internet connection. Ordering requires a connection.
Do I need a Stripe account?
Only if you want guests to pay you online through Thmenu. You connect a Stripe account from the panel and payouts go to your bank through Stripe. The menu, ordering and reservations work without it.
Is Thmenu available outside of Turkey?
Yes. Thmenu runs on Cloudflare's global edge network, so your menu is served from a node near each guest. We support 31 languages including Arabic, Japanese, Korean, Chinese, and all major European languages.
What if my restaurant already uses Menulux or Adisyo?
Thmenu can run alongside your existing POS: the POS handles payments, and Thmenu handles the QR menu and the customer ordering experience. Thmenu doesn't connect to the POS — the two systems run side by side.
Do I need special hardware?
No. Thmenu runs in any browser — phones, tablets or laptops. For a kitchen display any tablet you already own works; we do not sell, recommend or require specific hardware. Printing is optional and works with ESC/POS receipt printers connected over USB, serial or Bluetooth from Chrome or Edge.
Ready to get started?
Digitalize your menu today.
2-minute setup, no credit card required.