Case Study

Restaurant POS & Online Ordering for QSR Chains

How we built a restaurant POS and online ordering platform for QSR chains — with offline-first tablets, kitchen display systems, multi-location sync, and payment reconciliation — serving 120+ locations and 25K daily orders at 98% uptime.

Industry
Hospitality / FoodTech
Duration
8 Months
Services
Full-Stack · Mobile · Real-Time
Markets
United States

POS & Online Ordering · Offline-First

120+
Locations
25K
Daily Orders
98%
Uptime
Offline
POS Capable

The Client's Vision

A QSR (Quick Service Restaurant) chain with 120+ locations was stuck on legacy POS hardware that couldn't integrate with their growing online ordering channel. In-store and online orders lived in separate systems — managers had to manually reconcile daily sales across two spreadsheets. When the internet went down (common in strip malls and food courts), the POS froze and locations had to turn away customers. Kitchen printers churned out orders with no digital display; during rush, tickets piled up and cooks lost track of modifiers and special requests.

They needed a unified platform: a tablet-based POS that worked offline and synced when connectivity returned, a kitchen display system that showed orders in real time with modifiers highlighted, online ordering that fed directly into the same order queue, and multi-location reporting with automatic payment reconciliation. The system had to handle 25K daily orders across 120 locations without latency or data loss.

What Was Breaking

Offline-First POS

Restaurant internet is unreliable — strip malls, food courts, and rural locations often have outages. Legacy POS required constant connectivity. When the network dropped, registers froze and locations lost sales.

Kitchen Display

Paper tickets were hard to read during rush. Modifiers and special requests got missed. There was no way to prioritize or bump orders. Cooks had to manually track which orders were in progress vs. ready.

Multi-Location Sync

Menu changes, pricing updates, and promotions had to be pushed to all 120 locations. There was no central source of truth — some locations ran outdated menus. Online orders sometimes showed items that weren't available in-store.

Payment Reconciliation

In-store POS, online orders, and third-party delivery had different payment flows. Reconciling daily sales took managers an hour per location. Discrepancies between Stripe, terminal, and internal records were common.

The Architecture We Built

We built a React Native POS app that runs on tablets with a local SQLite database for offline order storage. When connectivity returns, orders sync to the cloud via a conflict-resolution protocol. The Next.js online ordering site and admin portal share the same Node.js API. Kitchen displays are web clients that subscribe to order events via WebSocket. PostgreSQL holds menus, orders, and transactions; Redis caches real-time order state. Stripe handles all payments — in-store via Terminal API, online via Checkout. A reconciliation job runs nightly to match transactions across channels.

System Architecture

React Native POS & Kitchen Display
Tablet POS with offline SQLite, order entry, and payment. Kitchen display tablets showing live order queue with modifiers and bump buttons
Next.js — Online Ordering & Admin
Customer-facing ordering site with location picker and menu. Admin portal for menu management, location config, and reporting
Node.js API & Order Sync
Order ingestion from POS and web. Conflict resolution for offline sync. WebSocket for real-time kitchen display updates
PostgreSQL — Menus, Orders & Transactions
Locations, menus, modifiers, orders, and payment records. Multi-tenant with location-level isolation. Versioned menu config for rollout
Redis & Stripe — Cache & Payments
Redis for order queue state and WebSocket pub/sub. Stripe for in-store Terminal and online Checkout. Nightly reconciliation job

Offline sync was the trickiest piece. We use a last-write-wins approach with server timestamps for conflict resolution. POS orders get a local UUID and sync when online — if two locations somehow create conflicting IDs (edge case), the server dedupes by order content and timestamp. We tested extensively with simulated network outages; zero order loss in production.

Tech Stack

React Native
Next.js
Node.js
PostgreSQL
Redis
Stripe
WebSocket
SQLite

How We Delivered It

Phase 1 — Weeks 1–4
Discovery & Offline Design

Mapped POS and online ordering workflows. Designed offline-first data model and sync protocol. Defined menu and modifier schema for multi-location. Evaluated Stripe Terminal for in-store payments.

Phase 2 — Weeks 5–16
POS & Kitchen Display

Built React Native POS with SQLite and sync logic. Implemented kitchen display with WebSocket order stream. Integrated Stripe Terminal for in-store. Tested offline scenarios at pilot location.

Phase 3 — Weeks 17–24
Online Ordering & Admin

Built Next.js ordering site with location picker and Stripe Checkout. Admin portal for menu management and multi-location rollout. Implemented reconciliation job for daily payment matching.

Phase 4 — Weeks 25–32
Rollout & Scale

Rolled out to 120 locations in waves. Trained staff on POS and kitchen display. Monitored sync health and reconciliation accuracy. Achieved 98% uptime and zero order loss during rollout.

The Impact

POS downtime
Offline capable
Sales continue during internet outages
Paper tickets
Digital KDS
Kitchen display with live updates
Manual reconciliation
Automated daily
Stripe + internal alignment
Split systems
Unified platform
POS, web, and admin in one system
“When the internet goes down in a food court, we used to shut the register. Now we keep selling — orders sync when we're back online. The kitchen display alone cut our modifier errors by half. Managers finally have one report instead of three spreadsheets.”
— VP of Operations, QSR Chain

What Made This Work

Offline-first is non-negotiable for restaurant POS. Internet in restaurants is notoriously bad — we designed the POS to assume connectivity is intermittent. Local SQLite holds everything needed to take and complete orders; sync runs in the background when the network is available. We use idempotent API design so retries never create duplicates. Zero order loss in 18 months of production.

Kitchen display drove significant operational improvement. Cooks see orders in chronological order with modifiers and special requests highlighted. Bump buttons move orders through stages (prep, cooking, ready) so the front knows when to call for pickup. The client reported a 50% reduction in modifier-related remakes after rollout.

Payment reconciliation was a hidden time-sink. In-store Stripe Terminal, online Checkout, and refunds flow differently. We built a nightly job that matches transaction IDs, amounts, and locations. Discrepancies trigger alerts for manager review. That cut reconciliation time from an hour per location to minutes.

Building a Restaurant POS or Ordering Platform?

We help hospitality and FoodTech companies build offline-capable POS, kitchen displays, and unified ordering systems. Let's talk about your architecture.

Book Strategy CallCase Studies