Jin Oh · Full-stack developerContact

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
Links
eatro.ca ↗Eatro Manager on Google Play ↗
Next.js 16React 19TypeScriptSupabase (Postgres, Auth, Realtime, Storage)Stripe ConnectExpo / React NativeFirebase Cloud MessagingESC/POSVercel

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

  1. 01One Next.js codebase serves four products — marketplace, merchant admin, platform admin and every restaurant’s own SEO website — routed by host name.
  2. 0265 Postgres tables, every one protected by row-level security; 104 migrations.
  3. 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.
  4. 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.
  5. 05Chinese and Korean menus print correctly on low-cost thermal printers by rendering receipts to bitmaps.
  6. 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

FIG.Order-to-kitchen architecture
orderpaypayoutwebhookwriteRealtimenotifypushticketmanageUSERDinerBrowser / phoneAPPNext.js appNext.js 16 · VercelEXTStripe ConnectPaymentIntents · ConnectEXTRestaurant bankConnect payoutsUSEROwner / manageradmin.eatro.caSVCRoute handlers19 API routes · server…DBSupabase Postgres65 tables · RLSDEVICEManager tabletExpo · React NativeEXTPush (FCM)Firebase Cloud MessagingDEVICEThermal printerESC/POS · Bluetooth / W…
  1. 01A paid order reaches the kitchenDiner → Next.js app → Stripe Connect → Route handlers → Supabase Postgres → Manager tablet → Thermal printer
  2. 02The restaurant is paid, minus the platform feeStripe Connect → Restaurant bank
  3. 03Push wakes a sleeping tabletRoute handlers → Push (FCM) → Manager tablet
  4. 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

  1. C-01

    Chinese and Korean on a budget thermal printer

    Problem

    Budget ESC/POS printers only ship Latin code pages. Menus in Chinese or Korean printed as garbage — a deal-breaker for many GTA restaurants.

    Approach

    Render 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.

    Result

    Any language prints on any supported printer, with the same layout as the on-screen ticket.

  2. C-02

    Four products, one deployment

    Problem

    The 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.

    Approach

    A 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.

    Result

    One codebase, one deploy, and every restaurant gets a fast, indexable website for free.

  3. C-03

    Tenant isolation that cannot be forgotten

    Problem

    A merchant with several branches must never see another merchant’s orders — and a missed WHERE clause in app code would leak them.

    Approach

    Row-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.

    Result

    Isolation is enforced by the database itself, not by remembering to filter.

  4. C-04

    Never miss an order in a rush

    Problem

    Tablets sleep, Wi-Fi drops, and a silent order is a lost customer.

    Approach

    Realtime 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.

    Result

    Orders arrive on two independent channels and staff actions are never lost.

Screens

Eatro marketing site — “Run your restaurant on one platform”
eatro.ca — marketplace and merchant sign-up
Eatro Manager Android app listing on Google Play
Eatro Manager — Android tablet app