[ Case study ]
Check-in ran on a desktop at the front desk, classes were booked by phone during staffed hours, and members queued at 6pm while the desk's single terminal also handled sales, waivers, and everything else.
CLIENT a three-city climbing gym chain — FOCUS Self-check-in against the XML bridge
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.
Three climbing gyms in three cities, each floor busy from the after-school rush to close, all run through a single front-desk terminal that handles check-in, sales, waivers, and everything else. Class bookings happen by phone during staffed hours only, so the 6pm queue at the desk is partly the desk's own making. The membership system is a desktop product the chain has outgrown but not outlived, and its waiver provider's signed documents are the chain's legal record — neither was negotiable.
Check-in ran on a desktop at the front desk, classes were booked by phone during staffed hours, and members queued at 6pm while the desk's single terminal also handled sales, waivers, and everything else.
We proposed a Flutter app where membership syncs through scheduled imports over the desktop product's XML bridge, and check-in writes back through the same bridge — the desktop system keeps its place as the record while phones take over the queue. The waiver provider's flow is embedded before any membership action, so the legal record never has a gap. Class capacity, waitlists, and drop-ins moved into the app, aimed squarely at the 6pm peak: the queue becomes a choice, not a bottleneck.
Just as important is what we ruled out, and why:
Memberships sync through scheduled imports, and check-in writes back through the same bridge — the desktop product keeps its place as the system of record.
The waiver provider's flow is embedded before any membership action, so the legal record never has a gap.
Class capacity, waitlists, and drop-ins moved into the app, so the queue at the desk became a choice, not a bottleneck.
Delivered by the experience pod — mobile engineer + designer over 8 weeks, with working increments reviewed with the client every week.
Obstacle
The first busy Friday after launch exposed the XML bridge's limits: a full gym's evening check-in storm queued behind one import cycle, and phones showed stale membership states at the worst moment.
Handled: We batched write-backs, moved heavy imports off-peak, and let check-in validate locally against the last known sync with reconciliation afterward — the queue never waits on the bridge again.
Obstacle
The waiver provider's web flow fought the app: session cookies dropped mid-flow on one Android manufacturer, leaving members signed up but legally unwaivered without anyone noticing.
Handled: We switched to a deep-link out-and-return flow verified by a completion callback, and added a hard app gate so no membership action completes until the waiver record is confirmed.
The headline: majority of member check-ins via app during the trial months, with the desk terminal freed for sales — Desk queue → self-service check-in, read from Front-desk check-in logs. A second check: class bookings made outside staffed hours at +31%.
The 6pm queue became a scatter of members walking straight to the wall, phones in hand, while the desk terminal finally does what it was bought for: sales. Bookings now happen at 11pm from a couch instead of by phone at noon, which changed the classes themselves — fewer empty evening slots, fuller beginner courses. The desk's job changed rather than shrank: instead of being the bottleneck members queue against, the desk's time goes to the members who need a person — a lapsed card, a first-time climber with a question.
The result was read from Front-desk check-in logs against the pre-engagement baseline over the stated window, with a guardrail check on class bookings made outside staffed hours. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.
What we would do differently
We would have load-tested the XML bridge against a full gym's evening peak — the first busy Friday exposed import lag we then had to engineer around in public.
[ 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
62% 89%Share of digital tickets validated offline-capable at first launch of the trial season, read from the operator's validation logs
[ Next step ]
Next case study