Why a mobile app for a restaurant loses table reservations
The guest journey in a table reservation app is short: choose a date, number of guests, time — and get reservation confirmation. It breaks at exactly one point.
The guest gets to time selection, sees a grid of slots, spends 30-40 seconds thinking — and closes the app because the next step turns into a chat with a manager.
Then reservation loss begins. The form submits a request, but reservation confirmation does not arrive immediately; it comes after an employee checks the floor and writes or calls.
While the guest waits for a response, they open maps (Google Maps) or an aggregator and books there in a couple of minutes. The app was rejected not because of the interface, but because it did not complete the guest journey to the end.
The second reason is table occupancy. If the app exchanges data with the POS not instantly but on a schedule, the time-slot grid shows data several minutes old and lies in both directions: a free table looks occupied, an occupied one looks free.
The first gives lost reservations, the second — a confrontation at the entrance when two guests arrive for the same table at the same time.
The cost of error accumulates quietly. A guest who did not book today marks it as "the app does not work" and returns to calling — and calls pull reservations out of the system where they are visible and can be used to plan floor occupancy.
We break down how this is solved: reservation confirmation according to restaurant rules in seconds, honest table occupancy, and a journey the guest completes without waiting.
What changes after launch: booking speed and floor occupancy
Booking speed is measured not by app response time but by the path to a confirmed reservation.
With a call, this path consists of getting through, checking available slots, waiting for a callback, and manually writing in the journal — some such requests are lost at the "free — occupied" boundary.
In the app, the guest selects the floor, date, and number of guests, remaining seating is recalculated automatically, and confirmation arrives immediately, without hostess involvement.
Floor occupancy grows not through advertising but through redistribution of seats. Slots are tied to actual seating and the stop-list, so a canceled reservation instantly returns to availability and the next guest sees it.
The floor stops sitting idle at the gaps between seatings, and peak hours are secured with a deposit or preorder — the table is taken by those who will come.
No-shows are fought not with a penalty but with reservation lifecycle management.
A reminder the day before and confirmation on the day of visit, a deposit for large parties, automatic table release if the guest has not arrived within the allotted time — the share of no-show reservations drops, and the hostess sees who confirmed and does not hold a table for a silent guest.
Repeat visits rely on history. The app remembers the favorite table, average check, and occasion of the previous visit, so the return to a date goes out as a personalized offer, not a mass mailing.
Integration with iiko pulls seating and history from the restaurant's management system: one database instead of a journal, spreadsheet, and messenger chats.
All these effects are the result of one connection: reservation, seating, and guest live in the same data, not in three separate systems of record.
Three paths: a unified core, native builds, an off-the-shelf solution
The choice of approach is determined not by taste but by the share of platform logic in the journey.
Reservation is a map with points, a confirmation notification, prepayment for a table, a calendar, and a reminder an hour before the visit: the more such nodes there are, the more the options diverge. Below are three alternatives that are chosen between in practice.
| Option | When it fits | Limitations |
|---|---|---|
| Cross-platform development: one core, two builds | Both platforms are needed by the same deadline, reservation journeys are standard, and speed of releasing new versions matters | The shared codebase does not cover everything: maps, payments, and background work require native inserts, and a new platform system capability arrives with a delay |
| Native development for each platform | A lot of work with the camera, geofences, payments, system widgets; high requirements for responsiveness and background operation | Two codebases and two release cycles: a fix to one screen is done twice, maintenance is more expensive, release is longer |
| Ready-made solution with configuration | A standard journey "selected a table — got confirmation" is needed, along with launch in a short time | The logic adapts to the product, not to your floor and prepayment rules; custom integrations are only through the vendor's open endpoints; exiting the solution in terms of scope of work is comparable to development from scratch |
The difference shows not at launch but in the second or third season. With a unified core, 70–80% of the code is shared, and a fix to reservation rules is released once; with native builds — twice; with a ready-made solution — in the vendor's queue.
That is why we first calculate the share of platform nodes and the number of external integrations (POS, loyalty program, maps), and only then name the approach.
How the work proceeds: from journey analysis to project handover
We start not with mockups but with how the floor lives during a shift: where the peak is, how many seatings per hour, who confirms the reservation, and what to do when a guest does not show.
The reservation scheme depends on this picture — whether we hold a table for a specific waiter, whether auto-confirmation works, how deposits and large parties are handled.
- Floor process audit. We analyze booking sources — calls, website, aggregators — cancellation rules, deposits, and seating for large parties. The output is a journey map and a list of bottlenecks.
- Reservation prototype. We test a clickable prototype of floor, table, time, and number of guests selection with the host and administrator before writing code: changes here take hours, after release — weeks.
- Data schema and connections. We determine which tables can be combined, how a reservation synchronizes with the floor management system, and what happens when two requests target the same table at the same time.
- Build. Iterations of one to two weeks, each with a working build. The client looks at a live app, not a readiness report.
- Load testing of journeys. We run a peak evening and holidays: hundreds of simultaneous requests, network drops, repeated taps. We check whether one table can go to two guests.
- Commissioning. We launch in parallel with the usual process: some reservations go through the app, some — as before. We monitor occupancy and reservation confirmation time.
- Project handover. We hand over access, documentation on the reservation scheme, and shift instructions, and set up failure alerts. After that — support and development.
Project handover: integration diagrams, access, support regulations
App handover is not an archive with source code but a kit that your team or a third-party contractor can use to bring up a build, release an update, and resolve an incident without our help.
We assemble it throughout the project: some artifacts are born together with integrations, some — during pilot operation, when the real behavior of reservations under load becomes visible.
- App documentation: a map of screens and reservation journeys, a description of modules, extension points, and which data is considered the source of truth when client and server diverge.
- Integration diagrams: flows with the reservation system, POS loop, acquiring, and fiscalization — where exactly the reservation is confirmed, at what point payment occurs, which fields are required, and what happens when each node fails.
- Employee access rights: a role matrix in the admin panel, repositories, notification services, app store accounts, and external services — indicating the owner of each access rather than a shared account.
- Support regulations: request priorities, first response time, escalation procedure, responsible people on the restaurant side, and our contacts for each class of incident.
- Release regulations: branch workflow rules, mandatory checks before build, publication procedure, and rollback to the previous version if an update breaks the reservation journey.
- Staff instructions: how to change the menu and opening hours, configure seating limits and intervals, clear stuck reservations, and what to do if a guest did not receive confirmation.
- List of external services and their settings: a dependency map indicating what is critical for accepting reservations and what can be disabled without stopping the floor.
For the first two to four weeks after handover, we stay in touch under the support regulations — answering your team's questions and resolving incidents together until you reach an independent release cycle.
Case study: a chain of venues — booking time reduced threefold
Before
The chain of venues kept reservations in a paper journal and on the phone: the administrator took the call, checked table occupancy, and called back to confirm.
During the evening peak load, the path from inquiry to confirmed reservation stretched to 4-5 minutes, some calls were lost in the queue, and the no-show rate remained around 18% — a table sat idle for a guest who did not arrive.
What was changed
For Provence, we built a mobile app with a floor map: the guest sees real occupancy for the selected time, chooses a table by seating, and receives confirmation immediately, without a call.
A reminder arrives a few hours before the visit, cancellation and rescheduling are available in one tap, and the freed-up time immediately goes to the waitlist for the next guest.
On the floor side, an admin console appeared: a reservation feed, shift occupancy, automatic table distribution with a buffer for cleaning between seatings — no more manual journal checks.
Results
The path to a confirmed reservation was cut threefold — to an average of one and a half minutes, and during peak hours it no longer grows because of a phone queue. No-shows decreased from 18% to 6% for those seatings where reminders and visit confirmation are enabled.
The number of calls per shift decreased by about three times: the administrator works with the floor instead of making calls.
The waitlist brings canceled reservations back into circulation, so evening cancellations decreased without expanding seating — the development case pays off through floor occupancy itself, not through increasing the number of tables.
What to do if the app has already been released and is slow
A released mobile app for a restaurant is rarely slow for one reason: usually a heavy startup, unnecessary requests when opening a screen, and workarounds accumulated over years of fixes add up.
Before rewriting anything, we audit the current solution — profile startup and key reservation journeys and see where time goes to waiting for the network and where to rendering lists and maps.
Based on the audit, it is clear whether the task can be closed with support of the finished product or whether a core rebuild is unavoidable.
| Option | When it fits | Limitations |
|---|---|---|
| Targeted improvement of the current loop | The bottleneck is localized: one or two slow screens, heavy startup, excessive requests when opening a floor card | Architectural debt remains, and the gain is noticeable only in the changed journeys |
| Core rebuild | Problems are systemic: layers are intertwined, any fix breaks neighboring screens | Longer in terms of timelines, and a period of parallel operation of the old and new versions is needed |
The choice between the two paths is a choice between speed of result and lifespan of the solution. Targeted improvement gives a fast effect where we have already worked, but leaves the cause: the next fix will again hit the same layers.
A core rebuild is longer and requires parallel operation of two versions, but it removes the cause, not the symptom.
Then support of the finished product begins: collecting crashes and slow operations, monitoring the share of successfully completed reservations, and regression testing at every release.
Release improvement proceeds in short iterations with the possibility of quick rollback — quality does not degrade as load grows.
Common technical questions before starting
Doubts at the estimation stage are almost always the same: what will happen during peak hour if the channel is overloaded, how data will get into the POS shift, what an update during the busiest part of a shift will lead to, and who is responsible for guest personal data. Below are short answers to the point, without generalities.
What happens if the floor loses connection?
The reservation and seating are written to the device's local storage, not only to the server: the administrator continues to see tables and mark guests. Changes go into a queue with retries and synchronize when the channel returns; conflicts are resolved by event time.
In this case, the guest receives reservation confirmation via a confirmed channel, not based on the request being delivered to the server.
How is the app connected to the POS and inventory?
We work through the open software interface of the POS system: an order from the table goes into the current shift as a single receipt, and payment and write-off statuses are returned back to the app.
If the POS is unavailable, the operation is queued with a uniqueness key — a retry does not create a duplicate receipt. Which POS systems are supported and what to do with a non-standard build are fixed at the survey stage.
Do updates break work during a shift?
The server side is rolled out to a prepared environment with subsequent switching, so downtime is measured in seconds. The mobile app relies on a backward-compatible contract: guests with old versions continue to book, and the minimum supported version is raised gradually.
Data schema migrations proceed as a separate step and are tested on a copy of the production database.
Who is responsible for guest data security?
We minimize the dataset: we store only what is needed for reservations and the loyalty program. Transmission and storage are encrypted, access is role-based, and administrator actions are logged. Data export and deletion at the guest's request are performed by a standard journey.
After handing over the source code and data schema, responsibility is fixed by the release and support regulations.
Let's discuss the task and come back with an estimate and plan
To make the estimate based on facts rather than "plus or minus," we need inputs on the floor and booking process.
We gather them in a conversation with the person responsible for seating: usually 40–60 minutes is enough to see the scope of a mobile app for a restaurant and the risks that are better closed before work begins.
What is useful to prepare for the task discussion:
- Floor plan: how many locations, seatings, whether there are banquets, deposits, a veranda, how tables are currently distributed between shifts.
- Booking channels: calls, website, social media, external platforms — what remains, what we move into the app.
- Roles and access: guest, hostess, shift manager, general manager — who sees and changes what.
- Systems of record: POS, inventory, loyalty program, telephony — whether there is open access to data and who is responsible for integration.
- Notifications: confirmation to the guest, reminder the day before, shift notification about new reservations — via which channels.
- Constraints: the date by which launch is needed, personal data protection requirements, your own design mockups or we work with ours.
If there is no answer for some points — that is okay, we will clarify some on site and propose a solution. After the conversation, we fix the scope of the first version and the order of stages.
We will come back with a project estimate by timeline and a work plan showing what we do at the start and when the feature can be tested on real reservations.







