Online orders, kitchen tickets, and last-mile dispatch on one Odoo POS.
The ordering channel was live. The till was still watching a screen.
Each brand ran its own POS. Ordable was already taking digital orders and the customers were already using it. The gap was everything after the order arrived.
Someone had to see it. Kitchen and counter tickets were printed by hand, which is workable at eleven in the morning and not at eight in the evening. A missed ticket at peak is not a printing inconvenience, it is an order the kitchen never started. Nothing confirmed that a ticket had printed at the right station for the right brand, so the only verification available was a member of staff walking over to look.
Delivery lived in a second tool. Driver status sat there, not on the order the kitchen was working from. The printers were already in the outlets. Nothing drove them.
Three layers, on the same POS order.
Catalogue and orders (Ordable and Odoo)
Products, categories and modifier groups sync to the storefront, carrying Arabic names and descriptions and images sized to what the platform accepts. Incoming orders land as POS orders on the mapped branch: lines, toppings, extras, discount, delivery fee, payment, Kuwait address, delivery slot. Status follows the ticket through received, preparing, driver pending, out for delivery, ready to collect, cancelled, refunded and complete. A refund on the storefront creates the matching refund in Odoo instead of leaving a sale behind.
Kitchen and counter print
A confirmed online order alerts the open POS session and prints on its own. Routing is per brand and per role, counter or kitchen. Arabic prints correctly on the thermal ticket. Every job is queued, completed or failed, and that status is written onto the order. A second print can fire ahead of the delivery slot for orders placed hours in advance.
Last-mile dispatch (Roboost)
Delivery orders become a dispatch task carrying customer, Kuwait address parts, GPS, contents, payment type and planned pickup. Roboost returns a reference that is stored on the order. Driver status writes back onto that same POS order, from pickup through delivered or cancelled.
Around the three layers: recipe cost on the bill of materials, an unused-product flag, goods-receipt and period stock reports, and training videos inside Odoo so the floor could be taught without a second system to log into.
A missed ticket is not a print bug. It is a missed order.
The hard part was never calling an ordering API. It was firing print at the right outlet, in the right language, for the right brand, and knowing that it happened.
Routing had to be configuration. Hardcoded outlet names work until the fourth brand opens, and then they are a code change instead of a settings change. Brand and station routing is configured per outlet.
Arabic on a thermal printer is its own problem. Reshaping, direction and encoding are not solved by taking a Latin receipt template and translating the labels. The ticket has to come out readable to a cook who is not going to debug it.
Print status had to come back. A print job that silently fails is worse than no automation, because staff stop checking. Success and failure land on the order, so the failure is visible where the order already is.
We evaluated Odoo’s IoT Box and left it. It did not hold on their network across multiple outlets. Print now runs through a dedicated Ubuntu print server. That was a mid-project reversal and it cost time. It was the right call, and a multi-outlet print estate is where we would expect to make it again.
Dispatch only counts if it lands on the printed ticket. Driver status in a second screen is a second list. It writes onto the order the kitchen already has.
The tablet-watching job is gone.
Online orders print when they confirm. Nobody polls a screen. Kitchen and counter each get the correct brand’s ticket, and print status is on the order rather than in someone’s memory. Delivery reference and driver status sit on that same record. Catalogue, payments and refunds are in Odoo instead of a second back office that drifts by lunch. Operations can see print health, ordering sync and dispatch sync in one view.
| Before | After |
|---|---|
| Staff watch a screen for online orders | Order prints on confirmation |
| Manual reprint if someone missed it | Print status stored on the order |
| No per-brand printer routing | Counter or kitchen, per brand |
| Delivery status in another tool | Driver status on the same POS order |
| Refund on the storefront only | Matching refund posted in Odoo |
No rates, no percentages. What changed is the operating shape, and that is checkable.
The integration is the standing liability.
Built and taken live in 2026. The estate has been in production for a matter of weeks, not years, and is in support now.
Ordering platforms and dispatch APIs move on their own calendars, and print hardware does too. A POS estate is not finished at the first successful order; it is finished at the first platform change it survives without anyone noticing. That has not been tested yet here, and we would rather say so than imply a track record this engagement has not had time to build.
What we hold is the seams: status drift, payment mapping, print failures, and the places where three vendors meet one record. That is the standing work, and it does not have an end date.
- Sector
- Multi-brand F&B and retail
- Region
- Kuwait
- Branches
- 3
- Platform
- Odoo 19 POS
- Ordering
- Ordable
- Dispatch
- Roboost
- Auto-print to thermal printers, status returned to Odoo
- Model
- Integration engineering, built to order
- Client
- Unnamed
We will take a POS estate that already has a storefront and a courier and make Odoo the record both of them write to. This is the engagement behind the Integration Engineering hub’s three-branch POS card.
Online orders that never reach the till?
Tell us the ordering platform, the courier, and how many outlets print. We can usually say in one reply whether that is an integration gap or a process one.