THE CHALLENGE

Designing the in-between: a ticketing app that fits a coffee run into your commute, without ever getting in the way of the ticket.

Our high level goal were to:

Make interaction
for everyone

Users should be able to interact with

cityflow in a fluid way

Giving our users more
control

Give the the traveller more control of the trip and scheduled delivery

Build trust and create a real connection

Create robust plaform to build more
engagement and trust

Product type

Cityflow bus transport Application project

Team

Olivier André (Lead designer)

Robin Damiens (Project manager)

SOFTWARE AND TOOLS

Figma, Framer, Mobbin, Claude

Timeline

6 months (Jan-Jun 2026)

MY IMPACT

" I designed a feature that lets commuters order food while traveling and collect it along their route, without ever compromising the app's core job: getting them a ticket in under 10 seconds. Result (pilot, 12 weeks): 18% of weekly active riders placed at least one food order, average order value of 15€, and ticket-purchase completion time stayed flat. "

final design highlights

The ticket flow that gained zero steps

Home to scannable ticket in four screens, identical to before the food layer existed.

Ordering along the route

Ordering without leaving the journey

Vendors at upcoming stops, filtered to what can actually be ready in time.

Tracking while travelling

One timeline instead of two ETAs

Your vehicle and your order on a single track, moving toward the same point.

Collecting at the stop

Pickup under time pressure

Order code first, vendor pinned to the platform exit, connection countdown running.

BUSINESS PROBLEM

Context & Business Problem

Public transport apps are high-frequency,
low-margin products. Riders open the app 10–14 times a week, but each transaction earns cents. The business goal was clear: monetize attention without taxing the core flow.

BUSINESS CONSTRAINTS

A commuter's journey has predictable dead time (waiting at a stop, riding 20 minutes) and a predictable path. If we know where someone will be and when, we can let them order coffee or food that's ready exactly when they pass by.

Constraints I had to design within

Don't touch
the ticket
Don't touch the ticket

The ticket flow is sacred. Any added friction there kills retention.

Design for uncertainty

Food vendors are third parties with variable prep times.

Timing is
the product
Timing is the product

Pickup logistics are unforgiving — a bus doesn't wait for a latte.

FRAMING THE PROBLEM

How might we let riders order food along their journey so that pickup feels effortless and perfectly timed — without slowing down the people who just want a ticket?

Two user jobs, one app:

“Get me moving and fed on the way” — buy your ticket, check departures, discover food, and time your pickup. Speed and confidence, all in one journey.

understanding the user expectation

The core design tension: Job 1 punishes anything extra on screen. Job 2 needs discovery surface area. Most of my architectural decisions trace back to resolving this tension.

Key interaction

System response

User expectation

Buying a bus ticket

Vers Rue de Rennes

6 min d’avance

234

à 18h09

Ticket received and ready to move to the

bus stop

Ticket received and ready to move to the bus stop

Direction and time

Vous êtes arrivé à l'arrêt de bus

St Mathieu

234

à 18h09

Show me the direction to the nearest

Bus stop

Show me the direction to the nearest Bus stop

Ordering food during journey

Livraison estimée

12:05-12:20

Votre commande est en route

Add a meal during the journey and while

keeping track of the journey progression

Add a meal during the journey and while keeping track of the journey progression

Show the pick-up point

Livraison est arrivé

12:05-12:20

Votre commande est en route

Keeping track on the journey and the delivery progression

RESEARCH INSIGHT

Insight 1 — Commutes are rituals, not journeys. 81% of surveyed riders take the same route at the same time daily. They don't need discovery so much as repetition: "my usual coffee, at my usual stop." → This pushed me toward a reorder-first design rather than a browse-first marketplace.

Don't touch the ticket

The ticket flow is sacred. Any added friction there kills retention. In interviews, the #1 reason people don't order ahead today: fear of mistiming.

Design for uncertainty

Food vendors are third parties with variable prep times.
In interviews, the #1 reason people don't order ahead today: fear of mistiming.

Commutes are rituals, not journeys. 81% of surveyed riders take the same route at the same time daily.

Insight 2 — Anxiety beats appetite. In interviews, the #1 reason people don't order ahead today: fear of mistiming. "What if my bus is early?" "What if the food isn't ready and I miss my connection?" → Timing confidence became the hero of the experience, not the food catalog.

Don't touch the ticket

The ticket flow is sacred. Any added friction there kills retention. In interviews, the #1 reason people don't order ahead today: fear of mistiming.

Design for uncertainty

Food vendors are third parties with variable prep times.
In interviews, the #1 reason people don't order ahead today: fear of mistiming.

Insight 3 — The stop is a better address than the store. Riders think in stops, not street addresses. "Pick up at Rose Hill Central, platform 2" is instantly meaningful; "collect at 14 Avenue des Manguiers" is not. → I made the transit network itself the geography of the food experience.

Insight 4 — Two distinct moments of intent. Orders happen either before leaving (planned: breakfast, lunch pickup) or mid-ride (impulsive: "20 minutes to go, I could eat"). → The entry points and defaults differ for each; one flow can't serve both.

Don't touch the ticket

The ticket flow is sacred. Any added friction there kills retention. In interviews, the #1 reason people don't order ahead today: fear of mistiming.

Design for uncertainty

Food vendors are third parties with variable prep times.
In interviews, the #1 reason people don't order ahead today: fear of mistiming.

DECISION 1:

Food is a layer on the journey, not a second app

I rejected the obvious pattern — a bottom-tab "Food" section like a mini Uber Eats — after testing a quick prototype. Users described it as "two apps stapled together," and it created a discovery problem (out of sight, out of mind) while still cluttering navigation.

Instead, food lives inside the journey context:

  • On the trip screen, eligible stops along your route show a subtle "order here" affordance.

  • On the live ride view, a contextual card appears: "Arriving at Curepipe in 22 min — coffee ready when you get there?"

  • A lightweight Food tab exists for planned orders, but it opens pre-filtered to your routes and your usual stops.

DECISION 2:

Decision 2: Time is the primary unit, not distance

Every vendor card answers one question first: "Will it be ready when I am?" Vendors are sorted and badged by pickup feasibility (✓ Ready before your arrival), computed from live vehicle position + vendor prep time + a safety buffer. Items that can't make it in time are visible but clearly marked — never silently hidden, never falsely promised.

DECISION 3:

Decision 3: The ticket flow gains zero steps

Food entry points are strictly additive surfaces (cards, affordances on existing screens). The ticket purchase path — home → route → pay → Scannable ticket — is byte-for-byte identical to before. I held this as a non-negotiable and verified it with funnel analytics post-launch.

KEY FLOWS

Key Flows & Design Decisions

(12-week pilot, 2 cities, 46 vendors)

Cityflow synced food orders to transit arrivals, turning the commute into a natural ordering moment. It became a habit fast: by week 12, 64% of orders were reorders, 18% of weekly riders had ordered food, and 92% of first pickups needed zero support. Revenue covered operating costs by week 9 — with no impact on the core ticket funnel.

18% of weekly active riders placed ≥1 food order

$7.40 average order value; food revenue covered the pilot's operating cost by week 9

64% of orders were reorders by week 12 — validating the ritual/repetition insight

92% successful first-attempt pickups (order ready & collected without support contact)

Ticket funnel unharmed: purchase completion time and conversion flat vs. control cohort

App Store rating moved from 4.2 → 4.5 in pilot cities

What I Learned

  1. The strongest monetization design is invisible to the people who don't want it. Protecting the core job earned the trust that made the upsell work.

  2. Confidence is a feature. We sold timing certainty more than we sold food. The synchronized timeline did more for conversion than any menu improvement.

  3. Design the bad day first. In a system with buses, kitchens, and humans, the failure flows are the product. I'd start there even earlier next time.

If I had another quarter: group ordering for regular co-commuters, vendor-side tooling for surge prep at peak times, and loyalty mechanics tied to commute streaks.

Cityflow’s mission:
Make bus travel in Paris smarter, safer, and more connected.

City-flow aims to become the next-gen mobility companion — a platform that merges information, safety, and social value to improve how people move across Paris.


Lack of Real-Time Clarity
Passengers often don’t know when the bus will actually arrive, how crowded it is, or if there are delays. This uncertainty creates stress, missed rides, and inefficient journey planning.


Weak Safety Awareness
There are no real-time incident alerts, no reassurance features, and no safety indicators to guide safer decisions.


No Social or Community Layer
Existing apps don’t help users connect, share experiences, or access relevant local information during their ride, even though commuters spend hours inside this shared space.


Poor In-Journey Guidance
They don’t support passengers during the ride with contextual cues (next stop, orientation, smarter transfers, disruptions ahead) that make the journey smoother and more predictable..


Fragmented Mobility Experience
There’s no single, unified tool that brings all mobility needs informational, social, and safety-related into one seamless experience.

DESIGNED + CODED BY OLIVIER

DESIGNED + CODED BY OLIVIER

DESIGNED + CODED BY OLIVIER