PBS Shop — Handbook
Checked against the live app at farmshop.pascoesystems.co.uk on 15 October 2026.
This is a live demonstration on fabricated data (two demo shops). No real shop's records are held.
PBS Shop is a product register with pictures and stock, the account customers, and the orders behind the counter — for a farm shop or any small retailer. This handbook has one section per screen you can reach; a product's, customer's or order's id sits in the address where it says :id.
A demonstration shop carries one slim line along the top - Demonstration shop - every record here is made up - on every screen once you are signed in; a real shop never does.
The screens are in the menu along the top. On a screen narrower than a laptop's (a tablet, a phone held either way) they sit behind Menu, with which shop you are in; Sign out and ? stay beside it.
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. You can read it without signing in; it describes the screens and holds no records.
Sign in /login
Enter your email and password to reach your shop. Signing out returns you here.
Create an account /signup
Linked under the sign-in form. While PBS Shop is not taking new accounts it says Accounts open soon, with Request access and Back to sign in, and the server refuses any sign-up sent to it; nothing is ever created here. When it does take accounts, it is a form - your shop, your name, email and a password - that makes your own shop, empty, and says Waiting for approval: the login cannot sign in until Pascoe Business Systems approves it, and signing in before then says so (only to someone who gives that account's right password). An address already on file gets the same answer and nothing is made.
Approvals /approvals
For Pascoe Business Systems' operators only - to everyone else this page does not exist. New shops that used Create an account, each with its owner, email and when it asked, and Approve: the owner's login can sign in from then on. Recently approved ones are listed with when and by whom. While sign-up is off it says no requests can arrive.
Approve a shop /approvals/:id/approve
Approve beside a waiting shop: its owner's login becomes active, in one step, and the shop moves to Approved recently. A second press changes nothing.
Demo links /demo-links
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 a login that can change nothing: every save says Demo: not saved, and a strip along the top 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.
Products /
Your home screen: everything on sale, as a grid of cards with a picture, the price and what is in stock, filterable by category (Meat, Vegetables, Dairy, Eggs, Preserves, Baked goods). The search box at the top looks across products, customers and orders. From here you open a product, go to the stock list or add a product.
Stock /stock
Every product as a list for stock-keeping: category, sold by, price, what is in stock and whether it is low — at or under the product's own Running low at level, or, where it has none, 5 or fewer of a product sold each and 3 kg or less of one sold by weight — or off sale. An archived product is not on this list; when there are any, archived (N) opens them, each with Restore to the stock list. Find a product narrows the list by name, barcode, product code or category. The list shows ten at a time; Show more adds ten, and the counts at the top always count every product.
Sell /sell
The counter. Scan a barcode or type a product name, set the quantity (kilograms for anything sold by weight), and it goes on the sale. Scanning the same item twice means two of them; two weights of the same cut stay as two lines, because they are two different weights. Remove a line or clear the whole sale at any point — nothing is recorded until you take payment.
The customer display. Open the customer display (under Sell) opens a second window: drag it to the screen your customer faces, on the till's own computer. It shows the sale as you ring it - each item with its quantity and price, and the total, in large type - then Thank you with what was paid and any change, and goes back to Welcome after twenty seconds. It shows only what the till shows, sends nothing anywhere, and keeps working with no signal. It works in the same browser on the same computer as the till; a separate tablet as a display is not offered.
A label from your scale. If your label scale prints a barcode that carries the weight - a 13-digit code beginning 2, laid out as the item's five-digit code then the weight in grams - scanning the label adds that product at that weight in one go: the quantity box is not used, the line says it came from the scale label, and it is priced at the product's own price a kilogram, exactly as a weight typed by hand. Give each weighed product the item code your scale uses as its barcode (the five digits, or the first seven with the 2 and the scale's flag digit). A label for a product sold each, or for a code no product has, is refused in words. A scale set to print the price rather than the weight in the label is not read - the till works out every price itself; set the scale to weight labels, or type the weight. The till with no signal reads these labels the same way.
Scan with the camera uses the phone's or tablet's own camera instead of a scanner: allow the camera when asked, hold the barcode inside the picture, and it is read into the scan box and added to the sale, just as a scanner would. Stop the camera closes it. The button only appears where the browser can read barcodes itself — Chrome on an Android phone or tablet, a Chromebook or a Mac; on an iPhone or iPad, in Safari or Firefox, or in Chrome on Windows it is not shown, and a USB or Bluetooth scanner, or typing, does the same job. If the camera is not allowed, it says so and nothing is added.
An unfinished sale is kept on the till's own device - in that browser tab, not on the server - so a page that reloads or a tab that closes does not lose it: open Sell again and it offers Restore it (the lines come back, priced again) or Discard it. It is still not a sale: nothing is recorded, and nothing reaches the takings, until you take payment. Taking payment or clearing the sale empties the kept copy.
Offers and money off. A product with an offer on (see Offers) has it taken off by itself as it is rung: every complete group - three, say, for the offer price - is charged the offer price and the rest at the price, and the line says what came off. Money can also come off the whole sale: Money off this sale, under Take payment - a percentage (under 100) or an amount (less than the sale), and why, picked from a list (damaged or short-dated, a regular customer, staff, price matched, a mistake put right, or something else, said in words) with a note if you like. An owner or administrator gives it on their own login. A shopkeeper may give up to the shop's limit without a manager (Discounts at the till, on Offers - to start, every discount asks); past it, an owner or administrator picks their name and types their PIN - the one they clock in with - on the same screen, and the sale says who authorised it. It shows on the sale until you take payment, Take the discount off removes it, and it is spread over the lines to the penny, so each line holds what was really paid for it. A wrong PIN is refused in words and listed on Exceptions; five wrong in fifteen minutes and that name waits fifteen minutes, as at Clock in. A manager's approval is for that discount on that sale only, used once, for two hours; a discount sent without one is refused in words. A discount that no longer fits the sale - a line removed under a fixed amount - is taken off, and the till says so.
No sale - the drawer opened, under the scan box: for when the drawer is opened without a sale - change for a customer, say. Pick why; a shopkeeper needs an owner's or administrator's name and PIN, as above. It records who, why and when, and Exceptions lists it; nothing is sold and no money is recorded.
Choose Cash, Card or On account. For cash, type what the customer handed over and the change is worked out for you; a figure smaller than the total is refused rather than treated as a part payment. Taking payment records the sale, takes the quantities off stock and shows you the receipt.
Paid more than one way - some cash and the rest on a card, say: open it under Take payment, type what came each way (cash, card, on account), and for a cash part put what was handed over in Cash handed over - the change is worked out on the cash part. Together the parts must make the total exactly, with at least two of them; otherwise it is refused in words and nothing is recorded. Record it in parts records the sale with each way: the receipt names each part, Takings counts each part under its own way, and Cash up puts only the cash part in the drawer. The till with no signal takes one way per sale.
Two things worth knowing. The price charged is the price at the moment you press Take payment, read from the product — the till never takes a price from the screen. And stock never blocks a sale: the goods are already in the customer's hands, so it sells and, if that takes the figure below zero, the receipt tells you to count the shelf.
The till with no signal /sell/offline-sale
When the signal goes, the counter keeps working. Open Sell once on the device with signal and it is made ready: the products and their prices are kept on that device (it says Ready on this device: N products kept). With no signal, open The till with no signal (the link under Sell - bookmark it on the till's own device): scan or type, set the quantity, take payment by Cash (the change is worked out) or Card (take it on your card machine as usual). Each sale is kept on the device and the badge at the top says how many are unsynced; when there is signal again they go into your takings by themselves, at the time each was rung, with the stock taken off, and the badge says All sent - or press Send now. A sale sent twice goes in once. The prices are the ones the device was last given: a line rung at a price that is not the product's price when it arrives is recorded as charged and listed in Exceptions. A sale is refused, and shown on the device with why, if it says it was rung in the future (check the device's clock), more than seven days ago, or names a product that is not yours. A card payment kept more than 24 hours is marked, because card machines can decline old payments taken with no signal - check yours took it. On account needs signal. Multi-buy offers and discounts are not taken off with no signal: every item is charged at its full price, and the device says so. <!-- keys: /sell/catalogue.json /sell/offline-sale -->
Offers /offers
Money off for buying more than one: a product sold each can carry one offer at a time - how many, and the price for that many ("3 for" a price). Open it from Offers under Sell, or from a product's page, where its offer is shown. Put an offer on with the product, how many (2 to 99) and the price for them, and, if it is only for a while, Only between two days. The till takes it off by itself on the days it is on; one that has not started yet, or whose last day has gone, says so here and is not taken off. An offer that would not be money off - the price for them at or above what they cost at the price - is refused in words, as is a second offer on the same product, a product sold by weight, or a last day already gone; nothing is put on. The owner, administrators and shopkeepers set and end offers; a read-only login sees the list. Past sales keep what they had off, in the offer's words as they were, whatever happens to the offer after.
End an offer /offers/:id/end
End it beside an offer, after a plain confirm: the till charges the full price from then on. The offer is not deleted - it is listed under Ended offers with who put it on and who ended it, and when.
Discounts at the till /till/settings
On Offers, for the owner and administrators: how much a shopkeeper may take off a sale without a manager - a percentage, 0 to start (every discount asks). Past it, and for every void, refund and no sale a shopkeeper makes, an owner or administrator picks their name and types their PIN on the same screen. Only owners and administrators who have set a PIN (Clock in > My PIN) can be picked; with none set, a shopkeeper is not offered those at all.
Takings /takings
Everything that went through the till today (the shop's day and times are UK time): the time, how many items, how it was paid (each way, for a sale paid more than one way), the total and who served it, with the day's total and a split by payment type at the top - a sale paid more than one way counts each part under its own way. ?day=YYYY-MM-DD shows an earlier day. A quiet morning reads as a quiet morning, not as an error. A voided sale is not counted: it is listed underneath, under Voided, with who voided it and why. Beside Open the till is Cash up the day — or, once it is done, when it was cashed up, by whom, and whether it balanced.
One sale /takings/:id
The receipt for a single sale: every line with the quantity, the unit price and the line total (an offer taken off under its line, in the offer's own words as they were that day), any discount given at the till with why (and, on screen, who gave it), the total, how it was paid (each way with its amount, for a sale paid more than one way), and — for cash — what was handed over and what the change was. If the sale took any product's stock below zero it says so here and asks for a count. Print receipt prints it as a till roll (80 mm wide) from the browser — the shop's name, the date and time, who served, the lines, the total, how it was paid and the change — leaving the rest of the page off. Any printer the device can print to will do, including a receipt printer set up on it.
Owners and administrators can Void this sale (/takings/:id/void) — for a sale rung by mistake; a shopkeeper can too, with an owner's or administrator's name and PIN on the same form (recorded as authorised by them). Say why, confirm, and the sale leaves the takings; it stays on record, marked voided with who and why, and the stock it took goes back (each product's history says so, and its Stock movements show the sale put right). A sale is voided once. A sale with any refund is not voided — its stock would come back twice; refund the rest instead.
Refund a sale /takings/:id/refund
For something brought back. Owners and administrators - or a shopkeeper, with an owner's or administrator's name and PIN on the same form - open Refund some or all of this sale on the sale's page: for each line, how much is being refunded (up to what is left of it), whether the goods went back on the shelf (then the stock goes back up - on each product's Stock movements as brought back by a customer, with the refund - and each product's history says so), and why. It asks first. The amount is worked out from what each line was charged, after any offer or discount — never typed, and the last of a line pays back exactly what is left of it, never a penny more — and goes back the way the sale was paid: cash out of the drawer, back to the card, or off the account. A sale paid more than one way asks which way it goes back; back to the card is never more than the card paid (a card machine will not refund more than it took) - more is refused in words - while cash out of the drawer or off the account can take up to what is left of the sale. The sale itself is never rewritten; each refund is listed on it with when, what, how much, who and why. More than is left, a part of something sold each, no reason, nothing chosen, or a voided sale is refused in words and nothing is refunded. A refund counts on the day it is made: the day's Takings take it off the total and list it under Refunded, and a cash refund comes off the cash the till took in that day's Cash up.
Exceptions /takings/exceptions
For the owner and administrators (the Exceptions link on Takings): everything at the till that was not an ordinary sale, between two days (the last seven to start) — every sale voided, every refund (and how it went back), every discount given at the till (how much off, why and who), each one authorised by a manager's PIN (and by whom), every no sale, every wrong manager PIN typed at the till (for what, and whose), money paid in or out of the drawer, each day the cash-up did not balance (short or over), and each sale rung on the till with no signal at a price that was not the product's (what it was charged, and its price) — newest first, each with when, how much, who and why, opening the sale or the day's cash-up. At the top, the totals of each, and how many each person did, so a pattern shows. Read only.
Takings for your accounts /takings/export.csv
At the foot of Takings: choose the first and last day (it starts on the month so far) and Download (CSV). One row per line of every till sale between those days, and per line of every refund (as minus figures): a reference for the sale, the date and UK time, Sale or Refund, how it was paid (each way and its amount, for a sale paid more than one way), the product, the quantity, the unit price, the line amount, the sale's (or refund's) total, who served it, and a refund's reason. A line that had money off is written at its full price, with a Multi-buy offer minus row under it (the offer's words in the reason), and a discount given at the till is one Till discount minus row for the sale, with its reason. Every order marked Complete with an order date in those days is in it too, under its order number (ORD-0007): each line at the price the order holds, and its discount as a minus row. Plain columns that an accounts package or an accountant maps once on import — no particular package's layout is claimed, and no VAT is worked out (the till holds none). Voided sales are left out. Before the file is given, every sale's lines are added up and must equal what it charged (less any money off), every refund's what it paid back, and every order's lines less its discount what the order holds; if one does not, nothing is downloaded and the sale is named. A text cell a spreadsheet would run as a formula is made plain. A year at most at a time.
Cash up /takings/close
The end of the shop's day (?day=YYYY-MM-DD for an earlier day not yet cashed up). At the top, the day's sales and the split — cash, card, on account — with any voided sales listed as not counted. The figures: the cash the till took (each cash sale's total, and the cash part of a sale paid more than one way — the change was given out of it already, so it is not taken off again) and paid in and out, which together are what the day's trading put in the drawer; add the float. Count the drawer and close the day: give the float you started with and what is in the drawer — as a total, or by notes and coins (Count by notes and coins instead), or both if they agree — and an optional note. The page then keeps the day's figures as they stood: the float, the cash taken, paid in and out, should be in the drawer, counted, and the difference (none, over or short — worked out, never typed), with the card and account totals, the number of sales and any voids. A day is cashed up once; a second close is refused. A sale rung on that day after the close is shown as such, not folded in. Staff who take sales can cash up; a read-only login sees the figures only.
Paid in or out /takings/paid
On the cash-up page, money into or out of the drawer that is not a sale — Paid out to the window cleaner, Paid in as change from the bank — with the amount and what it was for. It is listed with the time and who recorded it, and counted in should be in the drawer. It is today's only, and refused once today is cashed up. Nothing is edited away: a mistake is put right with an opposite entry.
Search /search
Results grouped as Products, Customers and Orders, each with a count. Products match by name, barcode or product code; customers by name, postcode, phone or email; orders by customer name or by the order number — ORD-0007, ord 7, #7 or just 7 all find it.
Add a product /products/new
Name, category, description, barcode, product code, whether it is sold each or by weight (only the matching price box is shown), the price, the stock, Running low at — the stock figure at or under which this product reads low (blank: 5 for a product sold each, 3 kg by weight) — and a picture chosen from the 25 drawn pictures of the goods that ship with the shop. Saving files it and opens its page.
Save a new product /products
Where the add form submits. It creates the product and opens its page. (Adding a product is a change to your records, so a frozen/unpaid account is refused here with an honest on-screen reason while the list stays readable.)
One product /products/:id
The product's page: its picture, category, how it is sold, price, its offer if one is on (and whether it is on today - things sold each), stock (marked low or out of stock), the level it reads low at, barcode and code; Edit and Delete; Stock in or out - choose what happened (came in from a supplier, a customer brought it back, wasted or gone off, lost or stolen, sent back to the supplier, or sold or used somewhere other than this till), how much, and why (needed if wasted, lost or stolen) - and Counted on the shelf (the figure counted, and a note); Stock movements - every change to its stock, newest first: when, what happened (a till sale opens its receipt, an order opens the order), the change, the stock after it, why and who. A figure carried over when the stock ledger began (24 October 2026), or put back for a sale rung before then, is marked about: it was carried over, not counted. And History — who did what and when: created, each edit and what changed, each stock adjustment with its reason, off sale, every sale at the till (how many, the sale's total — which opens the receipt — who served it, and voided where it was), and every order line it has been sold on — one timeline, newest first, in UK time. On a database where the audit trail has not been switched on yet the page says so instead of showing an empty one.
A product's photograph /products/:id/photo
On the product's page, Photograph: Take or choose a photograph opens the phone's camera or your pictures (on a computer, your files). The picture is made smaller on your phone or computer before it is sent - about 1,200 pixels on its long side, a JPEG under 600 KB - and shown, with its size, before you press Save the photograph, which stays off until it is ready. The server keeps it only if it really is a JPEG, PNG or WebP picture of 600 KB or less, and says why if not; nothing changes then. Saved, it shows on the product's page, its tile on Products and beside it on your shop's own page, in place of the drawn picture; a new one replaces it; the page says how big it is, who put it there and when, and each change is in the product's History. Take the photograph off (/products/:id/photo/remove) removes it - the drawn picture, if it had one, shows again. Owners and anyone who may change products; the demonstration shop - the same for every visitor - keeps its pictures. Each photograph is in Take everything out (product-photos.csv, the picture as base64).
Edit a product /products/:id/edit
The same form as Add, filled in, plus On sale: untick it to hide a product from the shop without deleting it. Save changes submits to /products/:id and returns to the product's page.
Read a delivery note /stock/delivery-note
From Stock (read a delivery note), for anyone who may change products. Take a photo of the supplier's delivery note: it is read on this device itself - nothing is sent anywhere and the photo is not kept (the first time, the reader is fetched, about 6 MB) - and its text appears in the box, where you can correct anything misread. You can also type or paste the lines in. Match to my products goes on to the next step; nothing is changed yet.
Check the delivery note — /stock/delivery-note (after Match)
Each line with a quantity, matched to one of your products - by a barcode or product code on the line first, otherwise by most of the product's name (plurals count: "wedges" is "wedge") - and how it was matched. A line that names none of your products clearly, or two equally, is left for you to choose. Change any product or quantity, untick anything that did not come, and set the reason the products' histories will show (delivery note unless you change it).
Add the delivery to stock /stock/delivery-note/apply
Add these to stock adds each ticked line to its product's stock - all of them together or none - as a delivery on each product's stock movements, with a line in its history and a stock.changed message to any webhook that wants it, as a change on the product's page does. A delivery only ever adds: a quantity of nothing or less is refused in words. The page lists each product with its stock before and after.
Stock in or out, and counts /products/:id/stock
Where Stock in or out and Counted on the shelf submit. Every change to a product's stock is one movement on its stock ledger, with what happened and why - the shop's stock figure is the sum of them, and a movement is never changed: a mistake is put right by another one. Stock in or out takes what happened and how much in units or kilograms (always more than nothing - the choice says whether it comes in or goes out); wasted, lost or stolen needs a reason, and nothing is saved without one. Taking out more than is in stock is refused, and nothing is saved — count the shelf and save the count instead. A count takes the figure on the shelf (0 or more) and records the difference it made. A figure a till sale has already taken below zero (the till never refuses a sale for stock) is shown as it is and moves by exactly the change you enter. A product with no stock figure is not counted: a sale, an order, a void or a refund moves nothing for it; stock in, a loss or a count starts it from 0.
Delete a product /products/:id/delete
Asks you to confirm, then removes the product for good. A product that is on any order cannot be deleted — it would leave those orders pointing at nothing — and the screen offers Take off sale (/products/:id/off-sale) instead, which hides it from the shop and keeps the orders whole.
Archive a product /products/:id/archive
Archive on a product, after a confirmation, takes it off sale and out of the stock list. It keeps everything recorded against it, and its sales still name it. Restore to the stock list (/products/:id/restore) brings it back to the stock list; it stays off sale until you put it on sale.
Customers /customers
The account customers: name, type (Retail, Trade, Wholesale), town, phone, how many orders and what they have spent. Empty until you add the first, and it says so.
New customer /customers/new
Name, account type, phone, email, address, town, postcode, delivery round, customer since, notes. Submits to /customers and opens the customer's page.
One customer /customers/:id
The customer's details, New order, Edit and Delete, every order they have placed (each by its order number), and History — who did what, and when: when they were added (and whether from New order) and each edit, by whom, in UK time — for their name, phone, email, address and notes it says that it changed, never the old or new value (so nothing personal is copied into the history); for the account type, round and since-date it shows from what to what. A deleted customer's history is kept.
Archive this customer (with why) takes them off the customer list and New order's picker; they and every order stay on record, the list's archived (N) shows them, and Restore to the list brings them back. Delete is offered only for a customer with no orders. Erase this customer's personal details (on their request) — the owner or an administrator, typing the customer's name exactly to confirm — wipes their name, phone, email, address, since-date and notes for good; their orders stay, with their amounts, under Erased customer, and the history says it was done and by whom. A name typed that does not match is refused and nothing is erased.
Archive a customer /customers/:id/archive
Where Archive saves. A reason is needed.
Restore a customer /customers/:id/restore
Where Restore to the list saves.
Erase a customer's personal details /customers/:id/erase
Where the erasure saves: the owner or an administrator, with the customer's name typed to confirm.
Their own page /customers/:id/own-page
On a customer's page, for the owner and administrators: Give them their own page makes a private link for that customer, shown once - copy it and send it by text or email. Only a fingerprint of it is kept, so it cannot be shown again; Make a new link replaces it (the old one stops). The card says when it was made and when they last opened it, and the customer's history records it. Not for a customer whose details were erased, and not in a demonstration shop.
Withdraw their page /customers/:id/own-page/withdraw
Withdraw it stops the link at once; opening it then says it is not in use. Erasing a customer's personal details withdraws it too.
A customer's own page /c/:link
What the customer sees - no password, nothing to sign up to. Your orders, newest first: each order's number (open it for what was in it), the day it is for (and collection or delivery, if ordered online), where it has got to - received, being made up, ready, complete, cancelled - and its total. When the shop takes orders online: Place a new order and, beside each order, Order these again open the shop's own page with their name, phone, email and address filled in (and that order's quantities), and the order goes on their account. Your details - name, phone, email, address, town, postcode - they can put right themselves; the shop's history says the customer changed them, never what to.
Save their details /c/:link/details
Where Save my details goes. Checked - a name is needed, a phone number long enough, a real-looking email, a full postcode - and refused in words with nothing changed, or saved at once.
Edit a customer /customers/:id/edit
The same form, filled in. Save changes submits to /customers/:id.
Delete a customer /customers/:id/delete
Asks you to confirm. A customer with orders cannot be deleted — orders keep their history.
Orders /orders
Every order, newest first, filterable by state: Open, Being picked, Picked, Complete, Cancelled. Empty until you raise the first, and it says so. Each order has its order number — ORD-0001, ORD-0002 and on, the shop's own running number in the order they were raised, never reused — for a customer to read out on the phone; it opens the order.
New order /orders/new
Pick the customer (or walk-in). Someone not on the books yet: choose + New customer… at the top of the list and type their name (and a phone number if you have it) — they are added in the same save, and their address and round can be filled in on their page later. Then a delivery date and the lines: type a product's name in a line and pick it from the suggestions, with its quantity (units for products sold each, kilograms for those sold by weight). One line shows to start; + Add a line gives the next, up to twelve. A name that matches no product on sale is refused with the line it was on, and nothing is saved. Then a discount and how it was paid. The totals are worked out from the product prices. Submits to /orders.
Picking list /orders/picking
From picking list for a day on Orders. Every order due that day — by its delivery day, or the day it was raised when it has none — that is not complete or cancelled. First What to pick: each product once, with how many in all (or how many kilograms, for anything sold by weight) and how many orders want it. Then Each order: its number, who it is for, where it goes and their phone, whether picking has started, and its lines, each with a box to tick. Previous day, Next day or a date move it; Print prints it on ordinary printer paper, one order never split across two pages. It only reads the orders: picking an order is still marked on the order itself. Delivery rounds are not built yet, so the list is by day.
Record a payment /orders/:id/payments
On an order, Payment says what it comes to, what has been paid and what is still owed - or Paid when raised for an order whose payment was taken when it was raised. Orders paid later - on collection, on delivery, a veg box, on account - get Record a payment: the amount (what is owed, filled in), how (cash, card, bank transfer, cheque, other), the day and a reference. Each payment is listed with who recorded it, and the order is marked paid once its payments cover it. More than is owed is refused. A payment recorded wrongly is put right by recording a minus amount - nothing is edited away - and the history says each one.
Match bank payments /orders/reconcile
From Orders (match bank payments), for the owner and administrators: how many orders are unpaid and what they owe, and a box to paste your bank statement's lines - the bank's download (CSV) or copied from its page, with its header row if it has one (a date, what the bank says, and the money in - a "paid in" or "credit" column, or one amount). Match them reads each line with a date and matches each money-in line to an unpaid order: an ORD- number in the reference first; otherwise the one unpaid order that owes exactly that amount - ticked only when the customer's surname is in the line, else left for you to check. A part payment says what would still be owed; more than is owed is not ticked; two orders owing the same is left for you to choose. Check the matches shows every line, its order (you can change it, or choose "not an order") and how it was matched. Nothing is recorded yet.
Record the matched payments /orders/reconcile/record
Record the ticked payments records each ticked line as a bank-transfer payment against its order, all as one batch, in one go - the page lists each recorded, what is still owed on it, and any not recorded with why (already paid, more than owed, no order chosen). Each batch, and each payment, is in Take everything out.
Invoices /invoices
From Orders (invoices). Every invoice issued - its number, who it is to, issued, due, total, and what is still owed - newest first, and whether your details for invoices are set (they must be, before the first invoice).
Your details for invoices /invoices/details
For the owner and administrators: the business name and address your invoices carry, how to pay (your bank details, or "cash or card in the shop"), days to pay (30 unless you change it), and your company number only if you are a limited company. Nothing is filled in for you. Each invoice keeps the details it was issued with; a change applies to invoices from now.
Make the invoice /orders/:id/invoice
On an order, Invoice shows its invoices or "Not invoiced", and Make the invoice: the next number - INV-0001, INV-0002 - never reused, and everything on it (your details, the customer, the lines, the totals, the day issued and the day due) kept exactly as it was that day. An order already invoiced as it stands is not invoiced again; if it changes afterwards (weighed, say), the order says so and offers Make a new invoice. The order's history says each one.
An invoice /invoices/:id
The invoice as issued, ready to Print (the menus and buttons do not print). Beside it, not printed: what has been paid against its order (Record a payment, Match bank payments) and what is still owed - or that the order has changed since it was issued.
A customer's statement /customers/:id/statement
Statement on a customer's page: today's date, your details, the customer, every order not cancelled - date, order number, its invoices, what it came to, what was paid, what is owed - and the total owed, with how to pay if anything is. Ready to Print.
Veg boxes /boxes
From Orders (veg boxes). Boxes on a round: Boxes on offer (each with its price, what goes in it, and how many customers have it), Customers with a box (how often, collected or delivered, the next box, on or paused), and Make the box orders for a day. The owner and administrators add boxes on offer; anyone who raises orders gives customers a box and makes the box orders. Read-only logins see it all and change nothing.
Add a box on offer /boxes/plans
A name, a price and, if you like, a line for customers. Then say what goes in it.
A box on offer /boxes/plans/:id
Its price and What goes in it - each product and how many (kilograms for things sold by weight). Put it in adds a product (or changes how many), Take out removes one, Retire this box stops new customers having it (boxes already given go on). Changes apply to every box made from then; boxes already made up keep what they had.
Put something in a box /boxes/plans/:id/lines
Where Put it in goes.
Take something out of a box /boxes/plans/:id/lines/:line/remove
Where Take out goes.
Retire a box /boxes/plans/:id/retire
Where Retire this box goes; it asks first.
Give a customer a box /boxes/subs
On Veg boxes: the customer, the box, how often (every week, fortnight or four weeks), the day of the first box, and collected or delivered.
A customer's box /boxes/subs/:id
The next eight days on its round, each coming, skipped (and by whom), paused or made up (with its order number). Skip a day (or Have it after all), Pause for a while up to and including a day (it starts again by itself after, or Start again now), Swaps - instead of something in the box, have something else sold the same way (each for each, by weight for by weight), or nothing - and End this box (it asks first). A day already made up as an order cannot be skipped here: cancel that order instead.
Change a customer's box /boxes/subs/:id/change
Where each of those buttons goes.
Make the box orders /boxes/make
For a day (today or later): one ordinary order for each box due that day - the customer, the box's price as the total, paid as "Veg box", its lines the box's contents with that customer's swaps (lines priced £0.00: the box is priced as a whole). Skipped, paused and ended boxes are left out, and a box already made for that day is never made again, however often the button is pressed - the page says how many were made, already made, skipped and paused, lists the new orders, and links to the picking list for that day, which now holds them with everything else. Completing a box's order takes its contents off stock as any order does. Any webhook that wants new orders is sent each one.
Their boxes on their own page /c/:link/boxes/:box
A customer with a box sees Your boxes on their own page: the next six days, Skip this one or Have it after all, Pause for a while and Start again now, and Swap something in your box (and Undo). A day already made up says so - they ring you; and only you can end a box. Your box screens show who skipped or swapped.
One order /orders/:id
The order's number (ORD-0007) at the top with who it is for, its lines and totals, its state, and one button — the next step: Start picking, then Mark picked, then Mark complete (each submits to /orders/:id/status). Marking an order complete takes the quantities off the products' stock. To stop an order, open Problem with this order? and press Cancel order; it asks first, and the order stays on record, marked cancelled, with no stock taken off. Marking it complete takes off exactly what went out, for each product whose stock is counted — a figure is never clamped at zero and never invented for a product that has none — and each product's stock movements and history say so with the order number. An order whose stock already went out when it was paid online is not taken off again; its history says so. Under the order, History — who did what, and when: when it was raised (its number, total and lines) and each step it moved on, by whom, in UK time.
Weigh an order /orders/:id/weigh
On an order with things sold by weight, Weigh lists each with the weight it was ordered at (an estimate, for an order placed online) and its price a kg. Type what each came to and Save the weights: each line is priced again at the price a kg it was ordered at (not today's), the order is totalled again (any discount kept), the order says its new total, and the history says Weighed with the total before and after. The customer's own link then shows the real weights and the total, no longer "about". Offered until the order is complete or cancelled, and never on an order already paid (or being paid) - its total cannot change. Marking the order complete takes the weighed amount off stock.
Orders online /online
From Orders (orders online) or Team, for the owner and administrators. Off unless you switch it on. Tick Take orders online, whether customers may collect, whether the shop delivers (and, if you like, the postcodes you deliver to - PL1, PL2, TR: a whole area like TR covers TR1 to TR27; blank is anywhere), the days' notice you need (0 to 14), and a line for customers (opening times, where to collect). Save, and the page shows your shop's own address to share - on your website, your social media, a poster. Recent orders from the web lists the last twenty with their numbers. A demonstration shop does not take orders online.
Order cycles /online/cycles
On Orders online, if you take orders in windows (a weekly box, a Friday bake): Add the cycle with a name, when ordering opens and closes (UK time) and the day the orders are ready. While one is open, your page takes orders for that day only and says until when; between windows it says when the next opens and takes none. When none is open or to come, your page goes back to taking orders for any day after your notice - switch orders online off if you do not want that. The list shows each cycle as to come, open now or closed.
Close a cycle now /online/cycles/:id/close
Close it now on an open cycle ends ordering for it at once; the orders already placed stay.
Call a cycle off /online/cycles/:id/cancel
Call it off on a cycle that has not closed: it no longer opens (or, if open, it stops). Orders already placed stay.
Limits a product /online/limits
On Orders online: choose a product and give the least and/or the most one order online may have - each, or kilograms for things sold by weight. Your page shows them beside the product ("at least 2, at most 6 an order") and an order outside them is refused in words, with what was typed kept.
Remove a limit /online/limits/:id/remove
Remove puts the product back to no limit.
Vouchers /online/vouchers
On Orders online: Make the voucher with a code (3 to 24 letters, numbers or dashes - e.g. SUMMER10), a percentage or an amount off, and if you like a least spend, a first and last day, and how many orders may use it. Your page then shows a Voucher code box; a good code takes its amount off the order (never more than the order), and the order, the customer's link and the history say which voucher and how much. A wrong, finished, used-up or too-small use is refused in words and nothing is ordered. The amount off is fixed when the order is placed - weighing the order later keeps it. Codes are never reused. The list shows how many orders have used each.
Switch a voucher off /online/vouchers/:id/off
Switch off stops the code taking anything off from then on; orders that used it keep their discount.
Your WhatsApp number /online/whatsapp
On Orders online, under News, offers and WhatsApp: your shop's WhatsApp number (a UK number, e.g. 07700 900123). With it, your order page offers Order on WhatsApp: WhatsApp opens on the customer's phone, to your number, with what they put in the basket written in - they press send. Blank takes the button away.
Download for Mailchimp /customers/marketing.csv
On Orders online: how many customers said yes to news and offers by email, and Download for Mailchimp - those customers only, in Mailchimp's own import layout (Email Address, First Name, Last Name, Phone Number, Tags - the tag is your shop's name). In Mailchimp: Audience, Import contacts, upload the file. Only a customer can say yes - an unticked box on your order page (it needs their email) or Yes on their own page - so you cannot add anyone to it; each customer's page says where they stand.
Withdraw their yes /customers/:id/consent/withdraw
On a customer's page, News and offers says yes (where and when they said it), no (when withdrawn) or not asked. Withdraw it (owner and administrators) takes them out of the Mailchimp file from then; the history says so. Erasing a customer's details withdraws it too. Remember to remove them in Mailchimp as well if you uploaded them before.
News and offers on their own page /c/:link/news
On a customer's own page, News and offers says whether they get them, with Yes, email me news and offers (their email must be under Your details) or Stop them. The shop's history says they changed it on their own page.
Your shop's own page /s/:shop
What your customers see, signed in or not: your products on sale at your prices, a box beside each for how many (kilograms for things sold by weight), collect or deliver, the day (from your notice up to two months ahead), their name and phone, email if they wish, and the address and postcode for a delivery. Place the order checks it all - a day too soon, a postcode you do not deliver to, half of something sold each, a missing phone number - and says what to put right, keeping what they typed. The prices are always yours, read when the order is placed; nothing a customer sends can change one. Five orders an hour from one place, then they are asked to ring. A shop that is not taking orders online says so. A product with a photograph shows it, small, beside its name (/s/:shop/photo/:product - only while you take orders online, only for a product on sale).
Place the order /s/:shop/order
Where Place the order goes. It is checked as above and, if anything needs putting right, the page comes back with what to fix and nothing ordered; if all is well the order is made and the customer is taken to their own link.
The order arrives
In Orders like any other, with its ORD- number, the day wanted as its delivery date, and Pay on collection or Pay on delivery. On the order, Ordered online shows collect or deliver, the day, and the name, phone (tap to ring), email, address and anything they said. Things sold by weight are estimates: weigh them when you make it up. The customer is the one on your books with the same phone number (and email, if both have one), or a new customer added for them. The history says it was placed by Online shop - the customer; a webhook that wants new orders is sent it (order.created, with "from": "web"). Erasing a customer's details clears what they gave on their web orders too.
The customer's own link /s/:shop/order/:link
After Place the order the customer lands on their own page: the order number, collect or deliver and the day, the lines, the estimated total, and where it has got to (received, being made up, ready, complete). Only a fingerprint of that link is kept, so nobody can work it out; to change or cancel, they ring you.
Team /team
For the owner and administrators only — to everyone else it says so and shows nothing. Who can sign in to this shop, what each may do, and whether they have set their password yet. Add a person takes their name, the email they will sign in with, and what they may do: Shopkeeper (the till, products, stock, customers and orders), Read only (sees the shop, its stock and takings, changes nothing), or, given by the owner only, Administrator. Voids and refunds stay with the owner and administrators. Once added, a one-time link is shown on screen, once: hand it to them by text or in person. It lets them set their own password, works once, and lasts an hour. Nothing is emailed, and no password is made up for them. One email signs in to one shop on PBS Shop, so an address already used for a login is refused. A read-only login has no Sell or Add a product in its menu; opening the till says it cannot ring up a sale, and any change it sends is refused in words — nothing is saved.
A new link /team/:id/link
Make a new link for a person whose link ran out or was lost. It is shown once, and any earlier link of theirs stops working.
Remove access /team/:id/remove
Remove access signs the person out everywhere at once and stops them signing in. They stay on the list as No access, and every sale they rang keeps their name. Nobody can change the owner's access or their own, and only the owner can change an administrator's.
Give access back /team/:id/restore
Give access back lets a removed person sign in again with their own password, or make them a new link.
API keys /api-keys
From Team, for the owner and administrators. A key lets another system - your web shop, a marketplace, a spreadsheet, Zapier - read your products, till sales and orders and, if you tick It may set stock, change your stock figures. Make the key shows it once: copy it then, because only a fingerprint of it is kept. The list shows each key's name, its first characters, what it may do, who made it and when it was last used. A key acts with its maker's rights: it stops working when its maker no longer signs in, and sets stock only while its maker may. Treat a key like a password. A demonstration shop cannot make keys. The page also lists every address another system can use.
Revoke a key /api-keys/:id/revoke
Revoke stops a key at once; it stays on the list, marked revoked, with who revoked it and when.
The API: is the key good /api/v1/ping
Another system sends the key as Authorization: Bearer pbsfs_… and is told your shop's name and whether the key may set stock. Every answer is JSON; a refusal says why in error (no key, an unknown or revoked key, a maker who no longer signs in). These addresses read no sign-in and no form - the key is the only way in.
The API: products /api/v1/products
Your products with their prices and stock, as written in the shop. ?since= (a time) gives only those changed after it, &active=1 only those on sale, &limit= up to 200. /api/v1/products/<id> gives one.
The API: one product /api/v1/products/:id
One product, as above; an id that is not one of your products is answered "There is no product with that id."
The API: till sales /api/v1/sales
Till sales, newest first, each with its lines, how it was paid (and each way with its amount, for a sale paid more than one way), who served it, and whether it was voided. ?since= and &limit= as above.
The API: orders /api/v1/orders
Orders, newest first, each with its ORD- number, status, customer and lines. ?since=, &status= and &limit=.
The API: set stock /api/v1/stock
For a key that may set stock: the product (product_id, or its barcode), and either change (in or out, e.g. -2) or set (the figure counted on the shelf), with a reason - and, for a change, what happened if you say: kind is delivered, customer-return, waste, loss, returned or used (with none, a minus is sold or used elsewhere and a plus came in; waste and loss need a reason; a kind that does not match the sign of the change is refused). The same rule as Stock on screen: a change that takes out more than is in stock is refused, and nothing changes. The product's stock movements and history say which key changed it and why. This is how another place that sells the same goods keeps your stock figure true.
Webhooks /webhooks
From Team, for the owner and administrators. Your own system is sent each till sale (sale.completed - with its lines; a sale rung with no signal is sent when it arrives), stock change (stock.changed - from Stock or the API; a sale's own stock comes in the sale) or new order (order.created) the moment it happens, as JSON. Give the address (https, a name on the public internet - not this shop's own site or a bare IP address) and tick the events. The signing secret is shown once: each message carries X-PBS-Signature: t=<time>,v1=<HMAC-SHA256 of "time.body">, so your system can tell it came from your shop and refuse anything else. The sale never waits for your system: the message is written down with the sale and sent straight after; an address that does not answer 2xx is tried again after 1, 5 and 30 minutes, 2 hours and 6 hours, then marked failed. Sent lists every message, its state, the tries and the last answer.
Send a test /webhooks/:id/test
Send a test sends a ping message to that address at once; its answer appears under Sent.
Switch a webhook off /webhooks/:id/off
Switch off stops anything more being sent to that address. It stays listed, marked off, with what was sent before.
Clock in /clock
From Sell (Clock in), on the till's own device. The team is listed, each with in since a time or out. Tap your name, type your PIN, and you are clocked in - or out, if you were in; the screen says who and when. Five wrong PINs for one name in fifteen minutes and that name waits fifteen minutes. A person with no PIN yet is told to set one.
My PIN /clock/pin
Each person sets their own PIN on their own login: 4 to 6 digits, typed twice. It is kept only as a fingerprint, like a password - nobody can read it back, the owner included. The owner and administrators see whose PIN is set and can Clear it, after which that person sets a new one before they can clock in. An owner's or administrator's PIN is also how they authorise a discount, a void, a refund or a no sale at a shopkeeper's till.
Clear a PIN /clock/pin/:id/clear
Where Clear it goes - the owner or an administrator only.
Hours this week /clock/hours
For the owner and administrators. Each person's hours on each day of the week (Monday to Sunday) and their total; anyone still clocked in is listed with the time they came in, and their shift counts once they clock out - an open shift is never given an end the app made up. A shift counts on the day it began; times are UK time. The week before and the week after move through the weeks.
Every shift as a spreadsheet /clock/hours.csv
The week's shifts as a spreadsheet (CSV): who, the day, clocked in, clocked out (or "still in") and the minutes - for your wages or your accountant. Clock ins and outs are also in Take everything out; the PINs are not.
Close our account /account/close
Close our account in the menu, for 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 shop can read everything but not save, as when a payment lapses. Type close our account and press Close our account: every subscription the shop holds is told to stop renewing (each read back first - one that is not this shop'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 (where the shop cannot reach Stripe itself, a shop with no subscription on record is closed with nothing billed, and one with a subscription on record is told to talk to us, with nothing recorded); 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. Both are in Take everything out.
Take everything out /export
Export in the menu, for the owner and administrators. Everything the shop holds, listed by kind — products and their history, customers, orders and their lines, till sales, voids, refunds, cash-ups, cash in and out, who did what, the team — with how many rows each has. It is yours, it costs nothing, and you can take it as often as you like. Left out on purpose: the sign-in secrets (password fingerprints, sessions and reset links), so nobody can sign in with the file.
Download everything /export.zip
Download everything gives one .zip (pbs-shop-export-<date>.zip): a CSV for each kind of record, 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 without anything installed. Text a spreadsheet would run as a formula is written as text; numbers stay numbers.
What this does not do
It is a product, orders and counter-sales register, not a bookkeeping package, and it certifies nobody. It does not process card payments — On account and Card record how the money arrived, they do not take it; the card machine is still the card machine. Orders online are paid on collection or delivery: card payment on your own page needs your shop's own card account connected, and that is not built. Refunds, cashing up, multi-buy offers, discounts and paying more than one way at the till are done here (see Refund a sale, Cash up, Offers and Sell); an order can be paid in parts too (Record a payment), and a voucher takes money off an order placed online (Vouchers). Offers are not taken off orders or the till with no signal, and the till with no signal takes one way per sale. Invoices are not VAT invoices: the shop keeps no VAT rate on its products, so nothing works VAT out. Card payment on the shop's own order page is not built: it needs the shop's own card account connected, so orders online are paid on collection or delivery.
Password reset
Recover access when a password is forgotten. Single-use, time-limited, and you set your own new password.
Forgot password /forgot-password
Enter your email. A signed-in owner/admin is shown a one-time reset link on screen to hand over. Otherwise we email you a reset link, which brings you back here to Set a new password; the screen says the request was made, and says plainly if the send failed (nothing is ever claimed "on its way" that did not go). Email recovery reaches addresses set up for it — if nothing arrives, an administrator can issue a link.
Set a new password /reset-password
Reached from a one-time link carrying the token; enter and confirm your new password. The link expires within the hour and works once; setting a password ends your other sessions. A link that has expired or already been used is refused before you type anything, and you are shown the request screen to ask for a new one.