Project Screenshot


Building an Android-powered self-service kiosk for a fast food restaurant in Belgium

  • The idea behind Can Tho

    Damien Toulouse, the owner of a Vietnamese restaurant in Brussels called Can Tho, wanted to create a restaurant with an innovative user experience to attract customers and grow brand loyalty, taking a waiter- and cash-free approach.Damien contacted us with an idea to build an application for the kiosks that would automate business processes at their restaurant. These kiosks would offer self-service ordering and a point of sale system.

  • Analysis

    Restaurants worldwide want to make meaningful investments in technology and business process automation to be major winners in the industry. Convenience for customers and resource efficiency for restaurateurs are the main aims driving restaurateurs to develop mobile apps and automate business processes. Famous chains such as McDonald’s, KFC, and Wendy’s have recognized the importance of technology and user demand for it, implementing mobile tech and self-order kiosks. This technology can deliver customer orders to the kitchen, reduce wait times via online ordering, and improve the overall customer experience with a brand.

  • Solution

    We developed an application for five self-ordering kiosks to help Can Tho serve customers faster and the restaurant's staff use their time more efficiently. Each Can Tho kiosk consists of a table, payment terminal, and wireless printer so customers can browse the menu, order, customize dishes, pay for an order, and get a receipt in one place. 


    You can visit Can Tho restraunts in Brussels and try self-ordering kiosks yourself. Addresses are:


    Can Tho: Rue de Trèves 38, 1050 Brussels, Belgium 

    Can Tho City 2: Rue Neuve 123, 1000 City 2 M17, Belgium

User roles


The admin can confirm orders, resolve returns, and add dishes and ingredients through the admin dashboard. They can also set prices and indicate the VAT percentage for eat-in and takeaway.


Customers can view the menu and place orders using the app. They can also create custom dishes or make changes to the ingredients in dishes. Customers can pay for their orders and get a receipt that confirms their orders. If customers have a hard time interacting with the app, they can get help by pressing the Get Help button on the home screen.


May 2018 – Present
Backend - 1 Android - 1 UX - 1 QA - 1 PM - 1
Created the UX

Our client came with a user interface design, and our task was to come up with a dynamic and engaging user experience. We spent some time discussing core features and the flow in order to develop a prototype. This prototype served as the starting point for our design.

Developed an Android application

We developed CanTho using Clean Architecture principles, which allowed us to separate business logic and price calculations into independent modules. By doing so, we simultaneously increased maintainability and reliability.

With CanTho, one of the main challenges was to implement a payment terminal and provide a smooth payment flow for customers. Since we needed a modern solution to satisfy even the pickiest customers, we went with the Valina terminal, which lets users pay both by card and with contactless methods.

We also implemented logic for price calculations that handles value-added tax (VAT).

As a result, we developed stable software that automates all work that’s otherwise done by waiters.

Developed the backend

We had the non-trivial task of implementing the backend for this Belgian waiter-free restaurant. The backend needed to let customers create their own dishes from suggested ingredients and add-ons. We chose the Django framework for the service base with a PostgreSQL database and the Django REST framework to let the backend communicate with the kiosks.


We needed to make sure we kept all information about transactions and value-added taxes as required by Belgian law. So we decided to integrate a point of sale (POS) system since developing and licensing similar functionality on our own would have taken a lot of time. Lightspeed had an API and the certifications required for use in Belgium.


Integrating Lightspeed led to a simple and clear order flow. Through the Lightspeed admin dashboard, restaurant staff can fill in information such as the price of dishes and all ingredients along with the VAT percentage. This information is synchronized with the CanTho database with the help of a web API, representing the server-to-server communication. To mitigate all possible discrepancies on the backend, all financial information is in a read-only format. After a user places their order, the backend transmits the data to the Lightspeed server, which checks the accuracy of calculations and keeps the tax information.


The backend for the CanTho app has extensive capabilities for editing menus. Seeing as CanTho’s key feature is creating custom dishes, we developed a multi-layer system for customizing orders as well as ingredients and add-ons. Everything can be set via the admin dashboard.


We built a Django admin site adding the Django JET plugin to make the admin interface more beatiful and navigation more efficient. Also, we made the app available in English, French, and Dutch.


We developed a backend application that synchronizes with the Lightspeed POS, provides an API for the kiosks, and allows staff to fine-tune the CanTho ecosystem that includes the menu, Lightspeed integration, smart light bulbs, kiosks, and printers via the admin dashboard.  


When integrating the Lightspeed POS, we needed to implement server-to-server communication through a web API. We developed the Lightspeed API client library using Requests.


We chose to divide the business logic for deserialization and synchronization using Marshmallow schema classes for deserialization. We used Marshmallow schemas instead of DRF serializers due to their simplicity, dynamic fields, and the absence of direct interaction with models, which was exactly what we needed.


Synchronization is done by synchronizer classes with the help of our client library and Marshmallow classes to serialize or deserialize data. This data is saved in the case of incoming synchronization or sent to Lightspeed in the case of outgoing synchronization.  


Taking into account that menu information changes rarely, instead of periodically syncing with Celery beat tasks, we implemented on-demand synchronization by adding a synchronize button in the admin dashboard. What’s more, the admin can see the synchronization status and the number of items created and deleted during the last sync.  


In the future, we plan to integrate with Uber Eats and Deliveroo.

Implemented features

For customer convenience, we integrated the app with a Xiaomi smart light bulb that lights up whenever customers press the Get Help button on the kiosk screen.

Customers, bartenders, and chefs each get different receipts. Customers get receipts that confirm their orders. Chefs get receipts printed in the kitchen showing what dish a customer has ordered and what ingredients are in it. Bartenders get official receipts with VAT and receipts with drinks a customer has ordered.

Customers can pay via a terminal provided by the Worldline company using cards or contactless payment methods.

Customers can create custom dishes and add ingredients the app suggests.

Customers can place orders with CanTho and choose three options: eat in, order takeaway, or eat in and order takeaway.

Technology Stack

Python icon
Django icon
REST Framework icon
REST Framework
Calligraphy icon
Retrofit icon
Crashlitics icon
PostgreSQL icon
Kotlin icon

Client's feedback

This wasn’t an easy project, and we weren’t easy customers, but they delivered the solution on time.

Damien Toulouse
Damien Toulouse, CEO of CanTho