Clienteling
Clienteling is a fashion-retail term for giving front-of-house staff a single personalised view of a customer — recent purchases, saved body measurements, size/style preferences, and wishlist — so they can serve a regular customer as if they remembered everything about them.
Overview
You search for a customer by name or phone, and the page pulls together their spend total, purchase count, wishlist count, up to ten recent invoices, any saved GarmentMeasurement record, and any pending wishlist items.
Measurements (chest, waist, hip, shoulder, sleeve, length, inseam, neck, all in inches) come from the same GarmentMeasurement record used by the Tailoring & Alterations flow, and only non-empty measurement fields are displayed.
A separate Preferences card lists Size Preferences (brand/category → size, e.g. "Zara: M") and Style Preferences (free-form style tags) — both are pulled from the sizePrefs/stylePrefs JSON columns on that same measurement record, so a customer needs a measurement record on file for this section to show anything at all.
This page is read-only — it is a lookup and briefing tool for the person serving the customer, not a place to edit measurements, preferences or wishlist items directly.
Before You Start
- Requires the "customers" plan feature to be enabled.
- A customer must already exist in Customers to be found by the search box.
- Measurements, Preferences and Wishlist sections all match by the customer's saved phone number first, then by name — they are not linked by a strict customer ID, so keep phone/name spelling consistent across screens for the match to work.
Step-by-Step Guide
1 Look up a customer's profile
- Type a name or phone number into the search box.
- Click a result from the dropdown to load that customer's full profile.
2 Review purchase history
- Check the Total Spend, Purchases and Wishlist Items tiles at the top for a quick summary.
- Scroll the Recent Purchases panel (up to 10 rows) for invoice number, date and amount of their last transactions.
3 Check measurements and style preferences
- Open the Measurements panel to see any saved body measurements (only fields with a value are shown).
- If a Preferences card appears below it, review their Size Preferences (per brand/category) and Style Preferences tags to personalise recommendations.
4 Check their wishlist
- If the customer has pending wishlist items, a Wishlist card lists each product name (with size, if saved) so you can mention restocks or suggest completing the purchase.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Search customer by name or phone | Debounced (300ms) search against /customers, limited to 10 results. |
Total Spend | Sum of the total field across the customer's most recent 20 sales fetched by the summary endpoint. |
Purchases | Count of sales included in that same fetch. |
Wishlist Items | Count of the customer's pending wishlist entries. |
Recent Purchases | Up to 10 rows shown — invoice number (or #id if missing), date, and total amount. |
Measurements | Chest, waist, hip, shoulder, sleeve, length, inseam, neck in inches, from the customer's GarmentMeasurement record (matched by phone, then name); only populated fields are shown. |
Preferences | Size Preferences (brand/category → size chips) and Style Preferences (free-form tags), sourced from the same measurement record's sizePrefs/stylePrefs JSON columns; the whole card is hidden if neither is populated. |
Wishlist | Pending wishlist items for the customer, each shown with product name and size if saved. |
Tips & Best Practices
- Take a GarmentMeasurement for every regular customer (via the Tailoring & Alterations / Measurements page) using the exact same name and phone number saved on their Customer record — Clienteling matches by those text fields, not a customer ID link.
- Use the Style Preferences tags consistently across your team (e.g. "Minimalist", "Bold prints") so any staff member pulling up a regular customer's profile gets the same shorthand.
- Check the Wishlist card before a customer leaves empty-handed — it is a ready-made upsell list of things they already told you they wanted.
Troubleshooting & FAQ
Measurements and Preferences show nothing even though I took this customer's measurements before.
I can see totals and invoice numbers, but not which sizes/colours the customer bought.
Searching for a customer returns no results even though they exist.
🧑💻 Developer Notes
Source component(s):
frontend-app/pos-app-garment/src/pages/garment/ClientelingPage.jsx
Backend endpoints used:
GET /customersGET /garment/analytics/customer-summary
Related tables (db-core repositories):
SaleSaleItemCustomerGarmentMeasurementGarmentWishlist
Redux slices:
None — local component state only
Feature flag key: customers
getCustomerSummary (packages/pos-core/src/garment.js) resolves the customer either directly by customerId or, failing that, by looking up Customer.name/Customer.phone, but it then matches GarmentMeasurement and GarmentWishlist rows purely by text equality on customerPhone/customerName — there is no foreign key relationship, so any formatting mismatch (e.g. missing country code, extra whitespace) silently produces empty Measurements/Preferences/Wishlist panels with no error surfaced to staff. The API response includes a recentItems array (per-line-item product name/quantity/subtotal across the customer's last 10 sales) that ClientelingPage.jsx fetches into `profile.recentItems` but never renders anywhere — a partially wired feature worth finishing if per-item purchase detail is wanted on this screen.