[ Case study ]
Timetables lived on a website that assumed good connectivity at the terminal — exactly where it failed — and seasonal ticket windows produced morning queues that pushed commuters toward driving.
CLIENT a regional passenger ferry operator — FOCUS Cache the day, stream the deltas
Representative examplesEvery case study in this library is an illustrative composite of the kind of engagement we deliver — written to show our method and standards, not to name clients.
Between the mainland terminal and a chain of island stops runs a commuter ferry service with a seasonal tourist surge and a timetable that changes four times a year. The operator sells tickets from staffed windows and a small online store, and vessel positions come from a licensed tracking feed it pays per call. Its riders are commuters with annual passes, day-trippers with phones and no patience, and terminal staff on whatever handsets the company issued years ago.
Timetables lived on a website that assumed good connectivity at the terminal — exactly where it failed — and seasonal ticket windows produced morning queues that pushed commuters toward driving.
We proposed an Android app that caches the full day's timetable at first launch and treats live tracking as a stream of compact deltas rather than repeated pulls, keeping the licensed feed inside its rate budget. Buying a ticket is two screens — route, then pay — reusing the operator's existing payment provider and saved passes, and the purchased ticket lives in a local pass store that validates offline. The performance bar came from the terminal's actual handsets, not our test phones.
Just as important is what we ruled out, and why:
The full day's timetable is cached at first launch, and tracking updates arrive as compact deltas over a subscription — the app stays useful offline and the feed stays inside its limits.
Route, then pay: saved passes from the payment provider make the repeat commute a two-tap flow, with the ticket usable offline from a local pass store.
A device matrix built from the terminal's actual handsets set the performance bar, not the flagship phones the team owned.
Delivered by the experience pod — mobile engineer + designer over 8 weeks, with working increments reviewed with the client every week.
Obstacle
Mid-design, we learned the tracking feed's license capped concurrent subscribers far below our assumed headroom — the polling architecture we had sketched could never survive a summer weekend.
Handled: We spent the redesign week converting tracking to a delta subscription with shared server-side fan-out, and negotiated a pilot-season rate with the feed's vendor in parallel.
Obstacle
The payment provider's sandbox was offline for most of the integration window, which put ticket-purchase testing on a collision course with the launch date.
Handled: We built a contract mock from the provider's published API and tested the purchase flow against it daily, then swapped in the live provider for one verified rehearsal before launch.
The headline: share of digital tickets validated offline-capable at first launch of the trial season, read from the operator's validation logs — 62% → 89%, read from Operator validation logs. A second check: ticket-window queue length at the two busiest sailings at −41%.
The terminal's morning changed character. Regulars board scanning a phone that works in the concrete corner where the website never did, and the ticket window's queue is now mostly tourists rather than a daily ritual the operator had budgeted around. Terminal staff stopped calling the office for sailing status — the app is the source they trust. The operations team also gained something structural: timetable changes propagate to phones the day they are decided, so seasonal reshuffles stopped being a communications exercise.
The result was read from Operator validation logs against the pre-engagement baseline over the stated window, with a guardrail check on ticket-window queue length at the two busiest sailings. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.
What we would do differently
We would have negotiated the tracking-feed terms before design — the rate limit shaped the architecture more than any user requirement, and learning that late cost a redesign week.
[ Related service ]
[ Related builds ]
Plastic cards Wallet passesAll active memberships issued as Wallet passes over the first renewal season, with gate scan time logged by the ticketing system
3 tools 1 appMembers manage access, bookings, and billing queries in one app across all five cities
[ Next step ]
Next case study