Seasonal Pricing
Seasonal Pricing is a reference catalogue of time-bound special prices tied to festivals and events — e.g. a Diwali sweets rate or a Christmas cake rate — each with its own validity window and a live Active / Upcoming / Expired status.
Overview
Each rule records a Rule Name, the linked product (or a free-text item name), a Seasonal Price, a Start Date and End Date, and an optional Event/Occasion label and notes.
Status is computed live against today's date and the rule's Enabled/Disabled toggle: Active (enabled and today falls within the date range), Upcoming (start date is in the future), Expired (end date has passed), or shown as Disabled if the rule has been toggled off.
Use the filter tabs to quickly see everything currently in effect versus what is coming up or already over, which is useful when planning production and pricing well ahead of a festival.
Before You Start
- Requires the Advanced plan tier or above.
- The Start Date must be on or before the End Date — the form blocks saving otherwise.
Step-by-Step Guide
1 Create a seasonal price rule
- Click New Price Rule.
- Enter a Rule Name (e.g. "Diwali Special" or "Christmas Cake"), then search for and select the Item/Product — its current selling price pre-fills the Seasonal Price field, which you can then override.
- Set the Start Date and End Date for when this price should apply, and optionally fill in the Event/Occasion (e.g. "Diwali", "Wedding Season") and any Notes.
- Click Create — the new rule appears in the table with its status computed automatically from today's date.
2 Manage existing rules
- Use the Rule/Item/Price/Valid Period/Event/Status columns to review every rule at a glance; use the ALL / ACTIVE / UPCOMING / EXPIRED tabs to narrow the list.
- Click the toggle icon to Enable or Disable a rule without deleting it — a disabled rule never shows as Active even inside its date range.
- Click the pencil icon to edit any field, or the trash icon to permanently delete a rule (with a confirmation prompt).
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
New Price Rule | Opens the form to create a new seasonal/event pricing rule. |
Active Now / Total Rules tiles | Summary counts — Active Now reflects rules currently enabled and within their date range; Total Rules is every rule regardless of status. |
ALL / ACTIVE / UPCOMING / EXPIRED tabs | Filters the table: Active = enabled and in-range today, Upcoming = start date in the future, Expired = end date has passed. |
Rule column | The rule's descriptive name, e.g. "Diwali Special". |
Item column | The linked product or free-text item name this price applies to. |
Price column | The seasonal/special price recorded for this rule. |
Valid Period column | The Start Date → End Date range the price is meant to apply within. |
Event column | The optional festival/occasion label (e.g. Diwali, Christmas, Wedding Season). |
Status badge | Active (green), Upcoming (blue), Expired (grey) or Disabled (grey) depending on dates and the enabled toggle. |
Enable/Disable toggle | Turns a rule on or off without deleting it; a disabled rule is never shown as Active regardless of its dates. |
Edit (pencil icon) | Opens the rule form pre-filled for editing any field. |
Delete (trash icon) | Permanently removes the rule after a confirmation prompt. |
Tips & Best Practices
- Set up next year's major festival rules well in advance with future Start/End dates — they'll simply sit as "Upcoming" until their window arrives.
- Use the Event/Occasion field consistently (same spelling each year) so you can spot patterns when reviewing past festival pricing.
- Disable a rule instead of deleting it if you might reuse the same pricing next season — deleting removes the record entirely.
Troubleshooting & FAQ
A rule's dates are within range but its status still shows as not Active.
I can't save a new rule.
I don't see Seasonal Pricing in my sidebar at all.
Does this page automatically change the price customers pay at billing?
🧑💻 Developer Notes
Source component(s):
frontend-app/pos-app-backery/src/pages/bakery/SeasonalPricingPage.jsxfrontend-app/packages/pos-react-lib (ItemSearch — shared component)
Backend endpoints used:
GET /bakery/seasonal-pricesPOST /bakery/seasonal-pricesPUT /bakery/seasonal-prices/:idDELETE /bakery/seasonal-prices/:id
Related tables (db-core repositories):
SeasonalPriceProduct
Feature flag key: seasonal_pricing (requires advanced plan tier or above)
Bakery-only local component mounted at /bakery/seasonal. Status (Active/Upcoming/Expired) is computed entirely client-side by comparing startDate/endDate to today's date plus the isActive flag — there is no separate backend "status" field.