| 1 |
# WCPOS 1.8.15 — Changelog Draft |
| 2 |
|
| 3 |
> **The biggest WCPOS release ever.** Almost three months of work, ~330 substantive PRs. Highlights below. |
| 4 |
|
| 5 |
## Unreleased |
| 6 |
|
| 7 |
- Added: anonymous analytics identifier (`wcpos_anon_id`) for the admin welcome screen — random UUID, no store data, deleted on uninstall, manageable via `wp wcpos anon-id rotate|delete`. Landing data contract `schema_version` bumped to 2. |
| 8 |
- Added: `woocommerce_pos_consent_copy` filter so the tracking-consent prompt copy can be overridden. |
| 9 |
- Added: `woocommerce_pos_get_anon_id()` accessor (used by the Pro licence-activation request). |
| 10 |
|
| 11 |
--- |
| 12 |
|
| 13 |
## 🧾 Receipt Templates — Complete Rebuild |
| 14 |
|
| 15 |
This release introduces an entirely new receipt template system. It started in early March as a "receipt data + multi-engine rendering" foundation and grew into a full template platform. |
| 16 |
|
| 17 |
- **New Template Gallery** with starter templates for every common use case — thermal (58mm, 80mm, narrow), A4 receipts, invoices, quotes, packing slips, gift receipts, kitchen tickets, and right-to-left languages (Arabic, Hebrew, Persian, Urdu). |
| 18 |
- **New Template Editor** built on CodeMirror 6 with a field picker, live preview, paper-size + engine locking, and a Sample/Order preview pill toggle. |
| 19 |
- **Multi-engine rendering** — HTML, Logicless (Mustache), PHP, and Thermal engines. Each template can declare which engine it uses; the active template is resolved per-store and per-order. |
| 20 |
- **Receipt Data v1 contract** — a stable, branchable data shape that custom templates can rely on: refunds, transaction IDs, line tax labels, per-row meta, fiscal/refund context, customer notes, store address composed via `WC_Countries`, structured `store.tax_ids[]`, customer tax-id labels, localized `status_label`, and a render-time `order.printed` timestamp. |
| 21 |
- **Store-aware presentation** — receipts now respect store currency, locale, timezone, tax display setting, price presentation, opening hours, and site logo, instead of falling back to global WooCommerce options. |
| 22 |
- **Refund-aware totals** — refunded orders keep totals positive and add Refunded/Net rows so receipts stay readable. |
| 23 |
- **Discounts as first-class data** — each coupon emits its own discount row, with `discounts[].code` as the canonical reference and `discounts[].label` taking the coupon description when available. |
| 24 |
- **Tax-summary guard** so templates correctly distinguish tax-inclusive vs tax-exclusive stores, and summaries use real post-discount taxable bases instead of reverse-calculating from rounded tax. |
| 25 |
- **Black-and-white safe printing** — light tints actually print, dark reverse-out fills removed, thermal receipts made 42-column-safe with star-column support. |
| 26 |
- **PHP gallery catalogue registry** (#1035) replaces JSON tracking for shipped templates, keeping the gallery cleaner and easier to extend. |
| 27 |
- **Template-management admin redesign** — unified Templates table with sidebar filters, drag-and-drop ordering, inactive-but-visible status, and a kebab menu replacing the old card "Settings" link. |
| 28 |
|
| 29 |
## 🪪 Customer & Store Tax IDs (new feature) |
| 30 |
|
| 31 |
- **Customer tax IDs** end-to-end — reader, writer, REST exposure, persistence (#850, #863). |
| 32 |
- **Store Tax IDs settings UI** with dedicated REST endpoints and country defaults (#851, #859, #872, #883). |
| 33 |
- **Consolidation** — Tax IDs folded into General → Customers and into the Store Details block (#860, #924, #942). |
| 34 |
- **Structured `store.tax_ids[]`** exposed on receipts with a derived `tax_id` scalar for legacy templates (#853, #874, #875). |
| 35 |
|
| 36 |
## 📈 Tracking Consent & Analytics (new feature) |
| 37 |
|
| 38 |
- **GDPR-friendly consent prompt** with a two-tier landing page (#787, #788, #790, #792, #801, #804). |
| 39 |
- **PostHog analytics foundation** with consent gating; session recording is explicitly disabled (#795, #799). |
| 40 |
- **Reusable `@wcpos/consent` package** so the same consent flow can be embedded elsewhere (#822, #824, #829). |
| 41 |
- **Landing Profile service** for personalized A/B testing (#781, #784, #797). |
| 42 |
- **Upgrade-funnel instrumentation** (#798). |
| 43 |
|
| 44 |
## ⚙️ Settings Overhaul |
| 45 |
|
| 46 |
- **General tab redesign** with a new Callout primitive (#864). |
| 47 |
- **Store Details block** extracted with a Pro override slot (#868, #877, #1015). |
| 48 |
- **General settings grouped** into Products and Customers sections (#733, #740). |
| 49 |
- **Snackbar improvements** — pinned to viewport, aligned to content area (#867, #878). |
| 50 |
|
| 51 |
## 🧱 Shared UI Package (`@wcpos/ui`) |
| 52 |
|
| 53 |
Many components extracted into a shared workspace package and reused across settings, templates, and consent: |
| 54 |
|
| 55 |
- Button (with ghost-destructive variant, form primitives) (#782, #783, #802) |
| 56 |
- Table (#879), Combobox (#880), searchable CountrySelect (#871) |
| 57 |
- FormSection / FormRow with `headerRight` and divider props (#796, #800) |
| 58 |
- Toggle hardened for hosts without Tailwind preflight (#841, #842, #843) |
| 59 |
- Skeleton loading states (#703, #704) |
| 60 |
- Filter sidebar with horizontal rule (#998) |
| 61 |
- Shared `@wcpos/thermal-utils` workspace package (#730) |
| 62 |
|
| 63 |
## 🧩 Extensions Catalog |
| 64 |
|
| 65 |
- **Redesigned cards** with body/footer layout, update badges, has-update flag, responsive grid, smaller buttons (#580, #778, #779, #780, #808, #809). |
| 66 |
- **Auto-update field** exposed in the catalog (#566). |
| 67 |
- **Extension settings and logs** now surface in POS admin (#821). |
| 68 |
|
| 69 |
## 📋 Sessions & Logs |
| 70 |
|
| 71 |
- **Sessions page** redesigned as master/detail with a shared Avatar component (#826). |
| 72 |
- **Logs page** redesigned with grouped-by-day view, copy boxes, and a new Chip primitive (#825). |
| 73 |
|
| 74 |
## 💳 Payments |
| 75 |
|
| 76 |
- **Per-gateway order status settings** — Cash and Card gateways now have their own configurable post-checkout statuses (#564). |
| 77 |
- **Refund support** added to POS Cash and Card gateways (#632). |
| 78 |
- **POS payment gateway contract** — gateway catalog, bootstrap, and checkout coverage (#828, #830). |
| 79 |
|
| 80 |
## 🐞 Major Bug Fixes |
| 81 |
|
| 82 |
### POS order reliability |
| 83 |
- Fixed `WC_Data_Exception` crash on misc product duplicate SKU (#573). |
| 84 |
- Prevent line-item tax overrides from mutating products (#563). |
| 85 |
- Cashier capabilities synced on plugin update, stripped on deactivation (#623, #768). |
| 86 |
- POS capability checks added to checkout routes; cashier roles included in auth payloads (#624, #806). |
| 87 |
- Cashier can now update orders with HPOS enabled (#662). |
| 88 |
- New misc product meta fields handled: category, virtual, downloadable (#690). |
| 89 |
- Variable-product empty sale prices filtered (#692). |
| 90 |
- Optional stock restore when POS orders are deleted, with admin toggle (#701, #732). |
| 91 |
- Line-item image IDs cast to integer in order responses (#756). |
| 92 |
- Client-provided order creation date honored (#915). |
| 93 |
- Historical store lookup works for trashed stores (#940). |
| 94 |
- Receipt permission error code corrected (#1014). |
| 95 |
|
| 96 |
### Coupon calculations (multi-round WooCommerce interaction fixes) |
| 97 |
- Strip coupon line IDs to prevent readonly errors on order update (#613). |
| 98 |
- Deactivate subtotal filter before `calculate_totals()` (#674). |
| 99 |
- Preserve subtotals during coupon recalculation (WC compound-tax bug) (#675, #677, #684). |
| 100 |
- Use POS price directly as subtotal, remove fragile filter mechanism (#686). |
| 101 |
- Clean up temporary cache entries after coupon validation (#693). |
| 102 |
- Coupon include/exclude sync filters fixed (#840). |
| 103 |
- Coupon REST API: shipped (#518), moved to Pro (#588), then restored as a standard controller (#766). |
| 104 |
|
| 105 |
### Auth & compatibility |
| 106 |
- Prevent third-party JWT plugins from blocking WCPOS Bearer token auth (#744). |
| 107 |
- Fix `require()` in IIFE bundle from Vite 8 CJS interop (#659, #664). |
| 108 |
- Analytics tsconfig updated for TypeScript 6 (#708). |
| 109 |
|
| 110 |
### Memory & performance |
| 111 |
- Log-spam memory exhaustion from i18n thundering herd resolved (#702). |
| 112 |
- OPFS worker added for RxDB 17 storage migration (#739, #897). |
| 113 |
|
| 114 |
### Localization |
| 115 |
- Translation write-location fallback and failure caching (#567). |
| 116 |
- jsDelivr CDN trailing-slash redirect-loop fixed (#931). |
| 117 |
- `TRANSLATION_VERSION` used for JS translation URLs (#707). |
| 118 |
- `loadPath` interpolation conflict fixed (#729). |
| 119 |
- Receipt dates and timestamps respect store timezone and locale (#666, #919, #937, #1029). |
| 120 |
- Receipt gallery, template editor, Combobox, CountrySelect, and Skeleton strings all localized (#669, #681, #903, #925, #927). |
| 121 |
|
| 122 |
## 🔧 Behind the Scenes |
| 123 |
|
| 124 |
- **CI/build** — root build script, simpler workflows, dynamic test matrix with RC/beta auto-detection, merge gate for bot PRs, hook-docs gh-pages deploy, release-draft idempotency, GitHub App tokens for POT and update-matrix automation, Dependabot auto-merge. |
| 125 |
- **Dependencies** — Vite 8, TypeScript 6, RxDB 17, codecov-action 6, many action upgrades; pnpm supply-chain settings tightened. |
| 126 |
- **Wiki** — moved to a `wcpos/wiki` submodule; deprecated `.kb/` folder removed (#759, #760). |
| 127 |
- **Security** — `TemplatesManager::save_raw_post_content` hardened with structural guards (#984). |
| 128 |
- **Docs** — `_woocommerce_pos_data` explainer, web bundle architecture KB article (#672, #753). |
| 129 |
|
| 130 |
--- |
| 131 |
|
| 132 |
**Stats:** 329 substantive PRs since v1.8.14, plus 60 routine translation/dependency-bot PRs folded into "Behind the Scenes". |
| 133 |
|