Two React apps, one platform, 26 database migrations — TP Food for Dottites




What TP Food actually does
Customer-facing ordering app for the website. Separate operator app for the kitchen and counter team. Each optimised for its specific workflow. Each consuming the same REST API.
Customers choose a delivery or collection slot. Operators see live order load per slot. Slot capacity configurable per day and per service type. No more 'sorry we're too busy' calls back to customers.
Pizza with side, drink and sauce add-ons. Sandwich with bread choice, fillings, extras. Each menu item can have unlimited addon groups with configurable mandatory and optional selections.
Closed on bank holidays. Reduced menu on Sundays. Delivery suspended in bad weather. Exception dates let the operator override standard rules for specific days without touching the menu.
Real payment processing — cards, Apple Pay, Google Pay, all via WooCommerce. Refunds and partial refunds handled through the standard WooCommerce admin. No third-party payment intermediary taking a percentage.
Orders flow to the kitchen operator app as they come in. Items can be marked started, ready, out-for-delivery. Customers get SMS or email notifications at key milestones. Audit log of every status change.
Commission-based platforms were quietly eating the margin
Third-party food platforms (Just Eat, Deliveroo, Uber Eats) typically take 14-30% of each order plus a fixed fee. On a £25 average order, that's £3.50-£7.50 going to the platform every time.
Building custom food-ordering software from scratch is normally a six-figure project. A small takeaway business can't justify that, even when the platform fees are stacking up.
Build a properly engineered platform using AI-accelerated development and WooCommerce as the payment layer. Keep build cost manageable. Deliver in weeks, not months.
Production system in daily use. Every direct order saves the commission that would otherwise have gone to a third-party platform. Customer data stays with the business.
WordPress plugin. Two React apps. PHP REST API. 26 migrations.
The backend is a PHP REST API exposing seventeen controllers — menu items, addon groups, variants, delivery slots, exception dates, orders, order items, payments, refunds, customers, audit logs, and more. Twenty-six versioned database migrations sit behind it, each one a self-contained schema change that can be rolled back.
The frontend is built with Vite, React and TypeScript, using shadcn/ui components. Two separate React applications are bundled into the plugin — the customer ordering app and the operator app — sharing types and utility code via a common library. Each app gets its own optimised production build.
WooCommerce sits underneath for payments. The plugin creates and manages WooCommerce orders programmatically through the WooCommerce REST API, so the food ordering UI doesn't have to touch a payment processor directly. Refunds, partial refunds and reconciliation work through standard WooCommerce admin.
Same methodology as the LMS — Project File, sandwich prompts, Wilson
A Project File acted as the AI agent's external memory throughout the build — capturing the data model, the business rules, the deployment process and the boundary cases. Every coding session referenced the Project File and produced milestone journal entries tracking what changed, what was tested, and what the commit hash was.
The architectural thinking was done with Claude — modelling the order lifecycle, the delivery slot allocation logic, the addon group resolution, the kitchen state machine. The code execution was done with Wilson (our name for GitHub Copilot) in milestone-by-milestone sessions, each session bounded by the Restraints layer of the sandwich prompt to prevent scope creep.
The result was a fully production-grade system delivered in a fraction of the time a traditional development house would have quoted.
Per-slot capacity, configurable per day, with exception overrides
Standard slots are configured per day per service type. Each slot has a maximum capacity expressed in either order count or kitchen-minute weight. When a customer picks a slot at checkout, the system reserves capacity. When orders are completed, capacity frees up — so a slot that was full earlier in the evening can reopen if orders are dispatched early.
Exception dates override the standard configuration. Closed on Christmas Day? Add an exception. Reduced menu on Sunday lunchtime? Define a Sunday-lunch exception with fewer slots and a limited menu subset. Bad weather closure? Toggle a same-day exception that suspends new orders until lifted.
All of this is configurable through the operator React app. No developer needed for ongoing changes.
Optimised for fast, low-friction ordering on mobile
Slot selection happens after the basket but before payment. The customer sees available slots for today and a couple of days ahead, with full slots greyed out automatically. Once a slot is selected, the customer has a fixed window to complete checkout before the reservation expires.
Payment runs through WooCommerce — Stripe, Apple Pay, Google Pay are the default options. The customer gets order confirmation immediately, then SMS or email updates as the order progresses through the kitchen. The whole flow takes under 60 seconds for a returning customer with saved details.
Real-time order queue with status workflow built in
Status flow for a typical delivery: New → Preparing → Ready → Out for Delivery → Completed. Status flow for collection: New → Preparing → Ready → Collected. Each status transition can trigger a customer notification automatically. The operator just taps the next status; the system handles the messaging.
Daily, weekly and monthly summaries are built in. Order volume, revenue, average ticket size, peak slot times, popular addons, customer return rates. The operator app doubles as a lightweight business intelligence dashboard for the takeaway owner.
Bespoke food ordering is a viable option for small operators
The traditional argument against custom food ordering software was that the build cost was prohibitive for small operators. Six-figure quotes for properly engineered systems pushed everyone toward the commission-based platforms, even though those platforms eat the margin order after order.
AI-accelerated development changes that arithmetic. A genuinely bespoke food ordering platform can now be built for a price comparable to a year or two of commission payments to third-party platforms — and after that, every direct order is fully retained margin.
If you run a takeaway, restaurant, dark kitchen or any food-service operation paying commission to third-party platforms, TP Food (or a customised version of it) is worth a conversation.
Other industries paying commission on every transaction
A real customer using the system every day
The same three-step process used to build TP Food
A 60-90 minute discovery workshop where we map your menu structure, slot rules, kitchen workflow, payment processor and integration requirements. We come back with a written scope and a fixed-price quote.
For TP Food the build was around 8-10 weeks. For your project it will be whatever your scope demands. Every milestone documented with commit hashes. Staging URL from week one. Weekly demos.
Deploy to your hosting. Train your kitchen team on the operator app. 30 days of bug-fix support included. Optional ongoing support thereafter.
Things prospects ask before signing a build agreement
How long does a TP Food-style build take?
Let's talk about what a custom ordering platform would look like for your business — and whether the maths makes sense for you.
