Getting started
WooCommerce tracks what you sell. It has never tracked what you buy — so the purchasing side of a shop ends up in a spreadsheet, and the cost of goods ends up out of date. PurchaseDesk closes that half of the loop: raise a purchase order, send it to your supplier, then receive the delivery. Receiving is the only step you take.
Requirements
| Requirement | Version |
|---|---|
| WordPress | 6.4 or newer |
| WooCommerce | Required and declared; HPOS-compatible |
| PHP | 8.1 or newer |
Install
- Install PurchaseDesk for WooCommerce from Plugins → Add New, or upload the zip.
- Activate it. A PurchaseDesk menu appears in wp-admin.
- Open PurchaseDesk → Suppliers and add your first supplier.
Suppliers
A supplier is a real record, not a free-text field you retype on every order. Each one holds a contact person, email, phone, address, lead time in days, and notes.
The email address matters twice: it is where the order email goes, and the lead time is what makes an expected date meaningful. Deleting a supplier does not delete the orders raised against it.
Purchase orders
Open PurchaseDesk → Purchase orders → Add new, pick the supplier, and start adding lines. The product search reads your own catalogue by name, SKU or barcode, so scanning a code in the search box finds the product.
Each line carries a quantity and a unit cost. The order moves through four states:
| Status | What it means |
|---|---|
| Draft | Being built. Nothing has been sent and no stock is affected. |
| Ordered | Sent to the supplier. The quantities now count as on the way. |
| Partially received | Some lines are complete, some are not. |
| Received | Every line is complete. |
The order list can be searched, filtered by status or supplier, and sorted. Status tabs carry a count. You can select a page of orders and mark them ordered, move them back to draft, cancel or delete them in one action.
Duplicating an order
Next week's order is usually last week's order. Duplicate copies a purchase order into a fresh draft — same supplier, same lines, same costs, nothing received.
Emailing the supplier
Send the order from your own site, with the products, quantities and prices. It goes to the supplier's stored address, or to an address you type at the time, and the send is written into the order's notes so you can see it went.
Receiving a delivery
Open the order and enter what actually turned up, line by line. You do not have to receive the whole order: take four units of one line today and the rest on Thursday. The order sits at partially received until every line is complete.
Receiving does four things at once:
- Stock rises, written through WooCommerce's own product API — the same call the product screen makes — so low-stock notices, lookup tables and any other plugin watching stock all stay correct.
- The product's cost is updated (unless you turn that off in Settings).
- A receipt is logged with the quantity, the unit cost, and the stock level before and after.
- The order's status is recalculated.
Scanning
A hardware barcode scanner — USB or Bluetooth — behaves as a fast keyboard. Focus the scan field on the receiving screen, scan a code, and the matching line counts up. This needs no setup and is part of the free plugin.
Pro adds scanning with a phone camera, using the browser's own Barcode Detection API: no library is downloaded and no frame leaves the device. That API is provided by Chrome and Edge on Android, and by Chrome on macOS. Windows, Linux and iOS browsers do not offer it today — on those, PurchaseDesk hides the camera button and says why, rather than showing a control that fails. A hardware scanner works everywhere.
Reversing a receipt
Received 100 when 10 arrived? Open the receipt and reverse it. Stock and the order line go back to where they were, and the reversal is written into the history as its own event.
The original receipt is never edited or deleted — that is the point of an audit trail. A receipt can only be reversed once.
Cost of goods
Cost is not kept in a private field. When WooCommerce's own Cost of Goods Sold feature is enabled (WooCommerce → Settings → Advanced → Features), that is the value PurchaseDesk writes. It also mirrors the same figure to the meta keys the established cost-of-goods plugins read, so profit reports elsewhere in your store agree with your purchasing.
Every product's Inventory tab gains a cost-history panel showing its recent receipts — date, supplier, quantity and unit cost — so you can see whether a supplier's price has been creeping.
Stock adjustments
Not every stock change is a purchase. PurchaseDesk → Stock adjustments records damage, loss, a customer return, goods sent back to a supplier, or a plain correction — each with a reason and a note, in or out.
Adjustments are written the same way receipts are, through WooCommerce's product API, and they land in the same history.
The audit trail
Every receipt, reversal and adjustment leaves a line carrying the quantity and the stock level before and after. Receipts also record the unit cost; adjustments record the reason.
Deleting a purchase order does not destroy its history. The confirmation tells you exactly what will go and what will stay, including how many units of stock the order has already put on the shelf.
The planning grid
Setting a reorder point one product at a time is the reason most inventory plugins stay empty. The planning grid puts the whole catalogue on one screen — reorder point, default order quantity, supplier, supplier SKU and cost — and lets you fill the first three for a whole page of products at once. Cost and supplier SKU are edited inline, row by row, on the same screen.
Filter to the products that are not yet planned to see exactly what is still missing before the reorder list can work.
The reorder list
PurchaseDesk → Reorder lists everything at or below its reorder point — with the quantity already on its way subtracted, so you never buy the same thing twice. Variations inherit their parent's reorder point unless you set their own.
Snooze a product for two weeks when you know about it and do not want to be told again.
CSV import
PurchaseDesk → Import / Export brings cost, supplier, supplier SKU, reorder point and default order quantity in from a spreadsheet, matching rows on SKU.
Every import starts as a dry run: you see row by row exactly what will change, with the numbers already read the way they will be written, before anything is saved. The importer detects whether the file writes 1.234,56 or 1,234.56, and keeps leading zeros in SKUs intact.
CSV export
On the same screen, export your own records — purchase orders, order lines, goods received, and every stock movement — as CSV whenever you want. This is free. Your purchasing record is yours, and nothing is held back to sell you an upgrade.
Text cells that begin with =, +, - or @ are defused before they are written, so a supplier name typed into a spreadsheet cannot execute as a formula on the machine that opens the file.
Settings
| Setting | What it does |
|---|---|
| Order numbering | The prefix and the zero-padding used to build a purchase order reference, e.g. PO-00042. |
| New orders start as | Whether a new purchase order opens as a draft or as ordered. |
| Receiving updates cost | Whether posting a receipt writes the unit cost onto the product. Turn it off if cost is maintained elsewhere. |
| Who can change stock | Shop managers and administrators, or administrators only. An administrator is never locked out. |
| Rows per page | How many orders a list page shows. |
What Pro adds
Free keeps the purchasing record straight. Pro turns that record into the numbers you buy from.
| Feature | What it gives you |
|---|---|
| Weighted-average costing | Cost follows the blended value of what is actually in stock as each delivery lands, instead of jumping to whatever the last box cost. |
| Reorder list → draft orders | Turn everything due into draft purchase orders in one click, grouped by supplier. |
| Purchasing dashboard | Stock value at cost, spend against the previous period, a receipts trend chart, top suppliers, and the value still on order. |
| Purchase reports | Over a period you pick — 7, 30, 90, 180 or 365 days — spend by supplier with each supplier's share, receipts over time, average receipt, and the value still on order. It also tells you how many products in stock have no cost and are therefore excluded. |
| Full inbound table | Every outstanding unit, per product, across every open order on one screen. |
| Printable purchase order | A clean document to print, or save as PDF from the browser. |
| Report CSV export | Export the spend report itself for the period on screen. (Your own records export on the free plan.) |
| Camera scanning | Scan with a phone camera while receiving, where the browser supports it — see Scanning. |
| Email support | Answered on weekdays by the developer. |
Licence & billing
Pro is sold per site, billed annually, through Freemius: $79 for one site, $199 for five, $399 for twenty. Every plan carries a 14-day money-back guarantee, and a licence can be moved between sites.
If a licence lapses, the free plugin keeps working and your data stays yours. You lose the Pro screens, not the record — and the CSV export is free.
Data, privacy & uninstall
PurchaseDesk stores suppliers, purchase orders, order lines, receipts and stock adjustments in its own tables in your database. Nothing is sent anywhere: there is no external service in the free plugin, and no telemetry.
Product cost is written to WooCommerce's own Cost of Goods Sold value and to shared cost meta on the product, which is the point — those are read by the rest of your store.
Deleting the plugin removes its own tables and options. Stock levels and product costs are not rolled back, because they are WooCommerce's data by then, not PurchaseDesk's.
Troubleshooting
The reorder list is empty
Nothing has a reorder point yet. Open the planning grid and set them — the not yet planned filter shows what is missing.
A product will not appear in the order search
The search matches name, SKU and barcode. A product with no SKU is still findable by name. Variations are searched too.
Cost is not showing up in my reports plugin
Check whether WooCommerce's Cost of Goods Sold feature is enabled. PurchaseDesk prefers that value when it exists and mirrors to the shared meta keys either way; a plugin reading a proprietary key of its own will not see it.
The camera scan button is missing
The browser does not provide the Barcode Detection API — see Scanning. Use a USB or Bluetooth scanner, which works everywhere and is free.
Receiving says the line is busy
Someone else is receiving that product at the same moment. The lock clears on its own; try again.
Get support
Free users: the WordPress.org support forum. Pro customers: email support@erenlabs.net, answered on weekdays by the developer.
When reporting a problem, say what you expected, what happened, and your WordPress, WooCommerce and PHP versions.