You’ve got a world-changing idea for a digital project you want to pursue, but don’t know if it’s feasible?
Your boss asked you for a rough estimate of that one project and needs it tomorrow? You’ll discover it all in only 4 minutes.

GroupCreated with Sketch.
Build / Mobile development
Go to overview

wave-a-cab back end

After being taxi drivers for over 20 years, Gwen Reynders and Wendy Steukers, owners of one of the biggest taxi companies in Hasselt, were up for a new challenge. With the arrival of Uber, Belgian taxi companies felt the competition, and Gwen and Wendy saw this as the perfect time to create a platform to unite and support all traditional taxi companies. That way they wanted to give the taxi companies the possibility to compete fairly. And so the transformation from being taxi drivers themselves to the proud owners of wave-a-cab began.

Taking the driver’s seat from front- to backend

For wave-a-cab, we built both back- and front end. The fact that everything in the app depends on events, made it crucial that mobile and backend development were aligned at all times. Our developers had to work very closely together on the same features, and constant communication about API/model contracts was key throughout the building process. 

The back-end of the application is written in Symfony, a well-known PHP framework and supplemented by the administration portal created in Sulu. Both are fully customized to the clients` needs. Using a headless set-up empowered us to make the complex data structure manageable using an intuitive admin portal. All taxi companies, drivers, rides, payments, ... can be self-managed and followed up in case of any inconveniences.” says Sander Hofman, PHP developer at icapps.

In a parallel complex, operations concerning business logic are seamlessly executed in the background. While the initial idea was to build an app for Hasseltse Gele taxi, it quickly became a platform for all taxi companies in Flanders. By using Symfony we can easily manage this growth in both scalability and functionalities. At last, all data is properly presented to the mobile applications through a streamlined REST API.

The backend was built with a few minor hiccups along the way, but the overall process went really smoothly.


On a technological level, the application was rather complex. The basic mechanisms needed for the ModulAid platform can be found in a multitude of applications developed for businesses. To facilitate a client and server with authentication/authorization and a way to do background order processing, we use the Google Cloud Platform. The following setup did the trick:

  • Client: Firebase Hosting

  • Server: Cloud Run

  • Database: Cloud SQL

  • Background order processing: Cloud Tasks

  • QR label storing: Google Cloud Storage (GCP)

  • Authentication and authorization: Auth0

The website is built with a headless CMS. This allows us to develop the front end in a fully decoupled way. To build the admin interface, we used Sulu CMS. Sulu makes it possible to use React as the go-to approach for all our rendering needs. This simplifies the development immensely. We made an API Gateway to feed both the data from the mobile applications and our headless CMS. This API is a REST-based API, which allows us to work with the data we are receiving from the different data providers.

Besides this setup we’ve done for the website and the APIs, we also set up event-driven architecture to easily ingest incoming rides and enrich them with the relevant metadata while processing them in the extended checkout flow. This event-driven architecture is powered by RabbitMQ for processing relevant data at scale.

To keep the cost low and the performance high, we implemented caching in multiple layers of the architecture. We cache the input data sources and output of our APIs. We apply HTTP caching combined with applicative caching all stored in Redis. We apply a fine granularity for the optimal balance between fast & fresh data. Next to that we also provided ElasticSearch for extensive and optimal searching. This provides an optimal experience for our end-user and keeps the load to a minimum.

Headless CMS

The back-end of the application is written in Symfony, a well-known PHP framework, supplemented by an administration portal created in Sulu. Both are fully customized to the clients` needs. The administration portal is headless with an admin API in PHP and an admin interface in React. Using a headless set-up empowered us to make the complex data structure manageable taking full advantage of the intuitive admin portal. This gives the client a powerful set-up to self-manage taxi companies, drivers, clients, rides, payments,... and follow-up in case of inconveniences.

API management

Api backend wave a cab

Event Driven Architecture

Besides the admin portal, the back-end consists of different API’s for both client and driver applications. Because of the complex business logic handling all ride reservations, payments, bookings, and cancellations, we take full advantage of an Event Driven Architecture. Every event is stored and tracked across its lifecycle. The event reflects every stage of an offline booking for which every state certain actions are triggered to inform and put in motion required dependencies.

wave a cab build back end

External Services

In addition to the streamlined API layer, our backend also functions as an aggregator between the different external services.


The payment flow is fully embedded throughout the mobile application and interacts with Mollie to handle ride payments in advance. So drivers don’t have to bother arranging them while finishing their rides. Every company that operates with wave-a-cab is registered on the Mollie platform and automatically handles incoming payments, refunds, and cancellations.

Exact Online 

Exact Online is used by wave-a-cab as an Enterprise Resource Planning tool. In order to circumvent manual work all sales entries, documents and invoices are automatically created in Exact Online. Invoicing for other companies can also be manually triggered from the admin portal.


We use Firebase to send mobile push notifications to both drivers and clients.


Pub/Sub is a messaging service that allows asynchronous communication between autonomous services or applications while using a publish-subscribe pattern. It is used to transfer data between our backend and mobile applications.

After authentication, a driver starts listening to a specific topic. When a client books a new ride for this specific driver, the ride is published on a specific topic on the queue. The mobile application gets notified about the new ride on the drivers’ queue and a specific callback is performed to accept and start the ride.

Cloud hosting

The entire wave-a-cab project is hosted on Heroku, a cloud-based Platform-as-a-Service. Since wave-a-cab generates a certain amount of traffic, we rely on a multi-dyno set-up. With Elasticsearch, Redis, and RabbitMQ as the most utilized add-ons. All deployments are fully automated using our predefined CI/CD flow. This flow is responsible for installing, building, testing, and deploying our application to their dedicated environments.

Read about the front end of this case

Got a great digital project in mind?
Calculate the cost now!

Launch calculator