Home / Help Center / pos-app-garment / garment / Clienteling
👤 garment

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.

📍 Menu path: /garment/clienteling
👤 Who uses it: Owner,Manager,Staff

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

Step-by-Step Guide

1 Look up a customer's profile

  1. Type a name or phone number into the search box.
  2. Click a result from the dropdown to load that customer's full profile.

2 Review purchase history

  1. Check the Total Spend, Purchases and Wishlist Items tiles at the top for a quick summary.
  2. 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

  1. Open the Measurements panel to see any saved body measurements (only fields with a value are shown).
  2. 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

  1. 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 / ButtonWhat it does
Search customer by name or phoneDebounced (300ms) search against /customers, limited to 10 results.
Total SpendSum of the total field across the customer's most recent 20 sales fetched by the summary endpoint.
PurchasesCount of sales included in that same fetch.
Wishlist ItemsCount of the customer's pending wishlist entries.
Recent PurchasesUp to 10 rows shown — invoice number (or #id if missing), date, and total amount.
MeasurementsChest, 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.
PreferencesSize 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.
WishlistPending wishlist items for the customer, each shown with product name and size if saved.

Tips & Best Practices

Troubleshooting & FAQ

Measurements and Preferences show nothing even though I took this customer's measurements before.
The match is done by phone number first, falling back to name — if the phone on file for the measurement record doesn't exactly match the customer's saved phone (or the name differs even slightly), no match is found and the panel stays empty rather than erroring.
I can see totals and invoice numbers, but not which sizes/colours the customer bought.
The API does return a line-item-level recentItems array (product, quantity, subtotal) for the customer's recent sales, but the current Clienteling screen fetches it and never displays it — only invoice-level rows are shown for now.
Searching for a customer returns no results even though they exist.
The search box queries the general Customers list by name or phone — double-check spelling and phone formatting match what is saved on their Customer record.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/pos-app-garment/src/pages/garment/ClientelingPage.jsx

Backend endpoints used:

  • GET /customers
  • GET /garment/analytics/customer-summary

Related tables (db-core repositories):

  • Sale
  • SaleItem
  • Customer
  • GarmentMeasurement
  • GarmentWishlist

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.