NEXSUM_LABS
  1. Home
  2. Work
  3. A coffee roaster's café accounts moved reordering from voicemail to a four-tap app
Book a call

[ Case study ]

Specialty coffee roastingReact NativeTypeScriptExpo EASSupabase

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

Cafés reordered by voicemail, text, and memory; the roaster's production schedule guessed demand, urgent Friday voicemails became Monday-shipment apologies, and no account could see what it had actually ordered.

CLIENT a specialty coffee roaster with 60 wholesale accounts — FOCUS Four taps to a standing order

React Native DevelopmentMobile AppsReact Native DevelopmentSpecialty coffee roastingRepresentative example
Client
a specialty coffee roaster with 60 wholesale accounts
Industry
Specialty coffee roasting
Engagement
6 weeks — systems pod — engineer
Service
Mobile Apps / React Native Development
Headline outcome
All wholesale accounts onboarded to the app, with the production sheet populated from real orders: Voicemail → in-app reorders, read from Production-sheet change log

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

Roasting for sixty wholesale cafés, this specialty roaster's week is built around a Thursday production cutoff that most of its accounts never quite make. Orders arrive as Friday voicemails, mid-rush text messages, and a standing-order email here and there; the office transcribes them into the production planning spreadsheet the head roaster owns. Café owners are baristas first — they reorder standing at the grinder between doses, from memory, at hours no office is staffed.

What it was costing

Cafés reordered by voicemail, text, and memory; the roaster's production schedule guessed demand, urgent Friday voicemails became Monday-shipment apologies, and no account could see what it had actually ordered.

What they could see

  • Friday voicemails describing orders by roast name and bag count went unreturned until Monday, by which point the production plan had closed.
  • The production schedule was assembled from last season's guesses, and the roaster ran out of its best-selling blend on peak weekends.
  • Café owners could not see what they had actually ordered, so accounts disputed invoices built from half-remembered voicemails.
  • The wholesale manager spent mornings replaying voicemails and texting cafés to confirm quantities the cafés had already told her twice.

The constraints we worked inside

  • The roaster's production planning runs in a spreadsheet owned by the head roaster — the app must feed it, not replace it.
  • Café owners order at odd hours from phones, mid-dose or mid-rush; the order flow must survive interruption.
  • Pricing varies by account and volume; the catalog cannot leak one account's terms to another.

What had been tried before

The roaster emailed a weekly order form that cafés were asked to fill in and return by Thursday noon.
The form lived in an inbox at exactly the moment cafés have no hands free; returns trickled in past cutoff, in formats the office retyped anyway.
A shared ordering spreadsheet on a consumer file-sharing account was circulated to the ten largest accounts.
Simultaneous edits collided, one café's pricing briefly appeared on another's tab, and the head roaster pulled the sheet rather than police version history.

What we proposed

We proposed a small React Native ordering app where a café's typical order is four taps — favorites and last-order reuse — and a half-finished order resumes instead of vanishing when the rush interrupts. Catalogs and pricing are scoped per account and enforced server-side, so no café ever sees another's terms. Orders land in the head roaster's production spreadsheet, in her columns, on her schedule: she keeps the tool she plans with and gains, for the first time, orders that are actually the demand.

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

  • A general e-commerce storefrontCheckout-style flows assume attention and time; café owners order mid-dose with one hand, and per-account pricing terms would have needed awkward bolt-ons to stay hidden.
  • Replacing the spreadsheet with an inventory or ERP systemThe head roaster's planning method lives in that sheet and she owns it; a six-week engagement that confiscated her tool would have bought software and lost the planner.
  • A reply-by-SMS ordering flowText threads have no order state, no account-scoped pricing, and no recovery when a barista returns to a half-typed message an hour later — the failure mode we were hired to fix.

How the work ran

01Four taps to a standing order

Favorites plus last-order reuse mean a café's typical order is four taps, and a half-finished order resumes instead of vanishing.

02Export to the head roaster's sheet

Orders land in the production spreadsheet's exact columns on a schedule the roaster set, so planning keeps its tool and gains its data.

03Scope pricing per account

Account-scoped catalogs and pricing are enforced server-side, so one café's terms are never visible to another.

Delivered by the systems pod — engineer over 6 weeks, with working increments reviewed with the client every week.

The stack, and the reasoning

React Native
Café owners carry both platforms in roughly equal numbers; one codebase was the only way a single-engineer pod could ship to all sixty accounts in season.
TypeScript
The order shape is shared between the app, the export job, and the sheet columns; one type definition meant a column change broke the build, not the Thursday run.
Expo EAS
Pilot cafés reported issues at odd hours mid-season; over-the-air fixes reached their phones the same night without anyone visiting an app store.
Supabase
Row-level security enforced account-scoped catalogs and pricing at the database layer — the one guarantee the confidentiality constraint actually needs, without building an auth system.
Scheduled sheet export
The head roaster's spreadsheet is the production system of record by her choice; feeding it in her columns, on her schedule, respected the constraint instead of fighting it.

What went wrong

Obstacle

The head roaster's spreadsheet was more machinery than a sheet: lookup formulas and a season-specific column arrangement broke the moment the export added a field she had not asked for.

Handled: We froze the column contract in writing, added a checksum row the export validates against, and any future change lands as a versioned option she approves before the schedule moves.

Obstacle

Adoption was immediate but behavior was not: the first month showed the same orders arriving through a new channel, still after the Thursday cutoff — the app had digitized the voicemail, not the timing.

Handled: We shipped cutoff push reminders with a one-tap repeat-last-order action, and made the post-cutoff state visible in-app so cafés could see what ordering late actually cost their delivery day.

How we worked together

Cadence
A Friday morning demo in the roastery's downtime between production runs, with a short written summary the wholesale manager forwarded to pilot cafés.
Client side
The wholesale manager owned café onboarding and communications; the head roaster owned the export contract; six account owners across three cities piloted the app in real rushes.
Decisions
The export format was the head roaster's call alone, and her sign-off gated every release; café-facing choices were settled with the wholesale manager at the Friday demo.
They provided
The production spreadsheet and its formula logic, the account-by-account pricing matrix, café contact lists for onboarding, and two pilot cafés willing to reorder on camera.

What changed

The headline: all wholesale accounts onboarded to the app, with the production sheet populated from real ordersVoicemail → in-app reorders, read from Production-sheet change log. A second check: orders placed before the thursday production cutoff at +22%.

The wholesale manager's mornings stopped starting with voicemail triage, and production planning started from real orders instead of last season's memory — the head roaster now walks into Thursday with demand she did not have to reconstruct. Café owners reorder between doses in four taps and can settle an invoice argument with their own order history. The relationship shift is the quiet one: accounts that used to feel like a transcription burden now read as a live demand signal, and the roaster prices its season against evidence.

The result was read from Production-sheet change log against the pre-engagement baseline over the stated window, with a guardrail check on orders placed before the thursday production cutoff. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.

What they own now

  • Expo EAS project and build pipeline under the roaster's own Expo account
  • The Supabase project with its row-level security policies and backup schedule
  • Export schedule configuration and the column contract the head roaster signs off
  • An account-admin guide for the wholesale manager: pricing tiers, catalogs, and onboarding
  • Cutoff reminder settings cafés and the roaster can adjust season to season

What we would do differently

We would add push reminders for the cutoff from day one — adoption was fine, but timing moved only when the reminder shipped, and that was a month later than it should have been.

Mobile AppsReact Native DevelopmentSpecialty coffee roastingReact Native

Next case study

A regional wildlife park moved 22,000 members from plastic cards to iPhone Wallet passes