Case study · Howdy Dispatch · 2025-2026

Howdy Dispatch

Live SaaS with a dispatcher web HQ, a driver iOS app on the App Store, photo proof of pickup and delivery, AI rate-confirmation intake, and Stripe-billed subscriptions.

Howdy Dispatch hero
Fig. 01 · Howdy Dispatch

Role

Studio · build + ship

Status

Live

Year

2025-2026

Surfaces

Web + iOS

Live

In production

The problem

Small trucking companies run dispatch on spreadsheets, group texts, and phone calls. Bills of lading get lost, nobody can see where a truck is, and every broker rate confirmation gets retyped by hand. Enterprise TMS platforms solve that at a price and a setup burden a small fleet will not carry. Howdy Dispatch is the dispatch platform for small fleets, built on both sides: a web HQ where dispatchers create and assign loads, and an iOS app where drivers work the load with photos, GPS, and one-tap status all the way to delivery. It is multi-tenant from day one, so every fleet gets its own data isolation, its own user limits, and its own billing.

What we built

  • Dispatcher HQ: loads from scratch or from a broker rate-conf PDF, live map, per-load documents
  • Driver iOS app on the App Store, with push, background GPS, and photo proof of pickup and delivery
  • Shift clock that gates GPS, HOS self-report (not a certified ELD), and detention timers
  • Mid-load incident reporting with photo evidence, pushed to every dispatcher
  • Lumper receipt capture with per-load totals by who paid
  • Customer address book with billing and shipping defaults and Google Places autocomplete
  • Stripe subscription tiers ($149-$1,990/mo) with truck, driver, and dispatcher limits
  • Platform admin dashboard and a full audit trail on every job, driver, and photo

How it is built

The backend is FastAPI with async SQLAlchemy and Postgres on Cloud Run, and the HQ dashboard is Next.js on Vercel. The driver app is the same web codebase wrapped in Capacitor and pointed at the live dashboard, with native plugins for the camera, background location, push notifications, and sign-in, so drivers get a real iOS app that still updates with every web deploy.

Every tenant-scoped row carries a company ID, every read and write filters on it, and the platform admin router is the only code allowed to cross that line. Uploads skip the API entirely: driver photos and broker PDFs go straight to Cloud Storage on short-lived signed URLs, the backend records the document only once the upload is confirmed, and photos are compressed on the phone first because drivers upload over LTE from a loading dock.

One AI feature, on purpose

The AI we shipped is narrow. A dispatcher drops in a broker rate confirmation PDF, Gemini on Vertex AI extracts the customer, origin, destination, mileage, rate, pickup and delivery times, and broker contact, and the backend matches the customer, driver, and truck against the fleet’s own records and validates both addresses. The dispatcher reviews the pre-filled load and confirms it, which turns five to ten minutes of typing into about twenty seconds of review.

The confirm step sends only the dispatcher’s edits. The server merges them against the extraction it stored, so the browser is never trusted for AI values, and the audit log keeps the difference between what the AI read and what was saved. It does not make routing or load-acceptance decisions; the dispatcher and driver stay the experts. The rest of the product, from the live map to lumper receipts, is on the Howdy Dispatch features page.

What was hard

We run no queue. The rate confirmation parse is a background task inside the Cloud Run container, which meant turning off CPU throttling so the task can finish after the response returns. The first version raced: the worker’s read beat the request’s commit and the job sat in parsing, so the parse record is now committed in its own session before the worker is scheduled.

Background GPS had to survive a locked screen without pinging dispatch from a driver who is off the clock, so tracking is gated on a shift clock with start, break, resume, and end. Location pings that fail in a dead zone queue on the phone, and status changes taken with no signal wait in an offline outbox that drains on reconnect. Raw pings are deleted after 30 days while per-job GPS totals stay on the load.

Keeping the marketing honest took a rule, not a reminder. The roadmap’s Live section is the claim gate, so a feature is not advertised until it is listed there. Pricing stays in fixed truck bundles, and we wrote up how dispatch software pricing works for a small fleet deciding what to pay.

Numbers that matter

Status

Live

App Store + web

Plans

$149-$1,990/mo

1-10+ trucks

Surfaces

HQ + Driver iOS

cross-platform

Tenant model

Multi-tenant

isolated per fleet

Stack

Frontend
Next.js 16React 19TailwindSWR
Backend
FastAPIPython 3.12Alembic migrations
AI / ML
Vertex AI Gemini (rate-conf PDF parsing)
Data
PostgreSQL (multi-tenant)Cloud Storage
Infra
Cloud RunCapacitor iOSFirebase Auth + FCMStripe BillingMapbox + Google Places

What we learned

Build both sides or the board goes stale. A dispatcher screen without a driver app still depends on a phone call to find out whether the load was picked up.

One AI feature that removes real typing beats a page of AI promises. Everything else on the AI list stays labeled as coming later until it ships.

No queue was the right call at this size, but it came with rules: always-on CPU, a separate session for the parse record, and a warm instance so driver location pings do not wait on a cold start.

Pricing maps to truck count in fixed bundles, because truck count is the number a small carrier already knows about its own business.

Have something that looks like this?

Tell us what is broken. We’ll tell you what the first week looks like.

Next case study →

RunLink