Release v1.10.0
WCPOS 1.10.0
The biggest release since we rebuilt WCPOS in React Native back in 2023. Your store now syncs through a proper change log: the POS asks the server what changed since it last checked, instead of re-downloading your catalogue and hoping it landed. Nearly everything below follows from that.
Sync and performance
- The sync engine has been rebuilt end to end, on a new server API (
wcpos/v2). Your store now syncs through a change log: the POS asks what changed since it last checked instead of re-downloading the catalogue. This is the foundation the offline queue and Store Health below are built on. - Product search matches inside words, so compound-word languages work correctly — searching "saippua" now finds "Kuorintasaippua".
- Customer search matches every word, so full names like "John Smith" work against the server.
Offline and reliability
- Browsing, cart building and saving orders keep working offline. The sync engine queues the changes you make — customers, coupons, stock and price edits (Pro), and receipt emails — and replays them on reconnect.
- Taking payment still needs a connection. Checkout renders a server-hosted payment page, so the payment step cannot complete offline. Offline checkout, starting with cash, is the focus of 1.11.
- Anything the server rejects lands in a recovery list with the reason, and can be edited and resent.
- Unreadable local storage now blocks checkout with a reload prompt instead of losing the sale; barcode scans fail loudly in that state rather than going quiet.
- The crash screen's "Try again" no longer discards unsent sales.
- Web: cross-tab leader election, so multiple tabs share one writer and can't produce phantom orders.
- Order write conflicts auto-recover once and surface if they can't.
- Store switching is transactional — hydrate, then commit, with errors surfaced.
Prevent overselling (new, off by default)
- Enable in Checkout settings. The cart blocks quantities beyond available stock and shows what's left.
- The server independently refuses the order (
wcpos_insufficient_stock, HTTP 400, every failing line listed), so a stale or bypassed device can't oversell either. - Backorders (
allow/notify) never block. Variation stock aggregates to the parent stock owner. Draft and cart syncs always succeed — only checkout is gated. - Variation stock shown in the picker; out-of-stock variations can be hidden.
Barcode scanning
- Camera scanning on every platform, in a resizable panel below the filters.
- New transports: USB serial and HID-POS (Web Serial / WebHID), Bluetooth SPP, and Bluetooth LE via vendor GATT. Electron gains a device chooser; Android gains a native key interceptor.
- Keyboard-wedge detection now requires a scanner-like burst, so fast typing doesn't register.
- Scanner Setup Wizard and a test panel that measures your scanner and suggests fixes.
- UPC-A barcodes resolve to the digits printed on the package.
- Barcode field defaults to GTIN (
_global_unique_id);_skuand custommeta_data:mappings selectable. Changing the field rebuilds the catalogue's barcode index. - Optional scan sounds with themes. Scans route to the search field on the Orders screen.
- Online fallback with auto-add for barcodes not in the local catalogue.
Store Health (new)
- Database — what's on the device vs. what's on the server, real storage usage, variation totals, server clock-skew detection, per-collection "check for changes now".
- Performance — measured actuals, live tuning dials, trend charts.
- Logs — flat ledger with duration and status columns, level filters, expandable rows, infinite scroll. Every sync warning carries a registry error code with a copyable value and a link to its explanation in the docs.
Money and tax
- Cash change and card cashback render in the order's currency rather than the site default.
- Receipts print the currency symbol rather than the ISO currency code.
Printing and receipts
- Star CloudPRNT negotiates media types properly, with a
text/plainfallback. - Receipts can be rendered server-side as PNG for printers that can't decode StarPRNT.
- Auto-print rules can trigger on order creation or only once paid, and can print multiple copies.
- Offline receipts render in the correct language — the store payload now ships a label dictionary.
- Retried print failures no longer stay stuck in "Needs attention".
- Thermal fixes: mbstring fallback, wider Star width table, shared text layout, preview and print clamp out-of-range attributes identically.
- Templates are labelled "Thermal" rather than "ESC/POS".
Access and permissions
- Cashiers can create and edit products by default. Deleting stays opt-in.
- Catalogue and coupon writes are checked against real WordPress capabilities; a rejected edit reverts locally and shows the server's reason.
- Capability toggles on the Access screen are grouped by task.
Platform
- Expo SDK 57 / React Native 0.86. Desktop app on Electron 43, with the Node stack retired from the main process.
- Native local storage moved to the Expo filesystem engine.
- Fixed dropdowns not opening on iPad.
- Fixed language changes not reaching every part of the app.
- New transport fallbacks for restrictive hosts: query-parameter JWT,
?rest_route=mode, a header echo probe, and an opt-in response-body envelope for hosts that strip headers. - Settings redesigned; Settings and Store Health open as panels rather than modals.
⚠️ Changes that may affect you Only things that differ from released 1.9.17. Internal contracts that changed during 1.10 development are not listed — they were never in a shipped build.
- Legacy
API\Settingscontroller methods are removed (get_general_settings(),update_access_settings(),get_general_endpoint_args(),remove_license_transient()and others). The class alias survives; the methods do not. Third-party code calling or overriding them needs updating. - The StarPRNT fixed-layout output adapter has been removed. Templates using it need switching to another output.
- Default cashier capabilities changed — catalogue create and edit are now granted by default. Deleting stays opt-in.
- The POS product grid now defaults to name ascending, replacing the previous default order.
For integrators
- New
wcpos/v2REST namespace. Syncing lives here, and the shared POS services previously served fromwcpos/v1are nowwcpos/v2pass-throughs. Thewcpos/v1routes still register and still work — they are frozen, and the POS no longer calls them. - New public endpoints:
wcpos/v2/site(discovery),wcpos/v2/ping(reachability),wcpos/v2/echo(header probe). - POS line-item pricing storage is now documented for third-party sync compatibility.
Upgrading Don't update while your store is busy. Pick a time when you have some free time to check everything over, and be ready to roll back if you run into a problem.
Full Changelog: v1.9.17...v1.10.0