PBS Delivery — Handbook
verified: 2026-09-28 · against: the route tables in app/server.mjs and every app/routes-*.mjs, and the live demonstration at delivery.pascoesystems.co.uk (deployed 28 September 2026) · by: terminal
Live as a demonstration. delivery.pascoesystems.co.uk runs one demonstration organisation, ZZ DEMO Deliveries (demo): every customer, person, vehicle and job in it is fabricated. The rates it ships with are defaults a tenant edits, never a customer's real figures.
PBS Delivery is one job engine for every delivery, collection, exchange and hire. For each job it shows what is charged to the customer and — to the people allowed to see it — what it actually cost to run. This handbook has one section for every screen you can reach. Addresses are shown in code font; :id stands for the job, run, checklist or offer number in the address.
Roles. owner · admin · office · driver · customer · readonly. Office roles (owner, admin, office) see the whole menu: Dispatch · Requests · Quote · Jobs · Runs · Messages · Money · Equipment · Registers · People · Customers · Rates · Price list · Job types. A driver sees only My run and Jobs. Money is gated per person: values (what is charged) and costs (what it costs us) are separate permissions, an owner has both, and field roles can never be granted either — the database enforces that, not the screen.
Getting in
Help — /help
This handbook, inside the app. Every screen carries a ? in the top bar that opens this page at that screen's own section. Readable without signing in; it describes the screens and holds no records.
Sign in — /login
Email and password. A driver lands on My run; everyone else on Dispatch. Accounts are created by your administrator; there is no public sign-up. Help under the form opens this handbook without signing in.
Every page, sign-in included, carries Privacy and Terms at the foot. A demonstration organisation carries a Demonstration only notice at the top of every page, saying that every customer, person, vehicle, price and job in it is fabricated.
Sign out — /logout
The Sign out button in the header. Ends your session.
Health check — /healthz
Not a screen: answers whether the service is up. Used by monitoring.
The office day
Dispatch — /
The front page for office roles. Today and everything live — every job in progress with its status; Runs today — the rounds going out; Jobs worth a look before they are invoiced — jobs whose costing raised a warning (no rate-card rule for the type, priced below what it costs to run, nothing charged, or driver pay out of proportion), shown only to people who may see values; Equipment needing attention — vehicles and plant whose MOT, service, tax, insurance or LOLER is expired or due within 28 days. Price and margin columns appear only for people with those permissions.
Requests — /requests
Calls waiting — what customers have asked for that is not a job yet. Take a request records one: Customer, Job type, Date wanted, Pickup address, Postcode, what3words, What they asked for → Save request. On a waiting request, Make it a job (/requests/:id/convert) turns it into a booked job.
Quote — /quote
Price a job before booking it: Job type, Customer, Service level, Collect from (postcode), Deliver to (postcode), How many items, Weight each (kg) → Work it out. The answer shows The trip (the distance it worked out) and How the price is made up, line by line from the rate card. If you may see costs, it also shows What it costs us, and the margin — the estimated cost to run, the margin in money and as a share of the price, and the cost lines — worked by the same rate card as the price, so the two cannot disagree. No vehicle is on a quote yet, so the cost is driver time, mileage, tip fees and overheads; the vehicle's own running cost joins when one is put on the job. Someone who sees values but not costs gets the price alone. Book it in opens Book a job filled in from the quote — the job type, customer, service level and distance — and carries the quote's collection and delivery postcodes, its items and its time on the job, so the booked job is priced on the same things as the quote.
Jobs — /jobs
Every job, filterable by Reference or customer, Status and Job type. Book a job opens the booking form.
Book a job — /jobs/new
Job type, Customer, Date wanted, Priority, Service level, Distance (miles), Notes → Create job. The job is priced from the rate card as it is created. Opened from a quote, the form arrives filled in and the quote's stops and items go on the job as it is created.
One job — /jobs/:id
Everything about a job on one page:
- Before this goes out — the costing warnings on this job (the same ones the Dispatch card lists).
- Costing — Charged to the customer (price lines) and, if you may see costs, **What it
costs us with the margin. Recost this job** (/jobs/:id/cost) rebuilds both from the current rate card and measurements.
- Progress — the status steps; the buttons post to
/jobs/:id/status. - Measured — Distance (miles), Time on the job (minutes), Waiting (minutes), **Hire
days → Save measurements** (/jobs/:id/measure). What was actually done, against what was quoted.
- Stops — the collection and delivery points (Kind, Name, Address, Town), added
at /jobs/:id/stops; each has Mark done (/stops/:id/done).
- Items (or Animals, for a job type that moves livestock) — what is being moved, for job
types that carry items; lines are added at /jobs/:id/items.
- Vehicle, plant and crew — the resources assigned (
/jobs/:id/resources). - Checks to do — the checklists this job type requires, each with Open; a new one is
started by the form that posts to /jobs/:id/checklists (shown only to roles that may progress a job).
- Offer it out — put the job to drivers (
/jobs/:id/offer): Open for (minutes), **Note to
the driver**.
- Payment — record money taken on the job (
/jobs/:id/payments): Method, **Amount
taken, Reference → Record payment**.
/jobs/:id/notify— the action that queues the job's customer message for a given trigger
(booked, on its way, delivered…). It is called by the notification flow; there is no separate button for it on this page.
A checklist — /checklists/:id
The questions for one check (vehicle walk-round, loading, handover…), Signed by, → Save answers. A job with an unfinished required checklist shows it under Before this goes out.
Runs — /runs
The rounds: a day, a vehicle, a driver and an ordered list of stops.
One run — /runs/:id
The round and Stops in order, each with Done. Worth a look before this goes out flags capacity or distance problems. Plan it (/runs/:id/plan) sequences and times the round from Leaving the yard, Average speed (mph), Minutes at each stop and Road factor (crow-fly miles × this = road miles; 1.3 on Island lanes) → Sequence and time the round. A stop is completed at /runs/:id/stops/:stopId/done.
Messages — /notifications
Customer messages: what is waiting to go, Recent sends, and the Templates the messages are built from. Send everything waiting posts to /notifications/send. Nothing is sent automatically.
Money — /money
Cash a driver has taken with Confirm received (/payments/:id/confirm); Statements — choose Customer, From, To → Build statement (/statements); and How people pay, the payment methods in use.
Equipment — /resources
Vehicles and plant: Name, Kind, Category, Reg, Payload, £/mile, £/hour, £/day, Status, Compliance. Add equipment (/resources/new): Kind, name and details → Add.
Registers — /registers
The paperwork the operation must keep: Incidents and complaints, Vehicle checks, cleaning and defects, Consignment and transfer notes. Each is a record of what happened; none is a certificate.
People — /people
The crew: Name, Licences, Cost £/hr, Charge £/hr, Tickets. (Who may see values and costs is set on the person's account by the owner, not on this screen.)
Customers — /customers
The customer list: Name, Account, Rate card, Jobs, Terms.
Rate cards — /rates
Your tariff, and the only place prices come from. Lists every card with its VAT rate and how many rules it carries; the default card is marked. Owners and admins also get New card. Shipped values are market-benchmark placeholders, not Pascoe's — flagged source: market-benchmark-2026-09 (D1).
Three cards are set up for you, because the trade charges three different ways and a blank tariff is no help: Retail same-day (a collection fee plus mileage — the default), Subcontract courier exchange (the job rate starts at zero, because an exchange job is worth whatever you accepted; the cost stack underneath tells you whether it was worth taking), and Man and van, hourly (with a minimum set to two hours of the hourly rate, so a short job cannot quote below what the day costs).
Every figure tells you where it came from. Hover any rate and it says whose number it is and when it was set. Two are marked not yet confirmed and are shown differently until they are: the 55p a mile and the National Living Wage floor. The 10,000-mile step and the 25p after it follow the shape of the HMRC mileage allowance, but 55p is Pascoe's own charge, not an HMRC figure, and the app does not pretend otherwise.
Mileage tapers across the tax year, not per job. The first 10,000 miles in a tax year are charged at the higher rate and everything after at the lower one, so a job that crosses the line is split and shows both figures on the quote. A job on its own is never 10,000 miles, which is why the count is kept for the year rather than the trip.
If an hourly rate is below the National Living Wage, the app says so and leaves it alone. It tells you how much short, in money, and shows the floor it compared against — the figure lives in the app's settings, with its source, rather than being written into this handbook where it would go stale. It does not quietly put the rate up: that would hide a typo and make the quote disagree with the card it was built from.
One rate card — /rates/:id
The card's rules in two tables: What the customer pays and What it costs us. The cost table is only shown to someone allowed to see costs, so an office user reads the customer side alone. Each row shows the invoice line, how it is charged, the rate, any band or free allowance, and what it applies to.
Every rule that matches a job is applied — they add up, they do not replace one another. That is how a base charge and a mileage charge work together. It is also the trap: a second weekend surcharge does not overwrite the first, it is added to it.
- Add a rule (
/rates/:id/rules) — the invoice line, the side, how it is charged, the rate,
and optionally a band, a free allowance, what it applies to, and minimum/maximum limits. The screen refuses to save a rule that would be charged on top of one already on the card, names the rule it clashes with, and keeps what you typed so nothing is lost. An unrecognised basis is refused outright rather than quietly changed to something else.
- Remove (
/rates/:id/rules/:ruleId/delete) — takes a rule off the card, after a confirmation.
Reading a card needs rates:read; changing one needs rates:write (owner or admin). Cost and driver-pay rules can only be added by someone who can see costs.
Price list — /prices
What a customer is quoted, built from the rates; Refresh from the job type, vehicles and checklists rebuilds it. Also lists the Checklists each job type requires.
Job types — /types
Delivery, collection, exchange, hire and any custom type: Type, Code, Direction, Switched on, Jobs, and what each carries (items, weight, volume, animals, hire days).
The driver's day
My run — /me
Today's round in stop order, each with Mark done; Checks to do before setting off; and Work going spare — jobs offered out, with Take it (/offers/:id/accept) or Pass (/offers/:id/decline). /me/location is where a driver's phone can post its position so the office and the customer's tracking page can show where the van is; nothing on the current pages posts to it by itself. A driver sees no prices or costs anywhere.
What a customer sees
Tracking — /track/:token
No sign-in; the link is sent in the customer's message. Progress of their job, Where it is (the van's last reported position), Proof of delivery once signed, and History. The token is the only key to it — the page shows one job and nothing else.
What this does not do
- It does not take card payments. It records what was taken and builds statements.
- It does not send messages by itself; someone presses Send everything waiting.
- It does not certify a vehicle, a driver or a load. Registers are records, not approvals.