Memberships
Memberships lets you define one or more paid plans (e.g. "Gold Member" — a fee, a discount % off all services, and a validity period) and sell them to specific customers, so that customer automatically gets the plan's discount applied on future visits for as long as the membership is active.
Overview
This page is not saloon-exclusive under the hood — it uses BazaarPOS's generic Membership module (packages/pos-core/src/membership.js), which any product variant can use; the salon app simply surfaces it under the Saloon & Spa menu.
A Membership Plan defines a Name, a one-time or recurring Fee, a Discount % (applied to services at billing) and a Validity in days from the day it is sold.
Selling a membership to a customer creates a time-boxed record: Start Date = today, End Date = today + the plan's Validity Days, Status = ACTIVE. The membership fee itself is not charged at the moment you click Sell — the page explicitly tells you to "collect the fee at billing".
The discount this membership grants is applied later, at the point of sale on the Sales/Billing screen, when that customer is selected and an active (non-expired) membership is found for them — not automatically on this page.
Before You Start
- You must have the Billing feature enabled on your plan.
- The customer must already exist in Customers before you can sell them a membership (this page searches existing customers only — it does not create new ones).
Step-by-Step Guide
1 Create a membership plan
- Open Saloon & Spa → Memberships and click "+ New Plan".
- Enter Plan Name (required, e.g. "Gold Member"), Fee, Discount % and Validity (days).
- Click Create Plan — it immediately appears as a card under "Plans" and becomes selectable when selling.
2 Sell a membership to a customer
- Click "Sell Membership".
- Search for the customer by name or phone and select them from the results.
- Choose the Plan, then click Sell.
- A success message reminds you to "collect the fee at billing" — this page does not process any payment itself.
- The new membership immediately appears under "Members" with its Start/End date range and an Active/Expired status.
3 Apply a membership discount at billing
- On the Sales/Billing screen, select the same customer — an active membership for that customer (if one exists and has not expired) is picked up automatically by the billing screen and offered as a discount option.
- The discount percentage applied is always re-validated server-side against the live membership record at the moment of sale (never trusted from what the browser sends), so an expired or deactivated membership cannot be used even if the billing screen still shows it as an option from stale data.
4 Delete a plan
- Click Delete on a plan card and confirm. This removes the plan definition only — any customers who already bought that plan keep their existing membership record with the discount %/dates it had at the time of sale.
Every Field & Button, Explained
| Field / Button | What it does |
|---|---|
Plan Name | Required. Shown on both the Plans list and, once sold, as the Members list's "plan" label. |
Fee | The price of the membership — informational here; you must separately collect it via a sale on the Billing screen. |
Discount % | The percentage discount this plan grants on services when the member is billed, while the membership is active and not expired. |
Validity (days) | How many days from the sale date the membership stays active; End Date is computed automatically as sale date + this value. |
Members list — Status | Shown as "Active" (status ACTIVE and End Date ≥ today), "Expired" (End Date passed), or the raw status value for anything else. |
Tips & Best Practices
- Immediately after selling a membership, add its Fee as a custom line item (or otherwise record the payment) on that customer's next Sales/Billing transaction — nothing here does that for you automatically.
- Because deleting a plan does not touch already-sold memberships, it is safe to retire an old plan (e.g. rename/replace "Gold Member 2025") without breaking existing members' active discounts.