About the Client
A transport payment system for a European country, delivered through a local intermediary. The end users are ordinary passengers, which sets the bar: if the app is slower than buying a paper ticket, nobody uses it twice.
Challenges
- A payment has to complete in the seconds between boarding and finding a seat, often on a weak mobile connection.
- Inspectors must be able to verify a ticket quickly and without argument.
- Discount entitlements and fare rules vary by passenger and by route.
- The audience includes people who are not comfortable with apps, so the flow has to be short and obvious.
Our Approach
We built a native Android application over a server-side payment system. Passengers register, see their personal data, purchase history and trips, and buy a ticket for a particular type of transport, with any discount they are entitled to applied automatically.
A trip is started by scanning a QR code or tapping the phone’s NFC module, which also tells the system the direction and route. During the journey the app shows the route and the remaining time, and supporting payment documents can be downloaded for anyone who needs to claim the fare back.
Payment confirmation is handled on the server rather than in the app, so a passenger who loses signal mid-purchase does not lose the ticket or pay twice.
Results
- About 30% of passengers moved to buying tickets in the app within the first weeks.
- Queues at ticket desks became noticeably shorter.
- Workload dropped for the staff who sell tickets and check fares.
Technology Stack
Kotlin (Android API 21–28), Dagger for dependency injection, OrmLite for local storage, MVP with Moxy, Cicerone for navigation, Retrofit, RxJava and RxAndroid, Glide, Mockito for unit tests. NFC and QR code handling on the device; payment processing server-side.
Business Impact
Public transport ticketing is one of the few places where adoption is measurable the week after launch: either the queue is shorter or it is not. Moving a third of fare purchases to self-service changed the staffing maths for the operator, and it did so without taking the paper option away from passengers who still wanted it.
