Field services

Collection confirmation for a waste company

A waste collection company runs fixed routes. Drivers confirm each collection with a timestamp and photograph anything that could not be collected. Customers can see when their bin was emptied, and missed collections are flagged for a return visit.

Automatically generated draft

Written by machine against our own engineering playbook. The company is invented; the decisions are the ones we would make on a real build. A reviewed blueprint goes further — nine sections, agreed line by line, and it is what the build is tested against.

Section 01 · What has to work

Drivers on erratic mobile connections must be able to log completed and missed stops offline so that customers see accurate collection timestamps without blocking the route.

Section 03 · Screens

Every screen, and what it is for.

  • ›Route List — Driver views today's assigned stops; tapping starts navigation. Instant map load.
  • ›Stop Detail — Driver confirms collection or snaps exception photo. Instant camera open.
  • ›Exception Logger — Driver selects reason code for uncollected bins. Instant dropdown render.
  • ›Customer Dashboard — Customer views real-time bin status and collection history. Instant timeline update.
  • ›Dispatcher Board — Manager views all route progress and flags. Instant status color-coding.

Anything not on this list is not in version one. That is what keeps a fixed price fixed.

Section 04 · The data model

What it stores, and who can read a row.

Route

id uuid, driver_id uuid, scheduled_date date, status enum(draft, active, completed), created_at timestamptz

Access · Assigned driver can read their active routes; dispatchers read all routes.

Stop

id uuid, route_id uuid, customer_id uuid, sequence_order int, status enum(pending, collected, missed), collected_at timestamptz, notes text

Access · Driver assigned to route reads stops; customer reads their own household stops.

ExceptionPhoto

id uuid, stop_id uuid, storage_path text, reason_code enum(blocked, contaminated, overflow), captured_at timestamptz

Access · Driver creates; dispatchers and the affected customer read the photo record.

Those access rules belong in the database, not in the screens. Someone who edits the address bar still cannot read a row that is not theirs — and the test that proves it blocks delivery if it fails.

Section 05 · States

pending → collected | missed(reason) → rescheduled → collected

Most scope arguments three weeks into a build are really arguments about a state nobody named at the start.

Section 06 · Where this breaks

What bites products like this one.

Cellular dead zones prevent photo uploads, stalling the driver's ability to complete stops.

Store photos and timestamps in local SQLite storage and sync via background worker when signal returns.

Large uncompressed mobile photos exhaust device storage and choke slow upload bandwidth.

Client-side compression resize to 1080p WebP before queueing for asynchronous background network upload.

Section 08 · Deliberately left out

What version one does not do.

  • ×Automatic customer push notifications for missed pickups — adds external webhook complexity, defer to v2 after core offline sync is stable.
  • ×Driver-to-dispatcher live chat — increases scope and connectivity overhead; defer to v2, rely on stop notes for v1.

This is the section that protects the date, and the only place in the document where somebody says no. It is also why clients trust the rest of it.

Still open

What we would ask before quoting.

  • What is the exact list of failure reason codes required for uncollected bins?
  • How should the system handle a stop marked collected by mistake after the truck has moved on?

Half of this already exists

Fieldline

The field half of this is a solved problem: routes assigned, work captured with no signal and synced later, and an alert when nobody shows up.

It is one of our pre-built products: the code is handed over to you, adapted to your own wording and rules, and the rest of the specification above is built on top of it rather than from scratch.

Your product, not this one

Get this written for what you are actually building.

Describe it in a sentence and the generator returns the same sections for your own product. Free, no email, nothing saved to a list.

Next step

Find out if your idea fits in 10 working days.

Tell us what you want to build. We reply the same day with a straight yes, no, or here is what we would cut.

NDA available on request