Repository navigation
Shop
Shop turns your Cactus site into a fully working shop: products, a cart, checkout, orders, discounts and more - all from your own admin, no third-party shop platform needed.
The shop lives at /shop on your site (/shop/products/your-product for a product, /shop/categories/mugs for a category, and so on).
Product page address. If you would rather a product lived at the very top of your site - /your-product instead of /shop/products/your-product - flip Product page address in Settings → Shop → General → SEO. Only the product page itself moves; categories, collections, the cart and checkout all stay under /shop. Each product then has exactly one address, and the old one forwards to it rather than leaving bookmarked shoppers staring at a not-found page. Everything on your own site follows the setting on its own - the sitemap, menus, product grids, search results, reviews, the accessories panel and the Google Shopping feed - but outside links can still take a while to be recrawled, so it is worth switching deliberately rather than on a whim. If you use the site search, run a reindex afterwards so its results carry the new addresses. A page of your own with the same address always wins the spot - the shop only answers where nothing else does (technically: core resolves an info page first, then a module index, then a module's publicRootSlug claim; shop claims a bare slug only when the style is set to root and a product row or forwarding rule carries that slug). The sitemap, menus, product grids, and the Google Shopping feed all follow the setting on their own.
Where things live now. The shop used to spread nine links across your sidebar, and each add-on you installed took another. It now takes two: Catalogue and Trading.
- Catalogue - Products, Categories, Collections, and a tab for each catalogue add-on you have installed (Variations, Attributes, Add-ons, Filters, Reviews).
- Trading - Orders, Cancellations & returns, Customers, Discounts, Reports, Tax & shipping, Suppliers if you keep them, and Quotes if you have that module.
Nothing was taken away and nothing moved house without leaving a forwarding address: every old link still works, it just carries you to the right tab.
Shop has seven permissions, set on your core roles from Users → Roles:
-
shop.access- see the Shop section in the admin sidebar, view (but not change) orders, products and customers. -
shop.manage- full run of the shop: settings, tax and shipping setup. (Editing what the shop's emails say needsemails.templatesinstead - they live on the site-wide Emails tab now. Its text messages needsms.templates, and live on the Twilio tab.) Overrides every other Shop permission below. -
shop.products- create, edit and delete products, categories, tags and collections; run CSV imports and exports. -
shop.orders- view and manage orders and refunds. -
shop.customers- view customer records. -
shop.discounts- create and manage coupon codes and automatic discounts. -
shop.reports- see tax and revenue reports.
shop.access really is look but don't touch. Raising or re-sending an invoice or a credit note needs shop.orders, and answering, re-opening or deleting a customer's product question needs shop.products. The order-size deduction report sits with the other reports, under shop.reports.
Core admins always have full run of Shop, permissions or no permissions.
Settings → Shop → Payments opens on a list of every way this shop can take money - the four Shop comes with, plus anything an installed module has added. Each row has a switch, a plain-English line saying whether it is actually working, and a handle for dragging it up or down. That order is the order shoppers meet the methods at checkout, and the top one is the one already selected when they get there. Arrow buttons do the same job if you would rather not drag. Underneath, a sentence spells out exactly what a shopper will be offered, so there is no guessing.
Along the top is a row of buttons - the list, then one for each method. Everything to do with a method lives on its own button: its switch, its instructions, its keys. Nothing to scroll past to reach the thing you came for.
A row can be switched on and still not be working, and it will say so rather than leaving you to find out at checkout. Switching a method off changes nothing else about it - your keys, your bank details and your wording all stay exactly where they were, ready for whenever you switch it back on.
The four Shop comes with:
-
Card payments (Stripe) - needs a Stripe account. Enter your publishable key, secret key and webhook signing secret right there on the Payments tab (full admins only - a Shop Manager without full admin access will be told to ask one). Saving triggers the usual "changes awaiting deployment" notice - redeploy your site for the new keys to take effect. Until all three are set, Stripe won't be offered at checkout even if you've ticked it on.
-
PayPal - same screen: Client ID, Client secret, Webhook ID, plus a Mode switch (sandbox for testing, live once you're ready to take real payments). Same rule - missing keys mean it's silently hidden at checkout.
How a PayPal payment finishes. The shopper presses Place order, approves the payment on PayPal's site, and PayPal sends them straight back to your order confirmation page, which takes the money there and then and shows the order as paid. Cancel on PayPal's site and they land back at checkout with the basket untouched. If PayPal turns the payment down on the way back (a card it won't accept, say), the page says nothing was charged and points them back to checkout to try again or pay another way; the order stays unpaid rather than failed, and is tidied away like any other unpaid order. Try a sandbox order end to end before switching the Mode to live.
-
Bank transfer - no keys needed. Write your account details on the same tab and orders sit as "awaiting confirmation" until you mark them paid by hand once the money lands. The shopper gets an email as soon as they order carrying those same account details, the amount, and a note that delivery times run from the day the money arrives rather than the day they ordered.
-
Cash - for in-person or over-the-phone sales. Same manual confirmation as bank transfer.
You can offer as many or as few of these as you like, in whatever order suits you.
Underneath the box where you write those bank details (and the collection details for cash) there is a switch: Show this on the checkout page too. Leave it on and the shopper reads them the moment they pick the method, which is what Shop has always done. Turn it off and they wait until the order is actually placed - handy if you would rather your account number only went to someone who has committed to buying something. Either way the thank-you page and the shopper's own order page still show them, so nobody is ever left wondering where to send the money. The two methods have a switch each, so you can be cagey about the bank details and still tell people where to come and collect.
Bank transfer and cash are the two methods where the shopper leaves with an order nobody has been paid for yet, and an installed module is allowed to say what that means for them: picking one of those at the checkout can add a short line underneath it, and the order's own lines can read differently until you mark the payment received. Advanced Shipping uses this to stop the shop promising a delivery date counted from a day the money had not arrived - see "Orders that are paid for later" there. With no such module installed, nothing changes.
Instant Bank Pay (open banking) is a fifth option, added by installing the separate GoCardless Instant Bank Pay for Shop module. Shoppers authorise a one-off payment straight from their banking app - no card, no stored details. Once installed it joins the list on the Shop → Payments tab like any other method, with a button of its own along the top for its settings (add your GoCardless access token and webhook secret, choose sandbox or live). Switch it on, and drag it where you want it, on the list itself. The email address and name typed at checkout are carried over so nobody types them twice, and can still be changed if the payment is coming from an account in another name. Refunds and confirmation work the same as any other method.
The webhook is the part that actually confirms the money, and it is worth getting right. Note that sites running core older than v0.5.1436 turned these calls away at the door regardless of how it was set up, so a bank payment could take the money and never confirm the order; if you are updating from further back, look for orders stuck at awaiting confirmation and check them against your GoCardless records before chasing anyone. The panel shows the address to paste into your GoCardless dashboard as a webhook endpoint, and the secret you set on that endpoint there has to be the same string as the webhook secret saved here. GoCardless does not check that when you add the endpoint - a mismatched pair looks perfectly healthy from their side and is only turned away when a payment tries to confirm - so the panel now reports how the last delivery went, right underneath the address. Green means GoCardless reached you. Red means it was turned away, and the two secrets differ: until you make them match, payments will sit at awaiting confirmation even though the money has left the shopper's account.
There is a second switch on that same panel, Let shoppers choose their bank on your checkout, and it is off to begin with. Turn it on and the bank list appears on your own checkout under the payment option, search box and all; the shopper picks their bank there and placing the order takes them straight to it, skipping the two GoCardless screens that would otherwise ask which bank they use and who they are. The approval itself still happens at the bank, because that is the bank's job and nowhere else will do. It also needs GoCardless to switch it on at their end - an account upgrade they grant on request, with no setting for it in your GoCardless dashboard, so the only way to get it is to message their support and ask for custom payment pages. The panel checks your account and tells you which way round you are. Until they enable it, the switch changes nothing a shopper can see: the checkout carries on sending them to GoCardless to choose, exactly as before.
Where the card is typed is a dropdown on that same page, and the one worth a moment's thought.
- On your own checkout (the recommended setting) draws Square's own card fields beside your Place order button, on the page the shopper is already looking at. The fields are Square's, served from Square and sealed off from the rest of the page, so the card number is no more yours than it was before - the shopper simply never leaves. Pressing Place order takes the payment then and there. This needs the Application ID as well as the access token, and the method is quietly not offered until that box is filled in, on the grounds that a card form that cannot be drawn is worse than one that was never promised.
- On Square's own page sends the shopper to Square, takes the payment there, and sends them back. This is what the module did before there was a choice, and it is what an existing shop keeps on updating - nothing changes underneath anyone. It is still the right answer if you would rather not think about Application IDs at all.
Either way the order is only created once the card has actually been authorised, so a shopper who thinks better of it leaves nothing in your orders list. The difference is how many of them get that far: a redirect to somebody else's site, in somebody else's colours, is a well-known place for a checkout to lose people.
Where everything sits at the checkout. Under the order summary, in this order: anything still holding the button shut, then the wallet buttons, then the card fields, then Place order. The card is typed next to the button that spends it, rather than several steps up the page where it was filled in before the total had been seen - and where anyone scrolling straight to the button walked past it. Nothing to set up; it is simply where they are now.
Apple Pay and Google Pay. Taking the card on your own checkout used to cost you these, because they came free with Square's own page and nowhere else. Now there is a tickbox for them - Offer Apple Pay and Google Pay, on the Square settings page, under the on-page setting - and ticking it puts the wallet buttons directly above your Place order button, on the same Square account and the same credentials as the card fields. Nothing else to set up for Google Pay.
Each shopper sees only the one their device actually offers: Apple Pay on an iPhone, iPad or Mac in Safari, Google Pay very nearly everywhere else, both side by side on the rare device that does the two of them, and neither on a device that does neither - in which case they simply carry on typing their card as before. The buttons come to life at the same moment Place order does, so nobody skips your terms tickbox or half an address by paying with a thumbprint. Tapping one opens the wallet's own sheet, the shopper approves it there, and the order is placed the instant they do.
Apple wants one extra thing first: proof that this website is yours. In your Square dashboard, register your domain under Apple Pay, download the small file Square hands you, open it in any text editor and paste the contents into the Apple Pay domain file box that appears under the tickbox. Until you do, the Apple Pay button stays hidden - Apple would refuse it anyway, and a button that always fails is worse than no button. Google Pay is working the moment the tickbox is ticked.
None of this appears when the card is typed on Square's own page: that page carries Square's own wallet buttons already, and two sets of them on the way to one payment would be silly.
Cards issued in the UK and the EEA generally need the extra bank check (Strong Customer Authentication) before they will go through. On Square's page Square handles that. On your own checkout the module asks for it as part of placing the order, so a shopper's bank may still put its own "confirm this payment" step in front of them - which is the bank's screen, not yours, and exactly as it should be.
Card payment (Square) is another card option, added by installing the separate Square Payments for Shop module. Card details never touch your site, and you choose where the shopper types them: in Square's card fields drawn on your own checkout, or on Square's hosted page a redirect away. It joins the list on the Shop → Payments tab, with a button of its own along the top for its settings. Sandbox and production get their own boxes, so both sets of credentials can be held at once and choosing which one the shop uses is a single dropdown. That dropdown saves itself the moment you change it and takes effect at once - there is nothing to deploy and no Save to press for it. The credentials in the boxes below are a different matter: those are stored with your hosting, so a token you have only just pasted in needs the site to redeploy before it will work. Paste in the access token from your Square developer dashboard, and the Application ID shown next to it if you want the card typed on your own checkout, then press Look up locations to fill the location ID in rather than hunting for it. Credentials only reach your running site when it redeploys, so a box can quite correctly show (set) while the panel above still says Square is not connected. The panel says as much in those words, and names the ones that are saved-but-not-yet-live separately from the ones you have not filled in at all. Deploy from the notification on your dashboard and come back. Add the webhook URL shown on the page to your Square developer dashboard, paste back the signature key it gives you, then switch the method on. The signature key is optional: without it payments are still confirmed when the shopper comes back from Square, but a shopper who pays and then closes the tab has to be confirmed by hand. Refunds and confirmation work the same as any other method.
Pay by bank (Atoa) is a second open-banking option, added by installing the separate Pay With Atoa module. Like Instant Bank Pay it takes a one-off payment the shopper approves in their own banking app, with no card and nothing stored; it is a different provider, so it is a matter of which account you would rather have. You choose where the shopper pays: handed to Atoa's own page and brought back, which is what happens out of the box, or Atoa's payment window opening over your own checkout so they never leave your site - that second one needs your web address whitelisting with Atoa first, and the module's own page explains where. It joins the list on the Shop → Payments tab with a button of its own along the top for its settings, where sandbox and production get their own boxes and a single dropdown says which the shop is using - that dropdown takes effect at once, while the credentials in the boxes below wait for the site to redeploy. Registering where Atoa sends its confirmations is a button on that page rather than an address to paste anywhere. One thing is different from the others: refunds are recorded but not sent. Pressing Refund takes the items off the order, credits your books and sends the credit note exactly as it always did, but the money itself goes from your bank to the customer's, the same as refunding a bank transfer. Automatic refunds are a later release, and the refund box says so. See Pay With Atoa for the setup.
Payment description on that tab decides what the method is called: fill it in with "Card payment" and that is what shoppers pick at checkout, what the Payments tab calls it, and what shows on the order. The same wording goes to Square for the shopper to see on their page, with the order number added on the end. Leave the box empty and the method keeps its default name, Card payment (Square).
No order until somebody has actually paid. Instant Bank Pay, Pay by bank (Atoa) and Card payment (Square) all finish somewhere else - a banking app, or Square's own page - and plenty of shoppers get that far and think better of it. Those methods now hold everything back until the money is committed, so an order only appears in Shop → Orders once there is a payment behind it. A shopper who picks the method, presses Place order, and then closes the bank's page leaves nothing behind at all: no order, no number, nothing sitting in your list looking exactly like a sale. Before this, every one of them left a real order marked unpaid, and the only way to tell a genuine one from a change of heart was to wait and see. The one thing you will notice is the odd gap in your order numbers, which is what a walked-away checkout now costs instead of a phantom order. Everything else works as it always did: the confirmation email, the stock, the receipt and the refunds all start from the moment the money lands. The other methods are unchanged - a card typed on your own checkout, or a bank transfer somebody sends you later, still makes its order there and then, because in both cases the order is a real thing the moment it is placed.
Badges at checkout. Card (Stripe), PayPal, Card payment (Square), Instant Bank Pay, Pay by bank (Atoa) and bank transfer each show a logo beside the name, so a shopper spots the one they know before reading a word. Nothing to upload: the badge comes with the method, and it is drawn to suit whichever face your site is showing, light or dark. Bank transfer is nobody's brand, so it gets a plain bank building rather than a logo as such. Cash gets nothing - a shopper paying in cash knows what cash is.
How each method reads at checkout. At the bottom of the Payment methods list, every method gets a card of its own holding the two things a shopper actually sees. A switch decides whether its logo appears beside the name, with the badge itself sitting right there so you can see what you are switching off; a method that brought no logo has no switch, there being nothing to show. Below that is the sentence printed under the name, saying who handles the money - "Credit and debit card payments are securely handled by our payment partner Stripe", and so on. Every method arrives with wording of its own and you can write straight over it. Empty the box again and the original comes back, so there is no way to lose it, and a method that arrived with nothing to say shows nothing until you type something in. Switching a logo off keeps it off the page altogether rather than merely out of sight.
Only offering a method on orders of a certain size. Underneath that, When each method is offered gives every method a Smallest order and a Largest order box. Leave both empty - which is how they all start - and the method is offered on everything, exactly as before. Fill one in and the method only appears on orders of that size. The figure is the total the customer actually pays, VAT and delivery included and any discount taken off, which is the same number printed at the bottom of their order summary. Both ends count, so a largest order of 571 and a smallest order of 571.01 on two different methods hands every order to one of them and neither to both. The usual reason for bothering: one way of taking money is a percentage and another is a flat fee, so there is a figure above which one of them is simply cheaper to be paid by. Some banks and providers also have a ceiling of their own, and a method that was going to be refused at the last step is better not offered at all.
If the basket changes so that the method already chosen no longer qualifies, the checkout unpicks it and says why, rather than letting the shopper find out when they press the button. The rule is enforced again when the order is actually placed, so a page left open in another tab cannot slip past it, and it applies just as much to a customer settling an unpaid order from their own order page later. Set a limit on every method you take and a shopper outside all of them is told there is no way to pay online and to get in touch - so leave at least one method unlimited unless that is genuinely what you want.
Bank transfer and cash both end the same way: an order goes in, nobody has been paid, and it sits there until somebody remembers. A fair number never do - not out of bad faith, but because the transfer was going to be done later that evening and later that evening turned into next week.
So an unpaid order offers a second door. On the customer's own order page, under the bank details, is a short list of the automated methods you already take - Instant Bank Pay, Pay by bank (Atoa), Card payment (Square) - and the amount still owed on a button. They pick one, pay it there and then, and the order carries on exactly as if it had been paid at the checkout: stock, receipt, invoice and refunds all behave the same. Nothing is taken away in the process. Your bank details stay on the page for as long as the money is owed, because plenty of people genuinely want to pay that way, and Confirm payment on your own order screen still does what it always did if the transfer turns up after all.
The switch is on the Payment methods list, under Paying an order after it has been placed, and it is on to begin with. The methods it offers are the ones you have already switched on, so it asks nothing new of you - and if you take bank transfer precisely to keep the card fees off, one switch says so.
Two smaller things worth knowing. Only methods that have said they can settle an order that already exists are offered, which today means Instant Bank Pay, Pay by bank (Atoa) and Card payment (Square); Stripe and PayPal are not on that list yet. And a customer who starts a payment and thinks better of it loses nothing: they come back to their order page with the bank details where they left them, free to try the other method, or the transfer, or neither.
From Shop → Catalogue → New product, fill in a name and price to get started, then come back to fill in the rest.
The search box on the products list matches whole words in any order, across the name and the SKU. Typing "evolve screen" finds "Evolve / Impulse Plus Bench Screen" - you no longer have to remember the exact wording, or everything that sits between the two words you do remember. Every word you type has to appear somewhere, so adding another word narrows things down rather than widening them.
If you use Product options (variations), this also searches every variation's own code, not just the listing's own SKU. Type a code off a delivery note or a customer's order and you get taken straight to the listing it belongs to - never to the hidden entry underneath it that variations use to keep each combination's own price and stock. The same is true of the search box shoppers use on your storefront.
The product page is split into tabs, with a panel down the right that stays put as you work: whether the product is on sale, its main photo, its price and stock at a glance, and the Save changes button.
- Details - the name, the descriptions, and your own SKU and barcode. Beside them sits a Supplier SKU - what the people you buy this from call it, so an order going back to them speaks their language rather than yours. Leave it blank where they use your code. If you've switched on suppliers (see below), the box for picking one lives here too. The web address is set when you first save and left alone after that; rebuilding it to match a new name is a button on the Search tab. The full description can stay plain text, or you can hit Design with the page builder to lay it out with headings, images and columns instead - and once you're designing, Open in a new tab pops that builder out into a page of its own with nothing else on screen, handy on a small window. Saving there sends the design straight back to the product; it never fights with anything you're doing on the main page.
- Images - add one or more. The first one is the main photo, so drag them into the order you want (or use the arrows) and the first is what shows on listing cards and in the cart. Each one can have a short description for screen readers and search engines. When you save, your product photos are tidied away into a folder of the product's own, inside a folder named after its lead category (so "Blue Mug" ends up in Shop → Kitchenware → Blue Mug), keeping whatever filenames you uploaded them under. If that lead category sits inside another, the folders nest the same way, so a mug filed under Kitchenware inside Homeware lands in Shop → Homeware → Kitchenware → Blue Mug - the media library mirrors your category tree rather than flattening it. Re-save a product after moving it between categories and its whole folder (photos, 3D models and downloads together) shifts to match. If the product has variations, their photos are filed in a variations folder just inside it, so everything for one product sits in one place without a hundred variation shots burying your own three. Housekeeping you never have to think about. A Media library ↗ button at the top of the tab opens that same folder in the media library in a new tab, for the times you want the full set of library tools rather than the picker (a product with nothing filed yet lands on the nearest folder that does exist). The picker plays along too: choosing an existing image opens in that product's own folder rather than the whole library at once, with a breadcrumb to wander back up and folders to click into if the picture you want lives elsewhere - and the search box looks across every folder regardless. A folder with more pictures than fit on one screenful gets a Load more button at the bottom, so nothing is stranded out of reach, and a sort menu lets you order them newest or oldest first, or by name A-Z or Z-A. Upload new takes as many files as you like in one go - pick a whole batch and they go up three at a time, the button counting its way through them, and every one that lands is ticked ready to add. Big photographs straight off a camera are fine: they take the same route as the media library's own uploads, so the old "over 4 MB" refusal is gone. If one file in a batch won't go, it says which and why, and the others carry on regardless. On a product with variations, the combinations promoted with Image up front appear in this same grid, marked Variation (one tile per combination, even where you've picked several of its photos - the caption says how many, and they travel together), and are dragged about with your own pictures - drag one to the front and the product page and its tile in a grid both open on it. Each has its own description box, and its × takes it off the gallery without touching the photograph itself - see Shop variations.
- Pricing - the price, and the tax class. Every product needs a price and that one is not optional. Beyond it you can switch on any of four extra prices under Shop → Settings → General → Prices, and only the ones you switch on show up here: a sale price (what the item drops to during an offer - shoppers are charged this, with the normal price struck through beside it), a retail price (the RRP, kept as a reference or, if you like, shown to shoppers), a trade price (what a trade customer would pay, kept in the admin only), and a cost price (your own supplier cost). Fill in the cost price and Cactus works out your profit and margin as you type - against the sale price when there's an offer on - and says so plainly if you're selling at a loss. Switch a price off and whatever you'd typed in it is kept, ready for when you switch it back on. Beside the sale price, once it's switched on, there's a Sale SKU box - some suppliers issue a separate code for discounted stock, and this is where you note it down so you order under the right one while the offer runs. Your own SKU on the Details tab is left exactly as it is, since a supplier's stock list still expects to see it.
- Stock & delivery - turn on stock tracking to set a stock count and a low-stock warning threshold, and choose what happens when it hits zero: block further sales, or let people order anyway (backorder). Smallest order lives here too, for anything you will not sell one of - a box of fifty castor cups, or a chair you will not send fewer than four of. Put the number in and the quantity picker on the product page opens on it, and a basket holding fewer is held back at the checkout with a line saying how many more are needed. It is a floor, not a batch size: set it to four and a customer can still order five, or seven - they simply cannot order three. And it is a rule about the product, not about one row of the basket: on something with options, four of one colour and four in a mix of four colours both count as four, so a customer is never told to take four of the same thing when they wanted one of each. Leave it empty and things sell one at a time, which is what all but a handful of products want. Pre-order lives here as well: flag a product as a pre-order with an expected dispatch date and an optional note, and customers can buy it straight away while stock only comes off the shelf once you actually mark the order as shipped. So does the weight and size of the thing, which is what postage priced by weight is worked out from - though the weight box only appears while Charge postage by weight is switched on under Tax & shipping.
- Download - for digital products only, the file customers download after paying, with an optional download limit and expiry. The limit only counts downloads that actually finished, so a transfer that gives up halfway through doesn't quietly cost your customer one of their goes - and opening the link in several tabs at once can't sneak past it. Refund the item (or the whole order) and its link stops working, with a page saying why. Files can be up to 20 MB - the most a customer on an ordinary connection can download inside the minute the download link gets. Anything over 4 MB goes straight to your media storage, so it needs S3-compatible storage (R2, B2 or S3) set up under Settings → General → Media. The file arrives named as you uploaded it, tidied up where it has to be: the odd character that would confuse a browser is swapped for a space, and accents and other alphabets survive intact.
- FAQs - the questions people keep asking about this particular product, and the answers. They show as a section of their own on the product page, below the measurements and above any downloads, with a link in the page's section strip. There's a switch at the foot of the tab for the odd product where the shop's usual answers are wrong: turn it off and the product shows only what you've written here, nothing inherited. See Frequently asked questions below - most of the writing is better done once for a whole range than a thousand times over.
- Organisation - categories, tags and collections, however suits. A product can sit in as many categories as you like, but one of them is its lead category, chosen from a dropdown of the ones you've ticked. It's the category the product's photos get filed under. At the foot of the tab sits Keep this product off the featured shelves, for the ones you would rather were not paraded on the front page. See below.
- Recommendations - what to show as "you might also like", and what to nudge at the cart. Pick them yourself or let the shop choose.
- Search - a custom page title and description for search engines, with a preview of roughly what Google will show. Leave them empty and the product's own name and short description are used. The product's web address sits here too, under the preview. Renaming a product deliberately leaves its address where it was - it is a live link, and quietly moving it every time somebody tidies a name would break every share of it - so Rebuild web address is there for when you do want it caught up. Press it and the preview shows where the page is about to move to; save and it moves, taking every variation of the product with it, since a variation's address is built from the product's own. The old address forwards to the new one, but it is still worth a thought if you have been handing it out.
Install the Shop Variations or Product Attributes modules and they add their own tabs here too, so options, personalisation and filters are all on the product rather than off on some other screen.
One button saves the lot. Any tab holding changes you haven't saved gets an amber dot, and they're listed next to the Save button so nothing hides from you. Anything that needs fixing first goes red and Cactus takes you to it. Try to wander off with unsaved work and you'll be asked first, rather than finding out later.
Leave it as a draft to keep working on it privately, or set it Active to put it in front of customers straight away.
Both the products list and a product's own edit page carry a Preview button - the list's sits beside each row's actions, the edit page's just under Save - opening the live shop page in a new tab. Active products open for anyone; draft ones open too, but only while you are signed in to the admin - everyone else gets a page-not-found, and a banner on the page tells you it is still a draft. Archived products grey the button out, since there is nothing to preview.
And the same trip the other way round. While you're signed in and allowed to edit products, the product's name on its own shop page is a link back to its edit page, opening in a new tab so the shop page you were checking stays where it is. There's a faint pencil beside the name to remind you it's there. Spot a typo while browsing your own shop, click the name, fix it - no hunting through the products list for the right row. Customers see none of this: to anyone who isn't signed in with permission to edit products, the name is just a name, and the link is never put on the page in the first place.
The same shortcut is now on the cards as well, so a category page, a search results page, a collection or any grid of products is a list of edit links to whoever's allowed one. Click the picture or anywhere else on the card and you go to the product page as always; click the name itself, pencil and all, and you land in its editor in a new tab. Handy for working down a category fixing prices, rather than matching rows in the products list to what you were looking at. Again, shoppers get a plain name and nothing else.
The stock figure behind "In stock". A shopper is told whether something can be bought and nothing more, which is right for them and no use at all to you. So while you're signed in with Shop access, a product page also shows the actual number, in a small dashed box marked staff only so there's no wondering whether the customer looking over your shoulder can see it too. On an ordinary product it sits with the badges as Stock: 42, or Stock: not tracked where you've left stock counting switched off - a blank would only look like something that failed to load. On a product with options it sits under the buy button instead and belongs to the combination you've actually chosen, changing as you pick, because "how many of these are there" only has an answer once you've said which one. Shoppers get none of it: the numbers aren't merely hidden from them, they're never sent to their browser at all, so there's nothing to go digging for.
And the codes you order under. The Sale SKU - the supplier's code for stock they've put on clearance - now shows on the product's own shop page in the same dashed staff only box, just under the SKU line. It appears whenever the product has one, on offer or not, so when a customer rings up about the chair on the page in front of you, the code you'd actually place the order with is right there rather than three clicks into the admin. Customers never see it, and it's never put on the page for them in the first place.
The product's own SKU is now staff-only too, and by default. It's a buying reference, and a customer has no more use for it than they do for your supplier's clearance code - so it sits on the page for you, with a small "staff only" note beside it, and isn't put in front of shoppers at all. If yours is one of the shops that quotes SKUs to customers deliberately, the SKU block carries a Show the code to setting: Editing pages → your product detail layout → click the SKU block → set it to Everyone.
Some things are sold as a set: a chair that is really a seat, a back and a base, or a desk and its screen. Open the product, go to Stock & delivery and use Made up of other products. Search for each part by name or SKU, say how many of it go into one, and press Save parts.
From then on the product has no stock of its own to look after. It follows its scarcest part, so if the back runs out, the whole chair shows as out of stock, and when the back comes in again so does the chair. A part you do not keep a count of never holds it up. The product page shows what it can make right now instead of a box to type a number into.
A few things worth knowing:
- The parts are ordinary products. Spare parts you have marked as "parts only" are the obvious choice, and they keep their own SKU, supplier and cost. The set itself needs no SKU.
- Selling one takes the parts off the shelf. Refunding one that has not left puts them back. Nothing is ever taken off the set's own count, because it has none.
- One level only. A set cannot be a part of another set, and a part cannot itself be a set.
- A part cannot be deleted while a set uses it. You are told which one, and you take it out of there first.
- Delivering stock books in the parts. Adjusting the stock of the set itself is refused, with a nudge towards the parts.
When the order is bought in, each part goes to whoever supplies it. See "Buying for a customer order" in the Purchase Orders page.
Every shop answers the same handful of questions until it is blue in the face. How long is the lead time, does it come assembled, can I have it in a different fabric. Those answers can now live on the product page itself, in a section shoppers can open one at a time, with a link in the page's section strip between the measurements and the downloads. Search engines are handed them too, in the form they use for the question-and-answer results you sometimes see under a listing.
You write them in three places, and a product page shows all three at once.
- For the whole shop - Shop → Settings → General → Product FAQs. Delivery, returns, how to get hold of you: the answers that are true of everything you sell. Written once, shown on every product.
- For a range - on the Categories screen, open a category and there's a questions list at the bottom of its panel. Everything filed under that category shows them, and so does everything under its sub-categories, so writing the office-chair answers once covers all four hundred office chairs. A category with questions written against it carries a small FAQs badge in the tree, so you can see at a glance which ranges have been done.
- For one collection - the collection's own FAQs tab on the Collections screen. These are for the collection's own page and nothing else: a product can sit in several collections at once, and one that inherited from all of them would answer the same question three different ways with no rule for which wins.
- For one product - the product's own FAQs tab, for the things that are only true of that one thing.
Writing the answer. Plain writing is all most answers need, and line breaks are kept as you type them. If an answer wants more than that - a link to the returns page, a list of the counties you deliver to, a word in bold - you can type HTML into the answer box and it will be shown as such. Anything unsafe is stripped out on the way to the page, so a pasted block from somewhere else cannot bring a nasty surprise with it. An answer that merely mentions a tag in passing is left alone and printed as the words you typed.
Nearest wins. Ask the same question in two places and the one closest to the product answers it: a product's answer beats its category's, and a category's beats the shop's. That's how you keep one set of delivery wording for the whole catalogue and still say something different about the one item that's made to order. It isn't fussy about matching - capital letters, extra spaces and the question mark are all ignored, so you don't have to retype the heading character for character.
Not inheriting at all. Both the category panel and the product tab have a tick marked also show the shared questions. Untick it and that product, or that whole range, shows only what's written there - nothing from above it. Useful for a range where the standard answers would be actively misleading.
Nothing written, nothing shown. A product with no questions of its own, no category questions and no shop-wide ones gets no section and no link in the strip - an empty accordion is worse than none. (The one exception is Let shoppers ask a question, below: switch that on and every product gets the section, because the product nobody has written a word about is the one a shopper most needs to ask about.) The same goes for a half-written entry: a question with no answer beside it is simply left off the page. And if you would rather not have the feature at all, the tick at the top of Product FAQs in settings takes it off every page in one go, category blocks included.
Where it appears on a product page. The section is part of the product page's usual run of sections - Description, Specification, Dimensions, FAQs, Downloads - so it inherits whatever you've chosen for those under Editing pages: stacked one after another, or collapsible. Nothing to place, nothing to drag.
On a product page it's a search box, not a list. A product can inherit thirty questions from its range and from the shop, and thirty collapsed headings is a second page to read rather than an answer. So the FAQs section opens on a search box and nothing else. The shopper types a word or two, a short list of matching questions drops down, and picking one opens that answer underneath. They can open as many as they like, and close them again.
The search looks at the answers as well as the questions, so somebody typing "delivery" finds How long until it arrives? even though the question never says the word. Questions beginning with what they typed come first, then questions containing it, then answers containing it - and where two are equally good, the one written closest to the product wins.
You can change the wording on the box itself: Shop → Settings → General → Product FAQs → What the product page's search box says.
Search engines and AI still see every answer. This is worth being clear about, because hiding things from shoppers usually means hiding them from Google too, and here it does not. Every question and every answer is written into the page itself, exactly as before - the search box only decides which of them are shown, and it decides it in the shopper's browser. The hidden product details that search engines and AI assistants read carry the full set whatever anybody types, and a visitor with JavaScript turned off gets the whole list as a plain set of headings, with no search box at all.
At the top of the suggestions: "Can't find your answer? Ask a new question." It sits above the near-misses on purpose - a shopper who has typed their question and not found it is precisely the person with a new one to ask, and they shouldn't have to read to the bottom of a list of things that don't help first. Clicking it opens the question form directly, with no second button to press. It only appears if you've switched Let shoppers ask a question on, below.
Category and collection pages are unaffected: the Shop: FAQs piece there lists its questions plainly, since a category page carries a handful rather than thirty.
And on your other shop pages. The shop home page, category pages, collection pages and tag pages can all carry the questions, but there you place them yourself: Editing pages → Shop → Shop Home (or Category, or Collection, or Tag), then drop in the Shop: FAQs piece wherever you want it - usually under the product grid, where a shopper who has scrolled the range still has a question. It has a heading box, a choice of one or two columns, and a choice of what to print:
- This category's or collection's own questions (the default) - just what you wrote against that one. On a category, the shop-wide answers are already on every product underneath it, and printing them here as well means the same questions on the category page and on all four hundred things in it, which is not what anybody wants a search engine to find.
- Those, plus the parent categories and the shop - the full set a product in this range would show. Fuller page, at the cost of that repetition.
On the Shop Home and Tag layouts there is nothing to choose: neither carries questions of its own, so the piece prints your shop-wide set whichever option is picked. That is how you get your main FAQs onto /shop. And as everywhere else, a page with no questions to show gets no heading and no empty box - the piece simply isn't there.
Two columns. On these pages the questions list in two columns on a desktop screen, and one on a tablet or a phone, where two columns of accordion would be two columns of nothing. Set the piece to One column if you would rather they ran down the page. Product pages are unaffected - they have the search box instead.
You will never guess every question. Shop → Settings → General → Product FAQs → Let shoppers ask a question puts an Ask a question button under the questions on every product page. The shopper leaves their name (optional), their email address (not optional - there is nowhere else to send the answer) and the question itself. It is off until you switch it on.
Four boxes sit under the tick: what the button says, the line above the form, what the shopper is told once it has gone, and an address to email each new question to. Leave the last one empty and nothing is emailed - the questions simply wait for you.
Either way, a question arriving lights the bell at the top of the admin: N product questions waiting, counting the ones nobody has answered yet, with a button straight to the queue. It follows the queue down as you work through it and takes itself away when the last one is dealt with, so the email address is a convenience rather than the only way you hear about one.
Answering. They land under Shop → Catalogue → Questions, waiting ones first. Write the answer, press Email the answer and add it to the FAQs, and two things happen at once: the person who asked gets it by email, and the question and your answer are added to that product's own FAQs, where the next shopper will find them without asking. That is the point of the whole feature - a question asked once becomes an answer everybody gets.
So write the answer as you want it to read on the page, not as a private note. If a question turns out to be a one-off - a delivery date, somebody's own office - answer it, then take it off the page afterwards: Delete on the question does it, or the product's own FAQs tab, where it now sits like any question you wrote yourself.
The buttons beside each one: Bin it for the spam and the things that belong in an order enquiry, Put back in the queue to undo that, and Delete to remove the question and the email address with it for good - which is the one to use if somebody asks you to forget them, and the one to use when an answer should never have gone on the page. Deleting takes the answer it published off the product with it, reworded or not, so the page and the queue agree. A question that never reached the page takes nothing off, and the dialog says which of the two you are about to do.
A question marked Not on the page was emailed but not added to the FAQs: either that question was already answered there, or it was too long to work as a heading, or the product has since gone. The answer reached the person who asked either way.
If nothing sends. Answering needs the site's email set up and the Product question answered email switched on under Settings → Emails. If either is missing, nothing is sent, nothing is published, and the question stays in the queue exactly as it was, with what you typed still in the box - so it is never a case of wondering whether the customer got it.
Categories are the usual grouping (Mugs, under Kitchenware, under Homeware). A category can also carry a set of frequently asked questions for its whole range, inherited by everything filed under it. A product can belong to several at once, and one is nominated the master category on the product page - the lead one, which decides which range's questions it inherits, and which is also where its photos get filed in your media library (under Shop → that category → the product's own folder, and if the category is itself a sub-category, nested inside its parents to match your tree). Products with no master land in a "Uncategorised" folder instead. Tags are free-text labels for cross-cutting themes, and get a page and an optional card badge of their own - see below. Collections are curated groups you build by hand (a "Summer Sale" collection, say), each with a page of its own. Unlike categories they follow no rule and inherit nothing: a product is in a collection because you put it there. See Collections below.
A card in a category grid is drawn about three centimetres wide. The photograph behind it was, until recently, the full studio shot - on one real catalogue, a 646 KB picture squeezed into a 300-pixel tile, twelve at a time.
Cactus now keeps a small copy of every product photograph and every variation photograph, and cards are drawn from that. So are the little thumbnails in the strip under the main image on a product page. The main image itself is still the full one - that is the picture people lean in and study.
This applies everywhere a card appears: category pages, collection pages, tag pages, search results, the related and upsell strips, and any product grid you have dropped onto a page of your own.
Nothing for you to do. Add or swap a photograph, on a product or on one of its variations, and the small copy is made when you save. It is covered in more detail under Small copies, for where a picture is drawn small in the media guide, including what happens for the handful of pictures that cannot have one, and how a shop that has been running a while catches up on the photographs it already had.
A product's photos, 3D models and spec sheets are filed in your media library under its master category's name. That filing is stamped when each file goes up, so renaming a category, or moving it under a different parent, leaves the existing files under the old name while anything uploaded afterwards goes to the new one. The shop carries on showing everything perfectly well - only the media library looks untidy, listing what is really one category twice.
Rename or move a category - or simply open the Categories screen - and Cactus counts what has been stranded and says so, right at the top, with a Tidy up filing button beside it. Press it when it suits you: the files are moved across in small batches, the count on screen keeps up with what has actually finished, and every reference follows automatically, from product galleries and variation swatches to 3D models, downloads, description videos and saved quotes. Choose Later and the note simply goes away until you next open the screen.
Renaming a product is different: its files follow on their own. Save a product under a new name, or in a different master category, and its whole folder goes with it - photographs, variation pictures, 3D models, spec sheets and swatches together - with the files copied across behind the scenes after the save. A product renamed by a spreadsheet import, or one renamed before this worked, is picked up by the same Tidy up filing note instead.
Shop → Catalogue → Tags is where tags are made and dressed. Each one has:
-
A name and a web address. The address is what the tag's own page lives at (
/shop/tag/summer-sale) and what any page block pointed at the tag is holding, so it is a separate box rather than something that quietly changes when you rename the tag. Change it and you'll be asked to confirm first, because old links stop finding it. - A description, printed at the top of the tag's page and used as its wording in search results.
- Show this tag on the shop, on by default. Turn it off and the tag becomes filing for your own benefit: no page, no badge, nothing about it printed anywhere a shopper can see.
- A badge, off by default. Switch it on and products carrying the tag get a small label on their card, with your own wording and your own colours. Pick colours from your site palette (the same swatches as Appearance → Styles) or choose freely, and set light and dark mode separately - there are previews of both side by side, which is the quickest way to catch a label that has gone invisible against a dark background.
- A place in the order, set with the arrows. It sorts this list, and it settles which badge sits above the other when a product carries two badge-bearing tags: the higher one goes first.
Cards and product pages both print every badge a product has earned, not just one - so a reduced chair that is also flagged Ex-display says both, in the grid and on the page it leads to. On a card they sit in a row across the top-left corner of the photo in that order, wrapping onto a second line if a product has collected a lot of them. "Out of stock" and "Pre-order" come first whatever else is true, then your own tag badges, then the built-in ones. If you'd rather not see a particular kind at all, the Card: Badge part in your Product Card layout has a switch for each.
Tags are ticked on a product under Organisation on the product editor, and there's an Add tag box right there for when you think of one mid-edit.
A tag's page can be designed like any other: Appearance → Layouts → Shop → Tag gives you a Tag layout with a header block, product grids and a promo panel to arrange as you like. One layout serves every tag - each block works out which tag it is looking at on its own - so you build it once. Publish nothing there and tags keep their plain built-in page.
Every shop starts with one tag it doesn't have to look after: On Sale. It applies itself. A product is in it for as long as it actually has money off - either because it has a sale price of its own, or because one of its variations does - and drops out again the moment the offer ends. There is nothing to tick, and nothing to remember to untick when a sale finishes.
It behaves like any other tag otherwise: it has its own page listing everything currently reduced, and it arrives with a red Sale badge switched on. Rename it, recolour it, reword the badge, hide it from the shop or delete it outright - all of that is yours. The only thing you can't do is put it on a product by hand, which is rather the point.
If you've switched sale prices off altogether under Shop → Settings, nothing is on offer, so the tag's page is empty and no badges appear.
Shop → Categories lets you nest categories as deeply as you like - Homeware → Kitchenware → Mugs → Travel Mugs, and on as far as makes sense for your shop. Each category shows as a row in a tidy indented tree, with a little number next to its name telling you how many products are filed directly in it:
- Search at the top filters the list as you type - handy once you've a lot of categories. Matches are highlighted, and their parents stay in view so you never lose the trail.
- Any category with sub-categories has a small arrow you can click to fold it away or open it up, and Collapse all / Expand all does the lot in one go - so a big catalogue stays manageable.
- Add sub tucks a new category underneath an existing one. New category (top right) starts a fresh top-level one.
- Edit opens a single panel to rename the category, move it somewhere else (pick its new parent, or "Top level" to promote it), choose what its page lists (see below), and write the category up properly (see "Giving a category a picture and some words" just below). You can't move a category inside itself or one of its own sub-categories - the shop won't let you tie a knot.
- Drag to reorganise. Grab a category by the handle on the left and drag it: drop it above or below another to reorder it among its siblings, or drop it right onto another category to tuck it inside as a sub-category. Nest as deep as you like, and rearrange whole branches this way. Prefer buttons? The ↑ / ↓ arrows nudge a category up or down one step among its siblings, and Edit lets you pick a new parent from a list. Whichever way you move things, the order you set is the order shoppers see, and it now sticks properly (an earlier gremlin let the top category spring back to where it started - that's sorted).
- Delete does what it says. Deleting a category also deletes everything nested under it - a warning tells you how many sub-categories will go. Products filed in them aren't deleted; they simply lose that filing and stay in your catalogue.
On the shop front, a category page shows a breadcrumb trail back up to the top, and leads with its sub-categories as proper cards so shoppers can drill down.
Until recently a category was just a name, which made for a slightly bleak page: a wall of products with a heading over it, and any sub-categories reduced to a row of little grey pills. Categories now carry the same three things a product does, all in the Edit panel on Shop → Categories:
- Short description. One line, printed on the category's card. "Height-adjustable desks for every office" is the idea; a paragraph is not.
- Picture. Choose one from your media library, or upload a new one there and then. It's the picture on the category's card, so it wants to be square-ish; anything else is trimmed to fit rather than squashed. The picker opens in that category's own folder in your media library (Shop → Homeware → Kitchenware, matching your category tree), and anything you upload is filed there rather than dumped in the top of the library - the same folder the products in that category keep their photos in. Rename a category, or drag it under a different parent, and its picture moves along with it.
- Full description. A paragraph or two shown on the category's own page.
Fill those in and a parent category's page opens with its sub-categories as cards - picture, name, your one-liner and a "Browse" link - laid out exactly like the product cards further down, because they are the product cards' design. Restyle one and you restyle both, which saves you doing the job twice.
A description you can actually design. If a paragraph in a box isn't enough - you want headings, images, two columns, a callout - the same Edit panel has a Design this description button. It opens the page builder full screen in a new tab, with none of the admin furniture in the way, and gives you the usual content pieces to arrange as you like. Save, close the tab, and that's what shoppers see on the category page instead of the plain text. The plain box stays exactly where it was, so nothing is forced on you: leave the builder alone and the plain version keeps working. A category that has one shows a small Designed label in the list. And if you open the builder for a nose around and build nothing, your plain text carries on as before - an empty design doesn't count.
Every category also gets a thumbnail beside its name in the list, so the ones still waiting for a picture are obvious at a glance.
Sharing a category page. Paste a category's address into a message, a post or a chat and the preview brings a picture with it, the same as a product page does. It uses the category's own picture where you have set one, and borrows the first photograph from the products on the page where you have not, so a category shares tidily whether or not anyone has got round to choosing a cover.
What a category page lists. By default a category shows every product from itself and all its sub-categories - so "Kitchenware" includes the mugs filed under "Mugs". If you'd rather a category showed only the products filed directly on it, you can change that. The shop-wide default is in Shop → Settings → General ("Products shown on a category page"), and any single category can override it from its Edit panel.
Flicking through photos on the grid. When a product has more than one photo, its card on a listing grows a pair of arrows: shoppers hover (or, on a phone, just look) and click the right arrow to see the next picture without opening the product, and a left arrow appears once they've moved along. If you use variations, each variation's own photo joins the run too, so someone can flick straight from the blue one to the green one on the grid. A product with a single photo shows no arrows, as before. This turns up everywhere product cards do - category and collection grids, "you might also like" rows, and featured blocks.
Pointing at a tile also shows its second picture on its own, without any clicking, and drops back to the cover when the mouse moves away. That second picture is whatever you actually put second on the product's Images tab - the product's own next photo, or a finish you promoted and dragged into second place. Variation colours you haven't put up front stay behind the arrows, so pointing at a tile never flicks it to a colour nobody asked about.
All of that pointing-at business now stays firmly on machines that have something to point with. On a phone there is no such thing as pointing: the first tap was being read as a hover, so the tile lifted, swapped to its second picture and then declined to open the product - and the shopper had to tap a second time to get in. The lift, the picture swap and the little arrow nudge are switched off entirely on touch screens, where nobody was getting them anyway, and one tap opens the product as it always should have.
Spinning a 3D model from the grid. If you have the 3D Views add-on and a product (or one of its variations) has a model, its card shows a small 3D button in the bottom-right corner. Clicking it loads the model right there in the card to turn, tilt and zoom, with a close button to go back to the photos. It follows the photo you're on: flick to a variation's picture and tap 3D, and you get that variation's model with its own material; if that variation has none, it falls back to the first model the product has. No model on the product or any of its variations means no button at all. Only one card's model is live at a time - opening another closes the last - so a grid full of them stays light.
Shop → Catalogue → Collections is where a collection is built and looked after. A collection is a shelf you fill yourself: "Under £200", "Everything in oak", "The six things we actually want on the front page". Nothing lands on it automatically, which is the point.
Each collection in the list shows a stack of the first few products in it, its name, how many products it holds, and the web address its page lives at. A collection holding nothing at all is flagged Empty, since an empty collection makes for an empty page. Drag the handle beside a collection to move it up or down; that order is the order collections come out in wherever the site lists them.
Beside every collection sit the things you'll reach for most:
- View. Opens that collection's page on the live site in a new tab, so you can look at what a shopper sees without losing your place here.
- Copy link. Puts the collection's web address on your clipboard, ready to paste into a newsletter, a post, or a menu.
- Duplicate. Makes a copy of the whole thing, wording, search settings and product list included, called " (copy)". Handy when the autumn version of a collection is last year's with four things swapped out. The original is left alone.
- Delete. Removes the collection and its page. The products in it stay in your catalogue; they just lose this grouping.
Open a collection and you get two tabs.
Details holds the words, and there are now three sizes of them - the same three a category has. A short description is the one line printed on the collection's card and under its heading. A full description is the paragraph or two shown further down the page, once you've added the Collection Description block to your Collection layout. And a designed description opens the full-screen page builder in a new tab, where the description can have pictures, columns and callouts in it; anything you build there is shown in place of the plain full description, and a collection with one is marked Designed in the list. Above them sit the name and the web address (yours to type out rather than something that quietly follows the name around, because changing it stops old links working). Underneath that is How this page looks in search results: a title and a description for search engines, each with a counter that turns amber once it's long enough to be cut short in a listing, and a preview of roughly what Google will print. Leave both blank and the collection's name and description are used, which is usually fine and occasionally not.
A collection's address shares with a picture too. There is no cover to choose on a collection, so it borrows the first photograph from the products on the shelf, which is the same picture a shopper sees at the top of the page anyway.
Products is the collection itself. Search your catalogue in the box at the top and click a product to put it on the shelf, or use Add all when a search has already found exactly the run you wanted. Products already in the collection say so rather than going in twice. Below that is the collection in the order shoppers will see it: drag a product up the list, nudge it with the arrows, or press Sort A-Z and have done with it. Remove takes a product off the shelf and does nothing else to it. Anything still in draft or archived is labelled, because those don't show on the collection page however carefully you've placed them.
There's no Save button on that tab, and that isn't an oversight: every add, removal and reorder is saved the moment you make it.
Inside an order. The total, customer, payment state and delivery progress are the first things you see. The framed workspace uses the same quiet, rounded treatment as Unified Inbox, with customer details and order controls alongside the work.
- Overview holds the items, full price breakdown, customer reports, replacements, downloads and any supplier purchase orders.
- Delivery holds the delivery address and instructions, parcels, tracking and redelivery charges. A pending charge or failed delivery puts a shortcut above the sections, so it still gets attention when needed.
- Payment & documents holds the payment record, proforma, invoices, credit notes and billing address.
- Activity holds the order history, private notes and checkout agreements. Switching sections keeps unfinished notes and forms intact.
The actions at the top are icons, grouped into little capsules the way the inbox draws them: Send a payment reminder and Mark as paid share one while payment is outstanding, then Dispatch items and Email the customer, each with a tooltip saying what it does. The three dots (More actions) open a menu holding replacements, printing and refunds. The way back to the list is the Back chevron to the left of the order number. On the Customer card, All their orders (opens in a new tab) sits beside the heading when they have ordered before, and Their first order when they have not; marketing consent shows as a tick or a cross on the end of Marketing emails. The delivery address is copied and edited with the copy and pencil icons on its card. The same copy and pencil icons sit beside the customer's email address and their reference number. Each parcel's Report a delay, Edit tracking and Undo this dispatch are icons in one capsule, and each invoice, proforma and credit note has View (opens in a new tab) and Download as PDF icons, with Send to the books again and Void in a capsule of their own. Hover over All their orders to see how many orders they have placed, what they have spent and since when. Where a line's delivery is priced per item, it gets its own row under that line in Items - unit price, quantity and total - and the Totals card no longer repeats it as a separate Delivery line. Printing includes the order's printable details from every section. On smaller screens, customer details and order controls follow the selected section. Redelivery has its place, but no longer gets to introduce the order.
Shop → Trading is the screen you'll live on. Across the top sit four counters: how many orders are waiting on money, how many are paid and haven't gone out yet, how many are waiting on pre-order stock, and what you've taken in the last thirty days. The first three are buttons: click one and the list below shows exactly those orders, so "three to send" always turns into three orders and never four.
Refunds go back through whichever payment method the customer used automatically for Stripe and PayPal; bank transfer and cash refunds are recorded in Cactus and the money is yours to send, since there's no card or account to refund back to automatically. The same goes for a replacement part you charged for: it was billed between you and the customer rather than through the checkout, so its refund is recorded and the money is yours to send.
What a refund does to the rest of the order. The payment badge follows the money - Part refunded or Refunded rather than a cheerful Paid - whether the refund was made here or in your Stripe or PayPal dashboard, and the Paid filter shows the orders that still hold money. Units refunded before they were sent go back into stock; anything already dispatched does not, because a refund is not a returned parcel, so book returned goods back in by hand. On a discounted order the refund box works out each item at what the customer actually paid for it, so a full refund is the order total and not a few pounds more than it.
Refunding the delivery charge. The refund box offers the delivery charge too, VAT and all, whenever some of it is left to give back - tick it on its own for a delivery-only refund. It goes on the credit note and comes off the invoice like anything else refunded.
Per-item delivery on a refund. Where an item's delivery was priced per item, the refund box shows that line's goods and delivery separately ("£100.00 each, plus £25.95 delivery"), each at what was actually paid after any discount, and the Amount column shows what each line will send back. The delivery is only refunded if you tick Refund its delivery too on that line - unticked by default, because a returned chair has usually had its delivery made. Once a line's units have all been refunded without it, that line's delivery cannot be refunded later from this box, so tick it at the time if it is owed. Approving a customer's cancellation still refunds the lot, delivery included. The credit note follows what went back: goods first, and only money beyond the goods is credited as delivery.
Refunds made in your Stripe or PayPal dashboard. The shop hears about these and records them. A refund of the whole payment is recorded as a refund of everything, delivery included - the stock goes back, the credit note is raised and your books are told. A part refund can't say which items it was for, so the order gets a note asking you to record it: open Refund, pick the items, and tick Already refunded - nothing is sent a second time, and the stock and paperwork follow.
A paid order can't be cancelled from the status menu any more: refund it, and the order follows. Nor can one be marked Refunded without a refund on record. Both used to be possible, and both left an order saying one thing while the money said another. The one exception is a part refund you made in your Stripe or PayPal dashboard, which the refund box here can't finish off: an order like that can still be cancelled by hand.
A part refund doesn't stop an order finishing. Two chairs of five refunded before dispatch leaves an order for three, and it's marked complete when they arrive. A part refund on an order that is already complete leaves it complete - the payment badge says Part refunded.
If a refund was started and nobody can tell whether it went through, a notice in the admin bell lists the orders to check against your payment provider, and you're emailed when that list changes rather than every hour it stands.
When the money lands and something about the order is wrong, it is put On hold with a note on its timeline saying what: the last of the stock had already gone to somebody who paid first, a pre-order went past its limit, or a card or PayPal payment came in for a different amount or currency from the order. The payment is kept either way - nothing is lost - but nobody should send the goods without looking. A coupon used past its limits gets a note and no hold, since the discount has been given and the goods can still go. Held orders are never marked complete automatically; lift the hold when you're happy.
A payment that arrives again after it was reversed - a bank payment that bounced and then went through - is recorded as paid, but the order stays where the reversal left it and nothing is taken from stock or sent to the customer a second time. There's a note on the order saying so.
Card pages and bank apps take the money away from your site and hand the customer back afterwards, so those orders are only written down once the payment is real. Almost always that happens in the same second. Very occasionally something goes wrong in between, and the result is the worst kind of problem: the customer has paid, there's no order to show for it, and nothing looks unusual - to you it's an abandoned basket, and to them it's an error page.
Cactus now notices. When an order can't be written after its payment has gone through, a warning sits at the top of Shop → Trading naming the order number, the amount, the payment method and the customer, and it stays there until the order exists. If the payment provider tries again and succeeds - which it usually does - the warning clears itself and you need do nothing.
If one does appear: check the payment with your provider before anything else, and don't refund on the assumption the order is lost. In most cases the order can be recovered with the payment attached, which is a far better outcome for everybody than a refund and an apology. The warning carries the checkout reference to recover it from, and the technical detail underneath for whoever ends up looking into it.
The same warning turns up for one rarer case: a card payment made from a checkout left open in a tab for more than a day. Unpaid orders are cleared away after a day, so by the time that payment arrives there is no order for it. There's nothing to rebuild it from, so either refund it in your provider's account or take the order again by hand and keep the payment.
Once you've dealt with one - refunded it, or taken the order again - press I have dealt with this to take it off the list. That's the only way off for a payment settled some other way, and the list is the only record the shop keeps that the money arrived, so it asks first.
Search by order number, company, name or email, then narrow it down: by status, by whether the money has arrived, by how much of the order has gone out, by date (last week, last month, or a range you pick), pre-orders only, or hiding cancelled ones. Sort by newest, oldest, biggest, smallest, customer or status, and show 25, 50 or 100 at a time. Where a company name was given, that's what the list calls the customer - both in the rows and in the A-Z sort - with the person who actually placed it on the line underneath. Businesses tend to be remembered by the business, not by whoever in the office was nearest the keyboard.
Whatever you pick ends up in the web address, so a filtered list can be bookmarked, sent to someone else, or come back exactly as you left it with the back button.
Each row tells you the lot at a glance: how old the order is, how many items, whether it's paid, how much of it has been dispatched, its status, the total, and whether the buyer has an account with you or checked out as a guest. The ⋯ button on the right opens the order, jumps to that customer's other orders, starts an email, copies the address, or changes the status there and then.
Doing several at once. Tick a few rows and a bar appears: pick a status, decide whether the customers should be emailed about it, and apply. If one of them can't be changed - an order being held back by a pre-order, say - the others still go through and Cactus tells you which one was left alone and why, by order number.
Export CSV hands you the orders you're currently looking at, filters and all, one row each - up to 5,000 at a time. Handy for the accountant, and rather easier than copying numbers off the screen by hand. If the filters match more than that, the file is named for it (first-5000-of-6123), so a partial export can't pass itself off as the lot; narrow the dates and export again for the rest.
Open an order and everything sits in two columns. Down the left: what was bought, the parcels that have gone out, any downloads, anything ticked at checkout, and the order's whole history. Down the right: the customer, where it's going, how it was paid for, and the money.
History is the useful bit. Placed, paid, every email sent, every parcel, every refund and every note you've written, all in one list with the newest at the top. No more reading four separate lists and working out the order of events in your head. Notes go in at the top of it, and are only ever seen by you and your team.
Also on the page: a note of how many orders this customer has placed and what they've spent, copy buttons for the email address and the delivery address, a link to everything else they've bought, and a Print button that turns the page into a tidy packing slip with the admin furniture stripped out.
Items and the money. Each item's name opens the page the customer bought it from, in a new tab - for a variation, the product page already set to the size and colour they chose, rather than a note telling you to go and edit it somewhere else. Where a delivery service is priced per item (the delivery tiers from Advanced Shipping, say), that delivery used to be folded into the item's price, and the totals then swore delivery was £0.00. The item now shows the goods' own price, and its delivery has a row of its own straight underneath with its own unit price, quantity and total. The Totals card no longer repeats it as a separate Delivery line - its Subtotal is the items as listed, delivery rows included. The invoice, proforma and credit note print it the same way, and so do the order summary at checkout (whose review totals no longer repeat it either - the basket itself still shows one delivery total while you are choosing), the thank-you page after checkout, the item list in the order emails, and the customer's own order page (where the order-wide Delivery row only appears when there is order-wide carriage to show, rather than claiming £0.00; the thank-you page likewise stops calling it Free). Nothing about what was charged has moved; it is the same money, finally in the right rows.
What was bought, in the emails. Every email that lists an order's contents - the confirmation, the how-to-pay one, the payment receipt, your own new-order alert and the part-dispatched note - lays the items out as a proper table, with each product's photograph beside it, the quantity and the price. It used to be a plain list, which read correctly on a phone's text-only view and ran together into one unbroken paragraph everywhere else: five items, their options and their delivery notes, all in a single sentence nobody could pick apart. The photograph is the product's own picture, the same one on the thank-you page, so a variation with no photograph of its own shows a blank space rather than the wrong colour. Anything captured with the line - engraving, options, a delivery note - still sits underneath its own item. Both the name and the photograph are links, going to that exact thing: the product they bought, or the precise variation of it, which opens on the right colour and size rather than the range's front page. A line whose product has since been deleted stays as plain text, on the grounds that a link to nothing is worse than no link.
Emailing a customer. Press Email customer to send a one-off message about this order - the "your sofa is stuck in Dover" sort of message that no automatic email covers. It goes out from your usual sending address and is added to the order's history, so the record stays complete.
"Here is how to pay." A shopper who chooses bank transfer or cash leaves your checkout owing you money, and until now the only place they were told where to send it was the thank-you page - read once, in a hurry, and impossible to find a week later when they finally open their banking app. They now get an email the moment they order: what they bought, what it comes to, your account details or your collection wording straight from the Payments tab, their order number to quote as the reference, and a line saying that delivery times start from the day the payment reaches you and not the day they ordered. That last sentence settles the most common argument on this sort of order, and it is in the wording rather than buried in a policy page.
It is editable like everything else under Settings → Email → Templates, including the lead-time line if you would rather it went. There is a short text version too if you have texts switched on, which points at the email rather than trying to fit account numbers into a text message. Card, PayPal, Instant Bank Pay and Pay by bank (Atoa) orders are unaffected - their money arrives in seconds, so the confirmation email covers it.
You get told as well. A New order awaiting payment alert goes to your usual new-order address the moment the order is placed, saying in as many words that the money isn't in yet and the order is sitting in Awaiting payment until you say otherwise - so a bank transfer no longer arrives in silence and sits in the list hoping somebody scrolls past it. It's a separate message from the ordinary new-order alert on purpose: one means "get it out of the door", the other means "somebody owes you money", and packing the second one on sight would be jumping the gun. You won't get a second alert when you mark it paid - you'll be looking at the order at the time, having just pressed the button.
Marking a bank transfer or a cash sale paid. Money that arrives by bank transfer arrives quietly, so those orders wait in your list until you say the money has landed. Press Mark as paid (the banknote icon) on the order and you get a tick box: Email the customer to say the payment has arrived. Leave it ticked and they get the Payment received message - the amount, the reference if there is one, what they bought and where it is going, and a line saying you are getting it ready. Untick it if you have already told them yourself on the phone, and the order goes through in silence. Either way the stock comes off, any downloads are released and the invoice is raised exactly as before.
Chasing a payment that has not arrived. While a bank transfer or cash order is still unpaid, Send a payment reminder (the bell icon) sits beside Mark as paid. It emails the customer the Payment reminder message (reword or switch it off under Settings > Emails): the order is still waiting, the total, how to pay and the reference to quote. It is never sent automatically. Each reminder appears in the order's Activity twice over - the email itself, and a note saying who sent it.
That message is editable like every other one, under Settings → Email → Templates, and if you have texts switched on there is a short version of it too. It has taken the place of the order confirmation that used to go out at that moment, which had been telling people their order was confirmed when what they were actually waiting to hear was that their money had turned up.
Orders rarely leave in one tidy box. Two of the four items are on the shelf, the third is on a lorry somewhere, and the fourth is a pre-order that won't land until next month. Marking the whole order as shipped would be a fib, so an order can now be dispatched a bit at a time.
Open the order and press Dispatch items. You get a line for every item with anything still owed, each capped at the number still to go out, so you can send two of the five today and the rest on Friday. Optionally add the courier, a tracking number, a tracking link, a note, and the date the parcel actually went out - handy on a Monday morning, when you're recording something that left on Friday afternoon.
Once recorded, each item shows how many have gone and how many are still to follow, a Parcels list appears with every parcel so far, and the badges at the top of the order read Partly dispatched or All dispatched - and All delivered once everything has gone and the courier says every parcel has landed. That badge is worked out from what's actually left the building rather than being a status you set, so it can't drift out of step with reality and there's no extra status to remember to change. The same badge shows on the orders list, and you can filter the whole list by it.
When the next van is due. On the orders list, the Dispatch column also shows the soonest day anything on the order is due at the customer's door, under the badge. It reads Delivery by Jewell Enterprises on Mon 12 Oct when a courier has booked that day for a parcel, and Delivery due Tue 22 Sep when it is only the day the customer was promised - so a booked delivery is never mistaken for the date the goods were due. Two things feed it:
- Items not sent yet are due on the day the customer was promised at the checkout - the "Arrives by" date their delivery service quoted. So an order you haven't touched yet already shows when it has to be there, which is rather the point of looking.
- Parcels on their way are due on the Delivery date typed into Dispatch items (or edited on the parcel afterwards), or the day the courier's own tracking booked when none was typed. The courier's day wins over the checkout promise for whatever is in that parcel, being the later and better-informed of the two; a parcel with no day booked yet falls back to its items' promise.
A parcel that has already been delivered is skipped, so an order split across Tuesday and Friday reads Tuesday until Tuesday's has landed and Friday after that. Nothing shows once an order is completed, cancelled or refunded, nor on an order still waiting for its payment - until the money arrives the promise is a number of working days rather than a date. The checkout promise comes from whichever module quoted it (Advanced Shipping, on most shops); a shop without one shows only the parcels' booked days.
Where the courier details go. All of them - courier, tracking number and tracking link - are typed into Dispatch items, because they belong to a parcel rather than to an order. Sending the lot in one box? Press Dispatch items, tick everything and fill them in there; the order status - the fifth box along the top of the order, beside Delivery - carries no boxes of its own, which spares you the puzzle of two places asking for the same number. The email for a whole-order dispatch still quotes whatever the parcels carry, however many there are.
The tracking link. A tracking number on its own is homework - the customer has to work out whose website to paste it into. Paste the carrier's own link for the parcel into the Tracking link box and the dispatch email carries a Track your parcel link instead. It has to be a proper web address; anything else is politely refused rather than quietly sent to somebody.
The link shows on the customer's own order page too, under Your parcels - one Track link per parcel, named after the parcel where there is more than one. That is the page people go back to once the email is buried, and it used to give them the number and leave them to it.
The Order shipped message says considerably more than it used to as well: what was in the order, where it is going, the courier and tracking number off whichever parcels have been recorded, and a Track your parcel link for each of those parcels that has one. Each link is labelled with its own tracking number, so an order that went out in three boxes gives three links rather than one nobody can tell apart. Anything you had already put in your own wording that the message never actually knew - the item list, the total, the delivery address - now arrives filled in rather than as a blank space.
Ticking Email the customer sends the Part of an order dispatched message, which lists what's in this parcel and what's still to come, and reassures them that separately sent parcels often arrive a day or two apart. When the parcel is the one that finishes off an order already partly sent, the same email says so instead. Where the parcel is the whole order - nothing sent before it and nothing left owing, which is every order that goes out in one go - the customer gets the ordinary Order shipped message instead, because being told "the last part of your order is on its way" when there was only ever one part reads like an earlier parcel has gone missing. Both are editable under Settings → Email → Templates.
The order's status follows along. When the parcel you record is the one that leaves nothing owing, an order still marked Processing moves on to Dispatched by itself, so the customer's order page says On its way instead of Being prepared to somebody who has just been emailed the opposite. It happens quietly - the parcel's own email is the one the customer gets, and an order set to invoice on dispatch is invoiced exactly as if you had changed the dropdown. Orders you have put On hold, or already marked Complete, are left alone.
Processing, then Preparing. A paid order starts as Processing, which customers see as Order received. Once a purchase order for it has gone to the supplier it moves on to Preparing by itself, which customers see as Being prepared, and they get an Order being prepared email (and text message, if you use them) saying the goods have been ordered in. It happens when the purchase order is emailed, or when somebody presses Mark as sent without emailing on it, and only for the first purchase order: an order bought from two suppliers moves once and the customer is told once. Only a Processing order moves. One that is unpaid, on hold, already dispatched, complete or cancelled is left alone, and you can still pick Preparing yourself from the status menu or the bulk bar. Dispatching the last parcel carries a Preparing order on to Dispatched just as it does a Processing one. Both emails are editable under Settings → Emails, and the one for this status can be switched off like the other status updates. Needs the Purchase Orders module; without it nothing moves an order to Preparing except you.
A bell entry for every new order. Each new order lights the admin bell with New order SO-1234 - £450.00 from Jo Bloggs and a button straight to the order. It appears when the order is paid, or, for a payment method you clear by hand such as bank transfer, when the order is placed (marked awaiting payment). Click the bell and press the small bell icon at the right-hand end of its header (it is also at the top of the Notifications page) and your browser will also pop up a notification for each new order (and for new contact-form messages) while an admin tab is open, even one sitting behind another. The choice is kept in that browser only; it does not work with every tab closed, or on a phone.
Recorded a dispatch that never happened? Press Undo beside it in the Parcels list and the items go straight back to being outstanding. Nothing else needs correcting, because the totals are counted from the parcels rather than kept in a separate tally that could disagree with them. If that undo leaves a Dispatched order with something still to send, it goes back to Processing, without emailing anybody about it.
Two sensible limits: you can't dispatch more of something than was bought, and you can't dispatch something you've already refunded. If a refund and a dispatch are attempted at the same moment, one of them waits its turn rather than both squeezing past the check.
When a supplier delivers straight to your customer, the tracking usually reaches you - the supplier's reply, or an email from the courier they booked - and the customer is left waiting until somebody copies it across. If you run Purchase Orders with Delivery tracking by email switched on, purchasing reads those emails and records the despatch on its purchase order. Whether that despatch then reaches the customer's order here is this shop's own decision, under Settings → Shop → Notifications → Tracking from your suppliers:
- Leave the customer's order alone (the default). Nothing the supplier's tracking says reaches the order; you record parcels yourself, as now.
- Put it on the customer's order, but email nobody. The parcel goes on the order with its tracking, and the order moves to Dispatched as it would if you had pressed Dispatch items - but the parcel is marked quiet. The customer is not emailed now, and nothing that follows from that parcel emails them either: not the delivery window or the failed-delivery message the automatic tracking would otherwise send, and not the completion email when it lands (the order still completes). They can see the parcel on their own order page. When you want them told, open the parcel (Edit tracking in the Parcels list) and press Send dispatch note: they get the dispatch note a parcel you recorded yourself would have sent, tracking and all, and from then on the parcel behaves like any other. This is the setting to start with: give it a fortnight, check what it recorded against what actually turned up, and only then let it talk to anybody. Switching to the next setting later does not go back and email anybody about parcels recorded quietly.
- Put it on the customer's order and tell the customer. The same, plus exactly the emails a parcel you recorded yourself would send: the dispatch note for a new parcel, the "here is your tracking" message for one that went out without, and the delivery window once the courier confirms it.
What it does with the order:
- A parcel you already dispatched with no tracking - you pressed Dispatch items and left the number blank, which is common - has the tracking filled in, rather than a second parcel appearing. If that parcel held only some of what the supplier sent, the rest goes on as a parcel of its own with the same tracking.
- The same tracking already on the order: nothing, apart from a newly confirmed delivery day or window, which follows the same rules as typing it in with Edit tracking yourself (the window email goes once per window, again only when the window moves, and only in the third setting).
- Otherwise a new parcel for the items the supplier sent, carrying their tracking, with the courier matched to your own courier list where it can be: by name, or by the link - a DPD follow-my-parcel link goes on your DPD courier with its code, a Multidrop link on your Multidrop courier - so the automatic tracking above picks it up.
- A tracking link is only kept when it goes to a courier the shop knows (DPD, Royal Mail, Evri, UPS, DHL and the like, Multidrop, GFS). Anything else read out of an email is left off and only the number goes on: an email can come from anybody, and the link is what your customer would press.
Only the first announcement of a despatch puts parcels or lines on the order. Later news about it - a new day, a confirmed window - only changes the day and window on the parcel already carrying that tracking. By then the order is yours: an item you held back stays held back, and a parcel you deleted is not put back.
Nothing is brought across after the event: despatches purchasing recorded while this was set to Leave the customer's order alone, or before the shop could hear about them at all, stay on the purchase order only when you switch it on later. Later news about one of those changes nothing here either - unless you typed the same tracking onto a parcel yourself, in which case its day and window are kept up to date like any other.
And what it will not do: put anything on a cancelled or refunded order, or overwrite tracking already on an order. If everything the supplier sent is already dispatched here under different tracking, it leaves it alone. Two emails about the same parcel arriving at once still make one parcel.
For module authors. The shop listens on purchase-orders.despatch-recorded (documented on Purchase Orders) with a serverOnly observer, lib/despatch-observer.ts. It acts only on an event whose source is { module: 'shop', orderId }, and treats lines[].sourceOrderItemId as its own order item ids. Any module can announce on that point; the shop does not know or care which.
Some couriers work in two goes. They collect the parcel and tell you which day it is going out on; then, usually the evening before, they ring back with the four-hour window. The order has already been dispatched by then, so there is nothing left to send - and the bit the customer actually plans their morning around arrives last.
Your couriers, as a list. Under Shop → Tax & shipping → Couriers, add the couriers you actually use. Each one carries a name, a set of delivery questions, and one tick box: Show customers this courier's own tracking page. Leave the list empty and dispatch keeps the plain Carrier box it has always had, and nothing changes for you.
Once there is a list, Dispatch items offers it as a dropdown, with Other for the one-off van. Rename a courier later and every parcel already sent with them renames itself, because the parcel remembers which courier it was rather than a copy of the name.
The delivery date. In Dispatch items there is now a Delivery date, and next to it a window starts and window ends if the courier has already told you. The customer's order page reads Arranged for tomorrow between 10am and 1pm - the day named the way somebody would say it out loud. Today and tomorrow get their own words, the rest of the week is named by its weekday, and anything further out gets the date. The times are spoken too: 10am and 1pm rather than 10:00 and 13:00. The delivery email is the one place that always spells the date out in full, because "tomorrow" in an inbox is wrong by breakfast.
Filling in the window later. In the Parcels list on the order, each parcel now has a Details button. That is where the window goes when the courier finally confirms it - and where a tracking link goes if it turns up after the parcel did. What is in the parcel cannot be changed there on purpose: to move items about, undo the dispatch and record it again, so all the sums are checked properly.
Saving a date and both times sends the customer the new Delivery time confirmed message: the day, the window, what is arriving, and a link to their order. It goes once per window: saving again with the same day and times (a note, a tracking link) does not email them all over again, and the panel says so plainly when they have already been told. Change the day or the times - the courier rebooked them, or the window the courier first gave has moved - and the panel offers Email the customer their new delivery window, ticked, which sends the message again with the new one. "New" is judged against the window the customer was actually emailed, so a window the courier moved after the email went still counts. Every edit to a dispatched parcel also leaves a line in the order's Activity: what changed, and whether the customer was emailed about the delivery - and if not, why. Editable, like every other message, under Settings → Email → Templates.
The van. Once a delivery is booked, the customer's order page grows a fifth step between Dispatched and Complete, with a small van on it. It reads Delivery scheduled until the window actually opens, and only then Out for delivery - a parcel booked for tomorrow is not out on a van today, and saying so has somebody waiting in a day early. During the booked window the van creeps across, so somebody who has been in since ten can see how much of the window is left. When the window has been and gone the van has arrived - but Complete stays untidied until you say so, because a delivery can fail and a tick that came off a clock would be telling somebody standing in an empty hall that their furniture is there.
When the tracking page is not for customers. Some couriers' "tracking" page is really your trade account: your account number, your buying terms, sometimes the word PRO-FORMA and their own telephone number. Untick Show customers this courier's own tracking page for those. The link is still recorded on the parcel and still there for you on the order screen; the customer gets the date, the window and the van instead, on your own site, and is never sent anywhere that quotes your cost price back at them.
Following the courier automatically. Some couriers publish a tracking page the shop can read for itself. On those, set Follow this courier's tracking automatically and the shop checks each live parcel once an hour - and again whenever the customer opens their order, at most once every five minutes per parcel however often they reload - keeps the answer on your own site, and never sends the customer anywhere near the courier's page.
Pick the one that matches the tracking links you get: Multidrop tracking pages, GFS parcel pages for parcels booked through Global Freight Solutions, DPD, AIT Home Delivery for aithd.com links, or Fieldly for fieldly.lt-innovations.co.uk links (Jewell Enterprises, among others). GFS are the booking company rather than the van, so they also ask which carrier is actually carrying it - usually DPD.
You tell it what the stages mean, in two boxes, using the courier's own wording: which stages mean it is out on a van (so the customer's order changes from Delivery scheduled to Out for delivery), and which mean it has arrived. They are settings rather than something baked in, because only the courier really knows whether "Assigned to Crew" means a van is out this morning or that tomorrow's round has been planned - and when you find out, you change a box rather than wait for an update.
When every parcel on an order reaches an arrived stage, and nothing is still owed, the order marks itself Complete and the customer gets your completion message, exactly as though you had pressed the button. That happens the moment the shop finds out, whether it was the hourly check that noticed, the customer opening their order, or the customer watching their own order page when the van pulled up - and the customer is told once, even if both notice at the same moment. Leave the arrived box empty and nothing is ever finished off automatically. An order with two parcels waits for both.
On your own order screen, each item says so too: 1 delivered once the courier reports its parcel has arrived, and 1 sent only for what is still on its way.
The checking is deliberately unhurried: twenty-five parcels an hour, longest-unchecked first, a few at a time. A courier whose site is down simply teaches us nothing that hour - silence is never read as "not delivered" - and a shop with nothing out costs one quick look at its own database and no more. You can change how often it runs, or turn it off, under Settings → General → Schedules.
Where the driver has got to. On a courier that reports it, the customer's order page says so in words: "Mozam has 2 more drops to make before yours. About 15 minutes away." A small bar fills as the van gets closer, and under it, folded away until somebody wants it, sits the courier's own history - every scan, with the depot it happened at.
Both the sentence and the bar count towards your delivery, never across the driver's day. The courier will happily tell you the van is on its 32nd of 98 drops; said to a customer that reads as "not for hours" when the van is two streets away, so the total never appears. Two doors to go is what somebody wants to know.
None of it is guessed. A courier that gives numbers and no name says "your driver"; one that gives a name and no numbers says only what it knows; one that says nothing shows nothing rather than a hopeful sentence. The estimate has the time since we last asked taken off it, so a page read at half twelve does not still claim ninety minutes because that was true at eleven - and once the estimate runs out it says "any minute now" rather than counting backwards.
The button out to the courier. On a courier you follow automatically, the customer already has the timeline, the window and the driver on your page - so sending them to the courier for tracking offers them what they have just read. What the courier's own page is genuinely good for is the things nobody else can do: leaving it in a safe place, giving it to a named neighbour, or moving the delivery to another day.
So each courier now carries what that button says and the line underneath it. Leave them empty and it reads "Track your parcel", exactly as before. Fill them in - "Change delivery options at DPD", "Safe place, a neighbour, or a different day" - and the button stops competing with your own page and starts pointing at the one thing it can offer that you cannot.
DPD: one link, and it has to be the right one. For a courier whose tracking is read from DPD, the parcel takes a single tracking link - the follow-my-parcel link DPD email once they have the parcel, which looks like https://www.dpd.co.uk/d/6dPoGvP3DMDN. Nothing else is accepted for DPD: the long track.dpd.co.uk/parcels/… page, a bare code or anybody else's link is refused at the desk, with the box turning red as you type. That one link is all it takes - the shop works out the parcel number from it and reads the delivery window, the driver's name and the drop numbers above. It usually turns up the day before delivery, so it normally goes in by editing the parcel rather than at dispatch. Any other courier still takes any web address as its tracking link.
DPD deliveries in several boxes. A supplier can send one delivery as several boxes - four labels, one DPD reference - and DPD then treat each box as a parcel of its own, sometimes delivering them on different days. The moment a DPD link goes into Dispatch items or a parcel's Details, the shop asks DPD how many boxes the delivery is and lists every one, with its parcel number and what DPD last said about it. Each box has its own follow-my-parcel link, and they arrive in different DPD emails, so the form gives you a box for each link still missing. Paste them in any order: when you save, DPD say which box each link opens and it goes on that one. A link for a different delivery is refused rather than saved. Any you have not got yet can go in later, and a box with no link is still followed - it just has no photograph and no "received by" name.
From then on each box is tracked separately, and the parcel only counts as delivered - and the order only completes - once every box has arrived. The order screen and the customer's order page both read like 3 of 4 parcels delivered, 1 still to come, with each box's own status underneath. DPD take one photograph per drop rather than per box, so boxes left together share one picture, kept once, and a second drop on another day gets its own. A parcel recorded from a supplier's tracking email has its boxes counted before the dispatch note goes, where DPD answer within a couple of seconds; otherwise the first tracking check counts them.
The customer is told too. The dispatch note, the tracking email and the delivery day, time and new-date emails all say It is coming in 4 parcels, and the courier may bring them separately whenever DPD have said the delivery is several boxes. It is never guessed from how many things were ordered. If you have changed the wording of those emails, the line is {{#if hasSeveralParcels}}…{{parcelCount}}…{{/if}}.
AIT Home Delivery: the short link, and nothing else. For a courier whose tracking is read from AIT, the parcel takes a single tracking link - the short one from AIT's text or email, which looks like https://aithd.com/kz0vkrz - and no tracking number at all: the tracking number box disappears when you pick that courier, because the code in the link is the whole parcel as far as AIT are concerned. Anything else (their long aithd.com/11093/972140 address, a bare code, somebody else's link) is refused at the desk.
From that one link the customer's order page shows AIT's status, the two-hour window, "Alex has 16 more drops to make before yours", the van on a map, the history of where it has been, and - once delivered - the signature, copied into the order's Proof of delivery folder like a Multidrop one. AIT say for themselves when a parcel is out, has arrived or could not be delivered (Out for delivery, Delivered, Unsuccessful), so all three stage lists can stay empty for them - the failed-delivery email and the rebooking advice work without typing anything in, and anything you do add still counts. AIT's position comes with no time of its own, so the line under their map reads Checked 1 minute ago - when we last asked - rather than claiming to know when the van last reported.
AIT's time window is only emailed once it is real. AIT put a holding window on their tracking page as soon as a day is booked, and only fix the real one the evening before, when they email it to you. So for an AIT courier the customer's order page still shows whatever AIT's page says, but no email to the customer ever repeats AIT's page times - the day, yes; the times, no. The window email goes when a window lands on the parcel itself: when you type it in under Edit parcel, or when AIT's own "your delivery on 14/10/2026 is expected between 08:06-10:06" email arrives in the unified inbox. That email is matched to the AIT parcel going to the postcode it prints on the day it names, the window is written onto the parcel, the customer is emailed if they have not already been told that window, and the order's activity and the email in the inbox both say so. If two AIT parcels to the same postcode are booked for that day and AIT's page cannot tell them apart, nothing is written and the email carries a note asking you to type it in on the right one. Needs the unified inbox receiving AIT's emails.
Fieldly: the tracking link, and nothing else. Some two-man couriers - Jewell Enterprises, for one - run their rounds on Fieldly, and their tracking link looks like https://fieldly.lt-innovations.co.uk/track/689C21A2D2. It works the way AIT's does: pick a courier set to Fieldly, paste that link, and the tracking number box goes away because the code in the link is the parcel. From that link the customer's order page shows the day they have booked, the time window once they set one (usually the day before), and their history as it happens - Booked, Picked, Loaded, Delivered. Fieldly say for themselves when it has been delivered, so the delivered list can stay empty; their other stages are in their own words, so list whichever one means the van is out today. They give no van position, so there is no map.
When the courier could not deliver. Couriers do not always get in. Each courier you follow automatically has a third list alongside the out-for-delivery and arrived ones: stages that mean the delivery failed. The start of the courier's wording is enough - "Failed Attempt" catches "Failed Attempt - Non Fault - Recipient Not Home" and whatever reason they staple on next time. When a parcel reaches one, the customer's order page stops saying "Out for delivery", the van and the map go, the rail reads Delivery not possible, and in place of the booked day the customer is told to get in touch with the courier to arrange a new one - by the live chat link and phone number you give that courier, with their tracking number printed alongside, because it is the first thing the courier will ask for. They are also sent one email saying the same - Delivery not possible under Settings → Emails, where you can reword it. One per failed attempt: a second failure on the same parcel is a second email, the hourly re-check of the same failure is not.
Who books the new day is a setting on each courier. The customer gets in touch with the courier (the default) is what is described above. The courier gets in touch with the customer tells them instead that there is nothing to do and the courier will be in touch to arrange a new day, with the chat link and phone number underneath for anybody who would rather get hold of them sooner - on the order page and in the email alike.
The courier's reason is kept back unless you tick Tell the customer the courier's reason for a failed delivery on that courier. Ticked, whatever the courier adds after the failed stage is shown on the order page and in the email, tidied up: "Failed Attempt - Non Fault - RECIPIENT NOT HOME - UNABLE TO DELIVER" becomes "Recipient not home - unable to deliver". It is off by default because it is written for drivers, and "Recipient not home" can read as an accusation to somebody who was in the garden.
On a courier set to the customer gets in touch, you may have already rung the courier and been told they will call the customer. On the order screen, a failed parcel shows what the customer is being told and a button to change it: [Courier] will contact the customer. Press it and the customer's page says the courier is arranging a new day and will be in touch, and that there is nothing they need to do; press it again to go back. It clears itself the moment the courier's tracking moves on - a new day booked, or another failed attempt - so an old "they will ring you" never hangs over a new problem. On a courier set to the courier gets in touch, the order screen just says so and there is no button. The button sends nothing itself. The email usually goes before anybody has had the chance to press it, so it will normally be the "get in touch" version; if the button was pressed first, the email says to wait instead.
Couriers who need the customer to ring them. Some couriers (Furdeco is one) will not book a day with the customer from your end: the customer has to get in touch and agree one. On the order screen, every parcel that has not arrived has Ask customer to contact [courier]. Press it and the customer is emailed (Contact the courier to arrange delivery under Settings → Emails) with the courier's phone number, their live chat link and the parcel's tracking number, and their order page says the same in place of a delivery day. The phone number and chat link come from that courier's settings (Settings → Shop → Couriers, Live chat link for contacting this courier and Phone number for contacting this courier, which every courier has, whether or not you follow its tracking automatically). The note goes away by itself once a delivery day is on the parcel or the parcel arrives; Take back removes it sooner and says nothing to the customer. A parcel set to send no customer emails gets the order-page note and no email.
Redelivery charges. When a courier charges you for another attempt because nobody was in, you can pass that on. On the order screen, Redelivery charge → Charge for redelivery: the redelivery fee before VAT, the VAT rate (it starts at the order's own rate), an optional cancellation charge before VAT, and, if you like, a note. The cancellation charge is only taken if the customer cancels instead of paying; give it a reason in Why there is a cancellation charge ("this is what our supplier charges us to deal with a cancelled order - we pass it on at cost"), which the customer sees beside it. The box starts with whatever you wrote last time. By default the order goes on hold and the customer is emailed (Redelivery fee to pay under Settings → Emails).
On their order page the customer then sees the fee with two ways out of it:
- Pay it there and then, by card - through any payment method you have switched on that can take a payment separately from the order (Square, for now). The order comes off hold, back to where it was, and you are emailed to say so; booking the new day is still yours to do. If no method can take it online, the customer is asked to get in touch, and you press Record as paid once the money is in.
- Cancel instead. The page says plainly that the first attempt has already happened and the courier has charged for it, so the redelivery fee is still due if they cancel - plus the cancellation charge and your reason for it, where there is one. They are refunded what they paid less both. The refund goes straight back the way they paid, the order is cancelled, both of you are emailed, and the credit note is for the smaller amount, so the charges stay on the invoice, VAT and all. Getting the goods back from the courier is up to you.
While the fee is waiting you can Change it - the fee, the VAT rate, the cancellation charge, either note. The customer is not emailed unless you tick Email the customer the new figures; their order page shows the new figures straight away either way. Changing the amount to pay retires the old figure and raises a new one, so a card payment somebody had already started at the old amount cannot quietly settle the new one - if one lands, a note on the order's history says so and leaves it to you. From the order screen you can also cancel or record payment on the customer's behalf (for the customer who rings rather than clicks), send the email again, or Waive the fee. One charge can be waiting on an order at a time. A fee that is paid is paid separately from the order, so it is not on the order's invoice - a note on the order's history says so, and it wants recording in your books.
Your own "Redelivery fee to pay" email. If you have reworded it, the new merge tags are {{cancellationTotal}}, {{hasCancellationCharge}}, {{cancellationNote}}, {{hasCancellationNote}}, {{keptTotal}} (everything kept if they cancel) and {{paidAmount}}; your wording is left alone, so add them yourself if you charge for cancelling. One catch: an {{#if}} block cannot sit inside another. So close your {{#if canCancel}} block with {{/if}} first, then put the charge line in {{#if canCancelWithCharge}} ... {{/if}} and the note in {{#if canCancelWithChargeNote}} ... {{/if}} beside it (both are only true when the customer can cancel anyway), and reopen {{#if canCancel}} for anything after, as the default does. Nest them and the customer gets the raw markers.
Watching the van on the day. On those same couriers, once a parcel is out with a crew, the customer's own order page shows a map with the van on it, the courier's own sentence about how far off it is ("The crew have 1 more drop to make before reaching you"), and - the important bit - how long ago the van last reported its position.
That last line is never dropped. A van drawn confidently on a map is worth nothing without it: five minutes old is a van two streets away, an hour old is a guess. Past five minutes the line changes colour to say so, which is the same point the courier's own page stops trusting it.
The map only asks the courier anything while somebody is actually looking at it. Watching the page checks every five minutes; once the crew's own sentence says you are next it checks every minute; a tab in the background asks nothing at all, and after an hour it stops and asks you to refresh. Everyone watching the same round shares one check, so a delivery to an office where four people have the page open is still one question to the courier, not four. The hourly checking above carries on regardless. If the courier says the parcel has arrived while somebody is watching, the order is finished off there and then rather than waiting for the hour.
Positions come from the courier as their crew drives, so they lag, pause and occasionally jump - the page says as much underneath, in those words. The map is drawn with open map data rather than the courier's own maps.
Proof of delivery. Couriers have stopped agreeing on what proof is. Some still take a signature on a handset; DPD and others photograph the parcel where they left it and name whoever took it in. The shop takes its own copy of whichever it is offered, and the customer's order page reads the same either way: Received by Beckley at 12:20pm, with the picture underneath.
Where a courier gives the name and the time but no picture, you still get the line. It is the half that settles most arguments, and it arrives even when the photograph is behind the courier's own login.
When the courier hands over a signature, the shop takes its own copy of it. Who signed, when they signed and the signature itself appear on the customer's order page under that parcel, and on your own order screen. The copy is the point: the picture sits on the courier's server under a filename of their choosing, and a proof of delivery that disappears when somebody tidies up is not proof of anything. It is fetched once, and a delivery is still recorded as delivered even if the picture cannot be had.
Once it has arrived. The progress bar's delivery step stops showing the plan and shows the fact - "Delivered today", "Delivered yesterday", then "Delivered 8/9/26" once it is older than that - and the parcel's own line underneath reads "Delivered on 8th of September 2026". Both wait for the courier to give a time. Where the courier gives none, the arrangement stays as it was rather than the shop guessing from the clock.
The delivery questions stop being offered on a parcel that has arrived, since all of them are about something that has not happened yet. A link from an older delivery message still opens the order page as normal; it simply has no questions to show.
If you mark an order complete yourself before the courier has published the signature - which is the natural thing to do when the van has just been - the shop keeps asking for a fortnight afterwards and files the proof when it appears. Nothing is asked once it has it.
Where the picture is kept. In your own Media library, under Orders / / Proof of delivery - the same place a customer's photograph of something damaged goes, so everything to do with one order sits together. You can open it, download it or send it on like any other file. It is counted as in use, so it will never turn up in the Unused pile with a delete button over it: the whole point of taking a copy is that it is still there on the day somebody says the furniture never came.
Optimise it, resize it or move it in the library like any other picture and the order follows it - the parcel on the order page, and a customer's photographs of a damaged delivery, point at the file's new home straight away. (They used not to. Optimising a signature quietly left the order pointing at a file that had just been swapped for a smaller one, which is a poor time to discover your evidence has gone walkabout.)
Delivery questions. Each courier can carry its own questions and answers - will they take it upstairs, what happens if nobody is in, do they ring first. They appear as a Questions about your delivery button on the customer's order page, and as a link in the delivery message, which opens the same questions when they arrive. A courier with no questions shows no button and no link, so an empty list is simply invisible rather than an empty box. Answers are plain words, typed exactly as you write them.
Settings → Shop → Checkout has a setting for what happens when a basket mixes something in stock with something on pre-order. It has never stopped anyone buying such a basket, and it still doesn't - it decides how the order gets sent.
- Hold everything until it's all in - the whole order goes out in one piece. Cactus won't let you mark the order as dispatched while any pre-order item is still waiting on stock, and it tells you which items are holding things up and when they're expected. Shoppers are told at checkout that the order will be sent together once everything has arrived.
- Offer to split the shipment - anything on the shelf can go straight away, with the pre-order following on. That's the setting to use if you want to dispatch part of an order, and shoppers are told as much at checkout.
If you're on "hold everything" and the stock has actually arrived, take the products off pre-order on their Stock & delivery tab and the order will let you mark it dispatched. Or switch this setting over to splitting shipments, if sending things separately suits you better after all.
A receipt says what somebody paid. An invoice says who charged them, at what VAT rate, under what registration number, and against a number that has to stay unique for as long as the business exists. The shop has always printed the first. It can now raise the second.
Invoicing is off until you switch it on, under Settings → Shop → Invoices. That is deliberate: turning it on is a decision about paperwork, not a display preference, and nobody should inherit one by updating.
Tick Raise invoices for orders, then answer three things:
- When to raise one. Completed, dispatched, paid for, or never (you raise each one yourself). Completed is the default: it is the point at which you have finished your side of the bargain. Whichever you pick, there is a button on every order too.
-
What they are called. Invoice numbers look like
INV-000123. You choose the prefix; the running number comes from the database and cannot be edited, which is rather the point of it. Change the prefix whenever you like and future invoices follow it. Nothing already issued is renumbered, because renumbering issued invoices is not a thing a business may do. - Payment terms. Days from the invoice date until payment is due, printed as a "due by" date. Leave it at 0 if you are paid at the checkout, and no due date is printed at all.
Then fill in your own details: business name, trading address, VAT registration number, company number, accounts email and phone. The VAT number is the one that matters. Without it the document is a bill rather than a VAT invoice, and a customer trying to reclaim the tax will be back in touch. The settings screen says so if you leave it empty.
The wording boxes underneath - the heading, an opening line, how to pay, your terms, a footer line - are copied onto each invoice as it is raised. Editing them later changes what future invoices say and never rewrites paperwork you have already sent out.
The same goes for the customer's side of it. The name, the organisation, both addresses, their purchase order number, every figure and every line are copied onto the invoice at the moment it is raised, and are never looked up again. A customer who renames their company, moves office or corrects their own account details afterwards finds the invoice still saying exactly what it said the day it was sent - which is what makes it a record rather than a report. Their newer details go on the next one. If an invoice really is wrong, you void it and raise a fresh one; you never edit one that has gone out.
The invoice is a layout, like the shop's other pages. Appearance → Layouts → New, pick Invoice document, and you get the same builder you use everywhere else with ten blocks made for the job:
| Block | What it prints |
|---|---|
| Style | Nothing of its own. Sets the colours, the spacing and the rule thickness for every other block at once |
| Site Logo | Your letterhead. This one is not the shop's block but the site's own, the same one your header uses |
| Heading | The heading, the invoice and order numbers, the date and any due date |
| From | Your details, your registration numbers and, if you want it, your telephone number |
| To | Who it is for, and the delivery address when it differs from theirs |
| From and to (both columns) | Both of the above as one block. What every invoice designed before the split uses, and it carries on working |
| Page number | "Page 2 of 3". Only says anything on the Document Footer layout - see below, and it is only offered there |
| Notice panel | A sentence of your own before the figures - how to pay, what the order was, when it falls due |
| Items | What was bought, with options and an optional rate column. Product codes are off unless you turn them on |
| Totals | Subtotal, discount, delivery, tax and the total |
| Tax summary | Net, tax and gross at each rate. This is the block that makes it a VAT invoice |
| Payment and terms | How to pay and your terms, one under the other or side by side |
| Footer | The line at the foot of company paperwork: where to find you, your company number and your VAT number |
| Divider | A rule, for the gaps the blocks either side of it do not rule themselves |
Every block takes a font of its own, a size for each run of text it prints, and its own labels, so an invoice can be made to look like your letterhead rather than like everyone else's. Four starters come with it: a standard invoice, a designed one with all the above in place, one with the tax rate against every line for a shop selling at more than one rate, and a plain one.
From and To are now two blocks. They used to be one, which was fine as long as you wanted them side by side and the same size. Separately you can put your own details up under the letterhead and the customer's down beside the dates, size them differently, or drop either into a column block with something else. Both carry a switch for the telephone number - yours prints as it always did, theirs is off unless you ask for it. If your invoice already uses the old block nothing changes: it is still there, still works, and is now called From and to (both columns).
Your logo is its own block. It used to be a switch on the Heading block; it is now the site's own Site Logo, dropped above the heading, which means it can be moved, resized, nudged, given a different picture for this document, or left off altogether without touching anything else. It takes the logo from Settings → Identity, so replacing the logo there changes every invoice, including old ones - which is what you want, since nobody reprints a two-year-old invoice hoping to see the old mark on it.
If you designed your invoice before this changed, your published layout has a Heading block that no longer prints a logo, and no Site Logo block yet. Open the layout, drag Site Logo in above the heading, and publish. Nothing else moves.
Sizes. Every run of text on the document has a size menu beside it: the heading, the invoice number, the dates, the addresses, the registration lines, the table's column headings, the item rows, the product codes, the options under a line, the totals, the total itself, the tax summary, the payment wording, the notice panel and both lines of the footer. Leave one on Default and that text keeps the size it has always had, so an invoice you were happy with stays exactly as it was. Dropping the small print to 10px and the item rows to 13px is how you get a long order onto one page.
These used to be boxes you typed a number of points into. They are menus of pixel sizes now, which is the unit everything else in the admin uses and the unit the builder is showing you. If you set a size before the change, it is still exactly the size it was, and the menu offers it back to you as its own option so you can see what you have.
Page settings: paper, margins and scale. Open the invoice layout and click nothing, and the panel on the right is the sheet itself: paper size (A4, A5, A3, Letter, Legal, Tabloid), portrait or landscape, a margin for each of the four edges, and the scale everything prints at. Set the scale to 80% and a five-page order becomes a four-page one; leave it at 100% and nothing moves. You can also turn backgrounds and shading off entirely, which your ink budget may thank you for. These apply to the PDF and to printing the page from your own browser, so the two finally agree.
One footer, on every page, on everything. The Footer block on the document itself prints once, after the last line - fine on a one-page invoice, no use on a four-page one. So there is a separate layout, printed into the bottom margin of every page of the PDF. Design it once and it covers the lot - invoices, credit notes, proformas, and quotes too, if you have that module. The Page number block is the one that counts the pages, and it only works here - it is filled in by the thing doing the printing, which is the only thing that knows how many pages there were.
These blocks now read Document: Style, Document: Notice panel, Document: Footer, Document: Divider and Document: Page number in the block list, where they used to say "Invoice:". They were never only the invoice's - the credit note, the proforma, the quote and a purchase order all draw with them - and a block called "Invoice: Page number" at the foot of a purchase order was a small lie told several times a day.
It lives at Appearance → Layouts → Document Footer, which is Cactus's own rather than the shop's - so when you add something that prints paperwork of its own, it turns up on the same designed strip instead of asking you to build a second one. There used to be a second, shop-only PDF footer tab as well, which was one footer too many for anybody's good: it has gone, and anything you designed under it has moved across to Document Footer with the same name, the same blocks and the same settings. Nothing to redo, nothing to publish again, one entry in the list where there were two.
Two blocks are deliberately not offered on it. Style is not, because the look of a document is set on the document, and a footer quietly disagreeing with the invoice above it is not a feature. Footer is not either, because the whole layout is the footer - one inside the other was a matryoshka doll nobody asked for. Small print that used to go in the Footer block goes in the Notice panel instead, set to Small print: the same wording, the same {{PLACEHOLDERS}}, no box round it. If you already had a Footer block on a footer layout, it will no longer print - swap it for a Notice panel.
Three things worth knowing. Blocks on the footer bring no space of their own. A rule, a line of text or a paragraph all leave a comfortable gap around themselves on a web page, and on a strip a few millimetres tall that gap is most of the strip - so on this layout, and only this one, they all start closed up. Set Space above or Space below on any block and your figure is used instead, including the exact box where you want a particular number of pixels. Anything you had already set stays exactly as you set it. The footer sits in the bottom margin, and it makes its own room: design a taller one and the document's bottom margin is opened up to fit it rather than the small print being printed over your last few lines. Your own margin setting is the floor, never the ceiling, so a generous margin stays generous. And nothing is published for you: no Document Footer means the PDF looks exactly as it did.
Start with Style. Drop it in once, anywhere, and it sets the accent colour used by the rule under the heading, the rule above the total, the bar down the side of the notice panel and the contact line in the footer - along with the shading behind the item table's column headings, how thick the accent rules are, whether corners are square or rounded, and how roomy the whole thing is. One field instead of the same field on six blocks. Leave any of them blank and that part keeps the look it had.
Then the blocks themselves take the details: how big the heading is and which side it sits on, whether the rule underneath is a hairline or thick in your colour, whether the dates read as two ruled columns or one line each ("Issued 6 April 2026"), whether the invoice number sits in that list or on its own above it, whether your details or the customer's come first, whether the table headings sit on a shaded band, whether the total is simply bold or set large above an accent rule, and whether "How to pay" and "Terms" stack or sit side by side. Every label on the document is a text box - "Description" can read "Item", "Unit price" can read "Unit ex VAT".
Rounded column headings, and the room round them. With the item table's headings on a shaded band, Items lets you round the corners to any radius you like, put those corners on the outer ends of the band or on every heading cell, and set the space above, below and either side of them. The same block sets how much room an item row gets, how wide the description column is, and whether the headings read IN SMALL CAPITALS or exactly as you typed them. Where the Style block sets a corner radius for the whole document, this one overrides it for this table alone. Every one of those menus starts on Default, which is the look you already have. The tax summary has a matching corner setting for its own headings.
Rows that have nothing to say are no longer printed. An invoice with no due date used to leave a gap in the heading where the "Due by" line would have been. It does not any more - a line with nothing beside it is not a line. The Date and Due by rows also have Show/Hide switches of their own now, for a shop that would rather not print either.
Their own reference gets a row. Where a customer has given you their purchase order number, the heading prints it under the order number. It arrives switched on and needs nothing doing: an invoice raised before you started asking has no number on it, and a row with nothing beside it is not a row. Rename that row, or hide it, on the Heading block like any other - leave the label blank and it reads whatever you called the box in Shop settings.
Paid invoices can drop the payment details. Payment and terms has an Once it has been paid setting: leave off how to pay and the terms, leave off just how to pay, or print both anyway. Money already in the bank does not need a set of bank details beside it, and a customer reading one on a settled invoice reasonably wonders whether they have been billed twice. New blocks leave both off; an invoice layout you designed earlier keeps printing them until you say otherwise.
Placeholders. The Notice panel and the Footer are sentences you write, and they take placeholders in double braces so one wording covers every invoice: {{INVOICE_NUMBER}}, {{ORDER_NUMBER}}, {{INVOICE_DATE}}, {{TAX_POINT}}, {{DUE_DATE}}, {{TOTAL}}, {{CUSTOMER_NAME}}, {{CUSTOMER_COMPANY}}, {{CUSTOMER_REFERENCE}}, {{BUSINESS_NAME}}, {{BUSINESS_EMAIL}}, {{BUSINESS_PHONE}}, {{BUSINESS_ADDRESS}}, {{VAT_NUMBER}}, {{COMPANY_NUMBER}} and {{SITE_URL}}. A placeholder with nothing behind it on a particular invoice disappears and takes its stray comma or full stop with it, so an order with no payment terms does not go out reading "due by ." One you have mistyped stays on the page instead, so you can see it on the sample invoice in the builder and fix it before anybody is invoiced.
The tax summary knows when to keep quiet. Set it to appear only when there is more than one rate and a shop selling everything at 20% drops the table - the totals row already says "VAT at 20%", if you have asked it to. The table comes back on its own the first time an invoice carries two rates, with nobody having to remember.
One thing the invoice leaves out on purpose: delivery dates never appear on an invoice. They belong on the confirmation email, where they are still a live question; an invoice is read months later by an accountant, by which time "by Wednesday the 2nd" is either history or wrong.
You do not have to design anything to start. Until you publish a layout of your own, invoices print with the standard arrangement above.
Open an order and there is an Invoice panel on the right, once invoicing is on. Before one exists it says when invoices go out on this shop, with a Raise the invoice now button beside it. After one exists it shows the number, the date, the total, View, PDF, and what the books made of it.
An invoice is never edited. If one is wrong, press Void, say why, and raise a fresh one. The wrong one stays on file marked void, its number stays spent, and the reason you typed is what explains the gap to anyone who asks later. Voiding needs the shop manager permission; raising one needs only the order permission.
Voiding also tells your books, so the sale and the VAT on it come back out. See below.
If Show it to the customer on their own order page is ticked, the invoice appears as a link on their order in their account, beside the printable receipt. Clicking it saves the PDF straight away - somebody opening their own paperwork wants the file, not another page to save it from. The link is signed, so it works from an email without anybody signing in, and it carries nothing personal in the address itself.
Before an invoice has been raised, that spot says when one is coming - "Your VAT invoice will be available on completion of your order", or whichever moment you issue on. It saves the email asking where it is.
Download PDF prints the layout you designed through a real browser, so the PDF and the page cannot drift apart. If your hosting cannot run the printer, switch the PDF off and the link goes back to the on-screen invoice, which carries on regardless.
The same PDF is attached to the email that tells a customer their order is complete, so the invoice arrives in the inbox rather than waiting behind a link. That is the message people keep, and their accounts department files what turns up attached to it. It is on by default; untick Attach the invoice to the "your order is complete" email under Settings → Shop → Invoices if you would rather they came and fetched it.
Nothing is attached where there is nothing to attach - an order you have not invoiced yet, a shop that raises invoices by hand, or an invoice you have since voided. The email goes out as it always did in that case, and so it does if the printer has a bad day: an order that is finished gets said so whether or not the paperwork printed.
The printable receipt beside it opens in its own tab and prints as a receipt and nothing else: your site header, menu and footer come off the paper, which is what everybody assumed it did all along. The customer's order is still sitting where they left it when they're done. It also says "This is not a VAT invoice" on the face of it, so nobody files the wrong piece of paper.
Somebody orders on the company card. A fortnight later their accounts department comes back: the invoice needs to be in the holding company's name, and it needs to go to the head office, not the site they had it delivered to. Without this, that is a telephone call to you and a job on your morning.
Settings → Shop → Checkout → Changing the invoice details afterwards hands it back to them. Switched on, a signed-in customer opening their own order sees the company and the address on the order's Billing address card, and a Change these button under them. Nothing there touches the delivery address - where the parcel goes stays yours to decide, which matters rather a lot once it has been picked.
What happens next depends on what they change, and the difference is the taxman's rather than ours:
- Before you have raised the invoice - nothing has gone out, so nothing has to be undone. The order is corrected, and the invoice, whenever it goes, goes correctly first time.
- They move the address, invoice already sent - same company, same registration, same sale. The address on the invoice is corrected where it stands, and the PDF from then on carries the new one. No new number, nothing for anybody's VAT return to notice, and the document keeps a note of what it said before.
- They change the company, invoice already sent - a different company is a different customer as far as HMRC is concerned, and an invoice made out to one firm cannot quietly become an invoice to another. So it is not rewritten. The invoice you sent is cancelled by a credit note, and a fresh invoice goes out in the new name.
That last one has a switch of its own - let them change the company name after the invoice has gone out - because plenty of owners would rather have that conversation themselves. Leave it off and the customer is told to get in touch, while the address half carries on working. It needs invoices and credit notes both switched on, for the good reason that without a credit note the same sale would sit in your books twice.
Nobody triggers it by accident. Change the company on an invoiced order and the page stops and says, in as many words, that the invoice will be cancelled by a credit note and a new one issued, and that nothing about what they paid changes. Only then does anything happen.
Afterwards, all three documents stay on their order page - the original invoice marked "(cancelled)", the credit note, and the new invoice - because their own accountant has very likely filed the first one already and will want to see how it was undone. They get one email covering both new documents, with the new invoice attached, rather than a bare "credit note issued" that reads as though money is coming back.
Your books are told about both: the credit reverses the sale, the replacement books it again, and the two net off in the same VAT return. An invoice that has already been partly refunded is left alone - the customer is asked to get in touch, because crediting it twice is not something a button should be able to do.
If the UK Bookkeeping module is installed, every invoice raised is handed to it as income the moment it is raised, ready for the VAT return. Nobody types anything twice. There is nothing to switch on in the shop for this: it happens because the books are there.
What goes over is itemised: each product with its quantity and stock code, delivery as a line of its own, every one at the rate it was actually charged at. The books record it that way, so the entry reads as the list of what was sold rather than one lump per VAT rate, and it comes to the penny what the invoice came to. Credit notes go over itemised in the same way.
The books decide what to do with it, under Settings → Bookkeeping → Sales from elsewhere on this site: whether to take them at all, which category they are filed under, and whether they land as records or as drafts for somebody to look at first.
Whatever the books say comes back onto the order's invoice panel in words - "Recorded as income of £1,872.00 in the books", or the reason it could not be. If it failed (the books were mid-VAT-return, say), press Send to the books again once the cause is sorted. Sending the same invoice twice never records the sale twice.
The invoice itself goes with it. The books keep the PDF against the entry as evidence, so the document behind a line is a click away rather than a hunt through the shop. If the PDF could not be printed at the time, the panel says so and Send to the books again attaches it.
Voiding takes it back out. Press Void and the books are told in the same breath: if the VAT return it belongs to is still open, the entry is removed outright; if that return has been filed, or the money has been matched to a bank line, the entry stays and a reversing entry goes into the open period, which is what a credit note is. Either way the panel says which happened. If the books were down at that moment, the button beside a voided invoice reads Tell the books it is void and says it again.
Somebody orders three desks on bank transfer. Their accounts department will not release the money without a document to file against it, and you cannot give them a VAT invoice, because a VAT invoice is a record of a payment and nobody has paid. The order sits there. Everybody waits.
A proforma invoice is the document that unblocks that. It says what is owed, how to pay it, and how long each item takes once the money lands - and it says on its face that it is not a VAT invoice, so nobody tries to reclaim the tax on it. The real invoice still follows, in its own time, with its own number.
Proformas are off until you switch them on: Settings → Shop → Invoices → Send a proforma invoice on orders nobody has paid yet. It is a switch of its own, not a sub-setting of invoicing - a shop can send proformas without invoicing anything, and the other way round.
Any order settled by hand: bank transfer, cash, and anything else where the money arrives later rather than at the checkout. Cards and the like are paid at the moment of ordering, so there is nothing to send a request for payment about.
The proforma stays available after the money arrives, and restates itself as paid. A buyer who paid last spring still has it in their filing, and taking the link off them at the moment it cleared would be a strange thing to do to somebody's paperwork.
- Numbered with the order number, not an invoice number. It is not an invoice, so it does not eat one - a gap in your invoice numbering is a question you would rather not be asked.
- Your trading details and your VAT registration, exactly as they appear on your invoices. Same business, same paper.
- How to pay, taken straight from whatever you have written for that payment method on the Payments tab. The proforma, the thank-you page and the "here is how to pay" email therefore quote the same account details, and editing them in one place changes all three.
- Lead times against every line. This is the one place they appear on paperwork, and deliberately: an unpaid line reads "5 working days from when your payment reaches us" rather than a date, because nothing is dispatched before it is paid for and a date would be a promise from a starting gun that has not fired. It needs the Advanced Shipping module to have anything to say; without it the lines simply carry their options as usual.
- Terms saying the clock has not started. Your own words, in Settings → Shop → Invoices → Proforma invoices. The default says nothing is dispatched and no lead time begins until payment clears, which is the thing customers most often assume the opposite of.
- "This is not a VAT invoice", in the panel at the top, in whatever words you choose.
Unlike an invoice, a proforma is not frozen. An invoice is a record of a day and is kept exactly as it was issued; a proforma is a live request against an order that can still change, so it is drawn fresh every time it is opened and always shows what is actually owed today.
Its own layout, under Appearance → Layouts → Shop → Proforma document. The same blocks your invoice is built from, so if you have laid one out you already know how - and there is a Standard and a Designed template to start from, exactly as there is for the invoice.
It is a separate layout on purpose. The two documents disagree in half a dozen places at once, and editing the request-for-payment should never be able to disturb the document your accountant reads.
The written blocks take one extra placeholder here: {{PROFORMA_NOTICE}}, which is the "this is not a VAT invoice" line from your settings. On an invoice it prints nothing at all, so it cannot go astray.
It has page settings of its own too, so a proforma can be on different paper or at different margins from the invoice that follows it. The Document Footer is the same one your invoice uses - one footer, designed once, on every document you send.
Until you make a layout of your own, proformas print with the standard arrangement.
- On the thank-you page, under the bank details, as Download your proforma invoice.
- On the customer's own order page, beside the printable receipt - until the real invoice is raised, at which point the proforma link goes and the invoice takes its place. A proforma says in as many words that it is not a VAT invoice, and having both sitting there is how somebody ends up handing their bookkeeper the wrong one.
- Attached to the "we have your order, here is how to pay" email, as a PDF. This is the one that matters: that email is what gets forwarded to whoever actually presses the button at the bank, and a file they can file beats a link they have to click. Switch it off in settings if you would rather it did not.
- On the order in the admin, as a Proforma card with View and PDF - handy when somebody rings up asking for it again.
Every link is signed, so it works from a forwarded email without anybody signing in, and it carries nothing personal in the address itself. If printing a PDF is not possible on your hosting, switch Offer PDF downloads off and every link falls back to the on-screen copy.
An invoice says what you charged. A credit note says how much of it you have since handed back. They are two documents and both belong in the file: a customer with a refund on their card statement and nothing on paper has nothing to give their own accountant, and a set of books still carrying the whole sale is a set of books paying VAT on money you no longer have.
Credit notes are on wherever invoicing is on. Settings → Shop → Invoices → Credit notes if you would rather they were not, or want to change what they are called.
Whenever a refund actually goes through. That covers all three ways money goes back: the Refund button on an order, approving a return request with the refund ticked, and the hourly tidy-up that settles a refund whose outcome was not confirmed at the time.
Nothing is raised for a refund that failed or is still in flight - only money that has genuinely moved gets a document - and an order that was never invoiced has nothing to credit, so it gets nothing.
Part refunds are the ordinary case, and the arithmetic is the point of the exercise. Send back one £261.60 chair from a £3,673.20 order and the credit note credits that £261.60, of which £43.60 is VAT, at the rate that chair was actually sold at. On a mixed basket each rate is credited at its own rate: handing back the zero-rated half of an order and the standard-rated half are the same money and completely different tax.
Credit note numbers look like CN-000001, and they run in a sequence of their own. They never borrow invoice numbers - an accountant who finds a gap in your invoice numbering deserves a better answer than "one of those was a refund".
The same as your invoice, because it is your invoice layout - page settings and all, and the same shared Document Footer too. There is nothing else to design: the credit note is drawn by the same six blocks on the same Invoice document layout, so an afternoon spent on your letterhead does the job twice. It leads with its own number, names the invoice it credits underneath, prints no due date because nothing is due, and where an invoice says "Paid in full - thank you" this says the money has gone back. That last line is yours to word.
Figures are printed as positive amounts under a "Credit note" heading, which is how a credit note is written and what your customer expects to read. A column of minus signs looks like a mistake.
Credit notes appear beside the invoice on their own order page in their account - and, like the invoice, save as a PDF when clicked - and they get emailed a copy when one is raised - both switchable, the email under Settings → Shop → Invoices → Credit notes and the on-page link under Who can see it. The wording of that email lives with every other email on the site, under Settings → Emails. Download PDF works exactly as the invoice's does.
That email now carries the credit note itself, attached as a PDF, rather than a link to go and fetch it from. Somebody filing a refund wants a file, and a link is one step more than they will take. Untick Attach it to that email as a PDF if you would rather it did not - and if PDFs are switched off altogether, or the printer has a bad day, the link goes back in its place so nobody is left with neither.
One other thing while we were in there: the email has always had a line for the reason you gave, and that line has never once printed. It does now.
A Credit notes panel appears on the order once there is something to show, listing each one with its number, the amount, the tax, the invoice it credits and what the books made of it. View and PDF beside each.
There is no void here, and none coming. An invoice can be withdrawn because it may be wrong before anybody acts on it. A credit note follows money that has already left your account and arrived in somebody else's, and there is no document that undoes that - if one is raised in error the answer is to invoice again, which is what an accountant would tell you too.
If a refund somehow has no credit note against it - the books were down, or credit notes were switched off at the time - the panel says so and offers Raise the credit note. Pressing it twice does not make two.
Money sometimes goes back before the order ever reaches the point where you invoice it - a line turns out to be unavailable while the order is being picked, and you refund it there and then. No credit note is needed for that, and none is raised. There is nothing to credit, because nothing has been invoiced yet.
Instead the invoice simply goes out without it. When the order does reach whatever you invoice on, the refunded units are already off the document: off the lines, off the subtotal, off the VAT and off the total, with the rate summary adding up to what your customer actually kept and paid for. Delivery stays put, because that was not handed back. Refund part of a line's value rather than the whole thing and only that part comes off.
The Credit notes panel says which happened in plain words, so a refund with no document beside it never reads as a job somebody forgot. A refund that was left off the invoice says so and offers no button - raising one would hand the same money back twice in your books, and the panel will not let you.
Refunds after the invoice has gone out are unchanged: those are credit notes, exactly as above. The rule is that every refund is dealt with once - either it is left off the invoice or it is credited off it, never both and never neither.
If the UK Bookkeeping module is installed, every credit note goes to it as it is raised, split by VAT rate, and the sale is reduced by exactly that much. The original sale stays where it is - it did happen - and the credit is recorded against it in the period the money went back, which is what a credit note is and where it belongs. The books never date it back into a quarter you have already filed.
The credit note PDF goes with it as evidence, exactly as the invoice does. What the books say comes back onto the panel in words, and Send to the books again repeats it if they were down. Sending the same credit note twice never credits the books twice.
One thing the books will refuse: crediting an invoice they have never seen. If the sale was never handed over - invoicing was switched on after the fact, say - the panel says so and tells you to send that invoice to the books first. Filing a credit against nothing would push your turnover below what you actually sold, which is a worse fault than the one being fixed.
The order review at checkout shows VAT from the moment it shows a total, even before the shopper has typed a delivery address. Until there is a postcode it uses the rate from your catch-all delivery zone (the one with no postcodes listed, which covers everywhere the others do not), and it works the figures out again as soon as the postcode arrives. Delivery is still added once the postcode is in. A shop with no catch-all zone shows VAT only once the address is known, as before.
Shop → Discounts has two kinds:
- Coupon codes - a code customers type in at checkout. Percentage off, a fixed amount off, or free shipping. Set a minimum order value, a total usage limit, and a per-customer limit if you like.
- Automatic discounts - apply themselves with no code needed, whenever their conditions are met. Useful for a blanket "10% off everything this weekend" or a free-shipping threshold. When several could apply at once, priority decides which wins.
An automatic discount can cover the whole basket or particular products. Pick "Particular products" under Applies to, search for as many as you like, and the discount comes off those products alone - a desk sitting in the same basket pays full price. Picking a product covers every option of it, so a discount on a chair applies to it in every colour and size.
Either kind can also have a minimum quantity: how many items the basket must hold before the discount kicks in. On a discount for particular products the items are counted together, so with a minimum of six, four of one chosen chair and two of another qualifies; anything you did not pick does not count. Leave it empty for no minimum. Handy for "10% off when you buy six or more" without anyone needing a code, or a spreadsheet.
Worth knowing: a fixed amount off particular products comes off once per order, not once per item, and never more than those products are worth. A minimum order value on the same discount still means the whole basket. If every product a discount was pinned to is later deleted, it applies to nothing rather than quietly spreading itself across the entire shop - the list says so, in case you were wondering why it has gone quiet.
A few rules worth knowing, because they decide what a basket actually gets:
- Dates run on your shop's clock, and both days count. A discount starts at midnight at the beginning of its start day and keeps working right through its last day, stopping at midnight at the end of it, in the timezone the site is set to - so a last day of 30 September means it works all of the 30th and stops as 1 October begins. Leave the last day empty and it runs until you switch it off. Discounts set up before the editor asked for a last day have not changed when they stop; the list simply shows them by their last working day, so one you entered as "expires 1 October" now reads "last day 30 September".
- A minimum order value is measured before its own discount comes off - otherwise "£10 off orders over £50" could never be used on a £55 basket - but after any discount applied before it. The coupon goes first, then the automatic discounts in priority order.
- A free-delivery threshold is measured on the goods after discounts, the same way a delivery rate's own "free over" figure is. A coupon that takes a £110 basket to £80 no longer collects free delivery "over £100", and a free-shipping rule with a threshold waits for it rather than giving free delivery on everything.
When a product is out of stock, visitors can leave their email address to be notified the moment it's back. The moment you top the stock back up (or switch it to allow backorders), Cactus emails everyone waiting automatically - no extra step needed on your part.
This now holds however the stock came back, not only when you typed it into the product editor. If another part of your site puts stock back on the shelf - a delivery booked in through the Purchase Orders module, say - the people waiting are told just the same. They used to be told only when the change came from the product page, which meant the one case where stock reappeared quietly was the one where somebody was actually waiting for it.
Every deliberate change to a stock count is now written down: how much it moved by, what it was before and after, why, and who or what asked. A count that disagrees with the shelf has something to read behind it rather than being a number that simply changed one Tuesday.
This starts from empty and fills up as things happen; there is nothing behind it from before this release, because a half-filled history that looks complete is worse than an honest empty one.
Some shops are happy for a sold-out product to sit there wearing its "Out of stock" badge, because it will be back on Thursday. Others would rather it vanished. Settings → Shop → General → Out of stock products covers both, and a middle position for everybody else.
When something sells out gives you three answers:
- Leave it where it is, marked out of stock. What the shop has always done, and still the default. Nothing changes.
- Take it out of the listings, keep its page. It disappears from category pages, collections, product grids, search results and your sitemap, but its own page stays up. Anyone holding a link - a returning customer, an ad still running, a search result from last week - lands on the product rather than a dead end, and can still ask to be told when it's back.
- Hide it completely, page and all. As above, and its page gives a page-not-found instead. For when sold out means gone.
Hide them from me and my staff as well decides whether any of that applies to you. Leave it off, which is how it arrives, and anyone signed in with shop access still sees hidden products on the storefront with their usual out-of-stock badge, so nothing quietly disappears without your knowing. On a product page that shoppers can't reach at all, you'll get a short note at the top saying so. Tick the box and you see exactly what a shopper sees, which is handy for checking your own work and less handy for spotting that half a range has gone missing.
A few things it deliberately does not do:
- It never hides anything from your Products screen. That's where you go to reorder the stock, so hiding it there would be a peculiar sort of help.
- It only hides what you actually count. A product with stock tracking switched off, one that takes backorders, or one on pre-order stays exactly where it is.
- It changes nothing about what can be bought. A sold-out product could not be bought before this setting existed either. This is only about who gets shown it.
- Nothing is deleted or archived. The moment stock goes back above zero, everything reappears on its own. There is no list to tidy up afterwards.
Where a product comes in several variations, it counts as sold out only when every switched-on variation of it is - which is precisely when the picker on its page has nothing left to offer. One colour running out never hides the whole listing.
Every product carries a popularity figure, and both your Products list (Sort → Best selling) and the shopper-facing Sort by dropdown can order on it.
It's built from two things. The first is what you have genuinely sold: paid orders only, refunded items taken back off, and nothing older than a year, so a hit from three catalogues ago can't squat at the top forever. The second is a starting rank you can be given - a supplier's own best-seller order, say, or your own hand-picked favourites - which matters enormously on a shop that hasn't been trading long. A best-seller list that says nothing until you've had a year of orders isn't much of a best-seller list.
One real sale beats any starting rank. So a borrowed ranking quietly steps aside as your own trade builds up, without anyone having to remember to turn it off.
Where a product comes in several variations, the sales count for the listing rather than each colour. A chair sold thirty times across fifteen fabrics is one popular chair, not fifteen also-rans.
Products nothing has ranked either way sort last, not bottom. "We don't know" and "it sells badly" are different claims and the list treats them that way.
The figure refreshes itself once a day, in the same overnight run that sends your low-stock email. It is not recalculated the instant a sale lands, which we're comfortable with: nobody has ever needed their best-seller list to be right to the second.
Shop → Catalogue → Import takes a CSV file of your catalogue - name, web address, price, stock, size and weight, categories, tags, images, SEO fields, pre-order settings, download rules and more. Existing products are matched and updated by their SKU, or by their web address where a product has no SKU. Anything new comes in as a draft unless the file says otherwise, so you can check it over before making it live. Grab the Import template button first if you're not sure of the column layout. A running log of your last few imports sits on the same page, so you can see what came in and what (if anything) got skipped and why.
A file can be up to 20 MB, which is a very long catalogue (anything over 4 MB goes straight to your media storage, which needs R2, B2 or S3 set up under Settings → General → Media). A big import that runs out of time stops cleanly at a row and says which one: everything before it is saved, and uploading the same file again carries on from there, because rows already in match and change nothing. An import that dies part-way no longer sits in the log saying it's still running for ever - after ten minutes it's shown as failed.
A file doesn't have to carry every column. Anything the file leaves out is left exactly as it is on your site rather than being wiped, so a spreadsheet of just names and prices does only what it says. A column that is there but left blank is taken at its word and clears that field - which is how you empty something on purpose.
The import window asks what's in your file. The first choice, Whole products, is the one above: it adds anything new and updates the rest, and wants the full set of columns.
The second, A few columns only, is for the small sheet a supplier sends you - most often a list of sale prices. It matches each row to a product you already have by its product code (or its web address), changes only the columns in the file, and never adds anything. A row that matches nothing is skipped and listed in the log by name, so a typo'd code turns up as a line to fix rather than a stray new product to hunt down later.
That means a sale is three columns wide: the product code, the sale price, and the sale code the supplier wants while the offer is on. There's a Download the sale price template link in the window that gives you exactly those. Leave a sale price blank and the product comes off sale, so the same sheet ends the offer as started it.
Export CSV goes the other way - a download of your current catalogue, handy for backups or bulk editing outside Cactus. It asks which columns you want first, grouped so you can tick a whole set at a time: the basics, prices and VAT, stock, catalogue, words and pictures, size and weight, pre-orders, downloads, and related products. Everything is ticked to begin with, which gives you the full file exactly as before. Untick the lot bar a few and you get a narrow sheet instead - product code, categories and nothing else, say, for a quick tidy-up in a spreadsheet.
Whatever you pick is remembered on that computer, so the next export opens with the same ticks. Keep the product code ticked if you mean to change the file and put it back in: that's what each row is matched on, and a file without it has nothing to match. A cut-down sheet uploads through the A few columns only option above.
Shop → Tax & shipping is where both live, because they share the same building block: a zone.
A zone is a group of postcodes that get the same treatment - "United Kingdom", say, or one zone per region if your tax or delivery costs vary within a country. You give a zone a name and a list of postcodes it covers. A customer's postcode is matched against the most specific rule that fits, so they only ever land in one zone.
Each line of that list is one of two things:
- A prefix, which catches anything starting with it.
SWcatches every London postcode starting SW; a US seller might use9to catch every California ZIP code starting with 9. - A range of districts, written
AB30-AB32, which means AB30, AB31 and AB32 and nothing else. You can leave the second half off:AB30-32is the same thing.
Ranges are there because a great many real delivery lists cannot be written as prefixes without catching the wrong places. The Isle of Wight is PO30 to PO41, and every prefix short enough to reach PO30 also swallows Portsmouth's PO3. The Perthshire highlands are PH10 upwards, and PH1 is Perth itself, delivered to like anywhere else. A range compares the number, so it gets both right.
Alongside the covered list, each zone has a list of postcodes excluded from it, and that list wins - over the zone's own covered list, and over a zone left empty to catch everything.
That is how you say "everywhere except the Highlands". Leave the covered box empty so the zone catches the whole country, then paste the exclusions into the second box:
AB30-AB32, AB33-AB38, AB41-AB43, AB44-AB45, AB51-AB56, AB63, BT1-BT94,
FK17-FK21, GY1-GY10, HS1-HS9, IM1-IM9, IV1-IV56, JE1-JE5, KA27-KA28,
KW1-KW17, PA20-PA78, PH10-PH26, PH30-PH50, PO30-PO41, TR21-TR25, ZE1-ZE3
(one per line, and that particular list is the usual Highlands, islands, Northern Ireland and Crown dependencies set).
What happens next depends on whether any other zone picks that shopper up:
- Another zone covers them - say a "Highlands and islands" zone listing those same ranges, with its own dearer delivery rates - and they simply land in it. Nobody is turned away; you've just charged the right money for a long drive.
- No zone covers them and the checkout stops, telling them you don't deliver there. It does this on the delivery step, before anyone reaches for a card, and again when the order is actually placed so a stale browser tab can't slip one through. Without that, an excluded order would go through with no delivery option and nothing charged to carry the goods, which is worse than refusing it.
You can word that message under Settings → Shop → Checkout. Left blank it says "Sorry, we cannot deliver to that postcode. Do get in touch if you would like us to try."
A shop with no zones set up at all is not affected by any of this: it carries on exactly as before, since "no zones yet" is not a decision about where you deliver.
A shop that has zones but none left empty to catch everything is making that decision, though. A postcode none of them covers used to go through with no delivery charge and no VAT, which is the most expensive way to find out a zone was missing. It now gets the same "we can't deliver there" message as an excluded one, but only when the basket has something physical in it - a download goes anywhere. Tax & shipping warns you when no zone catches everything, so you can decide whether that's what you meant.
The editor points out any line in either box it can't read - a range with two different areas in it, say - because a rule that quietly matches nobody is only noticed when an order turns up from somewhere you don't go.
For each zone you set:
- Tax rates - a percentage per tax class (Standard, Reduced, Zero-rated, or whatever classes you've defined above the zone list). This is exactly what lets a shop with customers across several US states charge the right sales tax per state - just create one zone per state with its own rate, rather than a single fixed rate for the whole country.
- Shipping rates - as many as you like per zone: a flat fee, a rate that scales with the order's weight (in bands you define), or free shipping above a threshold you choose. Each can have an estimated delivery time and be switched on or off without deleting it.
Tax is always worked out on the server at checkout, never left to the customer's browser.
The Tax report (Shop → Reports → Tax) gives each rate's tax collected, tax refunded and tax owed for any dates you pick - collected on the day each order was paid for, refunds on the day they were made, days starting at midnight in your site's timezone. Delivery VAT is included, split across the rates the way your invoices split it, and the CSV follows the dates you picked.
How you type a price in and how a shopper sees it are two different questions, and Shop → Tax & shipping → Prices on your shop is where you answer the second one.
The first is answered by Tax mode in Settings → Shop → Checkout: it tells Cactus what the number in the price box means - either the tax is already in it, or the tax gets added at the till. That is a bookkeeping decision, and plenty of shops keep their prices without tax because that's how their suppliers quote them.
Shoppers, though, generally want the number they'll actually pay. So the Tax & shipping box offers three answers:
- Exactly as you type them - no conversion at all. This is how Cactus has always behaved and stays the setting until you change it, so nothing moves on its own.
- With tax included - the tax is added on before the price is shown. What most shops selling to the public want, and what UK consumer rules expect.
- With tax taken off - the tax is stripped out before the price is shown. Trade catalogues, mostly.
Underneath there's a box for the wording that goes after each price - "inc. VAT", say. Pick one of the two converted options and a suggested wording is filled in for you; type over it with anything you like, or clear it if you'd rather have no note at all. Leaving prices to change side without a word of explanation reads to a returning customer as a price rise, which is why the box is there.
Whichever you choose applies everywhere a shopper meets a price: product cards, product pages, the options picker on a product with variations, delivery and assembly upgrades, the basket and the checkout, and the price search engines read off your product pages. The rate used is the one from the zone that covers everyone, because a shelf price has to be printed long before anybody knows where the parcel is going - the checkout still works out the real rate from the delivery address.
None of this changes what anyone is charged. The till works from the stored figure and the real zone, exactly as before. This setting decides what is printed, and nothing else. If you switch a public shop over to tax-included prices, do check your minimum order value in Settings → Shop → Checkout, since that is still measured against the stored figures.
A shop selling to both businesses and the public can't please both with one answer, so the same box has a second switch: Let shoppers switch between prices with and without VAT. Turn it on and a link appears straight after the tax wording beside the price on every product page - "Show prices including VAT" while prices are shown without it, "Show prices excluding VAT" once they've swapped.
One click turns every price on the site over: product cards on category, collection, tag, supplier and search pages, the product page's own price, was price and RRP, the "from" prices under each option, personalisation surcharges, add-ons and the add-on showcase, a modular layout's total, unit and preset prices, the delivery upgrade chips, and the order-size deduction line. The wording beside the price changes with it. The choice is remembered in that shopper's browser, so their next visit opens the way they left it, and it applies from the first moment a page appears rather than a blink after.
Pages still open on whichever side you chose above until a shopper picks otherwise. Once the switch is on, three more boxes appear:
- Wording after prices with (or without) VAT - the note for the other side. The existing wording box above stays the note for the side pages open on.
- Link offering prices with VAT and Link offering prices without VAT - the link's two wordings. Clear either one and it goes back to the default.
The basket and checkout are left as they are: they already show VAT on a line of its own, and they are where the real total is worked out. The switched figure is worked out from the one on the page at each product's own rate. On a shop that shows the same side it stores it is exact; on one that stores prices with tax and shows them without (or the other way round), the switched side can land a penny away from the stored figure. The till charges from the stored figure either way.
At the top of Shop → Tax & shipping there's a single switch, Charge postage by weight, which is on to begin with. Plenty of shops post everything for the same money and have no use for weights at all, so turning it off tidies them away:
- The weight-based option disappears from the Type dropdown when you add a shipping rate, leaving flat rate and free shipping.
- The weight box disappears from the Stock & delivery tab of the product editor. Length, width and height stay put, since they're often worth recording for their own sake.
- The weight column disappears from the variants grid, if you have the product options module installed.
Nothing is deleted. Weights you've already recorded stay on your products and come straight back if you switch it on again, and an existing weight-based shipping rate keeps working and keeps showing its own type when you open it for editing.
Guests can always check out without an account. If you have the Members system switched on, signed-in customers additionally get an order history, saved addresses that pre-fill at checkout, a basket that follows them from one device to the next, and a "create an account" nudge after their first purchase (switch that nudge off in Settings → Shop → Checkout if you'd rather not).
That nudge appears on the confirmation page, once the order is safely placed rather than in the middle of paying, and only to guests - a customer who was already signed in doesn't need telling. It sits below anything the customer still has to do about the money (bank transfer details, say) and above the list of what they've bought, so it's in plain sight rather than stranded at the bottom of a long receipt. It stays out of the way entirely if you've got Members switched off, or if your site is invite-only, since sending someone to a page that will only turn them away is worse than not asking at all.
The nudge is the sign-up form itself, sitting right there on the confirmation with the address they ordered with already typed in - not a button that carries them off somewhere else to start again. It's the same form as the one on your sign-up page, so it asks for exactly the fields you've chosen in Settings → Members and holds them to the same privacy policy. Someone who just spent five minutes paying you is unlikely to go looking for a second form.
Which does mean the shop's own tickbox is not the whole story: with accounts switched off site-wide, it can be ticked and still show nothing, because there is no account to create. The Checkout settings say so underneath the tickbox when that is the case, and point you at Users → Settings → Registration, which is where accounts are turned on.
The useful part is what happens next: sign up with the same email address and the order they just placed joins the new account by itself, so their order history isn't empty on the day they make it. Orders are claimed this way only once the customer has confirmed their email address, for the obvious reason - anyone can type someone else's address into a sign-up form, and an unconfirmed match would hand over that person's order history and delivery addresses along with it. If you've turned email confirmation off in the Members settings, nothing is claimed.
Guests aren't shut out of their own order either - see below.
A guest who checked out without signing up used to have nowhere to go. Their order existed, their invoice existed, their parcel was moving, and none of it was anywhere they could look - so every one of those questions arrived by telephone or email instead, including the awkward one where their accounts department has just told them the invoice needs to be in the holding company's name.
They can now open their own order by proving the postcode it's being delivered to. No account, no password, nothing to remember. What they get afterwards is the same order page a signed-in customer gets: where it has got to, what's in it, their invoice and credit notes, their parcels and tracking links, anything still to pay, and the same box for putting right the company and address the invoice is made out to.
There are two ways in.
From an email. Every email you send about an order now carries a line: Keep track of your order at .... Someone already signed in and looking at their own order goes straight through to it; anyone else is shown the order number and asked for the postcode. That decision is made when the link is clicked rather than when the email was sent, so a guest who creates an account a fortnight later finds the same old link takes them straight in.
From the tracking page. /shop/track-order asks for an order number and the delivery postcode. You can give it a short address at the root of your site as well - track-order out of the box, so yoursite.co.uk/track-order - which is the version worth printing on a delivery note or reading out on the telephone. Leave that box empty and only the longer address exists. It also asks whether they'd like an account, since the whole thing is a slower version of having one.
Both are forgiving about what gets typed. Spaces and capitals in a postcode make no difference - E1 1AA, e1 1aa and E11AA are the same postcode - and an order number works with or without your prefix and without its leading zeros, so DW000172, 000172 and plain 172 all find the same order. B29 7QB still finds nothing, which is rather the point.
Once someone has proved a postcode, that browser remembers it for 30 days, for that order and no other. Tracking two parcels means proving two postcodes.
It is not a guessable lock. Order numbers run in sequence and are printed on every email you send, so the postcode is the only real secret in the pair - and Cactus treats it that way. Eight wrong postcodes on one order and that order stops answering for an hour, however many different computers the guesses come from. Every kind of failure gives the same reply, so nobody can use the failures to work out which order numbers are real, and the link in the email is never a way in on its own: these emails get forwarded to partners, accounts departments and whoever actually presses the button at the bank, and none of them should get the delivery address thrown in.
The whole thing can be switched off under Settings → Shop → Checkout → Order history if you'd rather guests rang you. With it off, the tracking page doesn't exist and the line drops out of your emails.
When a customer pays a redelivery fee before their order's VAT invoice is raised, that fee now appears as its own line on the same invoice, with the VAT recorded when the fee was paid. One order still gets one invoice, rather than a small paperwork sequel nobody asked for.
One thing to know if you've edited your emails: the Keep track of your order line is part of the wording Cactus ships, and any template you've already rewritten keeps your wording rather than having ours put back. Add {{orderUrl}} where you want the link on those, in Settings → Email → Templates.
Anyone can still look an order's status up the old way as well, using their order number and the email address it was placed under. That is typed into a box now rather than being carried in the address of the page, so there is no link to that order for anybody to come across afterwards.
Orders and Addresses & Phone Numbers appear as tabs inside the customer's account, after Account & Security. If you've switched on Put the whole account on one page (under Users → Settings → Account sections), they come onto that page instead, in the same order the tabs run in, and the tabs scroll to them. An individual order still opens on a page of its own either way.
The page a customer lands on after paying is a receipt: their name, the address the parcel is going to, every line they bought and what they paid. Its address carries a long code that says which order it is, and that code cannot be guessed.
What it can do is travel. Receipt links get forwarded to a colleague, pasted into a family chat, left in the history of a shared computer at work, and quietly synced between somebody's laptop and their phone. So the code alone no longer opens the page.
The machine that placed the order is let straight in, every time, with nothing to type. Buying the thing is the proof, and the shop makes a note of it at the till. Come back to the same link on that machine a week later and the receipt is simply there.
Anywhere else, the page asks for the delivery postcode first, and then shows the receipt exactly as it would have done. Same box, same forgiveness about spaces and capitals, and the same protection behind it: eight wrong answers on one order and that order stops answering for an hour, however many computers the guesses come from. On a shop selling to somewhere that does not use postcodes, it asks for the email address the order was placed with instead, because a blank box must never be the key to anything.
That note lasts 30 days, which is the same as the postcode proof elsewhere. After that a customer opening an old receipt gives their postcode once, which on a link that has had a month to be passed around is the right way round.
Nothing about this needs setting up, and there is nothing to switch off. It does not touch the order page, the tracking page, or looking an order up with an order number and an email address, all of which work exactly as they did.
Invoices, credit notes and proformas used to open for anybody holding their link. That was deliberate once - the person who actually pays a bill is very often somebody in an accounts department who will never have a login here - but the link never expires, it sits in a mail archive for years, and what it opens is a name, an address and what was spent.
So the three of them now ask the same one question the receipt does. The customer goes straight through on the machine they ordered from, and so does anybody signed in: you and your staff from the order screen, and the customer from their own order page. Anybody else gives the delivery postcode once, and then the document is theirs.
Two things worth knowing:
- The PDF still travels with the email. Where you have PDF paperwork switched on, the invoice or credit note is attached to the message itself, so forwarding it to an accounts department is a matter of forwarding the email. Nothing about that has changed.
- A forwarded LINK now asks for the postcode. If you send somebody the address of an invoice rather than the file, they will be asked for the delivery postcode before it opens. Worth a sentence in the covering email if you do that often.
Nothing needs setting up, and there is nothing to switch off.
With the Twilio module installed and a text-enabled number added, customers can have their order updates texted to them as well as - or instead of - emailed.
The choice is offered on the page they land on after ordering: How shall we keep you posted?, with a tickbox each for email and text message, and a box for the mobile number when they want texts. It's the same card whether they have an account or not, and it saves against that order, so a guest gets the choice too. Signed-in customers can change their mind later on the Notifications tab of their account, and that change carries across to any order still in progress.
What they can't do is untick both. An order is something you have to be able to tell somebody about, so the choice is how you reach them, not whether. Cactus refuses the save and says so.
A few sensible details:
- A landline in the delivery number won't do - texts need a mobile, and Cactus says so rather than pretending to send one. If the number is unusable and text was the only channel chosen, the email goes out anyway rather than the customer hearing nothing.
- Texts cover the customer-facing milestones only: order confirmed, order placed with payment still to come, payment received (bank transfer and cash), being processed, dispatched, complete, cancelled, part of an order dispatched, and the three about a cancel or return request. Your own alerts - new order, low stock, import finished - stay on email, on the grounds that you're sitting at a screen and texts cost money.
- The wording of every text lives on Settings → Twilio → Templates, editable exactly like the emails.
- The delivery phone number and the number for text updates are kept apart, because they aren't always the same person: one is whoever's at the door, the other is whoever placed the order.
No Twilio, or no text-enabled number? None of this appears anywhere, and orders carry on being emailed about exactly as before.
Want texts turned off without touching Twilio - so login codes and everything else it does keep working? Settings → Shop → Checkout, untick Offer text message updates on the confirmation page. Every customer goes back to email only: the choice disappears from the confirmation page, and any order that already had texts switched on stops getting them too.
Orders and Addresses & Phone Numbers are tabs in the customer's account, next to Profile and Security, and those pages carry the same tabs across the top - so nobody clicks "order history" and finds themselves stranded on a page with no way back.
The order list shows each order with its date, a photo of what's in it, how many items, what it cost, and where it's got to - being prepared, on its way, complete. Four filters across the top narrow it to orders in progress, completed or cancelled. Opening one shows the lot: every line with its picture and any options they chose, what's been dispatched and what hasn't, each parcel with the courier and tracking number, any refunds, the full breakdown of what they paid (items, discount and the code they used, delivery, VAT), both addresses, and any downloads. There's a Buy again button on each line, and a printable receipt on its own tidy page.
The order page reads top to bottom in the order people actually want it. The order number, its state, the date, the number of items and the total sit at the top, and directly under them is a progress strip - Ordered, Paid, Dispatched, Complete - with a tick against everything that has happened and the step it's on picked out. Somebody who opens the page to ask "where is it?" has the answer before they've scrolled. Under that comes anything they still have to do about it: money owed, or a cancellation they've asked for and haven't heard back on. Then the receipt itself, with the items and the totals in one box rather than at opposite ends of the page. Everything after that - parcels, downloads, paperwork, how it was paid, the two addresses, refunds, past requests - is a set of smaller boxes that sit two side by side on a computer and one above the other on a phone, so a long order stops being a mile of scrolling.
Two details worth knowing. Things bought together stay together: a desk and the drawer unit ordered with it sit as one group with the accessory tucked under its parent, the same way they did in the basket and on the thank-you page. And where somebody bought more than one of something the single price is shown as well as the line total, rather than leaving them to divide one by the other. The paperwork - the printable receipt, every invoice including any that were cancelled and replaced, the proforma, any credit notes - now has a box of its own with a row per document, instead of being a run of links trailing off the date.
If they paid by bank transfer or cash, your payment instructions sit at the very top of that order, above everything else on the page, for as long as the money is still to come. They're in a highlighted box with the amount outstanding spelled out, so somebody opening their banking app a week later has the account details and the sum in one place instead of digging through their inbox for the confirmation email. The moment you mark the payment received they go - from the order page and from the thank-you page both - because a panel of bank details on a paid order reads like a bill arriving twice. An order that's been cancelled or refunded shows nothing either, on the same reasoning. This happens whether or not you show those details at the checkout: the switch on the Payments tab only governs the checkout page.
A line with options on it gets the same Buy again button, but it opens the product page with those same options already chosen rather than dropping straight into the basket - so a chair in a particular colour and back height comes back up exactly as it was bought, with only the basket click left to do. The detour is deliberate: what the order stores is a record of what they chose for reading, not the recipe for rebuilding it, so anything typed in by hand (an engraving, an uploaded file) wants confirming rather than guessing at.
Re-ordering is on by default and switches off in Settings → Shop → Checkout → Order history, which takes the button away everywhere. Worth doing if your range moves faster than your order history - made-to-order work, one-offs, anything where pointing somebody at a year-old product page is more likely to disappoint than to sell.
The Addresses & Phone Numbers tab fills itself in. Every address a signed-in customer orders to is kept there once the order is placed - the billing address too, where they gave a separate one - so the second order asks them for rather less than the first one did. They can add one by hand too, and delete any of them, but nobody has to remember to save anything.
Each saved address has an Edit button, which opens the whole address for changing - names, phone number, both address lines, town and postcode - rather than only the phone number. A company that's moved office edits the address it already has instead of adding the new one and deleting the old one. The Add address button opens the same form, empty. Both are the checkout's own form, down to the labels and the messages when something's missing, and both will look an address up for you where the checkout does (see below).
Each address keeps its own phone number, which is why it's in that form rather than on the account: the number wanted for a delivery is whoever's actually at that door - the site manager at the second office, the colleague taking it in at home - and not automatically the person who paid. Pick that address at the checkout and its number comes along with it. A number that isn't a UK one gets a polite refusal rather than being filed and quietly failing later, and an address saved with no number at all is perfectly fine unless you've made a number compulsory, in which case the form asks for one here too.
At the delivery step, a customer with addresses on file gets a short Deliver to list above the form: their addresses, and a Use a different address option for when they're sending something somewhere new. Picking one fills the form in, and the form stays right there underneath, so a flat number they've since moved past can be corrected on the spot without touching what's stored in their account. Whichever address the order actually goes to is the one that gets kept.
The same address ordered to twice stays one entry. Two entries only appear when the parcels would genuinely land at two different doors, so typing a postcode in capitals one week and lower case the next doesn't quietly grow a list of near-identical duplicates. It's the door that's matched on and not the name against it, which means two people at one address share one entry - the name comes up as whoever ordered first, and is typed over in the form like anything else. And a customer paying by bank transfer gets their address kept the moment they finish checking out, rather than whenever you get round to confirming the money.
With the Address Lookup module installed, the address book's own Add and Edit forms suggest addresses as they're typed, exactly as the checkout does - an address added in the account is worth no less than one typed at the till.
Other modules can add a box of their own to that order page, under the receipt and above the parcels. Nothing does unless you have installed something that wants to: with the Reviews module on, a completed order grows a Review what you bought box with a row of stars per item, so a customer can rate the lot from the page they are already looking at. A shop without such a module installed sees the page exactly as it was.
Guests aren't offered any of this and aren't asked to sign up for it. They see the form exactly as they always did.
A signed-in customer's basket is kept with their account rather than in the browser they happened to be using. Fill one up on the train on a phone, open the laptop at the desk, and it's already there. Nothing to press, no "save my basket" button, no emailed link.
Signing in joins the two baskets rather than picking a winner: whatever they'd put in as a guest stays, whatever was waiting on the account comes back, and something sitting in both counts once at the larger quantity rather than doubling up. Signing out takes the basket off that browser, since it's safe on the account and a shared laptop is nobody's idea of a good place to leave a shopping list. Sign in on somebody else's machine and you get your basket, not theirs.
Changes are sent up as they're made, so a phone put in a pocket mid-shop has already saved. If two devices are open at once, the one being used wins, and the other picks the change up the next time it's brought back to the front.
Guests get the same safety net on the machine they're using. Their basket is kept on the shop as well as in the browser, so a cleared cache, a crashed tab or a browser having a tidy-up doesn't take the shopping with it. It doesn't hop between their devices - there's no account to hang it on and the shop has no business guessing - but it survives on the one they've got.
Nothing personal goes with it. The basket kept for a guest is a list of what they picked and nothing else: no name, no email, no phone number, no delivery address. Anything typed into the checkout stays in their own browser until they actually place an order. The shop sets one small cookie so it knows which basket is theirs, which is the shopping-basket cookie the cookie rules specifically say you don't have to ask about - and it earns that by doing nothing else. A guest basket nobody comes back to is thrown away after a couple of months.
It's worth saying that a basket is a list of what somebody fancied, not a promise about the price: what things cost, what's in stock and what delivery comes to are all worked out fresh when the basket is opened and again at the checkout, so a basket left for a fortnight can't hold you to a fortnight-old price.
There's nothing to switch on, for either kind of shopper. The account-to-account part needs Members running; the rest is simply how baskets work now.
Customers can ask to call an order off, send something back, or tell you something arrived broken, all from the order page itself rather than hunting for your email address. They pick a reason from a short list and can add a note.
The rules are the sensible ones and you don't have to police them: cancelling is only offered on things that haven't been dispatched (once something is in a van, that one's a return), and returning is only offered after something has actually gone out, within a window you set. That window is counted from the day the last parcel left, not the day they ordered - an order that sat on your shelf for three weeks shouldn't eat the customer's return window. One open request per order, and they can withdraw it if they change their mind.
They can call off part of an order, not just all of it. Somebody who ordered five chairs and only needs three says so on the page: the form comes up with everything that can still be stopped already ticked, and they change the numbers if they only want some of it gone. Press send without touching anything and it's the whole order, exactly as before.
Anything that can't be stopped is listed underneath with the reason - already on its way, or something you don't take back - rather than quietly left off the form. An order showing three of its five lines and no explanation reads as broken, and the customer's next move is an email asking about the other two.
All three are on by default and can be switched off in Settings → Shop, along with the length of the return window (30 days out of the box). Off means the pages say to get in touch instead, rather than pretending the option was never there.
The Returns section on a product's Stock tab offers three answers, and the middle one is the one most shops actually give:
- Take it back as usual - the ordinary rules. Where every product starts, and where it stays unless you say otherwise.
- Only if we agree to it - they can ask, and you can say no. For the things you will usually take back but would rather not promise: the chair that has been sat on, the desk that has been built and taken apart again, anything where the van costs more than the restocking.
- Do not take it back - a desk cut to somebody's own measurements, a chair in a fabric they chose off a card, anything made to order.
On either of the last two you can write a line of your own explaining what to expect. Leave it empty and the customer is told "This item cannot be sent back once ordered" or, on a discretionary one, that you may be able to take it back and there may be a charge for collecting it.
Nothing happens to the rest of your catalogue. Every product starts on the ordinary policy and stays there until you change it.
A product with options is marked once, on the product, and every combination of it follows. Where one combination genuinely differs - a single made-to-order finish on an otherwise stock range, or the one stock finish on a bespoke one - the Returns column on the Variations grid overrules it for that row alone. Left on As product, which is where every row starts, it just follows the product.
All of it is in the spreadsheet too, so a whole range can be marked in one go: Can be returned, Returns are our decision and Why it cannot be returned on the Products sheet, and Returns on the Variations one, which takes Yes, Discretion or No. An empty cell means "nothing said", so a sheet that never touches those columns changes nothing.
What the customer sees: no Return something button on anything you will not take back, and your reason in its place. An order made up entirely of such things says so plainly rather than offering a button that goes nowhere. A mixed order still offers the button, lists what can go back, and says underneath which lines cannot and why. A discretionary line is offered like any other, with your sentence beside it before they ask - being told "we may say no" while you are still deciding whether to bother is far better than being told it afterwards.
One thing that follows from "do not take it back". A line you will not take back cannot be called off through the website either, even before it has been dispatched. Goods like that are cut, upholstered or ordered in specially the moment the order lands, and the van not having been yet does not put them back in the box. It is per line, not per order: on an order holding one bespoke desk and three stock chairs the chairs can still be stopped, the desk is listed underneath with your reason beside it, and only an order where nothing at all can be stopped says so instead of offering the button.
And on the page itself, for you alone. Signed in with Shop access, a product page carries the answer in the same small dashed staff only box that already gives you the stock figure and the codes - Returns: accepted, Returns: at our discretion or Returns: not accepted, the last two followed by the very sentence the customer would be shown. It's said either way round rather than only when the answer is no, because a box that comes and goes just looks like something that failed to load, and "yes" is the answer you actually want when somebody rings up asking. On a product with options it sits under the basket button with the others and follows the combination you've picked; where that one combination differs from the product it says this option only, so you can see the exception rather than wonder whether the page changed its mind. Customers see none of it, and it isn't sent to their browser either.
One thing worth knowing: what counts is how the product was marked when the order was placed. Marking something non-returnable today does not reach back and take the right away from somebody who bought it last week under the old terms. The same goes for your wording - the reason is recorded with the order, so a customer is shown what they bought under rather than whatever the product says months later.
Damage is not on the returns list, and that is deliberate. A return is somebody deciding they don't want a thing, and it ends in a collection and a refund; damage is your problem, and it ends in a replacement. Sat side by side in one dropdown, "it arrived damaged" is the line people pick, and every breakage then has to be unpicked by email.
So it has its own button: Report an issue. The customer says which item and what happened, and adds photographs - up to six, shrunk in their browser on the way so a phone camera on a bad signal still manages it. Please-add-at-least-one is as far as the nagging goes: "parts are missing" is a report of something that isn't there to photograph.
Four things are true of it that are not true of a return. There is no window, because a fault does not read a calendar. It works on the things you would never take back, because the customer who cannot send a desk back is exactly the one who most needs to tell you it turned up smashed. It runs alongside a cancellation or a return rather than instead of one, so a second parcel arriving broken doesn't have to wait its turn. And it does not go away once it has been used: the button comes back as Report another issue, because an order of eight desks is opened one carton at a time and the second fault shouldn't have to arrive as an email. Each report gets its own line on their order page, with its own way of taking it back.
Putting the link in your emails. Your order emails can carry a link straight to that form: {{reportIssueUrl}} opens the customer's own order page with the report already open, so "something not right?" is one click rather than a hunt for the right button. Wrap it in {{#if hasReportIssueUrl}} ... {{/if}} like any other optional line - it fills itself in on the emails sent after something has left you (dispatched, part-dispatched, completed, delivery booked, and both replacement emails), and it empties itself on a shop that has reports switched off, taking the whole line with it. Somebody following it who has to prove their postcode first still lands on the open form, rather than on the order page with the thing they clicked for shut.
Not asking for a review on an order that went badly. If your Order completed email asks for a Google review (or any other kind), wrap that paragraph - and anything else that only makes sense on a happy order, a P.S. with the link again, say - in {{#if hasReviewRequest}} ... {{/if}}. Every order asks by default. On an order where asking for five stars would be pouring salt in it, untick Ask for a review in the completion email under Status on the order's own page; it saves the moment you untick it, so it still counts if the order then completes itself when the courier reports it delivered. The rest of the completion email, invoice and all, goes out as normal. The same flag works in the completion text message, for anyone who put a review link in that. It is not offered on a replacement, whose last email is its own and asks for nothing.
The report lands in the same queue with its photographs on it, and the buttons read Putting it right and Turn it down rather than approve and decline, because nobody approves a broken table. Refunding is still offered if that is how you'd rather settle it.
Those photographs are also filed in your media library, under a folder named for the order (Orders → the order number → issues), so if you ever need to find them again outside the queue itself, that is where they are. Only photographs uploaded to that order's folder are attached to its report, so a report can't borrow a picture from somewhere else in your library. A fully refunded order no longer offers the button; one refunded in part still does, since the refund may have been for something else entirely.
Requests land in Shop → Cancellations, returns & damage in your admin, waiting ones first and the oldest at the top. Each shows who asked, for what, why, in their own words, and what the order was worth. Anything covering a discretionary line is flagged Your call, so you can see the decision is genuinely open without opening the order and reading the lines. You approve or decline, and either way you can add a line that goes in the email to them. Approving offers a tickbox to send the money back at the same time - it's a second, deliberate step, because a refund is money leaving the business and shouldn't be one stray click away. Leave it unticked to approve now and refund when the goods are actually back in your hands.
Return charges. Approving a return offers a box for what it costs you to collect the thing. Fill it in and the amount is kept back: the refund goes out for the goods less the charge, spread across the lines so each still looks like itself on the credit note, and the customer's email says the figure plainly rather than leaving them to work out why the refund is short. The charge is recorded whether or not you refund on the spot, so you can approve today, collect on Thursday and refund the balance then. A charge as big as the refund itself is refused rather than quietly sending back nothing - that is a decision to take without the refund machinery in the way.
Nothing is ever decided automatically. There is no auto-approve, by design: money going out on a timer is not a setting anyone should inherit without noticing.
On the order itself, too. Open an order a customer has reported something on and it says so: a Customer report waiting badge under the order number, and a Reported by the customer card with the whole story - damage, return or cancellation, the reason they picked, which items it's about, what they wrote, and every photograph they sent, each opening full size with a click. While anything is still waiting the card sits at the top, above the items, because a photo of a snapped chair leg is usually why you opened the order in the first place; once it's settled it moves down below the parcels and shows what you replied and any replacement you sent. The report and its outcome also appear in the order's timeline. Deciding still happens in the queue, where the refund and replacement steps live - the Decide button takes you there.
The photographs follow the media library. Optimise one, resize it or file it somewhere else and the order shows it at its new address straight away, rather than a broken image where the evidence used to be.
Approving a cancellation that covers the whole order also closes the order, so it can't be picked and packed by mistake while you're sorting out the refund. Approving one that covers part of it leaves the order open - five chairs less two is still an order for three - and takes the called-off units off the dispatch screen so they can't go out by mistake. That happens whether or not you refund on the spot, which is the point: on a shop that settles by hand, "approved on Monday, paid on Friday" must not mean all five turn up on Tuesday.
If the refund itself fails - a card processor having a bad minute - you're told plainly, the request still counts as approved, and you can retry the refund from the order page where the refund tools already live.
The refund sends back what the customer paid for those items: VAT included on a shop that adds it at the till, less their share of any discount. When the whole order is cancelled before anything has been sent, the delivery charge goes back too, as UK cancellation rules expect; otherwise it stays, and you can refund it from the order if it should go. The box is only ticked to start with when money was actually taken.
A whole-order cancellation can't be approved once part of it has gone. If some of the order was sent while the request was waiting, approving it is refused with a note to decline it, refund what hasn't gone and arrange a return for what has. A cancellation that names particular items only ever refunds units still on the shelf.
Dispatch knows about waiting requests. While a customer's cancellation or return is still waiting for your decision, Dispatch items says so, line by line, so a chair somebody has asked to call off isn't packed while the request sits in the queue. It's a warning rather than a lock: an ask isn't an approval.
Customers get an email when their request arrives, and another when you've decided. You get one too, at whichever address takes your new-order alerts. Damage has its own set rather than borrowing the return wording, so softening a decline doesn't accidentally reword an apology. All eight are editable like every other email the site sends, in Settings → Email → Templates.
Telling somebody you'll put it right is the easy half. The part itself - picked off a shelf, put in a box, handed to a courier - used to be written down nowhere at all, and the customer had no more idea where it was than you did.
Send a replacement sits on the order screen, and on any damage report in the queue. You say what's going in the box, how many, and which line of the original order it's for. That last one matters, because a replacement is almost never the thing that was bought: nobody sends a second chair, they send the gas lift out of it.
It goes out as an order of its own, numbered off the one it's putting right - order DW000182 gets DW000182-R1, then -R2 if a second one is needed. You dispatch it exactly as you'd dispatch anything else, and everything that follows a parcel follows this one too: courier, tracking number, the scans, where the van is, the signature on delivery. The customer watches it on the same page they watched the original, rather than copying a tracking number into a courier's website and hoping.
It's free unless you put a price on it. Leave the price box alone and the customer is charged nothing, which is the ordinary case; type a figure in and it's an ordinary sale of a spare part, out of warranty or otherwise. Either way it never inflates your order count - a warranty part is not another sale - while a part you did charge for counts as the money it is.
Both orders point at each other. The original carries a green note at the top listing what's been sent and how far along it is, each one a link. Its item lines say it too, so the chair itself reads 1 × Gas lift sent as DW000182-R1. The replacement says what it's putting right, and links back. So does the customer's order list, so a £0 order in their history reads as Replacement for DW000182 rather than as a puzzle - and so does your own orders list, where it carries a Replacement tag. Your orders export gains two columns for the same reason, right beside the order number.
Customers who never made an account are not asked to prove themselves twice: having shown they know the delivery postcode of the original, they can open its replacements straight from the link. It's the same address, so it's the same proof. And the number works in the tracking box the way they'd actually type it - DW000182-R1, 182-R1, 182r1 all land on it.
They're told three times: when you raise it, so they're not left guessing for a fortnight while a part comes in from a supplier; when it leaves you; and when it arrives. All three have their own wording rather than borrowing the order emails - "thanks for your order, total £0.00" reads as a second mistake on top of the first - and all three are editable in Settings → Email → Templates, with matching text messages for customers who take those.
Linking back to the original order. Every one of these messages names the original order number, and can carry a link straight to its page as well: {{parentOrderUrl}}, wrapped in {{#if hasParentOrderUrl}} ... {{/if}} like any other optional line. It is worth having, because on a replacement {{orderUrl}} points at the replacement's own page - one line and a parcel - while the invoice, the delivery address and the photographs they sent you are all on the original. The four replacement emails carry the line already; the text messages are offered the same wording but left without it, since a second link is most of a text message. An email you have already rewritten keeps your own wording, so add the tag from the chip list above the editor when you want it.
Tracking that turns up late. Plenty of couriers collect in the morning and issue the number that afternoon, by which time the dispatch email has already gone saying the goods have left and giving no way of following them. Dispatch it anyway - the email goes out either way, and simply has no tracking line in it. When the number arrives, press Details on the parcel, type it in, and tick Let the customer know the tracking: they get a follow-up naming the courier and the number, with a link to follow it. Once each, on a parcel that went out with nothing - correcting a typo afterwards does not send it again, and a parcel that already carried its number in the dispatch note says nothing twice.
It closes itself. The same hourly check that follows your ordinary parcels follows this one: when the courier says the part was delivered, the replacement is marked complete on its own and the arrival message goes out, naming the day and whoever signed for it. That last one ends on "if anything is still not right, reply and we'll sort it out" rather than "thanks for shopping with us", which is the wrong note to finish a complaint on. You need press nothing.
One thing that does not happen: a free replacement never raises an invoice, even on a shop set to invoice everything on dispatch. A £0 bill for a part you sent to put your own mistake right reads as a demand for money. One you charged for is an ordinary sale of a spare, and is invoiced like one.
Keeping a list of parts. Tick This is a spare part on any product and it drops out of the shop entirely - no grids, no search, no product page, no checkout, nothing for Google to find - while keeping its stock figure, its cost price and its supplier code. Staff can still open its page (with a note saying shoppers can't) and put it on an order entered by hand. You pick it by name when you send a replacement, the stock comes off when you raise the replacement, and what your warranty actually costs you is a figure rather than a feeling. You don't have to: the box also takes anything you type, which is the right answer for a fixings pack you'll never send again.
The look of every kind of shop page can be customised in Appearance → Layouts, under the Shop tab - the same drag-and-drop editor used for your header and footer. There are nine sub-tabs: seven for the whole-page types - Shop Home, Category, Collection, Product, Checkout, Confirmation and Cart - plus two for the pieces inside a page, Product Detail and Product Card (both covered below). Each comes with ready-made starter designs and Shop's own blocks (product grid, featured collection, promo banner, checkout steps, and more) alongside the usual layout and content blocks - pick one, tweak it as you like, and publish.
Shop Home, Product, Checkout, Confirmation and Cart always show one of these designs (a plain default is published from the moment Shop is switched on, so there's never a blank page). Category and Collection pages keep their current simple grid look until you publish a starter for them - nothing changes there until you actively pick one.
The Category tab has two blocks worth knowing about. Category Browser shows a category's sub-categories as cards - or, with its "Show as" setting flipped to Pills, as a compact row of wrapping link chips, which suits pages where the sub-categories are shortcuts above a product grid rather than the main event. On a phone that row stops wrapping and becomes a single strip you swipe sideways: four sub-category names used to stack into four full-width rows, which is a lot of signposting to scroll past before reaching anything you can actually buy. The row also fades out at whichever edge has more waiting past it, with a small arrow to tap for anyone who would rather not swipe - the same treatment the admin tabs get. If a category has a great many sub-categories, the Pills: show only this many setting caps the strip: put in 6 and the six busiest print, counted by how many products each one holds (including everything filed in their own sub-categories), with the rest tucked behind a 6 more button that opens them where they sit. Leave it at 0 and you get the lot, exactly as before. Nothing is actually removed from the page - every sub-category link is still there for search engines to follow, it's just folded up until a shopper asks. Drop it on the Category design and it works out which category it's on by itself, so one design serves the lot. (It's the same block you can put on Shop Home to show your top-level categories.) Category Description prints whatever you've written for the category - the designed version if you've built one, the plain paragraph if you haven't, and nothing at all if you've written neither, so a category you haven't got round to yet doesn't leave a hole. A plain written-up description now folds away behind a Read more that sits on the end of the short blurb under the heading, on every screen rather than only on a phone: the page reads heading, one opening line, the link on the end of it, then the products. Click it and the description opens where it always sat; click Show less and it tucks back. If you have turned the blurb off, or never wrote one, the link keeps its old place just below. Nobody has to scroll past a wall of prose to reach the stock, and search engines are handed the whole thing either way. A description you've designed in the builder is left exactly as you built it, on the grounds that hiding someone's careful layout behind a link is not our call to make - if a designed description needs to be shorter, the builder's own device settings will do it properly. There's a starter called Sub-categories First that puts the two in the sensible order: heading, sub-category cards, description, then the products.
Collection Browser does the same job for collections, and it is the one block you can also drop on an ordinary page rather than a shop one - which is how you get a single "all our collections" page. It lists every collection that has products in it, as cards or pills, with the number of products and a picture borrowed from the first item in each. Nothing to keep up to date: make a new collection, put something in it, and it appears. A collection with nothing in it is left off, so a half-built one never shows up as a promising tile leading to an empty page. The settings cover columns, the wording on the link, whether the description and the count are shown, and a cap if you only want the first few. If you have a companion add-on that keeps browsing pages of its own - the Filters add-on and its filter collections, for instance - the block grows an Include switch for it, so one page can list everything worth browsing by rather than making a shopper find two. The switch only appears when you actually have such an add-on installed.
Collection Description is the collection twin of Category Description: drop it on the Collection layout and it prints that collection's description wherever you put it - the designed version when there is one, the plain paragraphs when there isn't, and nothing at all on a collection you haven't written up yet.
Collection Links is the footer's one. Drop it on your footer design and it prints a short list of links to your collections - a different random handful on every page a visitor opens, so the footer never goes stale, no single collection hogs the spot, and every one of them gets its turn in front of shoppers and search engines alike, which is rather the point. You choose the heading, how many links to show, whether they stack like a footer column or run along one wrapping row, and both the wording and the destination of an optional link to the full collections page (leave the wording blank to drop it; the destination starts at /collections, so point it wherever your own index of collections lives). Colours can be left alone - it inherits the footer's own - or set per part, from the same swatches as every other block: your site's own palette from Appearance, a separate dark mode colour for each one, and a box for anything exotic. The text, the links, the colour links turn on hover and the little chevrons all take their own. Only collections with products in them are ever drawn, same rule as the Collection Browser, so a half-built one never gets a footer billing.
The product grid shows each item as a card with its photo, price and a short line of detail, and can flag an item with small badges - New, Low stock or a Trade price - worked out from the product's tags and its stock level. Give a product the new or trade tag to earn one of those two; the low-stock badge appears on its own once stock drops to your warning threshold. For badges in your own wording and colours, switch them on for tags under Shop → Catalogue → Tags instead - that's also where the automatic Sale badge comes from. A product wearing several says all of them, side by side in the corner of its photo. The card's own design - where the photo, name, price and badge sit - comes from the Product Card layout described below, and that one design is used everywhere a product card shows up: the catalogue grid, the "you might also like" row, a featured collection, or a single pinned product.
By default the Product page puts large photos on the left, with thumbnails to click through the rest of the gallery, and everything a shopper needs to buy on the right: the price, any saving against a higher "was" price, the stock status and the Add to basket button with a quantity picker. Below that sits a tabbed panel with the full description, a plain specification list, the dimensions and any download - all drawn straight from what you filled in on the product, so there's nothing extra to write. The related and "step up to" suggestions below use the same card design as the rest of the shop.
Product photos are square, everywhere they appear - the big one on the product page, and the little ones on cards throughout the shop. There's no shape to choose and nothing to keep in step: a photo that isn't square is trimmed to fit rather than squashed, so a catalogue built up over years still lines up. The exception is the Overlay card design, where the photo filling the whole card is rather the point.
The photo and its thumbnails are sized to fit the screen as one piece, with room left for your header if you've set it to stay put when the page scrolls. Nothing is left dangling below the fold, so a shopper can see every thumbnail without hunting for it. On a short screen the photo shrinks rather than losing its shape, and the left-hand side shrinks with it - so the price and the Add to basket button take the width the photo gave up, instead of the photo sitting marooned in the middle of a half-empty column. The taller the screen, the bigger the photo and the narrower the buy details; the shorter the screen, the more room the buy details get. Neither side is allowed to bully the other: the photo never takes more than about three-fifths of the width, however much room it thinks it deserves.
Thumbnails sit on a single line that scrolls sideways if there are more than fit. A product with a dozen photos gets one tidy strip rather than three rows of them quietly eating the space the photo was meant to have.
When there are more thumbnails than the line can show, the strip says so rather than leaving the shopper to guess: the last one fades out at the edge with a small arrow to walk the strip along, and once they've moved it, a matching arrow and fade appear at the start to go back. It works the same way as the tabs across the top of your admin pages, and it's the same strip a finger or a trackpad could always scroll - the arrows just mean nobody has to discover that for themselves. Thumbnails set to sit beside the photo rather than below it stack in a column and are left as they were.
If the buy details on the right run longer than the photo - a wordy description, a long list of options - the photo and thumbnails stay with the shopper as they scroll down, rather than sliding away and leaving them reading about a product they can no longer see. On a phone the page stacks and the photo scrolls along with everything else, which is rather the point of a small screen. Up to and including shop version 0.1.48, a product with enough photos to fill the thumbnail strip could be swiped sideways on a phone: the strip laid claim to the width of every thumbnail at once, and quietly dragged the whole page out with it. From 0.1.49 the strip keeps to the width it's given and scrolls inside it, so the page is only ever as wide as the phone.
That default is no longer fixed. The Product Detail sub-tab lets you design the product area itself from small pieces - the gallery, the badges, the title, the price, the Add to basket button, the reassurance lines, the tabs and so on - so you can drag them into whatever order and columns you like. It ships with three designs to start from: Default (the classic two-column look), Editorial (a big image up top with the details below) and Compact (a single narrow column for a quick, focused buy). Every piece now has its own small options. The gallery chooses where the thumbnails go; the badges piece lets you switch the New, Trade price and stock badges on or off individually; the title and the price each take a text size and the title an alignment; the SKU line lets you change (or remove) the word printed before the code and line it up left, centre or right; the price still decides whether to show the "was" figure, a "Save X%" flash and the RRP. The short description used to cap itself at a comfortable reading width whether you liked it or not, which left a stripe of empty space beside it in a wide column - it now fills its column by default, with a Text width option to bring the reading-width cap back and a text size of its own. The buy button has its quantity picker switch as before, plus a button label box if "Add to basket" isn't the wording you want (pre-order products keep saying Pre-order now regardless - that's a different promise). The old reassurance lines (a warranty promise, a returns note, that sort of thing) are one of those pieces too - drop it in and fill in the lines. The Add to basket piece can't be removed, so a product page always has a way to buy.
The buy row also copes better with a genuinely narrow column. When there isn't room to stand the quantity picker and the button side by side, the button drops onto its own line - and the quantity picker, rather than sitting stranded at its natural width with half the row empty beside it, now stretches to the full width with the count spread out in the middle. Bigger target, tidier row, and no setting to find: it happens on whatever width actually runs out of room, be that a phone or a narrow column you have designed yourself.
The product's description, specification and downloads now come as two pieces you place separately. The Sections piece holds the actual writing - the description, the spec table, the downloads - shown either stacked one under another with everything on show, or as an accordion where each heading opens and closes on a tap. It fills the width you give it, so there's no odd gap left down the right-hand side.
The Tabs piece is the row of buttons that steers it. Tapping one slides the shopper straight to that part of the Sections piece, and the button for whatever they're reading lights up on its own as they scroll past it. You can line the row up left, centre or right, make it stick to the top of the screen as the shopper scrolls so it's always to hand, set the padding above and below the row (it ships at 16px each way; anything from 0 to 64px goes), and there's a divider switch for the faint line and gap above it - handy to turn off when the row leads the page, where that gap would otherwise sit there looking like a mistake. The Tabs piece points at the Sections piece, so keep the two together: on its own it's a row of buttons with nowhere to go.
The row itself now sits inside a single rounded frame, like the segmented switches you'd find in a phone's settings, rather than each button carrying its own separate outline. Whichever part the shopper is reading is filled in with your site's main colour and the rest are plain text beside it, so the row reads as one control with a current position instead of a handful of buttons that happen to be next to each other. Nothing to set: it's simply how the row looks now, and everything below - the alignment, the sticky switch, the padding, the colours - still does exactly what it did.
The row can also carry a background colour of its own, picked from your site's palette (or any colour you like) rather than sitting on the page background. Set a separate dark mode colour underneath it if the light one doesn't suit after dark, and slide the background opacity down if you'd rather the page showed through a little - handy when the row is stuck to the top of the screen and you want a hint of what's passing behind it. Leave the colour blank and nothing changes: the row stays as it always was.
On a phone the row of buttons scrolls sideways when there are more tabs than fit, and the one for whatever the shopper is reading now slides itself into view as they scroll down the page. Before, the Downloads button could quietly light up somewhere off the right-hand edge, where only a shopper who thought to drag the row across would ever see it.
The row also ends with a filled button of its own, so the shopper never has to hunt for the buy button after tapping their way down the page. On a straightforward product it says Add to basket and pops the item straight in the basket from wherever they're reading. On a product sold in different versions - a colour, a size, that sort of thing - it says Configure and jumps them straight to the option pickers themselves, since there's nothing to add until they've chosen. And on a phone, where the product photo or 3D view pins itself to the top of the screen while the shopper picks their options, the media strip takes the top spot over the tab row so the thing being configured stays visible.
The Dimensions section is the one part you can now show the door. Some products carry a full set of measurements worth spelling out; others have a stray height and nothing else, or repeat what the specification table already says, and the section earns its place on neither. Each of the three pieces carries the same switch - Show Dimensions tab on the Tabs piece, Show Dimensions section on the Sections piece, Show Dimensions link on the Section links piece - so set them all to No to take it off the page entirely. Set only the Tabs one and the measurements stay on the page with nothing pointing at them, which is rarely what anyone wants. Everything ships switched on, so nothing changes until you say so, and a product with no measurements recorded never showed the section in the first place.
A FAQs section joins the run whenever the product has questions to answer - its own, its category's, or the shop's - sitting after the measurements and before any downloads, with a link of its own in the row. There's nothing to switch on here: a product with no questions gets no section and no link, and one with questions gets both. See Frequently asked questions for where the answers are written.
If you'd rather a plainer set of jump-links - the same idea with none of the tab-style buttons or the lit-up highlight - drop in the separate Section links piece instead and put it wherever you like, above the photo or across the top of the page. Either way, pair your links with a Sections piece set to stacked or accordion so there's always a section for each one to land on.
The Product Card sub-tab does the same for the little product cards, with Standard (photo on top), Overlay (the name and price floating over the photo) and Horizontal (photo on the left, details on the right) to choose from. Design it once and it applies to every card across the shop.
If you have the Variations module, the Product Card sub-tab also offers a Card: Variation options piece. Drag it onto the card and every product that has options set to show there summarises them: a row of colour or fabric swatches, or a plain comma-separated list of sizes, each behind whatever heading you chose. Which options appear, what they are called and how many are shown before a "+4" is decided per product on its Variations tab. See Shop variations for that half.
If you have the Advanced Shipping module, the same sub-tab offers a Card: Delivery piece: a line under the price reading "Delivery in as little as 4 days.", with "Installation available." after it where installation is one of the services that product is offered. The figure is worked out from that product's own delivery services, so a shopper can compare how quickly two things could arrive without opening either. Size, colour (with its own dark-mode colour), alignment, the space above and below, and an option to shrink the wording onto one line are all set on the piece. See Advanced Shipping for the rest.
The Card: Short description piece has a fourth setting alongside its 1, 2 and 3 line caps: Fill the spare space. Cards in a row are all drawn to the height of the tallest one, so a product with fewer options than its neighbours used to sit above a band of empty card. Set to fill, the short description pours into exactly that band - as many whole lines as fit, ending with an ellipsis where the writing runs on - and never a line more, so it cannot stretch the card or the row. The tallest card in a row shows no description at all (it has no spare space to fill), a card with a little shows a little, and the same card may show four lines on a desktop and one on a phone, because the space itself changes with the screen. Products with no short description are unaffected either way.
On a phone, product grids now show two products across rather than one. A single card per row turned a category into a very long scroll indeed, with most of the shop hiding below the fold. Because each card is half the width it was, the wording on it - the name, the price, the option swatches, the link - steps down a little to match, and over-photo badges do the same, so the card still sits neatly instead of turning into a label collection with a product somewhere underneath. The photos keep their shape and take the room the words gave up. Nothing changes on a tablet or a desktop.
Both come with a sensible design switched on from the moment Shop starts, so nothing looks broken before you touch them. If you want a particular grid or the product page to use a different design from the shop-wide one, open that block's settings and pick a Layout there; leave it on "Use shop default" to follow whatever you've published.
You can also drop a whole Category layout onto any other page - your homepage, for instance - using the Embed Layout block, then pick the category and the number of products to show. See Managing pages for how that block works.
From shop 0.1.198 the blocks that used to take life as they found it carry settings of their own. Every one of them starts set to exactly what the block did before, so nothing on a published page changes until you open a block and change something.
- The product grid can order its shelf: newest first (as always), New tag first, then newest (everything carrying the
newtag at the front, each group still ordered by when it was added - the usual answer for a "Just in" row), best sellers first, price in either direction, or by name. It can carry a heading and a smaller line beside it, and you can reword the message shown when a shelf turns out to be empty. - A featured collection can take a heading of its own instead of the collection's name, the same ordering choices as the grid, and a View all link through to the full collection page for shoppers who want more than the sample.
- The category browser's cards can drop their little descriptions where you'd rather have a tighter grid of pictures and names.
- The category header's small line above the name - it said The range for a long while - is yours to reword or remove, and the breadcrumb trail and the description each have an on/off switch. The collection header gets the same two switches. (That little line now starts empty on a newly added header, so a category page opens with its own name unless you give it something else to say. Headers already on your pages keep whatever they are set to.)
- The promo banner chooses which side its picture sits and how big it is, a filled or outline button, centred text if the mood takes you, and a line of small print under the button for the terms nobody reads but everybody needs.
- Every checkout step heading is editable - Contact details, Delivery address, Delivery method, Payment method, Order review - along with the order summary's heading and its Edit basket link, the wording on the Place order button (the total stays on it no matter what you call it), and the reassurance line beneath it - which is now blank to begin with. It used to ship with a padlock and a sentence about card details being encrypted, which was neither here nor there on a checkout taking a bank transfer, and read as filler on the ones where it was true. Write your own line there if you want one, or leave it empty and the space closes up.
- The back-in-stock form's invitation line, the hint inside the email box, the button and the thank-you message are all yours to reword.
- On the product card, the name and the short description can each be capped at one, two or three lines, so one long-winded product can't make its card twice the height of its neighbours; anything longer trims off with an ellipsis. The badge piece can switch each kind of badge - New, stock, trade - on or off individually, for shops that find "Low stock" a bit much on a browsing page.
- The related products strip can lie down as a sideways-scrolling carousel instead of a grid, and the you might also like strip takes a cap on how many suggestions it offers.
- The product grid can carry a View all link on the far end of its heading, for a shelf that is a sample of something bigger - a "Best sellers" row of four on the home page, say. Switch it on, reword it if you like, and leave the address blank: the block works out where it goes from whatever the grid is already showing, so a grid cut to a tag, category, collection or supplier links through to that page on its own. A grid showing a slice of the whole shop has no such page until you build one, so type the address in yourself - a filter page (see the Filters add-on) is the usual answer, since it gives shoppers the whole list with the filter panel beside it. The link lives in the heading strip, so a grid with no heading shows none.
- Both the product grid and the featured collection carry a Products kept off the featured shelves setting, set to leave them out. Flip it to Show them here anyway where you are using the block as a plain catalogue listing rather than a showcase row. See Keeping a product off the featured shelves below.
Some products earn their place in the catalogue without deserving the front page. A clearance line you would rather not lead with, a bulky thing you only sell to trade, an oddity that keeps winning "best seller" on the strength of one enormous order. Organisation → Keep this product off the featured shelves takes it out of the showcase rows without taking it out of the shop.
Tick it and the product stops appearing on the shelves you have dropped onto your pages: Best sellers, Just in, Staff picks, On offer, whatever you have called them. Everything else carries on exactly as it was. It still sits in its categories and collections, still carries its tags, still turns up in search and in your sitemap, still has its own page and can still be bought. It is a decision about the shop window, not about the stockroom.
The shelves it applies to are the product grid and the featured collection blocks, each of which starts out leaving flagged products out. Where you have used one of those blocks as an ordinary listing rather than a showcase - a "everything in stock" page built out of a product grid, say - open the block and set Products kept off the featured shelves to Show them here anyway, and that one block goes back to showing the lot.
Nothing changes until you tick something: on the day this arrives no product is flagged, so every shelf shows exactly what it showed yesterday.
The tick also travels on the products spreadsheet, as a featured_hidden column reading true or false, so a shopful of them can be set in one go rather than one product at a time. A spreadsheet from before the column existed is still a perfectly good spreadsheet: the column is simply left alone.
A grid pointed at a big category does not have to put the lot on one page. When there are more products than fit offers a Show more button, numbered pages, or load more as the shopper scrolls, with Products per page deciding how many are on screen at a time. Leave it off and the grid shows the number you set and stops, exactly as it always did.
However the next products turn up, the page stays where the shopper left it: they appear under the shopper's nose, rather than the browser politely scrolling on to keep the footer in view, which is what it used to do and nobody asked for.
Beneath that, Where the later pages come from decides how the extra products get to the shopper:
- Fetched as the shopper reaches them builds only the first page in and asks the shop for the rest as they are needed. On a big shelf this is the difference between a page that loads and one that does not - a live page was sending 14.6 MB before it drew a single word. A grid you add from now on starts here.
- Sent with the page builds every product into the page when it loads, so paging through them is instant. Worth having on a short list; punishing on a long one.
A grid you have already built keeps whatever it is set to - these are starting points for a new one, not a change that sweeps through your pages. Same goes for Products per page, which now starts at twelve on a new grid rather than twenty-four.
Search engines still see every product. Fetching as needed used to cost you internal links, because a search engine reads a page exactly as a shopper does the moment it arrives. So Show more is now a real link to the next page. Your shoppers never notice - their click is caught and the next products slide in where they always did - but a search engine simply follows it, and the one after that, until the shelf runs out. A Previous link appears past the first page, a shared link to page three lands on page three, and each page carries its own name rather than being another copy of page one. Nothing to switch on.
And if a page fails to arrive, the grid says so and offers a Try again rather than quietly stopping.
The same pair of settings appear on the Filters & Product Grid block, where filtering and sorting carry on working instantly either way - see Shop filters.
The Product Grid block can now wear a row of category buttons ("All", "Desks", "Chairs" and so on) above the products. It follows the shopper down the page while they browse the shelf and lets go when the shelf ends. Tapping a button swaps the shelf to that category and keeps its order, so a Best Sellers shelf stays best-sellers-first inside every category. Switch it on with Sticky category filter bar in the block's settings, which has the usual desktop, tablet and mobile toggles so you can show it on some screens and not others (tablet follows desktop, mobile follows tablet, until you say otherwise); leave Filter bar categories blank for every top-level category, or list slugs to pick and order them. If your site has a fixed header, use gap under a fixed site header so the bar stops beneath it rather than behind it. It is for shelves without paging, since the two would be fighting over which products are showing.
The basket page is now designable too, from its own Cart sub-tab - it no longer has to make do with one fixed look. Out of the box it shows a ready-made design built around a new Cart block: the full working cart - items, quantities, a remove button, a coupon box, the running total and the checkout button - with a suggestions row underneath. Two other starters come with it: a two-column layout with the items on the left and suggestions in a sidebar, and a card list that puts each item in its own tidy card.
The basket is quick about it, too. Once a shopper has visited their cart, coming back to it shows their items instantly from a copy kept in the browser for that visit, while the shop double-checks prices and stock in the background and corrects anything that changed - no more staring at grey placeholder boxes. The "you might also like" suggestions are fetched in one go for the whole basket and only refresh when the items themselves change, so fiddling with quantities or delivery choices no longer makes the whole strip reload.
The Cart block carries a generous drawer of settings to make it look like yours rather than ours. Choose whether the items sit as simple rows, tidy cards or a proper table; show or hide the product photos (and set their size), the per-item price, the stock warnings and the pre-order note; and pick how shoppers change the amount - the rounded minus/plus stepper it now uses out of the box, a plain number box, or read-only if you'd sooner they adjusted it elsewhere. The remove control is a small red cross by default, though the old Remove wording is still there if you prefer words to symbols.
The totals at the foot of the basket now show their working. Instead of one Subtotal quietly swallowing everything, the shopper gets Subtotal, then a line for anything a module has priced into their items - with Advanced Shipping installed that is a Delivery line carrying whatever the chosen delivery and assembly services come to - then VAT, then the Total. The goods figure is genuinely the goods, so a £66 installation service no longer hides inside the price of a chair. If your prices already include VAT (the usual setup here), the VAT line is labelled "VAT (included)" and is not added on top again, because it is already in the figures above it - the Total is Subtotal plus Delivery, and the VAT line is there so the shopper can see how much of it is the taxman's. Switch the shop to VAT-exclusive pricing and the same line starts adding itself to the Total instead, with no setting to change. Set prices to show with tax included and the basket follows suit: the item prices are the ones the shopper saw on the shelf, and the VAT line goes back to reading "(included)" whichever way the prices are actually stored. Every label is yours to reword, and the sticky bar at the bottom of the window carries the Total rather than the subtotal, so the two never disagree. The Order review step at checkout now reads the same way - goods, then any delivery or service charge, then a discount if there is one, then postage where you charge it, then VAT, then the Total - so a shopper who compared the two would find them telling the same story. The figure charged is unchanged by any of this: the split is about explaining the money, not moving it.
Two more switches sit with the totals. Sticky checkout bar puts a slim bar along the bottom of the window - item count on the left, running total and a checkout button on the right - which slides up only once the real total has scrolled out of sight, so a long basket never leaves the checkout button stranded miles below. Other modules can add a line to it: with Advanced Shipping installed the left-hand side reads "3 items · Everything gets to you by Friday", the date being the last of the basket's own delivery dates, so the whole order's finish line follows the shopper down the page. Undo after removing an item catches the inevitable mis-click: remove a line and a small dark message appears at the bottom of the screen saying what went, with an Undo link that puts it back exactly as it was - same quantity, same options, same place in the list. It waits five seconds, fades away, and takes the offer with it. Both are on to begin with; turn either off in the block's settings if you'd rather not. You can reword and recolour the checkout button, the coupon box, the subtotal line and even the "your basket is empty" message, with every colour drawn from your own palette so it stays on-brand without any faff.
The coupon box keeps itself to itself these days. Rather than sitting there open, asking every shopper for a code most of them do not have, it waits behind a small Add coupon code link and only unfolds when somebody says they have one. And if your shop has no code anyone could actually use right now - none made yet, or every one of them expired, switched off or fully used up - the link does not appear at all. Make a code and it comes back on its own, no republishing required. The link's wording is yours to change, in the block's settings alongside the placeholder and the Apply button. The same block can be dropped onto any other page too, should you want a cart somewhere unusual. Prefer the old plain basket? Just leave the Cart tab unpublished and it carries on exactly as before.
Two more blocks let you break the basket in half: Cart items and Cart totals. Between them they do precisely what the single Cart block does - the same settings, the same look - only in two pieces, so anything you want to say between the shopping and the paying can go where it belongs. A delivery arrivals summary, a note about lead times, a reassuring word about returns: drop it between the two rather than parking it above the basket or stranding it under the checkout button. The items half carries the lines, the remove buttons and the undo message; the totals half carries the coupon box, the item count, the totals and the checkout button. An empty basket says so once, in the items half, and the totals half has the good sense to say nothing at all. Your existing basket page is untouched until you choose to swap the one block for the pair.
The checkout used to keep the shopper's actual order rather quiet: a totals table at the bottom and not a word about what was being bought. It now opens with Your order - every item with its photo, its quantity, its price and, crucially, its own choices spelled out underneath. Any whole-basket promise ("Everything gets to you by Fri 4 Sep") sits under the list, and an Edit basket link takes the shopper back to the cart if something needs changing - checkout itself stays a straight line to the finish.
Things that arrive together are listed together. With Advanced Shipping installed, the summary sorts itself into deliveries rather than a flat column of products each repeating its own date: one heading per arrival day, soonest at the top, with everything landing that day beneath it. Where a day's items are all on the same service the heading says the lot - "Flat-pack - by Tuesday 25th of August" - and the line-by-line repetition of that same sentence goes away, since it has already been said. Where one day brings a flat-packed desk and a built chair, the heading states the day and each product quietly names its own service underneath, because one heading cannot honestly speak for both. Anything with no delivery date to promise sits at the end of the list, unheaded. Nothing is grouped away from what it belongs with: an accessory bought with a desk stays under its desk wherever the desk lands.
That summary is its own block, Shop: Checkout - Order summary, and the ready-made checkout designs all include it: the single-column ones put it first, so the shopper starts by seeing what they're buying, and the two-column one puts the whole summary down the left with the checkout steps alongside on the right - and the summary can be set to stay put while the page scrolls, so the order never disappears off the top while someone types their address. A summary too long to fit on screen sorts itself out: it runs down the page at its full height, so ordinary scrolling shows every item in turn, and once its last line is in view it pins by its foot and keeps the end of the order - the bit nearest the Place order button - in sight while the fields are filled in. A summary short enough to fit simply pins near the top as it always did. Earlier versions tried something cleverer here, taking over the page's scrolling to feed the order past a pinned summary, and clever is exactly what it turned out to be: on the wrong day it froze the page mid-scroll, drew the checkout over the footer, and let the page scroll on past the footer into nothing. All of that machinery is gone. The Scroll a long order inside the block setting remains for the owner who would rather have a compact box: Always caps the list and scrolls it inside the block (put the mouse over it and scroll; leave the height empty and it takes as much of the window as it can under whatever sticky offset you set, or name a length if your own header maths says otherwise), while Automatic and Never both let the order run down the page and rely on the foot-pinning above. On a phone none of it applies - the page does the scrolling, as it should. On a phone the summary starts folded away behind a Show link (the item count and total stay visible), because the fields are what a phone-sized screen is really there for. And a basket whose items have since been removed from the shop now says so plainly, rather than presenting a heading over thin air. The checkout page itself now gives a published design proper room to spread out, rather than squeezing everything into one narrow middle column. An existing published checkout design won't change by itself - open Appearance → Layouts → Shop → Checkout and drop the block in wherever suits, or pick a fresh starter.
The delivery address can look itself up, too. With the Address Lookup module installed (and a key entered for whichever service you have chosen, Ideal Postcodes or Google), the shopper types the first line of their address into the ordinary Address line 1 field, picks the right one from the suggestions underneath, and the rest of the address fills itself in. Without the module - or if the lookup service is having a bad day - the fields simply behave as they always have.
When another module works something out about the order as a whole - Advanced Shipping's "Everything gets to you by Friday 4th", say - the shop prints it verbatim. It never writes the sentence itself. What it does decide now is how that sentence looks, and it decides it separately on each of the two places it appears: the cart page and the checkout order summary. (The slide-out basket used to be a third. It no longer prints the note at all - see The slide-out basket.)
Each of those is a block, and each block carries the same set of Basket note settings:
- Style - four choices. Plain line is the modest one-liner it has always been. Coloured box puts it in a filled panel with corners you choose. Image and speech bubble pairs a picture of your choosing with the note coming out of its mouth, tail and all. Hidden takes it off that screen entirely.
- Background, text and border colours, each a swatch from your own palette with its own dark-mode row underneath, so you set light and dark in one go and there is no second set of settings to keep in step.
- Corner radius and text size.
- For the speech bubble: the picture itself (chosen from your media library), how wide it should be, whether it sits left or right of the bubble, and how big the point is.
- Tick in front and bold text for the plain line.
The box and the bubble both fill the whole width of whatever column they are in, which on a desktop checkout is a good deal more room than the old grey line was using. They shrink to suit: in a narrow column the type and the picture come down a size, and in a very narrow one the two stack, the bubble taking the top with its point swung down at the picture below. Nothing is left running off the side of a phone.
Set it twice, differently, and nothing objects - a cheerful mascot at checkout, nothing at all on the cart page. The checkout summary starts out looking exactly as it always has; the cart page starts out with the note in the sticky bar only, as before, so switching it on there is something you choose rather than something that happens to you.
An empty basket now gets an honest answer, too. Arrive at checkout with nothing in the basket - a bookmarked link, a back button, an order already placed in another tab - and the page no longer presents a full set of contact, delivery and payment forms for an order that doesn't exist. The order summary says the basket is empty and offers the way back to the shop, and the rest of the checkout politely stays out of it.
The forms have come along too. Every field has a proper visible label (not grey text that vanishes the moment you start typing), the browser's own saved details fill things in with a tap, and mistakes are pointed out politely next to the field the moment you leave it - "Enter your postcode", not a vague red sulk at the top. The email field says why it's wanted (that's where the confirmation goes), and the phone number explains itself: it's only used about that delivery. The phone box sits on the delivery step, directly under the first and last name and above the business name, rather than up with the contact details - the number wanted is whoever's at that door, which isn't always the person paying, and it's kept against that address afterwards for the same reason. Contact details are now just the email address and the full name, and for a signed-in customer that name arrives already filled in from their account. The phone box says Phone (optional) unless you've ticked Require a phone number at checkout under Settings → Shop → Checkout, in which case it drops the "(optional)", asks for a number before the order can be placed, and says "Enter a phone number" if someone skips past it. With a number made compulsory, picking a saved address that hasn't got one brings the delivery form back out so there's somewhere to put one, instead of hiding the only box that could answer for it. Up to and including shop version 0.1.177 that tickbox was pure decoration: it saved happily, and the checkout carried on calling the field optional and taking orders without a number, which is a poor show from a setting with the word "require" in its name. The address section is now honestly titled Delivery address, with Delivery method below it where you charge postage by zone.
The last step earns some trust as well. The place-order button now says exactly what's about to happen - Place order - £84.20 - so nobody clicks into the unknown, and a small padlock note by the card fields points out that card details go straight to the payment provider, encrypted, without ever touching your site. And if you've never published a checkout design at all, the page no longer shrugs and shows nothing: the full standard checkout appears on its own, exactly as the classic starter would lay it out.
Picking a payment method is now just that - picking one. The methods that finish somewhere else (PayPal, Instant Bank Pay) used to whisk the shopper off the moment they touched the radio button, before they'd so much as glanced at the total. Now nothing happens until Place order is pressed, and that button is the only thing that hands anyone over. Coming back afterwards without having paid starts the payment again properly rather than quietly waving the order through to the thank-you page, which is the sort of tidiness you only notice when it's missing. And paying that way now empties the basket on the way through, so nobody is thanked for an order they're apparently still carrying. The methods that finish on somebody else's site - Instant Bank Pay, Pay by bank (Atoa) and Card payment (Square) - go one better and no longer write the order down at all until the payment is committed, so a checkout abandoned on the bank's page leaves nothing in your orders list to puzzle over later.
A word of warning before the lights come on. A shopper browsing your site in dark mode and paying by a method that finishes elsewhere - Instant Bank Pay, Pay by bank (Atoa), Card payment (Square), PayPal - now gets a short notice before they are handed over: the payment provider draws its own site in its own colours, and almost none of them do dark, so an unwarned shopper gets a screenful of white at the exact moment they are being asked to approve money. The notice says where they are going, shows a bar draining away, and sends them on after five seconds whether or not they touch it - there is a Continue button for anyone who would rather not wait. Nobody on the light version of your site sees any of this, and nothing about the payment itself changes.
And the payment methods no longer insist on being last. A shopper who fancies choosing how they'll pay before they've finished typing their address can now do exactly that: the choice is remembered, a line underneath says what's still needed, and the card fields (or the bank details) appear on their own the moment the rest is done. What holds the order back instead is the Place order button, which stays greyed out until everything is genuinely finished and says, in one line above it, which bits are missing - a box further up, a payment method, a tickbox, or all three at once. Rather better than being told off for doing things in the wrong order by a page that put them in that order in the first place.
The total no longer hides until the form is finished. The Order review step used to replace its own figures with a list of boxes still to fill in, so a shopper who wanted to know what the thing actually came to had to type in their whole address to find out - which is precisely backwards, since the total is half of what they are deciding on. The figures are now there from the moment there is a basket: subtotal, any delivery or service charges, discount, VAT and the Total, updating as details go in. What's still outstanding has simply moved down to sit above the Place order button, where it belongs, each bit of it still a link that takes the shopper straight to the box in question - and the button stays greyed out until every one of them is done. Where the postcode or the delivery choice is still to come, a line under the figures says so, so nobody mistakes an early total for free delivery.
And whatever is holding the order up is now said once, in one red line, rather than twice. A list of unfinished boxes in one place and a separate "choose a payment method" note in another left the shopper to work out that the two added up to the same refusal, so they are now a single sentence: "Complete your email and full name above, and then choose a payment method above to place your order." Every outstanding bit in it - each box, the payment method, the tickboxes - is a link that takes the shopper straight there, which on a long checkout saves a good deal of scrolling and squinting. The boxes are named exactly as the form above names them, your own wording included if you've renamed the organisation box. An address typed into the email box that isn't quite an address is asked to be corrected rather than filled in, with a note saying what looks wrong with it, since telling somebody to fill in a field they have very obviously filled in helps nobody. The line is red, and readable in both the light and the dark version of your site.
The thank-you page is straighter about what happens next, too. Pay by bank and the money is authorised on the spot but takes a few minutes to actually clear, which used to leave the page saying only that the order was "awaiting payment confirmation" - the same wording someone gets when they've been asked to go and make a bank transfer themselves, and quite the opposite meaning. It now says the payment has gone through and that clearing usually takes a few minutes, and then the page waits with them: it checks quietly in the background and announces the moment the payment clears, so nobody sits there jabbing refresh. It checks briskly for the first minute, eases off, and after five minutes stops and says so, since the confirmation email is coming either way. Wander off to another tab and it picks the thread back up when you return. If the payment doesn't clear, the page says so plainly, points out that nothing has been charged, and sends the shopper back to checkout with their basket still intact rather than thanking them for an order that never happened. Behind the scenes those failures now actually land: a bank payment that fell over after being authorised used to sit in your orders list looking like money still on its way, forever, and now shows as failed like it should.
The tick at the top of the thank-you page can be swapped for a picture of your own - a mascot, a logo, a dog in confetti, whatever says "well done" in your house style. Open the Confirmation layout under Appearance → Layouts, select the Shop: Order Confirmation block and pick a Celebration picture from the media library. Give it a short description for screen readers, and a width if 220 pixels is not to your taste.
By default it gets a holographic shimmer: a rainbow foil that slides across the picture and tilts it towards the viewer as they move their mouse around the page. On a phone it follows the phone itself as they tip it, and it rolls as they scroll, which works everywhere with no questions asked. iPhones will not share which way they are being held until somebody taps the page, so on an iPhone a tap on the picture asks, once, and nothing else ever pops a prompt at someone who has just paid. Turn Holographic shimmer to No for the plain picture. Anyone who has asked their device for reduced motion gets the foil standing still.
Pictures with a transparent background work best: the shimmer only covers what is actually drawn, so a cut-out shimmers and the page around it does not. The picture only appears when there is something to celebrate - a payment that failed keeps its warning sign, since a dog in confetti above "your payment didn't go through" would strike rather the wrong note. It will not show in the layout editor itself, which has no real order to confirm; place a test order to see it.
Sell to businesses and you'll want to know who you're selling to. Settings → Shop → Checkout → Organisation name adds a box for it, sitting directly under the customer's own name on the contact step.
It used to sit inside the delivery address, above the first line, and that was the wrong place for it. An organisation says who somebody is, not where a parcel goes - so it was being asked for again on every new address, and a customer with three offices ended up with three copies of the same company name. It's now asked once, kept on their account, and filled in for them next time. Anyone who does want the company printed on the delivery label puts it in the first line of the address, which is where a courier reads it anyway.
There is a second, separate box on the delivery step: Organisation name (optional), sitting above address line 1. It starts out as whatever was given at the contact step, and the customer can change it or clear it without the contact-step answer budging. That matters for the odd order where the buyer is one company and the parcel goes to another (a practice ordering for a branch, say). It is never required, an order goes through happily without it, and it is not kept on saved addresses since it describes this delivery rather than the door. Where the order is drop-shipped, the purchase order's delivery address leads with it when it has been filled in and leaves it out entirely when it hasn't.
Two switches go with it. One makes the box compulsory, so an order can't be placed without one. The other lets you call it whatever your customers call themselves - Company name, Practice name, School, Department - and the wording follows through to the message they see if they leave it blank. Left off, nothing changes and nobody sees an extra box.
The organisation shows up on the order in the admin, in the customer's details, and it's what the orders list leads with so a trade order reads as "Acme Ltd" rather than as whoever in the office typed the card number. Search finds it too. Orders placed before this moved keep what they were given - nothing was lost in the shuffle, it simply moved column.
Signed-in customers can change it themselves on their account page, beside their name.
Sell to businesses and sooner or later somebody's accounts department will ask you to put their purchase order number on the invoice. Leave it off and the invoice tends to sit in a tray rather than get paid, which is a slow and thoroughly avoidable way to be out of pocket.
Settings → Shop → Checkout → Their own order reference adds a box for it, directly under the organisation on the contact step. Same two switches as the organisation above: one makes it compulsory, the other lets you call it what your customers call it - Purchase order number, Job reference, Cost centre, whatever it is on your trade. Left off, nobody sees an extra box.
There's a third switch: let customers add it later, from their own order page. Plenty of business buyers haven't got the number on the day - they order on the Tuesday and their finance team raises the purchase order the following week - and without this they have to ring you to get it on their paperwork. Switched on, a signed-in customer opening their order sees the number (or "Not given") with an Add it button beside it, and whatever they type goes on their invoice. Switched off, they can still see the number they gave at checkout; they just can't move it.
The company and the invoice address can be handed back to them in the same way - see Letting the customer put their own invoice details right under Invoices, which is a slightly bigger question because an invoice that has already gone out cannot simply be rewritten.
Once it's on, that number follows the order about:
- It's on the order in the admin, and you can add or change it there - which matters, because it usually turns up the morning after the order does, when somebody rings with the number their finance team has finally raised.
- The customer can add it themselves afterwards, where you've switched that on, from their own order page.
- It's on their order list and their receipt, so a business buyer can find last month's order by their number rather than by yours.
- Search finds it. Type their number into the orders search and you get their order, which saves explaining that you file things under a different number to they do.
- It prints on the invoice and the proforma, on the row under the order number. Nothing to set up: the document blocks already carry it, and you can rename or hide that row on your invoice layout like any other.
- It's on the order emails - the confirmation, the how-to-pay one, and your own new-order alerts - so everyone has it in writing.
- It's a column in the orders CSV export.
One thing worth knowing: an invoice you've already issued keeps the reference it was issued with. Change it on the order afterwards and the invoice doesn't quietly rewrite itself, because a document already sitting in somebody's filing is a record rather than a view. If a number went out wrong, that's a credit note and a fresh invoice, same as anything else on an invoice.
An invoice that went out with the box empty is the exception, and the useful one: there's nothing there to contradict, so a number added later prints on it the next time it's opened or downloaded. That's the whole point of letting customers add their own - the invoice they were sent before their purchase order existed comes back with the purchase order number on it. Same for a credit note. And it's why a customer can't change a number that's already on an issued invoice: they're told it's gone out with that number on it and asked to get in touch, which is a conversation rather than a text box.
A gate code. The side entrance, because the front one has a step. The neighbour at number 14 who takes everything in. The lift that has been out since March and the three floors of stairs behind it. None of that fits in an address, and a driver who does not know it either rings you or takes the pallet away again.
Settings → Shop → Delivery instructions puts a box on the delivery step for it. It arrives switched off, because a shop whose goods go through a letterbox has no use for it and an empty box is one more thing between a shopper and the button. Switch it on and you can rename it - Access notes, Anything the driver should know, whatever your customers will recognise - and write your own line of guidance underneath it. Nobody is made to fill it in: most orders go to an ordinary front door and have nothing to say.
What they write is theirs. It is kept with that order and nothing else, and it is deliberately not filed with the address, because an instruction is about this delivery rather than about the door. Somebody who is waiting in on Tuesday is not still waiting in next month, and a saved address that quietly carried "leave it with Sandra" into every future order would be wrong far more often than it was right.
It shows on the order in your admin, under the delivery address, in a box of its own so it is not read as part of the address by whoever is printing the label. It travels, too: where you have Purchase Orders and the goods are going out from your supplier rather than your own shelf, the instruction goes onto the purchase order's delivery details, which is the paperwork the supplier's driver actually reads. That is rather the point of collecting it. You can still type into that box on the purchase order yourself, and what you type wins from then on - the instruction is only ever filled in as the order is drafted, not written over afterwards.
Switch it off and the box goes. Orders already placed keep what they were told, which is the only sensible thing to do with somebody's front door.
Most people want the parcel and the invoice to go to the same place. Some don't: the buyer at a head office, the tenant whose landlord pays, the practice manager whose accounts department sits two towns away. Settings → Shop → Checkout → Billing address lets them say so.
Switched on, the delivery step grows one tickbox at the bottom - my billing address is different to the delivery address - and nothing else until somebody ticks it. Tick it and a second address form unfolds underneath, asking for the address and the postcode and nothing else - no name, because the invoice goes to whoever placed the order and their name is already on it, and no phone number, because the number on an order belongs to whoever is standing at the door. Where you've got the address lookup add-on installed, it works in the billing form too, so it's still a postcode and a pick from a list rather than five boxes to type.
A signed-in customer with addresses saved to their account gets to pick from them here, under Bill to, the same way they pick where the parcel goes - the accounts department is usually somewhere they've had something delivered before, and typing it out a second time on the same page is the sort of thing that loses an order. Picking one takes the address only: the name and the phone number stay behind, because this form has no boxes for them. Use a different address brings the empty form back. A saved address that turns out to be short of a town or a postcode brings the form back out ready-filled, rather than going onto the invoice half written.
A billing address they typed rather than picked joins their address book once the order is placed, exactly as the delivery address does, filed under Billing address so it's tellable apart in a list of doors. It never becomes their default, since the default is what the next checkout offers to deliver to. Bill to the same place the parcel goes and nothing new is filed - it's the same address, and one entry is quite enough.
The billing address rides along with the order and prints where you'd expect it: on the invoice and the proforma, on the customer's own receipt, and on the order in your admin beside the delivery address. An order without one bills to the delivery address exactly as it always has, so switching this on changes nothing whatsoever for the customers who don't need it - which will be most of them.
Change your mind and switch it off and the tickbox goes; orders already placed keep the billing address they were given, since a document that's already been sent isn't something to quietly rewrite.
Under Settings → Shop → Checkout → Tickboxes at checkout you can put tickboxes just above the Place order button.
The first one is ready-made: agree to your terms and conditions. Switch it on and it appears; mark it required and no order goes through until it's ticked. Leave the link box empty and it points at whichever page you've set as your terms page, so moving that page around never leaves a dead link behind at the one moment it matters. Want your own wording? Put square brackets round the words that should be the link - I have read and agree to the [terms and conditions] - and those words become it.
Below that you can add as many of your own as you like: age confirmations, a note about bespoke items being non-returnable, permission to be contacted about the order. Each one has its own wording, its own optional link, and its own required-or-not switch. A tickbox you've written nothing beside is quietly left out rather than presented as an unanswerable question.
What matters most is what happens afterwards. Every tickbox the shopper was shown is recorded on the order in the wording they saw on the day, along with whether they ticked it and when. Rewrite your terms next month and past orders still show what was actually agreed to - which is rather the point of asking. It's all on the order in the admin, under Agreed at checkout.
A required box that hasn't been ticked simply leaves the Place order button greyed out, and the line above it adds "tick the boxes marked *" to whatever else is outstanding, as a link that goes to the first of them - no clicking a button to find out it wasn't going to work. And because a tickbox in a browser is only ever a suggestion, the order won't be created without the required ones ticked even if someone tries to go round the form.
The thank-you page used to be a heading, a bare list of items and a couple of grey paragraphs. It's the last page of the whole shop, the one people screenshot, forward to whoever does the accounts and come back to a week later wondering where their parcel is - so it now behaves like a receipt.
It opens with the answer: a tick and a thank you by name, and one line saying where the confirmation email is going - which is the last moment anyone can spot a typo in their own email address. Then the order itself: every item with its picture, quantity, unit price and any choices made at the time, followed by a proper totals block that shows the discount and the coupon that earned it, the delivery charge and which service it was (free delivery says so out loud, rather than leaving a row missing), and the VAT. Underneath sit the delivery address, the delivery method and how it was paid - side by side on a computer, stacked on a phone. It prints sensibly too, since a receipt is one of the few web pages people genuinely do print.
The page still says the right thing for every ending: paid, still clearing at the bank, waiting on a bank transfer you've asked them to make, or a payment that fell over. And it still waits with the shopper while a bank payment clears, announcing the moment it does.
It also, quietly, reports the sale. Nothing in the shop knows or cares who is listening - if you have installed something that measures your site, such as Google Tag, it hears the order number, the total, the tax, the delivery, the coupon and every line, and does whatever it does with them. If you have not, nothing happens at all. An order is reported when it is paid, or when it has been placed on a bank transfer or cash and is waiting for the money; a payment still going through, or one that failed, is not reported. It is reported exactly once, however many times that page is refreshed or revisited.
The Cart Summary widget - the little trolley you drop into your header - has always been a link to the basket page. It can now be a door instead. In its settings, When clicked offers two choices: Go to the cart page, which is what it has always done, or Slide out a basket summary, which keeps the shopper exactly where they are and slides the basket in over the page.
It also opens itself. Add something to the basket from anywhere on the site and the panel slides in of its own accord, so nobody has to go hunting in the header to check that the thing they clicked actually went in. It comes in from whichever side you've set, at a proper unhurried slide rather than simply materialising.
Whatever was just added sits at the very top of the basket, on the panel and on the cart page alike - including something already in there that the shopper has added more of, which moves up to join it. A long basket no longer means scrolling to the bottom to see what you just did.
What slides in is the real basket, not a teaser. Every item with its photo, its chosen options, the minus/plus stepper and a Remove link, and - if you run Advanced Shipping - the same delivery service picker each item has on the cart page, so a shopper can move something to a faster service without ever leaving the product they were reading. A panel is a narrow thing, so it arranges those pieces to suit itself: the price, the amount and the Remove link stack in one tidy column down the right, all the same width, and the delivery service sits across the full width underneath the photo and the name where its wording has room to breathe. The cart page itself is unchanged. Underneath the items: the subtotal and the VAT side by side on one line, the total beneath them, a Checkout button and a View full basket button for anyone who wants the roomier page.
It gives the room to the basket. A panel on a phone is not a tall thing, and it used to spend a good share of itself on everything but the items. The heading bar is now barely taller than its close button. The subtotal includes the delivery the shopper picked - which is already printed on the item it belongs to - so there is no separate delivery line to repeat it. And the whole-basket sentences - the delivery module's "Everything gets to you by Wednesday" and the order-size deduction's "Add £252 more from…" - stay on the cart page and at checkout, where there is room for them, rather than squeezing the basket off the top of the panel.
The chat bubble steps aside. With the Live Chat block on your site, its floating bubble used to sit squarely over the View full basket button whenever the panel was open. It now disappears while the basket is out, and the chat is offered inside the panel instead: a full-width button, in the bubble's own colours and wording, under View full basket. Pressing it closes the basket and opens the chat. Shut the basket and the bubble comes back. Remove something by mistake and the usual Undo message appears, exactly as it does on the cart page.
One place the trolley now keeps quiet: the basket page. The whole basket is already on the screen there, so a second one in the header was never earning its keep. It reappears everywhere else, checkout included.
It behaves itself, too. The panel closes on the Esc key, on a click of the dimmed page behind it, or on the cross in its corner, and the page underneath stops scrolling while it's open so a shopper can't lose their place. Keyboard users are put inside the panel when it opens and back on the trolley when it shuts.
The wording and the look are yours: the heading, the subtotal label, both button labels, the "your basket is empty" message and the keep-shopping link are all editable, and you can set how wide the panel is, how round the buttons are, and whether it comes in from the right or the left. Product photos and the delivery picker can each be switched off if you'd rather keep it lean. Leave View full basket blank and that button simply isn't there.
Up from the bottom, full width. Slide-out: opens from has a third choice - Bottom (full width) - and it is the one to pick for phones. The panel comes up from the bottom edge across the whole width of the screen, with rounded top corners, rather than squeezing the basket into a narrow column down one side. Everything inside it is unchanged: the same lines, the same delivery pickers, the same buttons. The width setting is simply ignored, there being nothing to be narrower than. This is also what the basket cell in a Mobile Bar opens.
The two buttons now dress themselves separately. Checkout and View full basket each get a background colour, a border colour and a text colour, plus a second set of all three for when the mouse is over them, and every one of those carries its own dark mode colour underneath. Every swatch row also tells you what it is for, which, we admit, it had been quietly failing to do. Leave a hover colour blank and that part simply doesn't change under the cursor. Leave the whole lot blank and the buttons look precisely as they always have.
The trolley itself has a Hover colour as well. Leave it blank and it warms to your site's main colour under the mouse, the same as the theme toggle, the Icon Link and the members sign-in button, so the whole row of header icons answers the cursor in one voice.
Leave the Text label blank and the trolley also gains a small "Basket" tooltip on hover, the same quiet label the other icon-only header buttons already show.
One honest caveat: the panel stays shut inside the layout editor. It covers the whole page it belongs to, and letting it do that over the design canvas would hide the very thing you were editing. Publish and try it on the real site.
Editing layouts is covered by the core Appearance → Layouts permission, same as your header and footer - not by any of the Shop permissions above. A role with shop.manage but not that permission can run every other part of the shop but won't see the Layouts screen.
Want size/colour choices, or let customers add engraving, a gift message or an uploaded file? Install the Shop Variations module. It adds size/colour variant matrices (each combination with its own price, stock, SKU and photo) and personalisation add-ons, right inside the product editor, with no changes to how your cart or checkout work.
Selling something a photograph struggles with - furniture, a lamp, anything with a back to it? Install the Product 3D views module. It puts a slowly turning 3D model in the product gallery alongside your photographs, which shoppers can click to turn, pan and zoom. Models can be attached to a product or to individual variations.
Want your customers saying why the thing was good, where the next shopper will read it? Install the Reviews module. It adds a Reviews tab to every product page, holds each new review until you have read it (unless you would rather it went straight up), badges the ones written by people who actually bought the thing, lets you reply underneath, and will email past customers to ask if you want it to.
Paste a product's address into WhatsApp, Facebook, LinkedIn or most anywhere else and the preview now arrives with the product's main photo on it, along with its name and short description - the same details search engines are shown. Nothing to switch on; every product page does it.
Better still, the link remembers what was chosen. On a product with options, the address bar quietly updates as the shopper picks - colour, width, whatever you offer - so the address they copy carries those choices with it. Whoever opens it lands on the page with the same options already selected, the price to match, and the preview picture showing the chosen combination's own photo rather than the general one. Ticked add-ons ride along in the link too, choices and quantities included. See Shop variations and Product Add-ons for the details.
Every product page carries a hidden description of itself, written for machines rather than people. It is what puts a price, a photograph and an "in stock" beside your product in a search result, and it is increasingly what an AI assistant reads before deciding whether to recommend you when somebody asks it where to buy an office chair. None of it is typed anywhere separately - it is assembled from what is already on the page.
What goes out:
- The name, the photographs, the short description and your own SKU.
- The price - the figure actually on screen, on the same side of VAT you print. A listing with options publishes the range instead: the cheapest, the dearest and how many combinations there are, rather than a bare "from" figure that left a shopper's question half-answered.
- The sale price it is reduced from, where the page is showing one.
- Whether it is in stock, out of stock or on pre-order.
- Every delivery service the item can be bought with - the name, the charge, and how long each one takes. A shop with eight services publishes eight, free ones included. This is the single most useful thing on the page to whoever is asking, and it needs Advanced Shipping installed; without it nothing about delivery goes out.
- The star rating, where the item has published reviews, with the number of them. Needs Reviews. A product nobody has reviewed publishes no rating - inventing one is the kind of thing search engines hand out penalties for.
- "This cannot be sent back", with your own wording, on anything you have marked non-returnable. An item you will take back says nothing here on purpose: how long your returns window is and who pays the postage are set once on the Structured data tab of Ultimate SEO, and one policy stated once beats the same policy restated on twenty thousand products until they disagree.
- The brand, barcode, part number and condition, where you have filled them in for Google Shopping - see below.
A shop that withholds its prices withholds them here too. Switch to quoting and the figures come straight out of the hidden description as well. How it arrives and whether it can come back still go out - those say nothing about what it costs, and they are the half a buyer most wants.
Where the brand comes from, and a thing worth checking. The make, the barcode and the part number are the ones you set for Google Shopping, reused rather than typed a second time - so the search result and the Google listing can never name two different makers. That does mean one setting now reaches further than it used to. If Use the supplier as the brand is switched on in Google Shopping settings, the supplier's name is the brand on your product pages as well, not only in the feed. On a shop that sells its own range that is exactly right. On a shop that buys in from a distributor it may not be, and the switch is on the Google Shopping settings tab.
Price every job on its own merits, quote trade against list, or simply have customers who want a figure in writing before they commit? Install the Quotes module.
It works two ways. Leave your checkout exactly as it is and add a "Save basket as a quote" button, so a shopper can park a basket, walk away with a short code and fetch it back later - useful on any shop, not only a quoting one. Or switch the shop over entirely: every buy button becomes "Add to quote", the basket leads to a quote request page rather than the till, checkout stops serving, and prices can be withheld until you have quoted them yourself. Quotes land in a list under Shop, where you price them, reply, send them out and turn the accepted ones into ordinary orders.
Settings → Shop is split into General, Checkout, Payments and Notifications tabs. General covers store identity (currency, order number format, weight/dimension units), page title and description for search engines, the shop's open/browse-only/closed status, what happens to products that have sold out, the supplier support described below, the product FAQs shown on every product page, and the product image zoom described below. Checkout covers tax mode, guest checkout, minimum/maximum order value (measured on the goods before any discount and before delivery, so a coupon can never be what stops someone paying), what to say to a shopper whose postcode you don't deliver to, whether a phone number is required, which checkout steps are shown, the back-in-stock account nudge, whether guests can see their own orders by giving the delivery postcode (and the short web address that form lives at), and how mixed pre-order/in-stock baskets are sent out (see Mixed baskets with a pre-order in them above). Payments lists every method the shop can take money with - switch each on or off, drag them into the order shoppers meet them at checkout, and give each one a button of its own holding its keys, its bank details or its wording. Notifications covers alert addresses for new orders and low stock, and - on a site running Unified Inbox - two things under Where this email goes: which of your inboxes your customer emails go out as, so a reply to an order confirmation lands with the people who deal with orders rather than in the site's general post, and which inbox a copy of each one is filed in, so you can read what a customer was actually told. Either works on its own; order emails leave through your sending service and never appear in a mail folder unless you ask for that copy. What those emails actually say - order confirmed, shipped, back in stock, and the rest - is edited on Settings → Email → Templates alongside every other email your site sends, wrapped in whichever design you have set there. Any wording you had already changed came across with the update.
Switch the retail price on under Shop → Settings → General → Prices and every product gets an RRP box. On its own that is a reference for you and nobody else sees it.
Tick Show the retail price to shoppers and it prints as "RRP £x" beside the price, on product pages and on cards, whenever it is higher than what you are charging.
Under that sits Send the retail price to search engines too, off to begin with. Tick it and the RRP is added to the hidden product details Google and the rest read off your pages, in the slot they print as a crossed-out price.
Worth knowing before you tick it: that slot means "what this used to cost here", which is not quite what an RRP is. It is your call whether you are content for yours to be read that way, which is why nothing does it unless you say so. A product actually on offer sends its own previous price instead, since that is the honest answer and it wins.
Listings with options send the cheapest choice's RRP against the "from" price - the same pairing your product cards print - so the two never disagree.
Enable suppliers support on the General tab is off to begin with, on the reasonable assumption that plenty of shops make their own things and have nobody to name. Switch it on and two things appear: a Suppliers entry in the menu under Shop, and a box on every product for picking which of them it came from.
Switch it on and three choices follow. First, what to call it: Supplier, Manufacturer, Retailer, Importer, or your own wording if none of those is quite right. Whatever you pick is the wording used everywhere the field turns up, so a shop that thinks in makers never has to read the word "supplier" again.
Second, whether shoppers see it. Leave that off and the name is yours alone, sitting in the admin as a buying reference. Switch it on and it appears as a line on the product page's Specification tab, alongside the SKU and the weight.
Third, where the box appears: Products only, or Products and variations. The second option adds a column to the variations grid, which is what you want when the red ones come from one place and the blue ones from another. Products and variations both carry their own name, so a variation only shows one if you've actually filled it in - and if shoppers can see it, the line on the product page follows whichever one they've picked, falling back to the product's own if that particular variation hasn't got one.
Switching the whole thing back off hides the Suppliers tab and the boxes, but keeps every supplier and every name you'd recorded, ready for when you change your mind. The same goes for narrowing the field back to products only: variation suppliers are left where they are, not scrubbed.
Supplier names travel with your product spreadsheet as well, in a supplier column on the products export and a Supplier column on the variations one, so you can fill in a hundred of them in a spreadsheet rather than one at a time. A spreadsheet exported before the field existed imports perfectly happily - a missing column leaves the names alone rather than wiping them.
Shop → Trading → Suppliers is the address book behind that box. Each entry holds a name, your account number with them, the trade discount you're on, whether they're enabled or disabled, a contact person with their phone number, email address and postal address, and a notes field for everything that fits nowhere else.
Two columns on the list are worked out for you rather than typed: how many products carry that supplier's name, and how many variations do. Handy for the moment somebody stops trading and you need to know how much of the shop that actually affects.
Disabled is the polite version of deleting. The record stays, everything filed against it stays, and the name simply stops being offered when you're picking a supplier on a product. Ideal for a supplier you've stopped using but might go back to.
Renaming a supplier carries every product and variation filed under the old name across with it, so nothing is left stranded. Deleting one, on the other hand, leaves those names exactly where they are - removing an address book entry isn't a decision to forget where four hundred products came from. Add the same name back and the counts come straight back with it.
Adding a supplier doesn't mean stopping what you're doing, either. The dropdown on a product, and the one in the variations grid, both end with Add a new supplier, which records a new one there and then and makes it available on everything else too.
Most suppliers hand you a catalogue or three - "Spring 2026", "Seating", the trade price list - and most of those end up as a spreadsheet somebody has to go and find. The supplier form has a Catalogues section for exactly that: add as many as you like, each with a name and the web address it lives at, usually a Google Sheet.
They show up on the Suppliers list beside the supplier, as clickable links where you've given one, so getting to the right price list is a click rather than a rummage through your email. A catalogue with no link yet is fine - the name on its own is still better than nothing.
Two catalogues under the same supplier can't share a name, for the obvious reason. Different suppliers can, of course, since half of them call theirs "Main catalogue". Deleting a supplier takes their catalogues with them, which is the one place the address book does forget something.
If you have the Google Sheet module, your suppliers and their catalogues also get a tab of their own in the spreadsheet - see Google Sheet Products.
Some suppliers charge you a bit extra per item on a small order and stop charging it once you order enough at once. If you've built that bit into your shelf prices - and most shops have, whether they think of it that way or not - then a customer buying enough at once is paying for something you're no longer being charged for. Order-size deduction hands it back.
It's off to begin with, and it stays entirely inert until you've set both halves of it, so switching it on changes nothing on its own.
Switch it on under Shop → Settings → General → Order-size deduction. Underneath sits Say so in the basket, which is on by default and is what puts a line in the basket telling the customer where they stand. Turn that off and the prices simply come down with no explanation, which is rarely what you want.
Set the amount on each product, on the Prices tab, in the Amount inside the price box. It's per item, not per order - five chairs at £6 each is £30 off. Leave it blank on anything that carries nothing.
Set the threshold on the supplier, on the Suppliers screen, under Order-size deduction. That's how much of their goods a basket has to hold.
Some things worth knowing before you set it up:
- It comes off whatever that item is charged at. Sale price or ordinary price, it makes no odds: the box says how much of today's price was put there for this, and that is what comes back off. It used to insist the item was on sale, which meant a supplier whose amount sits inside the ordinary price could only be set up by inventing a sale price - and the shop then went and advertised that invention as a genuine reduction on every card and page. It no longer asks. The flip side is that the amount is yours to keep honest: reprice something and the box wants looking at, because nothing else knows you have.
- Each supplier is counted separately. £200 from one and £200 from another is not £400 towards either threshold.
- Delivery doesn't count. If you charge for delivery inside the item price, that part is left out of the sum. A basket only reaches the threshold on the goods themselves.
- Once you're over it, you're over it. Reaching the threshold and then dropping under it because money has come off doesn't take the money back.
- It isn't delivery, and it isn't a discount. It's part of the price that stops being charged, so the VAT lands exactly where the money did and nothing about your delivery charges or your discount codes is touched.
On the product page there's a Product: Order-size deduction block to drop in under the price. New sites get it placed for you; an existing site needs it dragging in once, on Appearance → Editing pages → Product, as updates never rearrange a design you've already made. On a product with options it follows whichever combination the shopper picks, so the line says what that one costs rather than a figure from somewhere else in the range.
The supplier's name is a link. Where supplier pages are switched on and that supplier's page is published, their name in the line - on the product page, in the cart page's note and in the checkout summary's - links to their page, so "Dynamic Office Solutions orders of £389 or more" is one click from everything else they make. It opens in a new tab, so nobody loses the product or the basket they were halfway through. With no published page the name is plain text, as it was.
Two lists worth checking live on Shop → Reports → Order-size deduction, and the tab only appears once you've switched the feature on. The first finds anything stamped with more than it actually sells for, which is almost always a typo and would otherwise sell for nothing. The second finds things that are on offer, from a supplier who has a threshold, with no amount on them - either you meant that, or it's money a customer will never get back. It sticks to things on offer purely to keep the list short enough to read; something priced with an amount inside its ordinary price and never stamped won't appear on it. Neither is an error exactly, which is why they're a list to look at rather than something that stops you saving.
The amount travels with your product spreadsheet too, in an order_size_deduction column, so a few hundred of them is a paste rather than an afternoon.
You can advertise it on Google, rather than leaving shoppers to find it in the basket - see Discounts on your listings in the Google Shopping module. Read the catch there first: Google can only express a whole-basket minimum, and yours is counted per supplier.
With shoppers able to see supplier names, there's a second way to show one. The Product: Badges block has a Show the supplier as a badge setting, off to begin with, which prints the bare name up in the badge row beside "Sale" and "In stock" - where it reads as a brand mark rather than as a disclosure. If supplier pages are switched on and that supplier's page is published, the badge links straight to it.
It's in addition to the line on the Specification tab, not instead of it, and it shows the listing's own supplier rather than following the options a shopper picks - a brand name flickering as somebody changes colour would look like a fault.
Plenty of shops sell other people's ranges, and shoppers who care about that ask for it by name: "what have you got from Senator?" Until now the only honest answer was a search box. Suppliers can now have a page each, listing everything of theirs with your filters down the side and room for a proper write-up above.
It takes two switches, on purpose. Give suppliers a page of their own under Shop → Settings → General decides whether such pages exist at all, and it's off to begin with - switching supplier support on has never meant publishing anything, and it still doesn't. Then each supplier is published individually from the Suppliers screen, so you can write one up properly this afternoon and leave the other forty as filing.
Open a supplier and there's a Their page on your site section holding the lot:
- Give them a page - the tick that publishes it. Untick it and the page goes, while everything you'd written stays where it was.
-
Web address. The page lives at
/shop/suppliers/their-name. It's yours to type rather than something that quietly follows the name around, because changing an address stops old links working - the same arrangement collections have. Leave it empty and their name is used. - One-line description - printed under the heading.
- Write-up - a paragraph or two about them. And if a paragraph in a box isn't enough, Design it with the page builder opens the full-screen builder in a new tab, where the write-up can have pictures, columns and callouts in it. Anything you build there is shown instead of the plain version, and a supplier with one is marked Designed in the list.
- Search engine title and description - how the page reads in results. Blank falls back to their name and your one-liner.
The list itself grows a Page column with a View link on every supplier that has one, so checking what a shopper sees is a click.
What lands on the page. Every product filed under that supplier's name. That's the name on the product itself, so a listing whose supplier was only ever set on its individual variations won't appear - set it on the product too and it will. Renaming a supplier carries the page and its products across, as renaming always has.
Designing the page, and where the filters come from. Supplier pages get a layout of their own under Appearance → Editing pages, listed as Supplier beside Category, Collection and Tag. One layout serves every supplier - the page fills in which supplier each block is looking at - so this is a job you do once, not once per supplier.
A Supplier design is now set up for you the first time your site sees supplier pages, and it's the one with the filter panel already on it, so there is normally nothing to do here at all. Sites that had supplier pages before that arrangement existed keep whatever they built and are left alone - deliberately, since nobody wants their pages redesigned by an update.
If you have no design and don't make one, you still get a page: name, write-up and a plain grid of their products. What that plain page does not have is the filter panel, for the same reason a category page doesn't until one has been designed. So if you want filters - and on a supplier's whole range you will - make the layout.
Four starters are offered when you create it. Two come from the Shop itself and use the plain product grid; the other two come from the Filters add-on and use the Filters & Product Grid block instead, which is the one with the panel on it. Header, Write-up and Filtered Grid is the one most shops want, and it arrives already set to load more products as the shopper scrolls, since a supplier's whole range tends to be the longest page on the site. Those two only appear if you have the Filters add-on installed, which is rather the point.
Everything you've already built applies: the same colour, finish and price-band filters as your category pages, with no further wiring. If you have the Product Attributes add-on, its specification filters work here too.
Putting it in the menu. Menus now offers Supplier alongside Category and Collection when you add an item, listing the suppliers that actually have a page - so a menu can never point at one that doesn't. Unpublish a supplier later and the link quietly drops out of the menu on the site while staying in the admin, ready for when you put it back.
Published supplier pages join your sitemap too, but only where the supplier has something on sale. An empty page is a thin page, and there's no sense advertising it.
Zoom the image on hover on the General tab magnifies whichever part of the main product photo a shopper points at, so they can inspect the grain, the stitching or the small print without you having to upload a set of close-ups. On a phone or tablet a tap magnifies the spot they touched, a drag moves the magnified area about, and a second tap zooms back out. It's off to begin with, and switching it on changes nothing about the photos themselves - the same picture simply gets a closer look.
Worth knowing: the zoom works on the shopper's biggest copy of the photo, so a small, low-resolution upload will magnify into a blurry mess. If you're turning this on, upload your product photos at a decent size.
When the shop status is set to closed, visitors see your closed message instead of the shop. That covers every shop page, not just the front one: product pages, categories, collections, the cart and the checkout all show the closed message too. Closed means closed, including to somebody who kept a link to a particular product and tried it directly.
What stays open is everything to do with orders people have already placed: tracking, the receipt and order pages, delivery updates, live delivery, their paperwork and the downloads they paid for. Closing for a fortnight's holiday shouldn't leave last week's customers unable to find out where their parcel is.
Anyone signed in with Shop access still sees the whole shop as normal, with a note at the top of each page reminding them it's closed to everyone else, and can go right through the checkout, so you can walk the place over before you reopen.
One deliberate exception: the unsubscribe link at the bottom of a back-in-stock email keeps working while you're closed. Someone who wants off your list should never have to wait for you to open the doors again.
Wiki: Home · Managing pages · Appearance and design · Managing users · Managing media · Modules · Gazette · Boards · Directory · Shop · Shop Variations · Product 3D views · Reply Catcher · Configuration reference