• Are you sending all online orders through a third-party aggregator that takes 25-30% commission and owns the customer data, with no way to market directly to repeat customers or build loyalty?

  • Is your online ordering widget a third-party embed with no control over menu display, upsell logic, or checkout experience?

Online Food Ordering System Development

Custom online food ordering systems for restaurants and food businesses -- branded web and mobile ordering that you own, with full control over menu structure, upsell logic, payment, and customer data. No 25-30% commission going to an aggregator on every order.

We build direct ordering channels that give customers a fast way to order on web and app, route orders to the kitchen, handle collection and delivery scheduling, and connect loyalty so repeat customers have a reason to order direct.

  • Branded web and mobile ordering fully owned by the restaurant

  • Menu management with modifiers, combos, and availability windows

  • Order routing to kitchen display or printer with prep time management

  • Loyalty programme and direct customer re-engagement

RaftLabs builds custom online food ordering systems for restaurants and food businesses. A direct ordering system removes the 25-30% commission paid to third-party aggregators on every order and gives the restaurant full control over the menu, upsell logic, and customer data. Most online food ordering projects deliver in 10-14 weeks at a fixed cost.

Vodafone
Aldi
Nike
Microsoft
Heineken
Cisco
Calorgas
Energia Rewards
GE
Bank of America
T-Mobile
Valero
Techstars
East Ventures
Software products shipped
100+
Cost delivery
Fixed
Week delivery cycles
10-14
Industries served
24+

The commission problem is a margin problem

A restaurant doing $500,000 in annual revenue through a third-party aggregator at 25% commission pays $125,000 per year for a customer channel it does not own. That number rarely appears as a cost in the profit and loss account because the commission is deducted before payout. Most owners have not calculated it explicitly.

A direct ordering channel costs a fraction of that to build and run. Customers who already know the restaurant -- the ones who have ordered three or four times through an app -- will order direct when given a fast, easy way to do it. The economics change because regulars shift to the direct channel and aggregator commission applies only to new customer acquisition. The second problem is menu control. Aggregator platforms are built for the median restaurant. Complex modifier logic -- build-your-own bowls, substitution rules, combo trees -- either does not map correctly or requires workarounds that confuse customers. A custom ordering system is built around your actual menu.

What we build

Branded web and app ordering

Branded ordering experience on mobile web, desktop, and native iOS and Android apps. Menu displayed with item photography, descriptions, allergen information -- including the 14 major EU allergens required under EU Food Information Regulation 1169/2011 and UK equivalent labelling rules -- and dietary filters (vegan, gluten-free, nut-free). Delivery address entry uses Google Maps Geocoding API or HERE Geocoding API to validate the address against your configured delivery zones, so customers outside the zone are told immediately rather than at checkout after they have built a basket. Modifier and extras selection is inline with each item, with allergen flags updating dynamically as the customer makes selections to surface any allergen conflicts the combo introduces. Basket management with quantity adjustments and order notes. Checkout runs Stripe payment with Stripe Radar fraud scoring -- each order is scored on velocity signals, IP reputation, and card BIN data, and orders above the risk threshold are held for review or declined before processing. Apple Pay and Google Pay are offered at checkout without redirecting the customer off the app. Order confirmation is sent by push notification (APNs for iOS, FCM for Android), email, and optional SMS. A direct channel fast enough to compete with the aggregator app already on the customer's phone.

Menu and modifier management

Item availability by time of day and by location so breakfast items close at 11am and location-specific specials appear automatically. Modifier groups with min and max selection rules: choose one sauce, choose up to three toppings, choose a required base. Combo management where a combo contains a main, a side, and a drink, each with their own nested modifier trees. Item 86 -- the industry term for marking an item unavailable for the current service period -- is triggered from the manager tablet the moment stock runs out, and the change propagates to the ordering interface in real time. When a restaurant is also integrated with DoorDash Drive, Uber Eats, or Olo for third-party delivery orders, the 86 propagation extends to those channels via their menu management APIs so the item is suppressed across all channels simultaneously, not just on the direct ordering channel. Third-party delivery integrations with DoorDash Drive, Uber Eats Direct, and Olo are supported for operators who want to accept third-party delivery orders alongside their direct channel without running separate tablets or menu management systems. Scheduled ordering allows customers to pre-book a time slot up to seven days in advance, with the kitchen schedule showing upcoming pre-orders alongside same-day orders. Allergen flags on each menu item surface automatically on the ordering interface and update in real time as modifier selections are made. The menu engine that keeps what the customer sees aligned with what the kitchen can deliver, across every channel.

Order routing and kitchen integration

Orders routed to kitchen display screens (KDS) or thermal printers by station on receipt. Station-based dispatch rules are configured per menu category: cold starters to the cold prep station, grilled items to the grill, drinks to the bar, desserts to the pastry section -- each station receives only the tickets relevant to it rather than seeing the full order. The KDS shows each ticket with item count, modifier details, and the elapsed time since order placement so the team manages pace without a separate timer. Order consolidation displays all items for a multi-item order together at the expediter screen so the pass can confirm all components are complete before dispatch. Prep time management calculates the expected ready time for each order using a historical delivery time regression model trained on your kitchen's actual output data -- factoring in current ticket queue depth, time of day, and order complexity -- so the customer-facing ETA shown at checkout reflects real kitchen conditions rather than a fixed offset. ETA updates are pushed to the customer via push notification (APNs/FCM) as the order moves through the kitchen workflow: confirmed, preparing, ready, out for delivery. The workflow that means every order arrives at the right station the moment it is placed, with no verbal relay and no missed tickets.

Payment processing and tipping

Card payment via Stripe, Apple Pay, and Google Pay at checkout with 3D Secure 2 (3DS2) authentication on eligible transactions. Stripe Radar applies machine learning fraud scoring to every order using velocity signals, IP geolocation, card BIN data, and device fingerprinting -- high-risk orders are flagged or blocked before charge, reducing chargebacks without adding friction to legitimate customers. Tipping prompt at checkout with preset tip amounts (10%, 15%, 20%) and a custom entry option so customers choose without being forced through a preset. Split payment support for group orders where multiple people contribute to a shared basket, each paying their portion separately. Order-level loyalty points are credited on checkout so customers accumulate rewards on every direct order -- a concrete reason to order direct rather than through an aggregator. Refund and void management for cancelled or incorrect orders is handled from the manager dashboard without requiring login to the Stripe portal for routine cases. Payment reporting shows daily takings, order count, average order value, tip totals, and refund rate. GDPR and CCPA data handling for order history is built into the data architecture -- order history is retained for the minimum period required for accounting and legal compliance, customers can request data export or deletion through the app, and payment card data is never stored in the application layer (handled entirely by Stripe's PCI DSS Level 1 infrastructure). The payment layer that handles every scenario without requiring the restaurant to manage a separate gateway portal for daily operations.

Collection and delivery scheduling

Collection time slots by location so customers pick a time that fits kitchen capacity during peak periods. Slot capacity limits per time window prevent the kitchen from receiving simultaneous collection orders that exceed throughput. Delivery zone configuration per location uses Google Maps Geocoding API or HERE Geocoding API to validate addresses against drawn delivery zone boundaries -- customers outside the zone see the boundary reason immediately and can switch to collection without losing their basket. Delivery fee tiers and minimum order values are set per zone, so inner-zone and outer-zone deliveries can be priced differently. Delivery time estimates are calculated from kitchen load (current ticket queue), driving distance from the restaurant to the delivery address, and historical delivery time data from the regression model trained on your actual delivery records -- not a fixed 30-minute estimate that ignores what the kitchen is actually doing. Pre-order support allows customers to schedule an order with a future date and time slot up to seven days ahead. Future orders appear in the kitchen schedule alongside same-day orders so the team can see the full load for the session before service starts. For operators using DoorDash Drive or Uber Eats for last-mile delivery, the system passes confirmed delivery orders to the chosen third-party driver API and tracks driver status within the same order management interface. The scheduling layer that smooths demand across the service period and gives the kitchen team full visibility of what is coming before the rush hits.

Loyalty and customer re-engagement

Points earning on every direct order -- a concrete reason for customers to order direct rather than through an aggregator that gives them no rewards for doing so. Points balance is visible in the app at all times and redeemable at checkout. Discount codes and promotional pricing at checkout with single-use or multi-use rules and expiry date control. Birthday offer automation sends a personalised discount timed to arrive two to three days before the customer's birthday, with the send triggered from the date of birth collected at account creation. Triggered reactivation campaigns send via push notification (APNs/FCM) and email to customers who have not ordered in 30, 60, or 90 days -- the delay threshold and message content are configurable per segment. Integration with Klaviyo or ActiveCampaign connects order history data to your email marketing platform so order frequency, last order date, average order value, and preferred categories drive segmentation and campaign targeting without manual data export. For multi-restaurant or multi-brand operators, loyalty points can be configured to earn across brands but redeem only within the brand where they were earned, or to earn and redeem across the whole group. GDPR and CCPA compliance for customer order history and marketing preferences is built into the loyalty data architecture -- customers can update marketing opt-in status from the app and request deletion of their order history independent of ongoing operational data retention requirements. The loyalty layer that turns a customer who discovered you through an aggregator into one who orders direct on every repeat visit.

Frequently asked questions

Third-party aggregators charge 15-30% commission per order, deducted before payout. A custom direct ordering system has a one-time build cost and ongoing hosting and payment processing fees -- Stripe processing typically runs 1.4-2.9% plus a fixed transaction fee depending on card type and region. For a restaurant doing $30,000 per month in delivery revenue, the gap between 25% aggregator commission and 2.5% direct processing is $6,750 per month. At that volume, a $25,000 direct ordering system pays back in under four months if 40% of repeat orders shift to the direct channel -- and repeat customers are the most likely to order direct when given a fast, easy way to do it and a loyalty reason to prefer it. The economics also include customer data ownership: every direct order adds a customer record with order history, preferences, and contact details that you can use for Klaviyo or ActiveCampaign campaigns. Aggregator orders produce revenue but no customer data you can act on. The specific payback numbers depend on your order volume, current commission rate, average order value, and what proportion of your current aggregator customers would switch to direct with an incentive. We can model the payback for your specific volumes before you commit to a build.

A custom system is built around your actual menu, not constrained by what a third-party platform can model. We handle nested modifier groups (a combo that contains a main with its own modifiers, a side with its own modifiers, and a drink choice), conditional modifiers (a sauce option that only appears when a specific base is selected), and exclusion rules (a topping that cannot be combined with another). Minimum and maximum selection rules are set per modifier group. Required selections block checkout until the customer completes them, with a clear visual indicator of what is still needed. Items with no valid modifier combination -- for example, a build-your-own dish where no base has been selected -- are caught before the order reaches the kitchen rather than producing an unconfigured ticket. Allergen flags on modifier options update dynamically as the customer makes selections, so if a chosen topping introduces a nut allergy, the item-level allergen summary updates immediately rather than relying on the customer to read a static allergen list. For operators integrating with Olo, DoorDash Drive, or Uber Eats, the modifier structure in the direct ordering system is mirrored to the third-party channel's menu API so the same modifier logic applies regardless of which channel the order comes through. We build the modifier logic against your actual menu during scoping, not a generalised approximation -- and we test it against the most complex items on your menu before deployment.

Collection slots work by setting a capacity limit per time window. If the lunch window between 12:00 and 12:15 has a limit of eight orders, the ninth customer is offered the next available window rather than being added to an already overloaded slot. Slot capacity is set per day of the week and per location, so a Friday lunch that runs 30% heavier than a Tuesday lunch can carry a higher capacity limit. The manager dashboard shows slot fill rates in real time -- how many orders are booked into each upcoming window -- so capacity can be increased or reduced between services without a system configuration change. Pre-orders placed the day before or several days ahead appear in the kitchen schedule alongside same-day orders so the team can see the full load for an upcoming period before service starts, enabling prep to begin early for a heavy pre-order window. The ETA shown to customers at checkout is calculated from the slot time plus the estimated prep time output from the kitchen load regression model, not from a fixed offset -- so a customer booking a 12:15 slot on a day with a full pre-order schedule sees a realistic ready time rather than an optimistic one that the kitchen cannot hit. Slot management removes the spike problem where every customer selects the first available time and the kitchen receives 15-20 orders with the same ready time, which is the most common cause of late collections during peak periods.

A focused ordering system covering branded web ordering, menu management, kitchen routing, and payment processing typically costs $15,000-$40,000 at a fixed price. Adding a native iOS and Android app, loyalty integration, and direct customer marketing tools moves the range to $25,000-$60,000 depending on the complexity of your modifier logic, location count, and loyalty requirements. We scope the project in a discovery session and give you a fixed cost before work starts. Timeline is 10-14 weeks for the core system. We do not quote on hourly rates -- you know the cost before we begin.

What clients say

What our clients say

Three-year average engagement. Founders and operators describing the work in their own words. No marketing varnish.

Grady Lakshmono
Grady Lakshmono
Indonesia
Co-Founder, Gula

RaftLabs helped us build a platform that truly transformed how our customers order and engage with our brand across multiple locations.

01 / 02

Related services

Talk to us about your online ordering project.

Tell us your location count, current delivery volume, which aggregators you run, and your modifier complexity. We will scope a direct ordering system and model the commission payback.