Style Lifecycle
Style Lifecycle lets you manually tag every product with a merchandising stage — Intro, Peak, Slow Mover or Clearance — so the whole team can see at a glance which styles to reorder, promote or mark down.
Overview
Every product in the catalogue (up to 500, fetched once via GET /products) is listed with a set of four stage buttons: Intro (new arrival — just launched), Peak (best seller — reorder recommended), Slow Mover (below target — consider promotion), and Clearance (end of life — mark down to clear).
Clicking a stage button saves it immediately via PUT /products/:id with a single field, { lifecycleStage: 'PEAK' } (etc.); clicking the currently-active stage again clears it back to untagged (null).
Stage counts, filter chips (All / Intro / Peak / Slow Mover / Clearance / Untagged) and a live search box (by name or SKU) all work off the same in-memory product list, so switching filters is instant with no extra network calls.
Before You Start
- Products must already exist in the catalogue — this page only tags existing products, it does not create them.
- The route requires the "inventory" plan feature; there is no plan-tier gate.
Step-by-Step Guide
1 Tag a style with its current stage
- Find the product using the search box (matches name or SKU) or by browsing the full list.
- Click the stage button that matches where the style currently sits — Intro, Peak, Slow Mover, or Clearance — on that product's row.
- The badge next to the product name updates immediately and the change saves to the server without a separate Save step.
2 Review stock by stage
- Use the stage summary chips at the top (All, Intro, Peak, Slow Mover, Clearance, Untagged) to filter the list to just that group, each with a live count.
- Combine a stage filter with the search box to find a specific style within that stage.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Stage summary chips | All / Intro / Peak / Slow Mover / Clearance / Untagged — each shows a live count and filters the list below when clicked. |
Search box | Filters the already-loaded product list by name or SKU as you type; no separate server call. |
Product row | Shows product name, SKU, category and season (when set), plus its current stage badge (if tagged) and the four stage buttons. |
Intro button | Tags the product lifecycleStage = INTRO ("new arrival — just launched"). |
Peak button | Tags the product lifecycleStage = PEAK ("best seller — reorder recommended"). |
Slow Mover button | Tags the product lifecycleStage = SLOW_MOVER ("below target — consider promotion"). |
Clearance button | Tags the product lifecycleStage = CLEARANCE ("end of life — mark down to clear"). |
Stage badge | Coloured pill shown next to a tagged product's name (Intro indigo, Peak green, Slow Mover amber, Clearance red); absent for untagged products. |
Tips & Best Practices
- Re-tag styles on a regular cadence (e.g. weekly) rather than only once at launch — Style Lifecycle has no automatic re-evaluation, so a style that has actually slowed down will keep showing Peak until someone changes it.
- Use the Clearance tag as your trigger to start markdown pricing or move the style into a Promotions campaign, since tagging here does not itself apply any discount.
- Filter by Untagged periodically to catch new stock that nobody has classified yet.
Troubleshooting & FAQ
Does the stage change automatically based on how well a style is actually selling?
I clicked a stage button and the badge disappeared instead of changing.
The stage button looked stuck / greyed out for a moment.
Tagging a product Clearance didn't change its price or add it to a promotion.
🧑💻 Developer Notes
Source component(s):
frontend-app/pos-app-garment/src/pages/garment/StyleLifecyclePage.jsx
Backend endpoints used:
GET /productsPUT /products/:id
Related tables (db-core repositories):
Product (lifecycleStage TEXT column)
Redux slices:
None — local component state only
Feature flag key: inventory
lifecycleStage is a plain free-text column added directly to the generic Product table (see the `ALTER TABLE "Product" ADD COLUMN IF NOT EXISTS "lifecycleStage" TEXT` migrations in backend/src/lib/db.js) rather than a garment-specific table, so it rides on the same generic PUT /products/:id endpoint used everywhere else in BazaarPOS. This is entirely a manual tagging tool — despite "lifecycle" implying automation, there is no cron job, sales-velocity calculation, or stock-age logic anywhere in this component or its backend call that ever sets or changes the stage on its own; every transition is a direct user click. A useful future enhancement (not currently built) would be to auto-suggest Slow Mover/Clearance based on days-since-last-sale or sell-through rate, similar to how Season Comparison already aggregates historic sales data elsewhere in the garment variant.