Project Screenshot

Subway

European mobile loyalty app that allows Subway customers to place order and track rewards

  • Our client’s request

    The Subway restaurant chain decided to change the business logic of their loyalty system in Europe. Previously, every European country Subway operated in had its own app for its loyalty program, with unique offers and discounts. But as the number of restaurants started to grow, it became challenging to manage all of these apps. This is why Subway’s top managers decided to develop a single app for the entire European market.

  • Solution

    In close cooperation with the Subway development team, we created a loyalty app for iOS and Android that caters to European users.  

User roles

icon
Admin

The admin can manage all content on the platform via a content management system (CMS). This content is different for each country.

icon
Subway Customer

Users can create profiles, check the menu, pre-order, get fresh offers, invite friends, form a “SubSquad,” and get discounts.

Result

Duration:
December 2019 - present
Team:
iOS - 2 Android - 2 QA - 1 PM - 1 Design - 1
Android and iOS app development

We built native Android and iOS apps. We used Kotlin for Android development and followed clean architecture principles. For the iOS app, we used Swift and implemented a service-oriented architecture. 

Clean architecture for Android
We created a presentation layer divided into feature modules that look like separate libraries. This allowed us to:
 

  • cut the app development time

  • easily add new features by creating new modules

  • reduce the app’s size
     

Service-oriented architecture for iOS 
We chose a service-oriented architecture in combination with the model–view–controller (MVC) design pattern. This architecture allowed us to prevent view controllers from being overloaded and reuse code. We implemented our own HTTP client to make requests and handle responses with native Codable decoding and encoding without third-party dependencies. This approach was time-efficient. 

Dynamic UI
The Subway app has dynamic content that can be changed by the admin via a CMS. Meanwhile, the design looks and feels native to each platform.

Offline mode
The app’s content is loaded once and then stored offline, minimizing the app’s storage needs. To store data and optimize images (by resizing and caching), we used Realm for iOS and Room for Android.

Dynamic localization without updating the app in the app stores
Dynamic localization allows our client to add new countries, languages, and images to the app at any time. It also allows our client to avoid spending money on a separate development team to maintain each country’s app and reduces the effort required to provide localized content via multiple APIs. To add support for a new country, a new loyalty app no longer needs to be uploaded to the app stores. The backend simply needs to be updated with localized content.

Implemented features

Users can log in to the app, choose a country, and get special offers based on their location. Users can also create SubSquads with friends, check out the menu, pre-order food and drinks, and track current offers.

Registered users can join SubSquads with their friends. Each member of the SubSquad gets a discount on every purchase.

Users can pre-order food and drinks and thus skip the line. Plus, users get a discount when ordering in the app.

An automated carousel allows users to tap any offer and see the details.

When ordering in a Subway restaurant, users can scan the QR code in the app to earn points. They can also add a plastic loyalty card number to an existing app account.

Users can quickly find a nearby Subway restaurant, view its hours, get directions, and see the approximate time required to get there.

Users can customize their orders in the Subway app. For example, they can add double cheese or exclude onion. They can also save their favorite subs and give them custom names for quick search.

Users can view their order history across all Subway restaurants.

Technology Stack

Kotlin icon
Kotlin
Retrofit icon
Retrofit
Swift icon
Swift
Google Maps icon
Google Maps
Codable icon
Codable
Kumulos icon
Kumulos
Realm icon
Realm
LiveData icon
LiveData
Room icon
Room
Koin icon
Koin