NEXSUM_LABS
  1. Home
  2. Work
  3. A wholesale nursery's sales reps stopped driving orders back to the office
Book a call

[ Case study ]

HorticultureFlutterIsar (offline store)Watched-folder bridgeFirebase App Distribution

A wholesale nursery's sales reps stopped driving orders back to the office

Sales reps visited garden centers with paper catalogs and hand-written orders keyed in back at the office; availability was wrong by the time orders arrived, substitutions were negotiated by phone, and peak season drowned the office in transcription.

CLIENT a wholesale plant nursery serving garden centers across three states — FOCUS Availability as a first-class citizen

Flutter DevelopmentMobile AppsFlutter DevelopmentHorticultureRepresentative example
Client
a wholesale plant nursery serving garden centers across three states
Industry
Horticulture
Engagement
7 weeks — systems pod — engineer + automation specialist
Service
Mobile Apps / Flutter Development
Headline outcome
All reps ordering in-app across the season, keyed into the legacy system via the automated bridge: Paper orders → in-field app orders, read from Order-entry timestamps

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

Wholesale horticulture has a season that forgives nothing: from early spring to late spring this nursery ships bedding plants and perennials to garden centers across three states, and availability changes daily with weather and germination reality. Sales reps cover their territories with paper catalogs and hand-written order sheets, keyed in at the office by someone else days later. The order system is a legacy desktop package whose only integration point is a watched folder it monitors for import files.

What it was costing

Sales reps visited garden centers with paper catalogs and hand-written orders keyed in back at the office; availability was wrong by the time orders arrived, substitutions were negotiated by phone, and peak season drowned the office in transcription.

What they could see

  • Reps wrote orders against last week's availability, so garden centers received substitutions nobody had agreed to.
  • Peak season drowned the office in transcription: order sheets keyed in days after they were written, sometimes with quantities nobody could decipher.
  • Substitution negotiations ran by phone, rep to garden-center manager, while the office retyped both versions of the story.
  • Reps could not answer a garden center's question about current availability without calling the office and waiting for a callback.

The constraints we worked inside

  • Availability changes daily with weather and the season; reps must see current numbers or know they are looking at yesterday's.
  • Greenhouses kill devices — heat, moisture, and dirt are the operating environment.
  • The order system is a legacy desktop package with a watched-folder import as its only integration point.

What had been tried before

A previous contractor delivered a web catalog that the office updated weekly with availability for reps to consult.
Weekly numbers in a daily business meant reps trusted the catalog less each week; greenhouses have no signal anyway, and it captured no orders.
The office experimented with scanning handwritten order sheets and correcting the recognition results before keying them in.
Cultivar codes defeated recognition often enough that correction took as long as retyping, and a misread quantity shipped the wrong order twice before the trial stopped.

What we proposed

We proposed an offline-first Flutter app that makes availability a first-class citizen: reps order against today's numbers, see substitution suggestions the moment a lot runs short, and work in greenhouses where gloves, glare, and dirt are the operating conditions. Orders export in the legacy package's import format to its watched folder, so the desktop system stays the record without a migration. Handsets are deliberately cheap and replaceable, with cloud backup doing the durability work fragile hardware cannot.

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

  • Replacing the legacy order packageIts replacement was a multi-year budget conversation the nursery could not have mid-season, and the watched folder lets the app deliver value without waiting for it.
  • Optical order sheets scanned and corrected at the officeRecognition errors on cultivar codes had already shipped wrong orders once; the failure mode was proven, and scanning moves transcription rather than ending it.
  • A cloud-only web portal requiring connectivityGreenhouses and rural garden centers are coverage gaps; reps needed the full catalog and order capture working with no signal, synced when they surfaced.

How the work ran

01Availability as a first-class citizen

The catalog is availability-aware: reps order against today's numbers with substitution suggestions when a lot runs short, so phone negotiations mostly disappear.

02Build for the greenhouse

Glove-friendly inputs, sunlight-readable contrast, and a device policy of cheap replaceable handsets with cloud backup.

03Respect the watched folder

Orders export in the legacy package's import format to its watched folder, making the desktop system's constraint a small bridge instead of a migration.

Delivered by the systems pod — engineer + automation specialist over 7 weeks, with working increments reviewed with the client every week.

The stack, and the reasoning

Flutter
One engineer plus an automation specialist had to cover iPhone and Android on cheap hardware before peak season; Flutter's single codebase and fast iteration fit the window.
Isar (offline store)
The availability catalog is large and changes daily; Isar's fast local queries kept category browsing instant on the low-end handsets reps actually carry.
Watched-folder bridge
The legacy package reads imports from a watched folder and nothing else; feeding it exactly and only that made the oldest constraint the least interesting part of the system.
Firebase App Distribution
Reps are not testers and the season does not wait for store review; direct distribution let fixes reach their handsets between Monday routes.
Sentry
Greenhouse devices fail in ways an office never sees; crash and error reports from the field told us about environment failures before reps phoned them in.

What went wrong

Obstacle

Reps' handsets mangled the special characters in plant names — apostrophes and accented cultivar codes corrupted between greenhouse capture and sync, and the watched-folder importer dropped those orders silently; the office found out from a garden center's missing shipment.

Handled: We added an encoding-normalization pass at capture, then routed anything that still failed into a quarantine queue a person reviews each morning instead of letting the import reject it silently; the confirmation report shows every order confirmed in, held for review, or flagged out by 8am.

Obstacle

The greenhouse environment won early: two pilot handsets quit in the first hot weeks — heat swelling and a moisture short — and the most senior rep, on a seniority-ordered rollout, hit the failures at peak season.

Handled: We moved hardware policy to cheap, swappable handsets with cloud backup and a car-cradle ordering flow for the hottest stops, and resequenced rollout by territory readiness rather than seniority.

How we worked together

Cadence
Twice-weekly calls before the season, then ride-alongs with reps on actual garden-center visits once the app was in their hands.
Client side
Three reps of varying seniority piloted; the inventory lead owned availability data; the office's keying staff validated the import bridge, and the operations manager owned the rollout.
Decisions
Availability presentation was settled with the inventory lead in the field; integration calls were gated by a validation report the operations manager reviewed before each release.
They provided
Daily availability feeds from their inventory process, a test install of the legacy package with its watched folder, rep handsets, and ride-along days during peak weeks.

What changed

The headline: all reps ordering in-app across the season, keyed into the legacy system via the automated bridgePaper orders → in-field app orders, read from Order-entry timestamps. A second check: order-substitution phone calls during peak weeks at −70%.

The office's peak-season transcription bench disappeared; orders arrive keyed and coded before the rep leaves the parking lot, and the legacy package imports them without a human between. Availability conversations moved from post-hoc apology to in-app substitution — garden centers choose the alternative from the same screen, so the negotiation happens once, with data. The most senior rep, last to adopt and loudest about it, became the one who shows the app to visiting buyers. Nobody misses the paper catalog, including the person who maintained it.

The result was read from Order-entry timestamps against the pre-engagement baseline over the stated window, with a guardrail check on order-substitution phone calls during peak weeks. Where platform-reported numbers and business outcomes differ, this record says which layer it is quoting.

What they own now

  • Signed release builds and the App Distribution pipeline under the nursery's Firebase project
  • Isar schema documentation and the offline sync behavior notes for future developers
  • Watched-folder bridge monitoring with the import validation report and alert settings
  • The device policy: handset specs, protective cases, and the swap-and-restore procedure
  • Sentry project access and a triage guide sized for the operations manager

What we would do differently

We would rollout region by region instead of by seniority — the most senior reps adopted last, and sequencing by seniority put the hardest skeptics in the same weeks as peak season.

Mobile AppsFlutter DevelopmentHorticultureFlutter

Next case study

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