Case study · Georgian Bay Ferries · 2023
Georgian Bay Ferries Booking
A rebuilt ticketing flow for a seasonal ferry operator, designed for patchy dockside signal and a summer rush of day-trippers.

01
The problem
Georgian Bay Ferries sells most of its tickets in July and August, mostly from phones, often on a dock with one bar of signal. The old booking flow took six screens, reloaded the page between steps and lost the cart whenever the connection dropped.
Fewer than half of mobile visitors who started a booking finished one, and the support inbox filled with duplicate-charge worries every long weekend.
02
The approach
- 01
Sit with the people booking
Two days at the Tobermory terminal with the studio's designers, watching real passengers try to buy tickets, shaped the whole flow before any wireframe existed.
- 02
One screen, progressive steps
Date, party and vehicle sit on a single screen that updates availability inline. State is persisted locally, so a dropped connection resumes exactly where it stopped.
- 03
Fast by budget
A 90 KB JavaScript budget for the booking route, enforced in CI. The seat map was replaced by a plain capacity bar, which was both lighter and clearer.
- 04
Idempotent payments
Each checkout carries an idempotency key, so retries on a bad connection can never charge a passenger twice.

03
The outcome
The new flow went live in May and handled its first 18,000-booking weekend in August without a support escalation.
- 41% → 63%
- mobile checkout completion
- 6:10 → 2:20
- median time to book
- 4.8s → 1.6s
- largest contentful paint on 4G
04
The stack
- Next.js
- TypeScript
- GraphQL
- Stripe
- Playwright
- Lighthouse CI