Yapoki: mobile delivery app for the future of the Enterprise
About Project
Here we’d like to share our experience in developing a delivery application with big ambitions and complex architecture. It all started with the customer's dream - make it like Enterprise (the direct reference was Dodo Pizza). It came true, but with a lot of technical nuances that we managed to solve during the project. The case will be of interest to both brands and developers: it tells how to avoid the many pitfalls that are inevitable in projects of this scale.
Goals and Solution
What did the customer want from the app?
- Increase the number of online orders.
- Become one of the largest food delivery services in the country.
- Increase average cheque size and market share.
What'd we do?
- Delivery app based on React Native for iOS and Android with flexible order detail management.
Key achievements
20k+
app downloads
200+
orders per day
35%
of total order share
It doesn't look like something extraordinary to create an app as an additional sales channel to support offline stores. But it's another thing entirely to turn a product into a main order processing channel that can compete with the biggest brands in its segment over the long term. And all this in the context of rapid customer growth.
We wanted to make it as easy as possible to place an order with Yapoki Delivery, so that people would want to come back to the app again and again.
How we met Yapoki
The client chose dev.family on the recommendation of our partners. But it was our vast experience in foodtech and a in React Native development that helped us win the project.
By then, Yapoki was an experienced foodtech brand with an established network which consists of:
- 3 own restaurants.
- 2 partner restaurants.
- dark kitchen network for fast delivery.
Delivery orders were placed via the website, which provided the following results:
500-600
orders per day
30-35 min
average order time
1k+
website visits per day
The launch of the mobile app was intended to boost online sales, which it successfully did.
Development Context
Spoiler: there were lots of challenges
As any experienced developer knows, it is only in typical projects with simple tasks, where it is rarely possible to do anything outstanding, that things usually go smoothly. In our case, the team had to solve several tasks with an asterisk. But let's start with the context in which we started development.
Difficulties in changes
The existing system already served several restaurants and any change could affect the whole chain. So we tried to avoid any changes. As a result, we had to implement all the new logic and processing that was not originally planned.
Prototyping
The first version of the design was provided by the client. We do not always agree with this as we move into development, relying on our own UI/UX expertise. This is the only way we can really take responsibility for quality and deadlines.
Data processing
This project is a good example of how important it is to consider the options and directions for scaling a business right from the start. Especially if you choose a complex architecture. Otherwise you will inevitably run into problems in the future. For example, all work with the catalog – managing order details, displaying dishes in categories, applying promo codes and other actions - was done on the client side. Therefore, although we had access to the back end, we were unable to make the necessary changes and transfer the data correctly. We will tell you more about how we dealt with this situation.
Yapoki's designer had good experience in graphic design, but not in working with the application interface, where it is important to consider nuances and components (fonts, grids, button colors and other elements) that will be used in further development. We tried to work with the first variants, but then the client decided to make a redesign. Our designer was involved in the audit, which highlighted weaknesses and opportunities for improvement in the interface. Although we had to stop development for this, we ended up with a good design that could be taken to work.
Here you can see how it comes and how it goes:
We share these insights in this article:
Core functionality
Let's take a look at the app and talk about its cool features and details. And also about the difficulties and challenges we faced.
History of orders
Combos
Delivery address tracking
Home screen
After authorization, users choose the delivery format and browse the catalog, which is divided into categories like "Rolls" and "Pizza." A widget shows the average delivery time based on the nearest restaurant's load. The Home screen features a 'No need to wait' section with ready-made but canceled orders for faster delivery.
In the catalog and in the showcase, a product may look the same and have the same name. But for application logic, they are two different products. Ordering a Margarita pizza that was originally in the catalog and the one that appeared in an online showcase after the cancellation will be processed differently on the back end. That's why we had to do a lot of extra processing to make sure that the product ordered from the storefront was displayed correctly in the shopping basket.
Product card
The main card contains a photo of the dish, a description of the ingredients and the price. In addition, nutritional information can be viewed in a pop-up window. The user can customize their order - changing the size of the dish and other details, and add up to four extra ingredients to the pizzas. No more are allowed, so as not to compromise the recipe. We warn users about this in the message.
The search for products by name and description was also performed on the client's side. We set up the process so that only exact matches from the entire product range were included in the output. In this way, the system was able to accurately display the correct dishes on request.
All products in the catalog have basic parameters and layout. So if a new product appears in the menu that doesn't match these, it is thrown out of the general dimensions and design. In the Yapoki catalog, product cards have a rectangular shape and transparent filling, so it was already problematic to embed a slightly rounded card with a different filling. If you want to highlight certain items, use the format provided for the main card. Also, the background blur in the menu is only available for iOS apps.
Payment options
You can use loyalty programme bonuses to pay for your order in two ways - by paying 100% or 50% of the total order value with the minimal limit for free delivery. Other interesting tricks and examples of gamification for loyalty programmes can be found in this article.
The Perfect Retailer Loyalty Program App
Two types of bonus can be used at the same time in a single order. We had to set up sliders to activate them, taking into account all the limits.
Cart
The user can choose the delivery time, payment method, and order fulfillment format—either to the specified address or delivered to a specific table number in the restaurant. If any dish is unavailable at the time of placing the order, a notification will appear.
If you plan to accept orders from other time zones (in case someone wants to surprise a loved one), make sure you specify this condition in the backend. Otherwise, when confirming an order, the user will get an error that restaurants and dark kitchens are not working at the given time. It is quite easy to fix this to make your delivery work worldwide.
Additional options
And the difficulties they caused
Stories
Toppings & Sauces
Promotions and referrals
The user can not only use personal promo codes, but also get a discount through the referral system.All they have to do is copy the link and share it with their friends.The solution works on the principle of a universal link, where the user is immediately taken to a specific page where a specific action is automatically performed.For example, if you don't have the Yapoki app, the first thing you'll do is go to the AppStore or Google Play to download it.But if you follow the same link again, the promo code for a discount from a friend will be automatically applied.
Each promo code has its own conditions - some activate a discount on a specific type of product, others provide the product for free. The logic of applying discounts and handling promo code restrictions was handled by us on the application side. Now we get a list of products and conditions from the backend, we check this match and let them know if the promotion can be used. Or we specify the conditions that need to be met for it to work. Such notifications reduce negativity from customers who don't understand why a promo code doesn't work. And they help increase the average order size if the user intends to use the discount.
Special option: streaming order status
Once an order has been placed, the user can view its status and follow the preparation live. Yes, just like the Dodo 🍕
If you're adding streaming from a restaurant kitchen to your app, be aware that not all mobile players can play links in this format. We've moved the streaming to the web view to make everything work. We just made a few style corrections to make the stream fit nicely into the application's interface. Also, to automatically change the order status and other actions in real time without having to refresh the screen, it is better to use sockets - a software interface for continuous data exchange between processes.
On-Demand Food Delivery Platforms - Market, Trends & Opportunities
We've outlined other features and approaches used by global delivery brands in this article
Used technologies
We use Reactive Native as our main front-end stack and Firebase to work with notifications.
The essence of the product
In the pursuit of uniqueness, entrepreneurs often try to cram in a bunch of extra ideas and features. But there are patterns that users are used to. And they ignore them because: "Oh my God! We don't want to be like our competitors! - is silly. If you want people to enjoy using your product, make sure it has familiar functionality.
Fast address tracking, the ability to flexibly manage loyalty points, apply personalized promo codes and manage the composition of dishes - that's the basics. Even if there is complex logic behind it that requires custom development.
And to differentiate yourself, give your customers good service: extra offers, bonuses, promo codes - anything that makes their experience better.
How retail apps can improve user engagement and retention: 9 ways to increase customer loyalty
More ideas for increasing loyalty are in our article
What is the value for brands that would want to use such a solution?
Developing your own app to deliver or collect orders within an existing restaurant is certainly a brave step. In most cases, businesses choose between an existing solution and delivery via a restaurant aggregator. Let's explain why it's still better to build your own app, and when customisation is needed.
The custom delivery app will allow:
Oversee the entire customer journey, from order to delivery. Ensure high customer service and loyalty by personally monitoring the kitchen and courier speed.
Provide a seamless and personalized experience with consistent design, allowing customers to start an order on one device and continue on another.
Create your own loyalty programs, discounts, and bonuses to encourage repeat purchases. Keep your customers loyal and prevent them from turning to competitors.
Gain insights into customer behavior to better understand preferences and tailor offers accordingly. Track popular products, payment speed, and more—data that you wouldn't get from aggregators.
Reduce costs by up to 30% by avoiding third-party catalog commissions.
Adjust prices and delivery terms to maximise profits, free from aggregator restrictions.
Boost conversion rates and order frequency with personalized offers and notifications based on order history and customer preferences.
Provide exclusive dishes or services, like custom dish creation, pre-orders, and takeaways, that aren't available through aggregators.
Custom Solutions vs. Off-the-Shelf
Now, let's explore where a custom-developed solution outperforms an off-the-shelf one:
Integrate with existing infrastructure
For example, you have already written backend logic and design. A custom app will be easier to integrate with your current system, retain brand recognition and all the logic. You'll be able to tailor the app to the unique needs of your business, take into account the features of your existing website and give customers a consistent experience whether they use the website or the app.
Business expansion and opening of new offices
Customized solutions are easier to adapt to future changes. A packaged solution is usually limited to the functionality and updates provided by the vendor. Therefore, if a company plans to expand or introduce new features, a custom application is preferable.
Avoiding costs for unnecessary functionality
Boxed solutions can include functionality you don't need, making the application harder to use and maintain. No unnecessary details – easier to use and more powerful.
Support and maintenance
With a custom application, you get direct support from the development team that built it. This means that any problems or change requests can be resolved more quickly than with a packaged solution where you have to rely on vendor support.
A small business vs. a big chain
If you're a small business just starting out with no plans for scale or experience in the hospitality industry, avoid spending on custom development. A "package" solution is enough to test your ideas and offer basic services. However, after a few years in the market, when you've identified your weaknesses and know your target audience, it's worth consulting developers to address your pain points
Bring Your Ideas to Life
Tell us what ideas you'd like to incorporate into your delivery app, and we'll work out how to make it happen using best practices from the foodtech market.