Wishlist
Wishlist records what a customer wants but couldn't buy today — product, size, colour and any notes — against a Pending/Notified/Fulfilled/Cancelled status flow, so staff can follow up once the item is back in stock.
Overview
Each entry stores the customer (name and phone, with live search against Customers), a product (name, optional SKU, with a live search against Products), an optional Size and Colour, and free-text Notes.
A four-stage status flow tracks the request — PENDING (just saved), NOTIFIED (customer has been told it is available), FULFILLED (customer bought it) or CANCELLED — with one-click buttons to move an entry to the next relevant stage rather than a full edit form.
The list can be filtered by status via chip buttons and searched by customer or product name; each entry shows when it was added and, once notified, when that notification happened.
This screen is the ONE page in the garment sidebar gated on the "customers" feature rather than "billing" — the neighbouring Garment Overview, Tailoring Orders and Customer Measurements pages all require the billing feature instead.
Before You Start
- Only Customer Name and Product Name are required to save an entry — SKU, size, colour and notes are all optional.
- This page is gated on the customers plan feature, not billing like most of the rest of the Garment section — a store with billing enabled but customers disabled will not see this page in the sidebar.
- Marking an entry NOTIFIED does not itself send any SMS or WhatsApp message — it is purely a manual status flag that staff set after contacting the customer through their own means.
Step-by-Step Guide
1 Add an item to a customer's wishlist
- Click + Add to Wishlist.
- Start typing in Customer Name * — pick a match from the dropdown (auto-fills Phone) or type a new name; fill in Phone if not auto-filled.
- Start typing in Product Name * — pick a match from the product search dropdown (auto-fills SKU / Code) or type a product name manually.
- Enter Size (e.g. M, 40, XL) and Colour (e.g. Navy Blue) if relevant, and add any Notes.
- Click Add to Wishlist.
2 Move a request through its lifecycle
- On a PENDING entry, click Notify once you have told the customer the item is available — this sets status to NOTIFIED and stamps the current time as notifiedAt.
- On a NOTIFIED entry, click Mark Fulfilled once the customer has actually bought the item.
- On either a PENDING or NOTIFIED entry, click Cancel if the customer no longer wants it.
3 Search, filter and remove entries
- Use the status chip row (ALL, PENDING, NOTIFIED, FULFILLED, CANCELLED) to narrow the list.
- Use the search box to filter by customer or product name.
- Click Delete on any entry and confirm to permanently remove it.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
+ Add to Wishlist | Opens the blank wishlist entry form. |
Customer Name * / Phone | Required name with live-search autocomplete against /customers; phone is optional. |
Product Name * / SKU / Code | Required product name with live-search autocomplete against /products (auto-fills SKU); SKU can also be typed manually. |
Size / Colour | Optional free-text size and colour the customer wants. |
Notes | Free-text notes on the request. |
Status | PENDING, NOTIFIED, FULFILLED, or CANCELLED — shown as a coloured dot and badge on each entry. |
Notify button | Shown only on PENDING entries; sets status to NOTIFIED and stamps notifiedAt with the current time. |
Mark Fulfilled button | Shown only on NOTIFIED entries; sets status to FULFILLED. |
Cancel button | Shown on PENDING or NOTIFIED entries; sets status to CANCELLED. |
Delete button | Permanently removes the entry after a confirmation prompt; available regardless of status. |
Status chip filters | ALL, PENDING, NOTIFIED, FULFILLED, CANCELLED. |
Search box | Filters by customer name or product name. |
"Added … · Notified …" line | Shows when the entry was created and, once notified, when that status change happened. |
Tips & Best Practices
- Search for the product using the Product Name field rather than typing it freehand where possible — picking a real product auto-fills its SKU, which makes it much easier later to match the entry against actual restocked inventory.
- Move entries to Notified as soon as you've actually told the customer, not before — the Notified timestamp is the only record you have of when that conversation happened.
- Periodically clear out old Cancelled and Fulfilled entries you no longer need to reference — there is no automatic archiving, so the list only grows unless entries are deleted manually.
Troubleshooting & FAQ
A customer's wanted item came back in stock — does this page tell me automatically?
I can't find this page in the sidebar even though other Garment pages are visible.
The product search dropdown isn't finding an item I know exists.
Marking an entry Notified didn't send anything to the customer.
🧑💻 Developer Notes
Source component(s):
frontend-app/pos-app-garment/src/pages/garment/WishlistPage.jsx
Backend endpoints used:
GET /garment/wishlistPOST /garment/wishlistPUT /garment/wishlist/:idDELETE /garment/wishlist/:idGET /customers (typeahead)GET /products (typeahead)
Related tables (db-core repositories):
GarmentWishlist
Redux slices:
None — local component state only
Feature flag key: customers
GET /garment/analytics/restocked-wishlist (ctrl.getRestockedWishlistItems, backed by getRestockedWishlistItems() in packages/pos-core/src/garment.js) is NOT called anywhere in WishlistPage.jsx — it is a separate, real endpoint that cross-references PENDING wishlist rows with a linked productId against current product.stock and returns only the ones now in stock, but it is consumed exclusively by a different screen, frontend-app/pos-app-garment/src/pages/garment/NewArrivalAlertPage.jsx (route /garment/new-arrival-alerts). So the endpoint is not dead code, but it is easy to assume (incorrectly) that this Wishlist page itself surfaces back-in-stock alerts — it does not; that logic lives entirely on the separate New Arrival Alerts page. The isRestocked check in that pos-core function only works for wishlist rows that were created with a productId (i.e. picked from the product search dropdown, not freehand-typed); a manually typed product name with no productId can never be detected as restocked.