Sell over the counter —
without a second system.
Scan with a barcode gun or your phone camera, take the payment, print the receipt. The sale is a WooCommerce order, on your products, your prices, your tax rules — and the stock has already moved. Nothing to sync at closing time.
- No account, no card, no trial clock
- The free version calls no external service
- HPOS compatible
The website says one thing.
The counter says another.
If you sell in store as well as online, you are probably running WooCommerce for the website and something else — a terminal, a notebook, a spreadsheet — for the shop. Every evening the two disagree, and someone has to decide which one is lying.
Two stock figures
The shelf sold three this morning and the website never heard about it. Retail POS takes counter stock down through WooCommerce itself, so there is only ever one number.
Double entry at closing
Counter sales land in your normal WooCommerce order list, under your normal tax rules, in your normal reports. There is no end-of-day transcription because there is no second ledger.
A separate catalogue to maintain
No import, no mapping table, no nightly sync. The POS rings up the products, prices, variations, customers and tax classes that are already in your store.
One system, one stock figure, one set of books.
A complete counter, at no cost
Everything below is in the free plugin from WordPress.org — no signup, no key, no time limit.
A scanner gun, your phone camera, or a photo
Beep — the line drops into the cart. Beep. Beep. Tap Cash. The receipt prints, the order is real, stock is already down, and the cursor is back in the scan box before the cashier has looked up.
- Any HID scanner, nothing to configure. USB or Bluetooth guns that type into a text field just work — the box fires by itself at four characters or more, and on Enter too, so you never have to program a suffix.
- The cursor always comes home. The scan box takes focus when a POS screen opens, and clicking empty space sends focus straight back to it.
- Your phone is the second scanner — no app. A camera button opens a live viewfinder; browsers with a built-in BarcodeDetector decode natively, and where there is none the bundled ZXing library decodes instead. Code 128, EAN-13, EAN-8, UPC-A, UPC-E, Code 39, ITF and QR.
- “Read from photo”, for the label that will not read. Creased or faded? Take a still and it is retried at three sizes and four rotations — twelve attempts — before it gives up.
- No barcode? Search by name. Two characters or more; a scan matches the barcode field, then WooCommerce’s GTIN, then the SKU — and a variation always wins over its parent.

The counter quotes gross, WooCommerce does the tax
Cart lines, the subtotal and the Complete sale button all show the tax-inclusive amount the customer actually hands over — whichever way your shop displays prices elsewhere.
- Tax is WooCommerce’s job. Items ring up at the product’s own price and the order’s tax is calculated by WooCommerce, so your rates, classes and rules apply unchanged.
- Discounts that do not break VAT. A percentage or fixed discount scales every line total down proportionally instead of dropping in a negative fee, so tax recomputes correctly even in a mixed-rate basket. Both are re-capped on the server.
- Your tenders, your words. Payment methods are a free-text list in Settings — Cash, Card and Bank transfer to start with. Rename, add, delete; renaming keeps the key, so last month’s orders stay attached to the same tender.
- Quantity three ways, and no quiet overselling. Minus, plus, or type the number; stock-managed lines are capped at the stock on hand, with a warning.
- Quick edit, mid-sale. The pencil on a cart line opens price, sale price, stock and cost and writes straight back to the product — optionally copying price, sale price and cost to every sibling variation. Save a line unchanged and the price stays exactly where it was.
In the free version a sale is settled by exactly one payment method covering the full total. Splitting a sale across tenders is a Pro feature.

Blind returns — no original order needed
Scan what comes back over the counter, hand over the money, done. The payout is documented as a refunded POS order, and stock is restored automatically when stock reduction is on.
- No receipt, no order number, no hunting through the order list.
- Deliberately no stock cap on the returns cart — a customer can bring back three of something you currently hold none of, exactly as a real counter has to allow.
- Returns and partial refunds are netted out of the dashboard, so the day’s figure is what actually stayed in the till.
- Camera scanning works on the returns screen too.

Receipts and your own barcode labels
Hit print and a narrow monospace window opens, sized for a roll of thermal paper: store name, address and phone, every line, the subtotal, the discount if there was one, the total, the payment method, and the customer’s name and phone. Any past POS sale can be reprinted from the order list.
- Receipt amounts are the pre-discount figures, so the paper adds up the way a customer checks it: items total to Subtotal, minus Discount equals TOTAL.
- Print price labels from the counter. Scan or search products into a queue, set how many copies of each, and print.
- EAN-13 and EAN-8 are auto-detected, with a Code 128 fallback, for any product that already has a SKU or barcode.
- Label width and height in millimetres, and what goes on the sticker — store name, product name, variant, price, the barcode and its digits — are all settings.

Your POS day, in the order list and on a dashboard
POS sales are ordinary WooCommerce orders tagged as counter sales — they take the status you configure (Completed by default) and appear in your reports and integrations like any other order.
- POS order list with filters for type, status and date, and search by order number, phone, or customer name and e-mail.
- Safe editing only — customer name, phone, e-mail and city, payment method, order status and a note. Line and price changes stay on WooCommerce’s own order screen, where they belong.
- Sales dashboard: today, last 7 days, last 30 days and the calendar month to date, a daily revenue chart, a payment-method breakdown, average basket and best sellers — all net of returns.
- Quiet by design. POS sales do not send the customer the usual WooCommerce order e-mails, and the admin new-order, no-stock and backorder notifications are suppressed for POS orders too. Orders from your website are untouched and mail as they always did.

Settings a shop owner can actually answer
Six working screens — Sell, Dashboard, Orders, Returns, Labels and Settings — plus a built-in Help & support page. The settings page is a single short form.
- Your payment methods, the store name, address and phone printed on receipts, and the label size in millimetres.
- Whether a POS sale reduces stock, and which order status POS sales get, are both settings.
- Optionally keep a product’s barcode in step with its SKU on save, and set a default country calling code for phone numbers.
- A language switcher on the POS screens lets each cashier read the terminal in a language of their own, separately from the rest of wp-admin, using the language packs WordPress has installed. Right-to-left languages get an RTL layout.


From install to first sale
There is no setup project and no data migration. It sells the store you already have.
Install & activate
Install from WordPress.org like any plugin. WooCommerce must be installed and active; WordPress 6.2+ and PHP 7.4+.
Check two settings
Open Retail POS → Settings: confirm your payment methods and the store name, address and phone that print on the receipt.
Scan and take payment
Open Retail POS → Sell. Scan or search, adjust quantities, add a discount if you want one, tap the tender that covers the total.
It is already a WooCommerce order
Print the receipt, glance at the remaining-stock snapshot, and the next scan is already in the box. Nothing to reconcile later.
Staff need the WooCommerce manager capability (manage_woocommerce) to open the POS screens — the Shop manager role and administrators have it, so nobody needs a full admin account to work the counter. Full setup notes are in the documentation.
What Pro adds
Free is a complete single register: scanning, the sale, returns, receipts, labels and the dashboard, with no time limit and no sale caps. Pro is the money-control layer a full retail day needs — credit, the drawer, and the numbers behind the revenue.
Split payments PRO
Settle one sale with several tenders — half cash, half card — each recorded separately, so the drawer and the card slip both reconcile.
Partial payment & customer credit PRO
Take what the customer has now and book the remainder to their account. A debtor list with aging, collections, printable statements and WhatsApp reminders keeps it from being forgotten.
Cash register & end of day PRO
Opening float, cash-ins and expenses on record, then an expected-versus-counted close with carryover — the till either balances or shows exactly where it did not.
Exchange terminal PRO
Scan what comes back and what goes out in one flow; the tax-correct difference is collected or refunded.
In-store (POS) pricing PRO
Ring items up at a counter price distinct from the website price. Set it per product, or generate it across the catalogue in bulk — site price ± a percentage, with optional rounding to 0.10/0.50/1/5 or charm endings.
Campaign scenarios PRO
Preset one-tap chips instead of mental arithmetic: “buy 3 pay 2”, “2nd item −50%”, and percentage or fixed presets your staff can apply without a calculator.
Profit reports PRO
Revenue, cost, margin, stock turnover, attribute breakdowns and discount usage. Free records a unit cost when you quick-edit a line, but shows no margin figures anywhere.
Store activity feed PRO
Every sale, return, exchange and credit of the day in one chronological stream — what happened at the counter while you were in the back.
Priority support PRO
Free users get help on the WordPress.org support forum. Pro customers reach the people who built the plugin directly.
| Feature | Free | Pro |
|---|---|---|
| Sale terminal — scan, cart, receipt | Included | Included |
| Barcode scanner & phone-camera scanning | Included | Included |
| Product search & variant picker | Included | Included |
| Manual discountspercentage or fixed amount | Included | Included |
| Configurable payment methodsone method settles a sale in Free | Included | Included |
| Blind (receiptless) returns | Included | Included |
| Barcode label printing | Included | Included |
| POS order list with safe edit | Included | Included |
| Sales dashboardtoday · 7 · 30 days · month to date | Included | Included |
| Split paymentsseveral tenders on one sale | Not included | Included |
| Partial payment & customer credit ledger | Not included | Included |
| Debtor aging, statements & reminders | Not included | Included |
| Cash register & end-of-day close | Not included | Included |
| Exchange terminal | Not included | Included |
| In-store (counter) pricing | Not included | Included |
| Campaign scenario presets | Not included | Included |
| Profit & margin reports | Not included | Included |
| Store activity feed | Not included | Included |
| Priority support | Not included | Included |
Pro is a separate download from erenlabs.net, not from WordPress.org. It is the same plugin with the Pro screens unlocked — no re-install of your data, no migration. If a licence lapses, the free features keep selling and the Pro screens lock again; nothing in your database is deleted.
Pricing
The free version is genuinely free and complete for one counter — no trial, no card. Pro is one flat annual price per licence, whatever the shop’s turnover.
Free
- Sale terminal, scanner gun & camera scanning
- One payment method per sale, your own tender names
- Receipts, blind returns, barcode labels
- POS order list and sales dashboard
- No account, no licence check, no telemetry
Pro · 1 site
- Everything in Free, plus:
- Split & partial payments, customer credit ledger
- Cash register & end of day
- Exchange terminal & campaign scenarios
- In-store pricing, profit reports, activity feed
- Automatic updates & priority support
Pro · 5 sites
- Every Pro feature, on up to 5 sites
- One licence key, one renewal date
- $59.80 per site per year
- Automatic updates & priority support
More than five counters?
A 20-site licence is $699 a year — 64% off twenty single licences. Pick a licence size and the checkout link follows.
Every paid plan is an annual licence that renews yearly, and you can switch renewal off at any time. Checkout, invoicing and licence management are handled by Freemius. Refunds follow our refund policy, summarised below. The free version stays free either way: it is not a trial and it has no sale caps.
Questions, answered
The things a shop owner asks before putting a plugin on the till.
Any scanner gun that types into a text field — the usual USB or Bluetooth HID kind — works, and you do not have to program an Enter suffix into it. The scan box fires by itself once four or more characters land (and on Enter as well), and it takes focus back after every action, so the next scan always lands in the right place. The Labels screen auto-fires at six characters or more.
Yes, with no app to install. A camera button on the scan box opens a live viewfinder: browsers with a built-in BarcodeDetector (typically Android Chrome) decode natively, and where there is none (typically iOS Safari) the bundled ZXing decoder takes over. If a damaged or dense label will not read live, “Read from photo” takes a still and retries it twelve ways. Camera scanning is on the Sell and Returns screens. Browsers only release the camera on a secure connection, so the site has to be served over HTTPS.
No. This is a WordPress admin screen and it needs a live connection to your site — every scan, search and sale is a request to WordPress. If the internet drops at the counter, the terminal stops with it. There is no third-party POS cloud in between, so the terminal is as fast as your own site.
Your theme is not involved. The POS lives entirely in wp-admin — nothing is added to the storefront, no template is overridden, no shortcode or block is needed. What it does need is WooCommerce active, WordPress 6.2 or newer and PHP 7.4 or newer. It is HPOS (High-Performance Order Storage) compatible and works on classic post storage too.
Yes. They are ordinary WooCommerce orders tagged as POS sales, they take the status you configure (Completed by default), and they show up in your reports and integrations like any other order. Stock reduction goes through WooCommerce core, so lookup tables and integrations stay correct — and whether a POS sale reduces stock at all is a setting.
No. Search by product name or SKU and pick from the results; a variable parent opens a variant picker showing each variation with its price, remaining stock and barcode. When you do want barcodes, the Labels screen prints scannable labels for any product that already has a SKU or barcode, and the plugin can keep a product’s barcode in step with its SKU on save.
Yes. Anyone who can manage WooCommerce — the Shop manager role, plus administrators — can open the POS screens, so nobody needs a full administrator account to work the counter. Developers can point the rpsw_capability filter at a different capability.
The free version contacts no external service at all. Sales, customers, orders, settings and reports live only in your own WordPress database, and the free package ships no licensing, analytics or telemetry code of any kind. Every JavaScript library it uses is bundled inside the plugin, so nothing loads from a CDN.
The separately distributed Pro version uses the Freemius SDK for licence validation and updates. On first activation it shows an explicit opt-in screen: nothing is sent unless you click “Allow & Continue”, and “Skip” keeps the plugin fully functional. If you opt in, Freemius receives basic site data — site URL, WordPress and PHP versions, plugin version, admin e-mail. Your sales, customers, credit ledger and reports are never sent.
Not in the free version: one sale is settled with one payment method covering the full total. Split payments, partial payment and the customer credit ledger are Pro features. You can still define as many tender types as you like in the free version — Cash, Card, Bank transfer, or whatever your shop calls them — you just pick one per sale.
Nothing is deleted. The sale terminal keeps selling, and every ledger entry, register day and report stays in your database — the Pro screens simply lock until a licence is active again. The licence renews yearly by default because that is what keeps updates and priority support coming, and you can switch renewal off at any time.
Yes — returns are blind. Scan what the customer brings back, refund it, and stock is restored automatically when stock reduction is on; the payout is recorded as a refunded POS order so the day’s figures stay honest. There is no stock cap on the returns cart, so you can take back more than the shop currently holds.
The plugin removes its own options and scheduled events and stops there. Your products, stock, customers and orders stay exactly as they are — including the POS ones, because they are ordinary WooCommerce orders and always were.
Sell one item and see
Install it on the till, ring up a single product, and you will know inside a minute whether the counter likes it. Nothing is held back behind a signup.