Skip to content
Restaurant Tech

Best Tools for a Custom Restaurant Ordering System

Stop paying 20–30% commission. Own your ordering stack.

I built Pizzeria Bestek — a custom ordering system that replaced third-party delivery apps for a real restaurant. Sub-second order latency, real-time kitchen dashboard, Stripe checkout, zero per-order commission. These are the tools that made it work.

The Tools
Supabase RealtimeRecommended
Real-time backend

WebSocket-based live order updates without a separate server

The kitchen dashboard needs to update the moment an order comes in — no polling, no refresh. Supabase Realtime publishes Postgres row changes over WebSockets. An INSERT on the orders table immediately updates every connected kitchen screen. No separate real-time server, no Redis Pub/Sub to manage.

Used in production — Pizzeria Bestek
ReactRecommended
Frontend

Customer-facing menu + kitchen dashboard

The customer menu is a simple React SPA — menu categories, item selection, cart, checkout. The kitchen dashboard is a separate React view subscribing to order events. Keeping them as separate routes in the same codebase means one deployment, one domain, no coordination overhead.

Used in production — Pizzeria Bestek
StripeRecommended
Payments

Checkout, payment confirmation, webhook-triggered order creation

The right architecture: Stripe Checkout handles payment, the success webhook triggers order creation in Postgres, Realtime pushes the new order to the kitchen. This prevents unpaid orders from reaching the kitchen. Never create an order on the client side before payment confirmation.

Used in production — Pizzeria Bestek
ResendRecommended
Email

Order confirmation to customer on successful payment

Customers expect an email confirmation. Trigger it from the same Stripe webhook that creates the order — one event, two side effects. React Email templates make the confirmation look professional. The order summary, estimated time, and item list are all data you already have.

Used in production — Pizzeria Bestek
VercelRecommended
Hosting

Zero-config deployment, fast global CDN for the menu page

The customer-facing menu is the highest-traffic page. Vercel's edge CDN serves static assets fast globally. The API routes (cart, order creation, Stripe webhook) run as serverless functions. For a single-restaurant deployment, the free tier is sufficient indefinitely.

The Verdict

For a custom ordering system: Supabase Realtime (live kitchen updates) + React (menu + dashboard) + Stripe (webhook-triggered order creation) + Resend (confirmations) + Vercel (hosting). The total build time for a production-ready system is 3–4 weeks. The commission savings pay for the build in the first 6–12 months for most restaurants.

In detail

How to choose: own vs. rent vs. hybrid

Before picking tools, decide which problem you're actually solving. Three honest paths:

  • Rent (Uber Eats / Glovo / Wolt) — you pay 20–30% per order but get demand. If the platform is your discovery channel, that commission is a marketing cost, not a tech failure. A new restaurant with no audience usually shouldn't fire the marketplaces.
  • Own (custom stack) — you pay a build cost once and keep the margin forever. This only pays off when you already have repeat customers ordering directly — regulars, phone orders, your own social following. Then the marketplace fee is pure leakage.
  • Hybrid — keep the marketplaces for discovery, push loyal customers to your own ordering page with a magnet on the receipt or packaging. Most restaurants land here, and it's the right answer more often than vendors admit.

The tool choice flows from this decision, not the other way around. Don't build a custom system to dodge commission if you have no direct demand to capture.

Criteria that actually matter (and ones that don't)

What matters:

  • Order-to-kitchen latency. A new order has to appear on the kitchen screen instantly and impossible-to-miss. This is the one thing that breaks operations in practice. WebSocket push (as in the source stack) beats any polling/refresh setup here.
  • Payment-before-order integrity. The order must not exist until payment clears. Create it from the payment webhook, never on the client. Skip this and you'll be cooking unpaid orders.
  • Menu edit speed. Whoever runs the floor changes prices, marks items sold-out, and toggles availability — at 7pm, on a phone, with no developer. If editing the menu needs a deploy, the system is already failing.
  • Failure visibility. When a payment webhook is dropped or an email bounces, someone needs to know. Silent failures in an ordering system mean a hungry customer and a missing order.

What doesn't matter as much as people think:

  • Framework choice. React, Vue, Svelte — for a menu, cart, and dashboard, the framework is a rounding error. Pick what you (or your developer) already know.
  • "Scale." A single restaurant does tens to low-hundreds of orders a day. You do not need Kubernetes, a message queue, or a microservice split. Serverless functions on a free tier handle this for years.
  • A native mobile app. A fast mobile web menu converts fine and skips the app-store tax and update friction. Build the app later, if ever.

Common mistakes

  • Building before validating direct demand. The most expensive mistake. Confirm people will order directly before paying for the stack.
  • Creating the order on the client. Covered above, but it's the single most common architecture bug — it lets a refresh, a closed tab, or a failed card produce a ghost order.
  • Over-engineering the kitchen view. It needs new orders, a clear sound/visual alert, and a "done" button. Tablets, drivers, ETAs, and analytics dashboards can all wait. Ship the boring version first.
  • No offline/edge-case plan. Restaurant Wi-Fi drops. The kitchen screen needs to reconnect cleanly and not lose the order it was showing. Test the unplug-the-router scenario before launch, not after.
  • Ignoring who maintains it. A custom system someone has to babysit isn't free — it traded a per-order fee for a per-month attention cost. Price that in honestly.

When a simpler or cheaper option is enough

A full custom stack is the right tool for a restaurant with steady direct demand and a margin worth protecting. It's overkill for most others, and there's no shame in starting smaller:

  • A single-restaurant SaaS (a hosted ordering product) gets you 90% of the value for a monthly fee and zero maintenance. If you're doing modest volume, the math often favors renting the software even while owning the customer relationship.
  • A static menu + a payment link or a WhatsApp/phone order line is a legitimate v1. Many restaurants over-buy here — a Stripe Payment Link and a clear menu page beat a half-finished custom build.
  • Go custom when the recurring fees clearly exceed the build-and-maintain cost, and when you want control the SaaS won't give you — your own data, your own branding, your own loyalty logic.

The honest version of this: a custom ordering system is worth it when it pays for itself in saved commission inside a year and you'll actually maintain it. Pizzeria Bestek (React + Supabase) hit that bar because the restaurant had real direct demand to capture. If you're not sure you do, start with the cheap option and graduate when the numbers force the decision — building it right avoids the overhead of going through an agency, but the fastest build is the one you didn't need to do yet.

Related

Want this stack built for you?