Demonstration. Made-up company and data — every customer, person, vehicle, price and job here is fabricated; no real business's data is in it.
PBS Delivery?

PBS Delivery — Handbook

Live as a demonstration. delivery.pascoesystems.co.uk runs one demonstration organisation, Example 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 menu: Dispatch · Requests · Quote · Jobs · Runs · Calendar · Repeating jobs · Messages · Feedback · Money · Equipment · Registers · People · Customers · Rates · Price list · Job types · Sign-in security; owners and administrators also Your plan and API keys, and Driver pay shows for someone who may see costs. On a screen narrower than a laptop's (a tablet, a phone held either way) the menu sits behind Menu at the top, with who you are signed in as. A driver sees only My run, Jobs and Sign-in security. A readonly user is offered only the pages it may open: Dispatch · Requests · Jobs · Repeating jobs · Messages · Feedback · Equipment · Registers · Sign-in security - the menu follows the same permission each page checks. 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.

Lists and records. A record opened from a list (a job, a round, a rate card, a customer) opens on its own screen with ← and the list's name at the top (← Jobs, ← Runs); the phone's own Back goes to the list where you were.


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. Until PBS Delivery takes new accounts, they are created by your administrator. Create an account and Help sit under the form, with Forgot your password?; Help opens this handbook without signing in. For a login with two-step sign-in on, the right password leads to Your code instead (below).

Your code — /login/code

After the right password, for a login with two-step sign-in on: the 6-digit code from your authenticator app → Sign in. Lost your phone? Type one of your recovery codes instead - each works once, and Sign-in security then says how many are left. A wrong code says how many tries are left; after 10 minutes or 5 wrong codes, nothing is signed in and you sign in again.

Sign-in security — /account/security

In everyone's menu. Two-step sign-in asks, after your password, for a code from an authenticator app on your phone, so a stolen password alone does not get in. Set up two-step sign-in (/account/2fa/start) shows a key to type into the app (Google Authenticator, Microsoft Authenticator, 1Password and others; on a phone, a link opens it in the app); type the code it shows → Switch it on (/account/2fa/confirm), and ten recovery codes are shown once - keep them safe. Not now (/account/2fa/cancel) leaves it off. While it is on: New recovery codes (/account/2fa/recovery, with a code from the app) replaces them all, and Switch two-step off (/account/2fa/off) needs your password and a code. The key is kept sealed on the server, never in plain, and only a fingerprint of each recovery code is kept. Owners and administrators also see Your team's two-step sign-in - who has it on - and can switch it off for someone who has lost their phone and their recovery codes (/account/2fa/off-for/:id, after a confirmation); that person signs in with their password and can set it up again.

Every page, sign-in included, carries Privacy and Terms at the foot. A demonstration organisation carries a slim Demonstration strip at the top of every page — a made-up company and data; on a wider screen it adds that every customer, person, vehicle, price and job in it is fabricated. A company that is not a demonstration never carries it.

Forgot your password — /forgot

Give the email address you sign in with and press Email me a link. The screen gives the same answer whatever address is typed, so it never says who has a login. If the address has one, an email from PBS Delivery brings a link to set a new password. The link works once and for 30 minutes. An address can ask three times an hour, and one place ten times. A made-up demonstration address is never emailed.

Set a new password — /reset

The page the emailed link opens: type a new password of 8 characters or more twice and press Set the new password. Setting it signs that login out everywhere it was signed in. A link already used or run out says so and offers a new one.

Create an account — /signup

Until PBS Delivery takes new accounts this page says Accounts open soon and saves nothing. Once it does, you give your business's name, your name, your email and a password; you get your own empty account and the screen says it is waiting for approval. You can sign in once it has been approved.

Approvals — /approvals

For Pascoe Business Systems only — to everyone else this page does not exist. It lists each new company Waiting (company, owner, email, when it asked) with Approve (/approvals/:id/approve), which lets that owner sign in to their own, empty account; and Approved recently, with when and by whom. While new accounts are switched off it says so and lists nothing.

For the demonstration company's owner only - to everyone else this page does not exist. Make the link (who it is for, and how many devices it may open on - 5 unless you change it) or Make a public link (no end date, for a website): the link is shown once, to copy. Each link lists its devices (phone, tablet or computer, the system and browser, and the rough place) with the pages opened on each, kept 90 days; Extend 14 days or Switch off. For each new device on a named link you are emailed the time, the device, the rough town and the network provider, a line when the network looks like a VPN or a data centre, and two links - Pause link and Block this network - each opening a page that asks before it does anything. A link pauses itself if an automated client opens it, if it is opened on more devices than it allows, if it asks for server paths no screen uses, or if it is used far faster than a person uses it; you are emailed why. Pause / Resume on each link do the same by hand, and Blocked networks lists every network blocked from demo links for 30 days, with Un-block; real accounts are never affected. The website's public link is never paused by a visitor - that visitor alone is refused.

A demo link — /demo/:token

Opens the demonstration company with no password, as an office login that can change nothing: every save says Demo: not saved, and a strip under the banner says it is a read-only demo, with End demo. Someone already signed in is asked first, because opening the demo signs them out on that browser. The first time a link opens on a device it shows its terms - the demonstration is confidential; screenshots, screen recordings, copying and sharing are not permitted; every screen is marked with their name; activity on the link is logged for security - with I agree — open the demo; nothing opens until they agree. Every demo page carries a faint diagonal mark, for example "Demo for Alex · 15 Oct 2026 · Confidential · PBS", and loads /demo-protect.js, which stops text being selected, dragged or copied outside the boxes they type in, turns off the right-click menu, and covers the screen with "Screenshots aren't permitted in this demo." when Print Screen is pressed or the window loses focus, until it has focus again; printing prints only "Printing is switched off in this demonstration." A web page cannot actually stop a screenshot or a phone camera - the mark is what traces one back. A link opens on a limited number of devices; past that, it says so.

Demo ended — /demo/ended

Where a demo visitor lands when the link has been switched off or has reached its end date, or after End demo - or, when it has been paused, with the words "This demo link has been paused. If that's a mistake, please contact Jarrad Pascoe."

The owner's one-tap page — /demo-owner

Where Pause link / Block this network in the new-device email land: it says what will happen and does it only when its button is pressed. It works without signing in - the link in the email is signed and lasts 14 days.

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

How a page opens. Every office page opens on its figures, its main list and its one form; each other section is folded to its heading and a count - tap the heading to open it. What you open stays open on that page on that device, and a link to a section opens it. The job page folds the same way around Progress; the driver's screens are never folded.

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; each name opens its equipment record. Price and margin columns appear only for people with those permissions. Each reference opens its job and, for office roles, each customer opens their customer. Each figure at the top opens the jobs behind it: Live jobs opens Jobs filtered to live (booked to arrived), Completed the completed jobs, and Value of jobs, last 7 days, Cost to run it and Profit the jobs dated in the last 7 days that are not cancelled, with their value, cost and profit added up - the same figures as the tiles. The value counts every such job, invoiced or not.

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, Access (gate code, dogs, where to go), What they asked for → Save request. On a waiting request, Make it a job (/requests/:id/convert) turns it into a booked job: the pickup becomes its first stop, carrying the access notes and the what3words address in the stop's notes, which the driver sees on the stop. Each reference opens its request, and each customer their customer. Each request's state is in words: waiting, quoted (waiting for the customer), accepted by the customer (with the day), booked in, made a job, declined or cancelled. A quote the customer accepted keeps its price on the job it becomes: the job's notes say "Quoted £… + VAT and accepted by the customer on …" with the request's reference.

One request — /requests/:id

What they asked for (the customer, job type, service level, date and window wanted, where to collect from, its what3words address - which opens what3words.com - access, quantity, the quoted total for the roles that see values, and notes); its Lines; and the Jobs made from it, each opening its job. The customer opens their customer for office roles.

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) and, for a job type that goes by the pallet, How many pallets → 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 pallets) and its time on the job, so the booked job is priced on the same things as the quote. Send it to the customer (under a priced quote): choose the Customer and, if you like, the Day wanted → Send the quote (/quote/send). The price is worked out again on the server from the same things - never taken from the page - and the quote is kept on Requests as quoted, waiting for the customer. The page shows their link once; it works for 14 days without a login. If the customer has an email address the link is emailed to them from your company's name ("… via PBS Delivery") and the page says so only when the email service accepted it; otherwise it says why not and you pass the link on yourself. A demonstration company emails nobody but the test inbox.

The customer's quote — /q/:token

What the customer opens from the link, with no login: your company's name, who it is for and the reference, what it is, the price + VAT and what it is made up of. Accept this quote (/q/:token/accept) tells you to go ahead and charges nothing - the request on Requests then reads accepted by the customer, ready for Make it a job. A link that has run out says so and asks them to contact you; one that has been made up or changed opens nothing.

Jobs — /jobs

Every job, filterable by Reference or customer, Status and Job type. The newest ten show; Show more adds ten, keeping the filters, and the heading counts every job found. Book a job opens the booking form.

Bring in orders — /jobs/import

Bring in orders on Jobs (whoever may book jobs): a day of orders from a spreadsheet, or a Shopify orders export (Orders > Export), becomes a day of delivery jobs. Choose which of your customers the orders are for (the shop you deliver for), the type of job and the day to deliver (used when the file has no Date), then give the file (or paste it) and Check the orders. Every order is listed - its number, who it goes to, the postcode, the day, how many lines - with ready or what to put right in words: no one to deliver to, a postcode that is not a UK postcode, a quantity that is not a number, no day, or already brought in as a job made from the same order for that customer. Nothing is made until every order is ready; then Make N jobs makes them all, booked, each with a drop at the person it goes to, its lines, and the order number kept on the job (or none, if anything changed since the check). PBS's layout: Order, Deliver to, Address, Town, Postcode, Phone, Item, Quantity, Date (optional), Notes (optional) - one row a line, rows with the same Order are one order. A Shopify export is read by its own headings (Name, Shipping Name, Shipping Address1, Shipping City, Shipping Zip, Shipping Phone, Lineitem name, Lineitem quantity, Notes). Up to 500 orders a file. No email is sent to the people in the file.

From your farm shop — /jobs/from-shop

For a company whose firm also runs PBS Farm Shop: From your farm shop (on Bring in orders) lists the shop's orders with a delivery date, from a week ago on - the day, the shop's order number (ORD-0042), the customer and town, the lines - and what became of each. Bring in (/jobs/from-shop/:id) makes the order a booked Farm shop job (your first job type if you have none of that kind), costed like any other, with one drop at the shop customer's address, the order's lines, the shop's order as its own reference and its history naming the order and who brought it in; pressing it again shows the same job. The first time a shop customer comes in, choose which of your customers they are, or New customer made from the shop's details (if you may add customers); that choice is kept on the one customer record the two products share, so their next orders come straight in - customers are never matched by name. An order whose customer the shop has no address for says so and waits. The shop's own order then shows the job's reference and where it stands. Until the database has the link to the farm shop, the page says so and offers nothing.

From your farm — /jobs/from-farm

For a company whose firm also keeps its animals in PBS Livestock: From your farm (on Bring in orders) lists the farm's movements on and off the holding, from a week ago on - the day, which way and why, the other keeper (and their CPH), the animals by ear tag - and what became of each. The farm is the customer: the first time, choose which of your customers it is, or New customer named after the farm (Link the farm, /jobs/from-farm/:id); the link is kept on the one customer record the two products share, never by name. The farm's yard is that customer's first site - add it on the customer's page if it has none. Then Bring in makes the movement a booked Livestock job: off the holding, collect at the yard and deliver to the other keeper's address; onto it, the other way round; each animal a line with its ear tag; the movement as the job's own reference, so pressing it again shows the same job. A movement with no address for the other keeper says so and waits. Nothing is reported to BCMS or LIS from here. The movement's page in Livestock then shows the job.

Book a job — /jobs/new

Job type, Customer (a customer not on file yet: choose + New customer… and type the name - they are made with the job, 12 October 2026), Date wanted, Time wanted (optional, UK time - a card's out-of-hours and weekend charges are judged on it), Priority, Service level, Distance (miles), Email for updates (optional — where this job's messages go; left blank, the customer's account email), 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. It opens on Progress; every other section is folded to its heading and a one-line summary (the price, the miles and hours, "1 of 2 done", how many assigned) and opens with a tap. The sections you open stay open for that job on that device.

costs us with the margin. Recost this job** (/jobs/:id/cost) rebuilds both from the current rate card and measurements.

booked, the office still puts it on the day (scheduled); after that the job moves forward only as the driver finishes each step (Loading, On the way, Arrived — see A job, step by step), and Progress shows each finished step on one line, such as "Loaded · all 3 lines · Van 1 DEMO 01 · 10:42", and which step the driver is on. Cancelled and failed stay with the office under Problem, or a different step; they ask you to confirm first, and the job is kept on record either way — nothing is deleted. Take the job back a step (/jobs/:id/steps/back) asks why and keeps the step, struck through, with the reason. A completed job links to Jobs ready to invoice.

days → Save measurements** (/jobs/:id/measure). What was actually done, against what was quoted.

at /jobs/:id/stops. The first stop not yet done has Mark done (/stops/:id/done); the ones after it get theirs in turn. Once a driver has taken proof at the door, Proof of delivery under the stops shows who signed, when, the signature and the photo.

types that carry items; lines are added at /jobs/:id/items.

Open; its summary says how many are complete, or how many are holding the job. They are put on the job by themselves: when it is booked, when a vehicle goes on it, when its page opens, and before it is scheduled, loaded or signed off. Refresh from the job type, vehicles and customer (/jobs/:id/checklists, shown only to roles that may progress a job) does the same at once. A required pre-start or vehicle walk-round check holds the job in the yard; a required pre-finish or end-of-day vehicle check stops it being signed off.

(minutes), Note to the driver**.

taken, Reference → Record payment**.

(£) → Add (/jobs/:id/pass-through). It goes on the price and on the cost alike, so the margin does not move, and no percentage surcharge or driver's percentage is worked on it; it is part of the job's price on a statement. Remove** (/jobs/:id/pass-through/:ptId/remove) keeps it on record, struck through, and the job is costed again.

delivered…) without sending it. Booked, completed and failed send their messages by themselves when the job reaches them (see Messages); there is no separate button for this on the 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. New run (/runs, owners, admins and office): Name, Date, Driver, Vehicle → Make the run; you are taken to the new round to put stops on it.

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.

Breaks on the round: Add a break - when it starts (UK time) and how long (5 to 180 minutes); as many as the day needs (/runs/:id/breaks), each with Take off (/runs/:id/breaks/:breakId/remove). Plan it times every door with them: a break that starts by the time the van reaches the next door is taken first, and every time after it moves on; adding or taking one off re-times the round in its present order. A driver can have more than one round in a day: My run shows the one on the road, otherwise the day's first, with its breaks and how many more rounds follow it today.

Change the order of Stops in order by hand: drag a stop still to do to where it should go and Save this order, or use Up and Down on it (/runs/:id/order); the round is re-timed in that order - from the yard before it starts, from the van's last position once it has. A stop already done keeps its place. On a round that is out (issued or under way) with two or more stops still to do, Re-plan the rest from where the van is (/runs/:id/replan-rest) puts them in the shortest order from the van's last position (else the last stop done) and re-times them. Whenever a round is put in order, a job's drop, tip or return comes after its own collection (and weigh); an order by hand that breaks that is refused, saying which job.

Add to this round lists the stops still to do on booked and scheduled jobs that are not on a round yet; tick them → Put the ticked stops on this round (/runs/:id/stops). A booked job put on a round becomes scheduled, and the round is put in order and timed (a postcode is looked up to place it on the map). Issue this round to … (/runs/:id/issue) — once it has a driver and at least one stop — sends it to the driver's phone. When the driver has started it, The round shows the van where their phone last said it was.

Move… on a stop still to do (for whoever may change rounds, while the round is planned, issued or under way) opens Move a job to another round, below.

Cancel this round (/runs/:id/cancel), at the foot of a round not yet started with no stop done, for whoever may change rounds: its stops come off it, back to be put on another round, and a job left on no round goes from scheduled back to booked (its history says which round it came off). The round is kept on record, marked cancelled, and leaves the driver's phone; Runs today on the dashboard and the Calendar leave it out. A round already started, or with a stop done, is finished by its driver instead.

Calendar — /calendar

A week, Monday to Sunday: each day's rounds (name, driver, how many stops and how many done, and where the round is) and the jobs wanted that day that are not on a round yet - N not on a round, each opening its job. Week before and Week after move a week; This week comes back; today is marked. Every round opens its own page. Read only: rounds are made, and jobs put on them, on Runs. Cancelled rounds and jobs are left out. Not for drivers (they see My run).

Messages with the customer — /jobs/:id/messages

On the job page (Messages with the customer) and on the driver's job (a fold under Problem, on My run and the job's step): every message with the customer about this job, oldest first, and Send to the customer for whoever moves jobs on (owners, admins, office and drivers - not a read-only login). The customer is emailed it with their tracking link and answers on that page. Each message the firm sent says whether it was emailed, not emailed (with why - no address, the customer asked for no messages, or a demonstration company) or whether the email failed; it is on their tracking page either way. When the customer wrote last the card stays open and says waiting for us (the driver's fold opens by itself, new from the customer). Not on a cancelled job. Messages are kept as written; erasing a customer's details clears their words.

Age check at the door — /jobs/:id/age-check

On a job that carries something age-restricted (drink, knives, solvents): Over 18 (ID from anyone who may be under 18) or Challenge 25 (ID from anyone who looks under 25; hand over only to 18 or over) → Save; the job shows the check, and its history says who set or took it off. The driver's Complete then cannot be pressed through without the ID they were shown (see A job, step by step). Which IDs your business takes is your own age-verification policy: this records what the driver saw; it certifies nothing.

Parcel labels — /jobs/:id/labels

Parcel labels on a job: say how many parcels (it starts at the number of lines on the job) and Print the labels - one label a parcel, 100 x 150 mm (the usual parcel label size), each with your company's name, Parcel n of N, a square code and the same code in words (the job's reference, then n-N), and who it is for. The card says how many parcels have been scanned at each stop so far, and each scan is in the job's History.

Move a job to another round — /runs/:id/stops/:stopId/move

Sized for a phone. The job and where the stop is, which round it is on now, and the other rounds still open that day, each by its driver, van and number of stops → Move it. All of that job's stops on the round move together - a collection and its delivery are never split between two vans - to the end of the other round; both rounds keep their order and are re-timed, and the job's history says who moved it from which round to which. It is refused, with the reason and nothing changed, once any of the job's stops on the round is done (the goods are on that van), or when the other round is on another day, finished or cancelled.

Repeating jobs — /repeats

Jobs the office repeats on set days - the same customer, stops, time windows, load and rate card every Monday and Thursday, or every two weeks. A repeat is started on a job's own page: Repeat this job (/jobs/:id/repeat) - tick the days, every how many weeks (1 to 8), From and, if it ends, To → Repeat it. Each repeat is a booked job of its own, made four weeks ahead and topped up every morning; the job it copies stays as it is, and changing that job changes the ones booked from then on. A booked, done or invoiced job can be repeated (not a draft, a quote or a cancelled one), and one with no stops cannot. This list shows each series - the job it repeats, the customer, the pattern in words, the next day and how many jobs it has made - and each opens its page.

One repeating job — /repeats/:id

The pattern in words, whether it is still repeating, the job it copies, and Its jobs, each opening its job (and saying if it is on a round). Book ahead now (/repeats/:id/book-ahead) books any day in the next four weeks not yet booked - the morning run does the same. Stop repeating (/repeats/:id/stop) books nothing more, keeps the reason on record and can also cancel the jobs booked ahead that are on no round; a job already on a round, or under way, is never cancelled here.

Customer feedback — /feedback

What customers said on their tracking page once their job was done: 1 to 5 and a comment, once per job, shown as they gave it - nobody here can change an answer. Average, last 90 days, Answers, last 90 days and how many were 1 or 2 out of 5, then every answer, newest first, each opening its job. A job's own page shows its answer under Customer feedback, or that there is none yet and how the customer is asked. The done email carries the link: unless your own wording already places {{feedback_url}}, it ends "How did we do? Tell us in one tap" with the link (email only; a text stays as you wrote it).

Messages — /notifications

Customer messages. When a job is booked, completed or failed, its customer is emailed by itself — from your company's name — using the message set up for that milestone, with the tracking link. When it is put on a round (on the round), when the drop before it on the same round is done (nearly there, with the expected time) and when the driver presses I've arrived (arrived), the customer is emailed too - in your own words if you have a message for that milestone, otherwise in the standard words, signed with your company's name. Which messages go by themselves lists all eight milestones, when each goes and whether it is on; the owner (or an admin) switches each one off or on (/notifications/milestones/:milestone), and a milestone switched off sends nothing for any job from then on. Payment due goes when the office builds a statement: the customer is emailed once, at the statement's email address, with its reference, how many jobs, the total with VAT and the date it is due by their payment terms. When the driver finishes Loading, the customer is emailed that it is on its way: the driver's first name, the vehicle, a half-hour window around the expected time, your phone number and the tracking link — once per job. On its way on this page shows those words; the owner (or an admin) sets Your phone number, for customers → Save the phone number (/settings/company-phone), and with no number the line about calling you is left out. When the driver completes a drop, the customer is emailed the proof of delivery as a PDF, with the signature; the job's history says whether it was sent. Each message is kept with what it said, to whom and when, and its status says what really happened: Sent (the email service accepted it, with the time), Waiting, Failed (with the reason), or Not sent with the reason — no email address for the job, text messages not switched on, or a demonstration company, which never emails a made-up address. What each message says lists the messages; words in double braces are filled in from the job. Each message under Recent opens its own page (/notifications/:id): what happened to it (status, when queued and sent, and why not), how and to whom, the job it is about, and the full text it said. If anything is waiting, Send the waiting messages now posts to /notifications/send.

Money — /money

Jobs ready to invoice at the top lists what the drivers have completed. Each statement's reference opens the statement, and each line of How people pay opens the payments behind it. Cash a driver has taken (entered by the driver at the drop) with Confirm received (/payments/:id/confirm); Statements — choose Customer, From, To → Build statement (/statements) - the customer is emailed that payment is due, unless that message is switched off on Customer messages; and How people pay, the payment methods in use.

Each statement has CSV for Xero (/statements/:id/xero.csv) and CSV for QuickBooks (/statements/:id/quickbooks.csv) under For your accounts: your accounts package's own sales-invoice import file, one row per job, with UK dates and its UK VAT names. It imports as one invoice, numbered with the statement's reference, for the statement total — the rows always add up to it, because the statement's VAT is the sum of its lines' VAT. In the Xero file every row is coded to account 200, which is Sales in Xero's standard UK chart; if your sales account has another code, change it in the file before importing. PBS Delivery does not send anything to Xero or QuickBooks itself — you download the file and import it there.

One statement — /statements/:id

The customer, the period and the status; Totals (net, VAT, total due, paid, its date and due date) with CSV for Xero and CSV for QuickBooks; and Its jobs, one line each, each opening its job.

Payments by method — /money/payments

Every payment taken by one method (or with no method recorded): the job (which opens), who took it, when, its status and whether the office has confirmed it.

Jobs ready to invoice — /ready-to-invoice

The jobs the drivers have completed that are not on any statement yet, newest first, each opening its job. Build their statement on Money. Drivers do not see this list — invoicing is the office's.

Equipment — /resources

Vehicles and plant: Name, Kind, Category, Reg, Payload, £/mile, £/hour, £/day, Status, Compliance. Add equipment (/resources/new): Kind, name and details → Add. Each name opens its own page. Equipment that has been sold or scrapped is listed apart under Off the register, kept on file and not offered for jobs or rounds.

One piece of equipment — /resources/:id

What it is (make and model, payload, volume, pallets, odometer, owned or hired in), every due date (MOT, service, tax, insurance, LOLER) with its compliance warnings, its costs and charges for the roles that see money, Jobs it went on, the Rounds it drove and its Checks, cleaning and defects - each job and round opens its own page. Take it off the register (sold or scrapped) (/resources/:id/off-register), for whoever may change equipment: tick that it has been sold or scrapped → Take it off the register. It stays on file with its jobs, rounds and checks, and is no longer offered for jobs or rounds. It is refused, with the reason, while it is on a job that is not finished or on a round its driver has been given; its planned rounds are cancelled and the page says how many stops need another round.

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.) Each name opens their page.

One person — /people/:id

Driver or not, still active or not; Licences and tickets (licence classes, licence, CPC and ADR expiry), their cost, charge and pay scheme for the roles that see money; the Jobs they were on and the Rounds driven, each opening its own page. Their phone and email are not shown here. For someone who may see costs, Pay says how the person is paid - their pay scheme, or their hourly cost when they have none - and an owner or administrator changes both there (/people/:id/pay): Pay scheme, Hourly cost (£) → Save their pay. An hourly cost below the National Living Wage is pointed out and kept as typed.

Driver pay — /pay-schemes

How your drivers are paid, which is what a job costs you in driver time. Shown in the menu only to someone who may see costs. Each scheme pays any mix of per job, per mile, per hour, per stop, per item, per kg and a % of the price, they add up, with At least - the least a driver is paid for a job - and can be kept to one service level. A driver on a scheme is costed by it instead of their hourly cost, never both. New pay scheme (owner and administrator) → Add the scheme; each name opens Change it; Retire (/pay-schemes/:id/retire), after a confirmation, keeps the scheme on record, stops it costing new jobs and puts its drivers back on their hourly cost. A per-hour rate below the National Living Wage is pointed out beside the scheme and kept as typed.

Change a pay scheme — /pay-schemes/:id/edit

The scheme's form filled in → Save the change (/pay-schemes/:id). A change applies to the next job costed; a job already costed keeps what it was costed at. A retired scheme is shown as it was and cannot be changed.

Customers — /customers

The customer list: Name, Account, Rate card, Jobs, Terms. Nothing here is deleted. Archive (/customers/:id/archive), after a confirmation, keeps the customer with all their jobs, statements and payments and takes them out of the lists for new work (booking, quotes, requests); they are listed under Archived, and can still be put on a statement, marked (archived). Reinstate (/customers/:id/reinstate) brings them back. Each name opens the customer.

Erase personal details… (/customers/:id/erase) — owners and administrators only; to everyone else the page does not exist. It is for a formal request to erase a person's data, and it is the one action that asks you to type to confirm: the customer's name. It erases the customer's name, phone, email, account code and notes; the names, addresses, contacts, what3words and map positions on their sites, job stops, requests and calls (a postcode is cut to its district, such as PO30); the email on their statements; the text of messages sent about their jobs; their jobs' notes and update email and number; the name of whoever signed for a delivery, wherever it was written (the driver's step and the job's history); their feedback comments; and the words of the messages with them about their jobs, both sides. It keeps what the law requires a business to keep: their jobs with references, dates and money, statements and payments, the incident register and consignment and transfer notes; and it keeps the proof of delivery (the photo and the signature taken at the door), the record that the delivery happened, for a dispute. It cannot be undone; the page says what it changed, the customer is archived as "Erased customer", and the erasure is recorded with who did it and when.

One customer — /customers/:id

Office roles. The account (account code, kind of account, phone, email, the rate card they are priced on - which opens it - payment terms and notes), their Jobs, their Requests and saved Sites, and, for the roles that see money, their Statements - each job, request and statement opening its own page. On stop, archived or erased shows beside the name. Drivers are refused it.

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. Under each rule is its source - whose number it is and what it is based on - and the date its rate was last set and by whom; hover the rate and it says the same. You write the source in Where this figure comes from when you add or change a rule; a rule with none says so. The 55p a mile and the National Living Wage floor were confirmed against gov.uk's 2026 to 2027 rates on 26 September 2026. 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 can taper across the tax year, not per job. Tick count the band in miles across the tax year on a per-mile rule and its band is read against the year's miles (6 April to 5 April) rather than the one job's: put 0 to 10,000 on one rule and 10,000 upward on another, and the first 10,000 miles of the year are charged at the first rate and everything after at the second. A job that crosses the line is split and shows both lines on its costing. The year's miles are the jobs booked or further on, dated before the job (or the same day and made earlier); a draft, a quote or a cancelled job adds none. A job on its own is never 10,000 miles, which is why the count is kept for the year rather than the trip. A rule without the tick is banded per job, as before.

If an hourly cost is below the National Living Wage, the app says so and leaves it alone - under a per-hour rule in What it costs us, on a person's Pay and beside a pay scheme. 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.

and optionally a band, a free allowance, what it applies to, and minimum/maximum limits. Charge in whole blocks of rounds what is left after the free allowance up to whole blocks, each one started charged in full: a waiting rule with the first 30 minutes free and blocks of 15 charges 31 to 45 minutes as one quarter hour, 46 to 60 as two. Only when… narrows a rule without typing anything: weekends or weekdays, out of hours or working hours (the working hours are yours to set; both are judged on the UK clock from the job's own date and time), particular days, postcode areas, at least / at most miles or kg, at least so many items or stops, particular priorities, refrigerated loads, not when the job's driver is paid by their own pay scheme (a general driver rate then counts the hours twice - the driver's own pay is costed instead), only on a job that goes to a tip (a tip fee), not when a vehicle of ours on the job is already costed by the mile (for a driver's own-vehicle mileage - the vehicle's running cost already counts those miles). Leave it blank and the rule applies to every job. The card lists each rule's conditions in words (1 October 2026). 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.

Save the change (/rates/:id/rules/:ruleId) changes it in place. The same checks as adding a rule apply: a change that would be charged on top of another rule is refused, naming that rule, and what you typed is kept. A change applies to the next job costed; a job already costed keeps its figures.

and leaves the card; it is kept on record (the card says how many are), so a job costed with it can still be explained. A retired rule never blocks a new one.

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

The repeat items, grouped by their category (one with none is under No category set): Code, Description, Band, Basis, Job type, Price. Each description opens its own page.

One price — /prices/:id

The price and its basis, minimum charge, band, service level, the job type it is tied to (which opens) and its VAT, and the Jobs with a line of this item - matched on its code or its description - each opening its job.

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). Each type opens its own page.

One job type — /types/:id

What it switches on and what it leaves off, the Checklists it asks for (and which are required), Its prices (for the roles that see money; each opens), and its Jobs, newest first, each opening its job.

Your plan — /plan

Owners and administrators only. Once Stripe has confirmed a payment, the page shows your subscription: Subscribed with its state (Active; Payment failed — in grace period; Cancelled), Vehicles paid for and Each month. With no subscription it shows Start a subscription: the price for one vehicle and for two or more, the number of vehicles in your equipment register as a starting figure, and Continue to payment (/plan/checkout), which opens Stripe's own payment page for that many vehicles. Coming back, the page says Stripe has sent you back and shows the plan only when Stripe has confirmed it. A company has one subscription; to change the number of vehicles the page links to talk to us, and to stop it the owner uses Close our account, below.

When a payment fails, and when a subscription lapses. After a failed payment every page carries a banner counting the days left - saving keeps working for 14 days. After that, or once a subscription is cancelled, unpaid or paused, every page says Your subscription has lapsed: you can still read everything, and saving starts again when it is paid, and a save is answered Not saved with that sentence. Reading never stops. Paying (Continue to payment), signing in and out and resetting a password always work, and a driver can always finish the work already on the road - its steps, its checks, a payment at the door, a stop's proof, their round and their location (declining an offer too, but not taking a new one). A company with no subscription record - the demonstration - is not affected.

Take everything out — /export

The owner, or an administrator whose login sees both prices and costs (the file holds both); anyone else is told why not. Everything your business holds here - customers, sites, enquiries, requests, every job with its stops, items, costs, messages, steps and events, runs and their breaks, equipment and its checks, registers, rate cards and rules, the price list, statements, messages sent, and the rest - listed by kind with how many rows each has. Download everything (/export.zip) gives one .zip, named pbs-delivery-export and the date: a CSV for each kind, every row, which opens in Excel or any spreadsheet, and a README saying when it was taken (UK time), by whom, and how many rows each file has. It opens in Windows with nothing installed. Text a spreadsheet would run as a formula is written as text; numbers stay numbers. It is yours, it costs nothing, and you can take it as often as you like. Left out on purpose, and the page and the README say so: sign-in secrets (password fingerprints, two-step keys and recovery codes, sessions and reset links); the tokens in tracking links and the API keys themselves (their names and first characters are listed); and the photos, proofs, signatures and receipts themselves - each is listed with where it is kept, its type, size and when, and opens from its job.

Close our account — /account/close

The owner only (anyone else is told so). Take everything out is offered first, at the top. The page says what closing does: the subscription stops renewing - nothing more is billed after the period already paid for, and everything keeps working until that day; anything owed up to that day is still due; after it the business can read everything but not save, as when a payment lapses. Type close our account and press Close our account: every subscription the business holds is told to stop renewing (each read back first - one that is not this business's is refused), and only when every one has stopped is the closure recorded, with the day it closes. The message says that day, or, with no subscription, that there was nothing to stop and nothing is billed; if any could not be stopped it says why, and nothing is recorded. Closing does not delete anything. Once closed, type delete our data to ask for the data to be deleted (/account/delete-request): the ask is recorded (who, when), and the page says nothing has been deleted - the data is deleted after the account has closed, except the records the law requires us to keep, such as invoices.

API keys — /api-keys

Owners and administrators only. A key lets another system - Zapier, your web shop, your own script - read your jobs and, if you allow it, book new ones (see For other systems: the API, below). Make a key: what it is for, and whether it may book new jobs, as well as read them → Make the key. The key is shown once, on that page - copy it then; only a fingerprint of it is kept. Your keys lists each with its first characters, what it may do, who made it and when, and when it was last used. Revoke (/api-keys/:id/revoke, with a confirm) stops it at once; a revoked key stays listed with who revoked it and when. A demonstration company cannot make keys. A key acts with the rights of the person who made it: it gives prices only if they may see values, and it stops working once they no longer sign in here.


For other systems: the API

Every request carries a key from API keys: Authorization: Bearer pbsdv_… (or X-Api-Key). Answers are JSON with ok; a refusal says why in error (401 no key or not recognised, 403 a read-only key booking or a lapsed plan, 404 no such job, 400 what is wrong with the job sent). No sign-in cookie is read on these addresses. Lists give at most 100, newest first.

Is the key good? — /api/v1/ping

Your company's name, the key's name, and whether it may book jobs.

Your jobs — /api/v1/jobs

The newest jobs: reference, status, day, customer, job type, price, your own reference and the customer's tracking link. since (a time, such as 2026-10-22T09:00:00Z) gives only those changed after it, newest change first; status one status; limit up to 100. Book a job is a POST to the same address with a JSON body: customer (their name exactly as on Customers) or customer_id; for one drop postcode, address, town, deliver_to, phone - or a stops list (each kind deliver or collect, with a postcode or an address; up to 20); items (each description and quantity; up to 100); date (yyyy-mm-dd; today if left out); job_type (a code or name from Job types; your first if left out); notes; external_ref - your own order number. It is made as a booked job, the way Bring in orders makes one: costed, its history naming the key. Sent again with the same external_ref, the job already made comes back (created: false) - a retry never makes a second. A customer who is on stop or archived, or a name two customers share, is refused in words.

One job — /api/v1/jobs/:id

The job, with its stops: kind, status, where, expected time and when it was done.

Status changes — /api/v1/events

Each time a job changed status (from and to, when), newest first - for a system that wants to act when a job is delivered. since and limit as above.


The driver's day

My run — /me

Today's work one stop at a time: the stop you are on is the one card, with its job's one step and its one button (see A job, step by step) and the stop's notes - access, and a what3words address that opens what3words.com; the stops after it are listed by name under Next, and each opens here when the one above is done. Finishing a job's last step brings you back to My run, to the next job's Loading, or says there is nothing more today. Also Checks to do before setting off, and Work going spare — jobs offered out, with Take it (/offers/:id/accept) or Pass (/offers/:id/decline). A driver sees no prices or costs anywhere.

When a round has been issued to you for today, it shows at the top with Start my round (/me/runs/:id/start); once started, Finish my round (/me/runs/:id/finish). While the round is on, this page shares your phone's position (/me/location) — your phone asks you to allow it — about every half minute while you move, so the office's map and each customer's tracking page show where the van is; the page says when your position last reached the office. A customer's page shows the van only while their delivery is loaded or on its way and still ahead of you - once you have been to them, it no longer does. Outside a round, nothing is shared.

Parcels on the stop you are on: scan each parcel's label - Scan with the camera where the phone's browser can read codes (Chrome on Android), or type the code printed under it - and Record it (/stops/:id/scan). The right parcel says Parcel n of N - right parcel, recorded and the count at the stop goes up; a label from another job is refused, naming both jobs, so the wrong parcel stays in the van; scanning the same label again records nothing new. With no signal the scan is kept on the phone and sent when the signal is back.

A proof taken on a phone before 18 October 2026 that is still waiting on it is still sent to the office (/stops/:id/proof) when there is signal; the foot of the page says how many are still on the phone (1 unsynced, and with photos how many wait and how big, e.g. Photo waiting: 1 (300 KB). - a step kept on the phone says the same). The page itself opens with no signal too: while there is signal the phone keeps My run and the step page of each of its jobs (/sw.js), so they open with no signal - with a line saying it is the phone's copy and from when. A screen the phone has not kept says so in words. Signing out deletes them from the phone.

A job, step by step — /jobs/:id/step

A job is one step at a time, with one button; each finished step folds to one line above it. Opening a job as a driver always lands here. When a check holds the step - a pre-start or vehicle walk-round check before Loading, a pre-finish or end-of-day vehicle check before Complete - Checks to do first lists each one as a link; it opens the checklist (/checklists/:id), Save answers comes back to the step, and the step goes through once they are done. Pressed with a check still open, the step is refused, says which check, and nothing is recorded.

not on it (the office sees that on the job). A job with no lines asks what is loaded and how much. A weighed job type asks the Gross and Tare in tonnes. Then a Photo of the load → Loaded - start the drop (/jobs/:id/steps/loading). The customer is emailed that it is on its way.

Navigate, and the drop on a map. Your phone shares its position only while the job is on its way → I've arrived (/jobs/:id/steps/in_transit), which records the pin and compares it with the drop's map point: the job's Progress says "pinned 42 m from the drop", and further than 300 m (allowing for how accurate the phone says it is) it adds "check the address or the stop" for the office. Nothing is refused - a wrong map point must never stop a driver finishing. A drop with no map point says so instead of a distance.

the customer's name and their signature with a finger (at a tip: who took it there), and Cash taken at the door if any (recorded against the driver, for the office to confirm on Money) → Complete (/jobs/:id/steps/arrived). The drop is done with that proof; the customer is emailed the proof of delivery (not for a tip). A job with more drops goes back to Loading for the next one; only the last drop completes it. On a job marked for an Age check at the door, Complete also asks which ID the person showed (a passport, a photocard driving licence, a card with the PASS hologram, a Ministry of Defence Form 90, an EU, EEA or Swiss identity card, a Biometric Immigration Document - or, under Challenge 25 only, Not asked - clearly over 25) and a tick that the photo matches and the date of birth makes them 18 or over; without them nothing is recorded. No ID, or under 18: do not hand it over - use Problem. What was seen goes in the job's history.

A step left with a part missing is refused with what is still needed, and nothing is recorded. It works with no signal: a finished step waits on the phone, the page says how many steps are waiting, and they are sent once when the signal is back - oldest first, one at a time (on an Android phone even with the app closed; on an iPhone when My run or the step page is next open); a step sent twice is kept once, and one the office does not accept stays on the page with the office's reason until you press Understood. Only the office can take a job back a step.


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 — who signed, when, the signature and the photo (/track/:token/proof/:proofId, which opens only with that job's link) — and History. The token is the only key to it — the page shows one job and nothing else. Once the job is done it asks How did we do? - 1 to 5 and an optional comment → Send (/track/:token/feedback). One answer per job: after it, the page shows what they said, and a second answer is refused politely.

Messages - what the firm has written to them about this job, and theirs, oldest first; Send a message (/track/:token/message, up to 1,000 characters) goes to the firm's office and driver on the job. Up to 10 an hour; it stops 7 days after the job is done, and on a cancelled job, and the page says so.


What this does not do

(Your own PBS Delivery subscription is paid on Stripe's page, from Your plan.)