P-01 · Multi-tenant SaaS · Web + Android
Eatro
All-in-one restaurant SaaS — online ordering, payments, reservations and a kitchen tablet app.
- Role
- Solo — product design, development, deployment
- Timeline
- Apr 2026 — Jul 2026
- Platforms
- Web (marketplace, merchant sites, admin) · Android tablet app
TL;DR
Eatro lets independent restaurants take takeout, catering and reservation orders online, get paid through Stripe Connect, and run the kitchen from an Android tablet that alerts staff and prints tickets. Jin Oh designed, built and deployed the whole platform alone: one Next.js app serving four products, a 65-table multi-tenant Postgres schema with row-level security on every table, and a React Native tablet app.
Key facts
- 01One Next.js codebase serves four products — marketplace, merchant admin, platform admin and every restaurant’s own SEO website — routed by host name.
- 0265 Postgres tables, every one protected by row-level security; 104 migrations.
- 03Stripe Connect splits each payment automatically: the restaurant is paid out directly and the 5% platform fee is taken from the pre-tax subtotal only.
- 04New orders reach the kitchen tablet in real time (Supabase Realtime + FCM push) with a sound alert, and print on Bluetooth or Wi-Fi thermal printers.
- 05Chinese and Korean menus print correctly on low-cost thermal printers by rendering receipts to bitmaps.
- 06Modules are billed per branch: reservations $59/mo, shift clock $29/mo, commission on online orders.
- 65Postgres tables, all under RLS
- 104schema migrations
- 4products from one codebase
- ~98web pages and screens
The problem
Independent restaurants were stitching together a delivery app, a separate reservation tool, a paper time sheet and a website nobody updated. Each tool took a cut and none of them talked to each other.
Eatro puts everything on one bill: online ordering, catering boxes, table reservations, a staff clock and a generated website — and it pays the restaurant directly.
Who it serves — and what they needed
- Restaurant ownersWanted online orders without handing a large commission to third-party apps — and to own their customer list.
- Kitchen & front-of-house staffNeeded orders they cannot miss during a rush — loud, visible, printed.
- Accountants / bookkeepersNeeded payroll-ready timesheets and clean payout reports.
How it fits together
- 01A paid order reaches the kitchenDiner → Next.js app → Stripe Connect → Route handlers → Supabase Postgres → Manager tablet → Thermal printer
- 02The restaurant is paid, minus the platform feeStripe Connect → Restaurant bank
- 03Push wakes a sleeping tabletRoute handlers → Push (FCM) → Manager tablet
- 04Owners manage menus and branchesOwner / manager → Route handlers
What’s inside
Ordering
- Takeout with customer-chosen pickup slots in the branch’s time zone
- Catering boxes for future dates with delivery, discounts and minimum-quantity modifiers
- Sold-out at product, category or modifier-group level, per branch
Payments
- Stripe Connect with per-branch KYC and test/live mode switch
- 5% platform fee on the pre-tax subtotal, processing-fee split, tips
- Partial refunds from the admin
Reservations
- Floor plan editor
- Turn time and slot length per branch
- Slot locking so two guests cannot book the same table
Kitchen tablet
- Realtime order feed with audio-visual alerts
- Offline queue that syncs when the connection returns
- Bluetooth / Wi-Fi thermal printing of receipts and kitchen tickets
Staff & reports
- PIN clock-in/out (hashed with pgcrypto)
- Schedules, timesheet edits, payroll date-range reports
- Sales analytics and audit log
Growth
- Generated SEO website per restaurant with schema.org JSON-LD
- Custom domains and subdomains
- “Try live demo” that seeds a sandbox account, cleaned up by cron
Hard parts, solved
- C-01
Chinese and Korean on a budget thermal printer
ProblemBudget ESC/POS printers only ship Latin code pages. Menus in Chinese or Korean printed as garbage — a deal-breaker for many GTA restaurants.
ApproachRender each receipt as an image on the tablet (Skia + view-shot), rasterise it to ESC/POS bitmap commands, and keep GB18030 / CP949 text profiles as a fallback for printers that support them.
ResultAny language prints on any supported printer, with the same layout as the on-screen ticket.
- C-02
Four products, one deployment
ProblemThe marketplace, merchant admin, platform admin and hundreds of restaurant websites each needed their own domain and SEO, but maintaining four apps alone was not realistic.
ApproachA single Next.js app reads the Host header in the proxy layer and rewrites to the right surface; restaurant sites are server-rendered from the same data with per-merchant metadata and JSON-LD.
ResultOne codebase, one deploy, and every restaurant gets a fast, indexable website for free.
- C-03
Tenant isolation that cannot be forgotten
ProblemA merchant with several branches must never see another merchant’s orders — and a missed WHERE clause in app code would leak them.
ApproachRow-level security on all 65 tables using five documented policy patterns and helper functions (is_member_of, can_access_branch); public reads go through SECURITY DEFINER RPCs only.
ResultIsolation is enforced by the database itself, not by remembering to filter.
- C-04
Never miss an order in a rush
ProblemTablets sleep, Wi-Fi drops, and a silent order is a lost customer.
ApproachRealtime subscription for the live feed plus FCM push as a second channel, loud alerts with per-branch settings, and an offline queue for actions taken while disconnected.
ResultOrders arrive on two independent channels and staff actions are never lost.
Screens

