It started as the in-house system for a pizzeria with delivery: orders came in through the website, WhatsApp and the phone, and had to reach the kitchen, the driver and the till without anyone retyping them. Today it also covers purchasing, stock, recipe costing and accounting, and it's sold to other venues as Vialika.
02What I built
01Web store and WhatsApp Flows ordering on the same pricing, coupon and offer engine
02Real-time front desk and kitchen screens, with delivery times estimated from the queue
03Native driver app with background GPS, Mapbox turn-by-turn and an offline queue
04Custom print agent replacing QZ Tray: every printer in the venue, with retries
05Inventory with suppliers, delivery notes, stock counts, waste and per-dish recipe costing
06Daily close to Holded, geofenced clock-in with rotating QR, AI assistant with permission-scoped SQL
03Decisions that matter
No charge without an order
I audited the Redsys payment flow and found eight holes: charges with no order, duplicate orders when two notifications arrived at once, mismatched amounts silently ignored. Web and WhatsApp moved onto a single payment engine, with a unique key per transaction and a watchdog that asks Redsys again when a notification never arrives.
The AI proposes, a person accepts
The assistant never writes on its own: every change is a card with Accept or Dismiss, and everything can be undone. It calls the same server actions as the screens, so it inherits their permissions, and numbers come from tools, not from the model.
Permissions, not roles
No check ever looks at the role. Every request passes three locks: the proxy blocks the route, the page checks again, and the server action, which is the one that counts, checks once more.
Accounting to the cent
Closing the till pushes a draft invoice to Holded on its own, with the VAT breakdown and payments per account. The second version of the integration was validated against the first until it matched to the cent, with 135 tests.