NEXSUM_LABS
  1. Home
  2. Work
  3. A bike-share nonprofit doubled rides per bike after its rider app stopped fighting low-end phones
Book a call

[ Case study ]

Micromobility nonprofitReact NativeMapboxReanimatedDetox

A bike-share nonprofit doubled rides per bike after its rider app stopped fighting low-end phones

The rider app's map froze on mid-range Android phones, unlock codes failed at the dock in bright sun, and the nonprofit's own usage data showed riders giving up between finding a bike and unlocking it.

CLIENT a city bike-share nonprofit — FOCUS Profile on the median phone

React Native DevelopmentMobile AppsReact Native DevelopmentMicromobility nonprofitRepresentative example
Client
a city bike-share nonprofit
Industry
Micromobility nonprofit
Engagement
8 weeks — experience pod — mobile engineer + researcher
Service
Mobile Apps / React Native Development
Headline outcome
Rides per bike per day across the season after relaunch, read from the dock system's unlock records: 1.9 → 3.1, read from Dock-system unlock records

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.

Where they started

The nonprofit behind the city's bike-share operates a few hundred docks on grant funding and municipal goodwill, with a paid staff you could fit around one table. Its riders are not the premium-phone demographic: the median rider phone is four years old, and the equity mission that attracts the grants also defines the fleet. The rider app had been assembled by successive volunteers and short contracts, and the nonprofit's own usage data — assembled by hand for grant reports — showed riders quitting at the dock.

What it was costing

The rider app's map froze on mid-range Android phones, unlock codes failed at the dock in bright sun, and the nonprofit's own usage data showed riders giving up between finding a bike and unlocking it.

What they could see

  • The map froze or crashed on mid-range Android phones, and riders learned to screenshot the night before rather than trust the app.
  • Unlock codes failed at the dock in bright sun — riders could not read their own screen against the glare.
  • The nonprofit's funnel data showed riders finding a bike and then abandoning the unlock, ride after ride, dock after dock.
  • Every grant report required hand-assembling ride counts by neighborhood from exports nobody trusted.

The constraints we worked inside

  • Dock hardware is fixed — unlock protocols and beacon behavior are given, not chosen.
  • The nonprofit's budget rules out premium-device-only development; the median rider phone is four years old.
  • Grant reporting requires ride data by neighborhood, collected with documented consent.

What had been tried before

A volunteer contractor rebuilt the map screen with a lighter tile source and shipped it before the season.
The fix was measured on a flagship phone in an office; on the four-year-old devices riders actually carry, the jank moved but did not leave.
The operations lead published an app notice asking riders to move to phones from the last three years.
It contradicted the equity mission the grants fund, and the usage data showed the notice changed nothing about which devices opened the app.

What we proposed

We proposed rebuilding the rider app around a performance contract: the four-year-old reference device is the release gate, and every map, animation, and unlock flow must clear it before it ships. The dock moment gets redesigned against its actual failure modes — high-contrast sun-readable unlock, haptic confirmation, and a code fallback that does not require reading anything. Rides carry coarse, consented zone tags from onboarding onward, so the funder's neighborhood report becomes a query instead of a hand-assembled project.

Just as important is what we ruled out, and why:

  • Replacing the map with a list-based station finderRiders navigate by map — that is how they decide which dock to walk toward; removing it would trade one measurable failure for a deeper drop-off.
  • A white-label micromobility app from a vendorDock unlock protocols are fixed hardware behavior, and grant reporting demands consented zone data the vendor's product had no way to produce or prove.
  • Rebuilding natively for AndroidThe nonprofit has one part-time mobile budget, not two codebases; if profiling could not make React Native clear the reference-device bar, nothing else in scope would either.

How the work ran

01Profile on the median phone

The map layer was rebuilt with clustering and offline tile caching until the four-year-old reference device scrolled smoothly — performance was a release gate, not a hope.

02Redesign the dock moment

Unlock moved to a high-contrast, sun-readable screen with a fallback code entry and haptic confirmation, designed against the dock's actual failure modes.

03Make reporting a query, not a project

Rides carry coarse, consented zone tags so the funder's neighborhood report is generated, not hand-assembled.

Delivered by the experience pod — mobile engineer + researcher over 8 weeks, with working increments reviewed with the client every week.

The stack, and the reasoning

React Native
The existing app and its dock integration were React Native; a rebuild kept that knowledge and the one maintained codebase the nonprofit can actually staff.
Mapbox
Offline tile caching, style control, and nonprofit pricing mattered more than the default SDK; the incumbent map's costs at this fleet's query volume priced out a grant line.
Reanimated
Map gestures and unlock animations run on the UI thread rather than the JavaScript thread, which is precisely where the old app's jank lived on slow devices.
Detox
Performance and behavior regressions on the reference device had to fail the build, not the season; end-to-end tests on that device class became the release gate.
Node.js backend
Zone tagging, consent records, and the funder's report query live in one small service the nonprofit's part-time developer can read and run.

What went wrong

Obstacle

The first optimized build still dropped frames on the reference device: the tile cache was right, but station clustering recomputed on every pan and dragged the JavaScript thread to a standstill.

Handled: We moved clustering to a coarse grid that recomputes only on zoom changes and profiled until the reference device scrolled the full network without stutter — then froze that measurement as the gate.

Obstacle

Sunlight legibility never appeared in office testing: the unlock screen passed every review indoors, then failed on a sunny dock where riders could not distinguish active from inactive codes.

Handled: We made it an instrumented rebuild: a test device at the busiest noon dock, the unlock screen's contrast stepped through measured levels while the failure rates recorded in the nonprofit's own usage data served as the pass mark — the contrast level that survived the dock became the release gate, and haptic confirmation followed so success no longer depends on reading the screen.

How we worked together

Cadence
A weekly demo with the executive director, plus rider intercepts at docks on Saturdays — five short interviews a round, run by the engagement's researcher.
Client side
The executive director owned scope and funder language; the operations lead owned docks and staff; a volunteer rider group from the membership tested builds and reported through a form.
Decisions
Anything touching grant reporting or rider data went to the executive director in writing; dock-behavior questions were settled by the interviews, and the demo took everything else.
They provided
Dock-system unlock protocol documentation, two seasons of anonymized usage exports, volunteer riders for testing, and the funder's reporting requirements in their own words.

What changed

The headline: rides per bike per day across the season after relaunch, read from the dock system's unlock records1.9 → 3.1, read from Dock-system unlock records. A second check: app-initiated unlocks abandoned before completion at −55%.

The app stopped being the part of bike-share the nonprofit apologizes for. Riders on old phones open the map and it opens — that alone returned a cohort the usage data showed had quietly left. The dock moment became something staff demonstrate proudly instead of explaining around. The operations lead now pulls the funder's neighborhood report in an afternoon instead of a fortnight, and the grant renewal conversation shifted from defending numbers to planning expansion, which is the conversation a nonprofit wants to be having.

The result was read from Dock-system unlock records against the pre-engagement baseline over the stated window, with a guardrail check on app-initiated unlocks abandoned before completion. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.

What they own now

  • The release pipeline and Detox suite pinned to the reference-device performance gate
  • Mapbox account, style assets, and the tile-caching configuration
  • The consent and zone-tag data model with the funder report query pack
  • A profiling bench documenting the reference device and the measurement setup
  • A dock-test checklist for verifying unlock behavior at a real dock after updates

What we would do differently

We would test in actual daylight earlier — the screen-legibility failure was obvious on a sunny dock and invisible in the office, and it had been shipping for two seasons.

Mobile AppsReact Native DevelopmentMicromobility nonprofitReact Native

Next case study

A coffee roaster's café accounts moved reordering from voicemail to a four-tap app