All work

Mobile · React Native · Expo · Detox

Phlebotomist Field App

A production-grade mobile platform that replaced phone-based coordination for 20+ healthcare providers — reducing operational cycle times by 50% and onboarding 100+ field professionals.

50%

Cycle time reduction

100+

Field professionals

20+

Providers served

90%+

Test coverage

01 — Problem

Field ops ran entirely on phone calls

Before this app, phlebotomists managed their entire workday through phone calls and paper notes. Dispatchers manually called each technician to assign appointments, confirm arrivals, and track specimen shipments — creating cascading delays whenever a single handoff was missed.

There was a legacy React Native prototype but it was unmaintainable: a monolithic component tree with no reuse, bulk API calls that loaded the entire appointment history on every launch, and no real-time status updates. It needed a full rebuild — with a clear mental model for the field worker's actual workflow.

02 — Dashboard

Four numbers. Full situational awareness.

The dashboard was my proposal — the previous app opened directly to a calendar list. I wanted phlebotomists to feel in control of their day from the moment they open the app.

Home dashboard
Home dashboard
  • 4 entry points: Today's Upcoming, In Progress, Missed, and All Appointments — each is a tap-through shortcut, not just a label
  • Progress ring shows Successful / Total ratio, giving phlebotomists a sense of achievement and daily progress at a glance
  • Counts derived from filtered queries — no extra API calls, computed from the cached appointment list on mount
  • Bottom tab bar mirrors the same 3 main sections (Home, Calendar, Appointments) to reinforce navigation across multiple entry points and reduce the learning curve

03 — Calendar & Appointment Flow

From today's schedule to specimen shipped — one flow.

The calendar is the operational core of the app. Every step in fulfilling an appointment — viewing, navigating, collecting, and shipping — is reachable from here.

Calendar view

Calendar (Agenda)
Calendar (Agenda)
  • Uses react-native-calendar Agenda component — evaluated multiple libraries and this best matched our need for a time-grouped, day-scoped layout
  • Filters to today's active appointments only: in-progress and upcoming — reducing visual noise so phlebotomists aren't scrolling through completed or unrelated records during a busy shift
  • Appointments within 1 hour of each other are grouped into a continuous time block — each appointment remains its own card, but the left-side timestamps run together so a visible gap in the timeline immediately signals a break in the schedule
  • Per-day query architecture: calendar loads only the selected day's data, keeping memory usage flat regardless of history size

Appointment detail — map & instructions

Detail (WalkIn)
Detail (WalkIn)
Detail (Mobile + map)
Detail (Mobile + map)
Accession ID & instructions
Accession ID & instructions
Tube list & collection steps
Tube list & collection steps
  • Mobile appointments show a live map tracking the phlebotomist's current location and ETA to the patient's address — added post-launch to help field staff navigate without switching apps
  • Tapping the map deep-links to Apple Maps or Google Maps with the patient address pre-filled
  • "Share Location" toggle lets the patient see a similar live map on their confirmation page — real-time field location streamed via background location API
  • "See Instructions" expands the full tube list, collection protocol, and return shipping checklist fetched from the lab order — phlebotomists no longer need to reference a paper manual, and can get up to speed on newly added kits without any extra training
  • Accession ID is tappable — copies to clipboard for downstream scanning and data entry
  • Note field supports two modes: private note to self, or a message sent directly to the lab

Fulfill — photo upload & shipping

Fulfill checklist
Fulfill checklist
Upload sample photos
Upload sample photos
Photo picker
Photo picker
Collected ✓
Collected ✓
Scan barcode
Scan barcode
Upload package photo
Upload package photo
Shipped ✓
Shipped ✓
  • Fulfill flow is a two-stage checklist: upload sample photos first, then add shipping info — each stage gates the next
  • Photo upload caused repeated app crashes in early versions due to image size: iterated through multiple compression strategies (resize before upload, quality reduction, format conversion) until large-image uploads became stable
  • Shipping: phlebotomist can scan the FedEx barcode directly with the camera instead of typing — reduces input errors and speeds up the handoff step significantly
  • Status transitions are visual: Confirmed → Collected (teal) → Shipped (green badge) — color and label change on the detail card immediately after each upload
  • Each status change triggers a server update and a push notification to the ops team

04 — Appointments History

Full history with lab-facing search.

List with filters
List with filters
Status filter active
Status filter active

05 — Navigation & Profile

Multiple entry points. Minimal learning curve.

Side drawer
Side drawer
Profile
Profile
Settings
Settings

06 — Error Reporting

In-app bug reports for instant hotfixes.

Error Report screen
Error Report screen
  • Added after repeated delays in diagnosing field bugs — phlebotomists couldn't articulate errors over the phone clearly enough for developers to reproduce them
  • Submitting an error report sends a structured email to the dev team: description, optional video link, and up to 3 screenshot attachments
  • Direct feedback loop enabled same-day hotfixes for critical field issues without waiting for a support ticket cycle
  • Screenshot upload uses the same compression pipeline as the sample photo upload — no extra infrastructure needed

07 — Key Decisions

Engineering choices that shaped reliability

Per-day queries instead of bulk-loading

Why: The original app fetched all appointments on launch — causing 3–5s load times and excessive memory usage as history grew. Switching to per-day queries made the calendar instant regardless of total record count.

Tradeoff: Required a query param redesign on the API side and cache invalidation logic when appointments update intraday.

react-native-calendar Agenda over custom implementation

Why: Evaluated several calendar libraries against our display requirements (time-grouped, day-scoped, collapsible consecutive slots). Agenda matched our data shape best and reduced the custom rendering code needed.

Tradeoff: Library constraints meant the 'collapse consecutive slots' logic had to be implemented as a data transformation pre-render rather than a display-layer concern.

Multi-round image compression for sample photo uploads

Why: Early versions crashed on large photos from modern iPhone cameras. Iterating through resize → quality reduction → format conversion resolved stability without sacrificing image legibility for lab review.

Tradeoff: Compression adds ~300ms latency per photo — acceptable for the use case, and visually covered by a progress indicator.

In-app error reporting instead of third-party crash tools

Why: Standard crash tools like Sentry capture stack traces but field phlebotomists couldn't reliably reproduce bugs verbally. Structured in-app reports with screenshots gave enough context for same-day hotfixes.

Tradeoff: Manual submission means bugs only get reported when users notice them — silent failures still require monitoring.

08 — Testing Infrastructure

90%+ coverage built after shipping

The testing infrastructure was added after the core product shipped — not as an afterthought, but because meaningful coverage requires understanding where the real failure modes are. Building the app first revealed which flows were genuinely critical and hard to manually verify.

RNTL — component & integration tests

React Native Testing Library covers individual components and data flow — appointment rendering, status transitions, filter logic, and navigation state across the mobile app.

Detox — E2E on device

5+ end-to-end scenarios run on a real device simulator: full appointment fulfill flow, barcode scan, photo upload, and status update — the exact sequence a phlebotomist runs in the field.

Expo EAS — OTA updates without store review

The app ships via Expo EAS Build and over-the-air updates, bypassing App Store / Play Store review cycles. Critical fixes reach field phlebotomists the same day they're merged.

09 — Outcome

Real-time ops for 100+ field professionals

50%

Operational cycle time reduction

100+

Field professionals onboarded

20+

Healthcare providers served

A complete rebuild of an unmaintainable legacy app became the daily operational tool for 100+ field professionals across 20+ healthcare providers. Phone-based coordination was replaced by real-time mobile workflows — giving the ops team visibility into every appointment, collection, and shipment in the field.

Back to all workGlobal Patient Booking Platform