CRM Product Spec · crm-v1.4
Product spec for the Loyalty Program Designer — a visual, template-driven CRM tool that lets club operators design their loyalty program from scratch. Templates to start fast, full configurability to customise every detail, and a live member preview so operators see exactly what members will experience before going live.
Program Models
The designer supports four distinct loyalty mechanics. The chosen model determines which templates are available and which configuration options are shown.
Earn points, redeem rewards.
Members earn points on every qualifying action (bookings, POS spend, program enrollments). Points accumulate in a spendable balance. Staff redeem points against a rewards catalogue at the front desk.
Example Mechanic
Book 1 hour → earn 10 pts. Accumulate 200 pts → redeem for 1 free court hour.
Best for: Clubs that want a flexible, long-term loyalty economy. Most versatile model.
Spend money, earn credit back.
Members earn club credit (not abstract points) as a percentage of their spend. Credit automatically applies to their next booking or POS purchase. Simple and immediately tangible.
Example Mechanic
Book ฿1,400 court → earn ฿70 credit (5% back). Credit applied on next booking.
Best for: High-frequency clubs where spend is the primary driver. Members love seeing 'you saved ฿X'.
Book N times, get one free.
Classic loyalty mechanic. Every completed booking punches a card. After reaching the target count, the member earns a free session. Resets automatically after each redemption.
Example Mechanic
Book 10 courts, get the 11th free (฿1,400 value).
Best for: Simple operations that want minimal configuration. Easy to explain to members.
Reach a tier, unlock perks.
No points currency. Members progress through tiers based on their lifetime booking count or spend. Each tier unlocks standing perks (court discounts, priority booking, free racket rental) that apply automatically.
Example Mechanic
Book 20+ sessions → Silver tier → 5% off all future bookings applied at checkout.
Best for: Clubs that want to reward loyal members with automatic discounts without managing a points economy.
Templates
Templates pre-fill the designer canvas with sensible defaults. Every field remains fully editable after selection — templates are a starting point, not a constraint.
Easy to understand, easy to explain.
The classic earn-and-redeem template. Members earn a flat number of points per booking. Points redeem for court credit or discounts. No tiers — just a simple balance and rewards catalogue. Perfect starting point for clubs launching their first loyalty program.
Pre-filled Config
Club Rewards
pts
Points never expire
Sample Rewards
Best for: Clubs launching their first program. Minimal setup, immediate member value.
Status + rewards. The full loyalty experience.
Points plus a four-tier status ladder. Members earn points per hour played, progress through Bronze → Silver → Gold → Platinum, and unlock escalating perks at each level. Spending points doesn't drop your tier — lifetime points determine status. Best-in-class loyalty design used by major sports and hospitality brands.
Pre-filled Config
Club Rewards
pts
Points expire after 365 days of inactivity
Tier Ladder
Welcome to the program
5% off all bookings
10% off + priority booking
15% off + exclusive events
Sample Rewards
Best for: Clubs that want a premium, full-featured program. Creates aspiration and loyalty over time.
Spend money, earn credit back automatically.
Members earn a percentage of their court spend back as club credit. Credit is applied automatically to their account balance and deducted on the next booking. No points to track — just visible savings. Simple, transparent, and immediately rewarding.
Pre-filled Config
Cashback Rewards
credit
Credit expires after 90 days
Best for: High-frequency players who book regularly. Cashback feels tangible and immediate.
Book 10, get the 11th free.
The simplest loyalty mechanic. Every completed booking adds one punch to the card. Reach the target (e.g. 10 bookings) and earn a free session. The card resets automatically. No points, no tiers — just a visible countdown that members love.
Pre-filled Config
Court Punch Card
punches
Punches never expire
Best for: Casual clubs that want a loyalty program without the complexity of points or tiers.
UX Screens
Every screen in the loyalty designer, with ASCII mockups showing exact layout, components, and interactions.
The entry point. Shown only on first-time program creation. Presents 4 template cards plus a 'Start from scratch' option. Selecting a template pre-fills the designer canvas with sensible defaults. Users can change everything after.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ CRM / Loyalty / New Program │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ Choose a starting template │ │ Pick a template to pre-fill your program. You can change │ │ everything after — templates are just a starting point. │ │ │ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │ │ ★ Simple Points │ │ 🏆 Tiered Club │ │ │ │ │ │ │ │ │ │ Earn pts per booking│ │ Bronze → Silver │ │ │ │ Spend on rewards │ │ → Gold → Platinum │ │ │ │ │ │ │ │ │ │ Best for clubs │ │ Best for clubs │ │ │ │ launching their │ │ wanting status and │ │ │ │ first program │ │ escalating rewards │ │ │ │ │ │ │ │ │ │ [ Use template ] │ │ [ Use template ] │ │ │ └──────────────────────┘ └──────────────────────┘ │ │ │ │ ┌──────────────────────┐ ┌──────────────────────┐ │ │ │ 💵 Cashback │ │ ✓ Punch Card │ │ │ │ │ │ │ │ │ │ Earn % back as │ │ Book 10 courts, │ │ │ │ club credit on │ │ get the 11th free │ │ │ │ every booking │ │ │ │ │ │ │ │ Best for simple │ │ │ │ Best for high- │ │ operations with │ │ │ │ frequency clubs │ │ minimal setup │ │ │ │ │ │ │ │ │ │ [ Use template ] │ │ [ Use template ] │ │ │ └──────────────────────┘ └──────────────────────┘ │ │ │ │ ───────────────────────────────────────────────────────────────── │ │ [ Start from scratch — blank canvas ] │ │ │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
The main design workspace. Two-panel layout: configuration sidebar on the left, live member preview on the right. As the operator changes settings, the preview updates in real time so they see exactly what members experience before going live.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐
│ CRM / Loyalty / Settings │
├─────────────────────────────────┬────────────────────────────────────┤
│ CONFIGURE │ MEMBER PREVIEW │
│ │ │
│ Program Name │ ┌──────────────────────────────┐ │
│ ┌───────────────────────────┐ │ │ 🥉 BRONZE MEMBER │ │
│ │ Pad Thai Padel Rewards │ │ │ Sarah K. · Member │ │
│ └───────────────────────────┘ │ │ │ │
│ │ │ 450 pts │ │
│ Points Name │ │ Lifetime 450 pts │ │
│ ○ pts ○ stars ● tokens │ │ │ │
│ │ │ ─────────────────────────── │ │
│ ───────────────────────────── │ │ Progress to Silver │ │
│ Earn Rules ▸ │ │ ████████████░░ 90% │ │
│ Tier Ladder ▸ │ │ 50 pts to Silver │ │
│ Rewards Catalogue ▸ │ │ │ │
│ Expiry Policy ▸ │ └──────────────────────────────┘ │
│ │ │
│ ───────────────────────────── │ How members earn tokens: │
│ Program Status │ • 10 tokens / hour on court │
│ ○ Inactive ● Active │ • 5 tokens per ฿100 at shop │
│ │ │
│ ───────────────────────────── │ Available Rewards │
│ [ Save Changes ] │ ┌──────────────────────────────┐ │
│ │ │ Free Court Hour 200 tokens │ │
│ Last saved: 2 mins ago │ │ 20% Booking Disc 150 tokens │ │
│ │ │ Club T-Shirt 300 tokens │ │
└─────────────────────────────────┤ └──────────────────────────────┘ │
│ │
│ Redeem at the front desk → │
└────────────────────────────────────┘Components
Notes & Edge Cases
Configure how members earn points. Three earn sources — bookings, POS, and program enrollments — each independently toggled and rate-configured. A live calculation preview shows concrete examples ('A 2-hr booking = 20 pts').
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ ← Earn Rules │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ Court Bookings [ ● ] ON │ │ ───────────────────────────────────────────────────────────────── │ │ Earn rate │ │ ● Per hour played ○ Flat per booking │ │ │ │ Points per hour │ │ ┌────────────────┐ │ │ │ 10 │ pts / hour │ │ └────────────────┘ │ │ │ │ POS / Shop [ ● ] ON │ │ ───────────────────────────────────────────────────────────────── │ │ Points per ฿100 spent │ │ ┌────────────────┐ │ │ │ 5 │ pts per ฿100 │ │ └────────────────┘ │ │ │ │ Program Enrollments [ ○ ] OFF │ │ ───────────────────────────────────────────────────────────────── │ │ Points per enrollment │ │ ┌────────────────┐ │ │ │ 50 │ pts flat (toggled off — won't apply) │ │ └────────────────┘ │ │ │ │ ───────────────────────────────────────────────────────────────── │ │ Earn Preview │ │ ┌──────────────────────────────────────────────────────────────┐ │ │ │ A 1-hr booking → 10 pts │ │ │ │ A 2-hr booking → 20 pts │ │ │ │ A 90-min booking → 15 pts │ │ │ │ ฿500 shop order → 25 pts │ │ │ │ Program enroll → — (source disabled) │ │ │ └──────────────────────────────────────────────────────────────┘ │ │ │ │ [ Apply ] [ Cancel ] │ │ │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
Design the tier progression. Up to 6 tiers, each with a custom name, lifetime-points threshold, court discount %, POS discount %, and a freetext perks description. An inline tier preview shows the full ladder at a glance.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ ← Tier Ladder │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ Tiers are earned from lifetime points (total ever earned). │ │ Spending points does NOT drop a member's tier. │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Tier 1 ┌─────────────┐ from ┌──────────┐ pts │ │ │ │ │ Bronze │ │ 0 │ (welcome tier) │ │ │ │ └─────────────┘ └──────────┘ │ │ │ │ Court discount ┌──┐ % POS discount ┌──┐ % │ │ │ │ │ 0│ │ 0│ │ │ │ │ └──┘ └──┘ │ │ │ │ Perks ┌──────────────────────────────────────────────────┐ │ │ │ │ │ Welcome to Pad Thai Padel Rewards! │ │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Tier 2 ┌─────────────┐ from ┌──────────┐ pts │ │ │ │ │ Silver │ │ 500 │ │ │ │ │ └─────────────┘ └──────────┘ │ │ │ │ Court discount ┌──┐ % POS discount ┌──┐ % │ │ │ │ │ 5│ │ 5│ │ │ │ │ └──┘ └──┘ │ │ │ │ Perks ┌──────────────────────────────────────────────────┐ │ │ │ │ │ 5% off all bookings + priority court booking │ │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Tier 3 ┌─────────────┐ from ┌──────────┐ pts │ │ │ │ │ Gold │ │ 1,500 │ │ │ │ │ └─────────────┘ └──────────┘ │ │ │ │ Court discount ┌──┐ % POS discount ┌──┐ % │ │ │ │ │10│ │10│ │ │ │ │ └──┘ └──┘ │ │ │ │ Perks ┌──────────────────────────────────────────────────┐ │ │ │ │ │ 10% off + priority booking + free racket rental │ │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Tier 4 ┌─────────────┐ from ┌──────────┐ pts │ │ │ │ │ Platinum │ │ 5,000 │ │ │ │ │ └─────────────┘ └──────────┘ │ │ │ │ Court discount ┌──┐ % POS discount ┌──┐ % │ │ │ │ │15│ │15│ │ │ │ │ └──┘ └──┘ │ │ │ │ Perks ┌──────────────────────────────────────────────────┐ │ │ │ │ │ 15% off + exclusive events + VIP lounge access │ │ │ │ │ └──────────────────────────────────────────────────┘ │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ [ + Add Tier ] (max 6) [ − Remove last tier ] │ │ │ │ ───────────────────────────────────────────────────────────────── │ │ Tier Ladder Preview │ │ Bronze ─── 0 Silver ─── 500 Gold ─── 1,500 Pt ─ 5,000│ │ ●──────────────────●────────────────────●───────────────────────● │ │ │ │ [ Apply ] [ Cancel ] │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
Control how long earned points are valid. Operators choose between 90/180/365-day rolling windows or 'never expires'. When expiry is enabled, a nightly pg_cron job expires stale points and decrements the member's spendable balance.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ ← Points Expiry │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ Enable expiry [ ● ] ON │ │ ───────────────────────────────────────────────────────────────── │ │ │ │ Points expire after: │ │ ○ 90 days ○ 180 days ● 365 days ○ Never │ │ │ │ ───────────────────────────────────────────────────────────────── │ │ Example │ │ Points earned on Jan 1, 2026 expire on Jan 1, 2027. │ │ Expiry check runs nightly at 02:00 (Asia/Bangkok time). │ │ │ │ ───────────────────────────────────────────────────────────────── │ │ ⚠ Members are not yet notified before expiry. │ │ Expiry email warnings are planned for v1.5. │ │ │ │ When expiry is off: │ │ Points earned today are valid forever. Simpler for members, │ │ but no urgency to redeem. Recommended for programs just launching. │ │ │ │ [ Apply ] [ Cancel ] │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
Define what members can redeem their points for. Each reward has a point cost, type (court credit, discount %, free session, merchandise, other), and a value payload. Staff redeem rewards at the front desk in v1.4 — members see the catalogue but cannot self-redeem.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ CRM / Loyalty / Rewards [ + New Reward ] │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Free Court Hour ● active │ │ │ │ 200 pts · court credit · 1 hour = ฿1,400 credit │ │ │ │ [ Edit ] [ Disable ] │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ 20% Booking Discount ● active │ │ │ │ 150 pts · discount % · 20% off one booking │ │ │ │ [ Edit ] [ Disable ] │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Club T-Shirt ● active │ │ │ │ 300 pts · merchandise · "Pad Thai Padel" branded tee │ │ │ │ [ Edit ] [ Disable ] │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Free Racket Rental [INACTIVE] ○ inactive │ │ │ │ 100 pts · free session · 60-min racket rental │ │ │ │ [ Edit ] [ Enable ] │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ ───────────────────────────────────────────────────────────────── │ │ ℹ Staff redeem rewards at the front desk. Members see this │ │ catalogue on their account page but cannot self-redeem in v1.4.│ │ │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
Embedded in the designer canvas. Shows the program exactly as a member would see it on the web app. Uses a simulated Bronze-tier member (450 pts) to demonstrate tier progression realistically. Updates in real time as the operator configures.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ MEMBER PREVIEW [ Change simulated tier]│ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ 🥉 BRONZE │ │ │ │ Sarah K. · Member since Jan 2025 │ │ │ │ │ │ │ │ Current Balance Lifetime Points │ │ │ │ 450 pts 450 pts │ │ │ │ │ │ │ │ ──────────────────────────────────────────────────────────── │ │ │ │ Progress to Silver │ │ │ │ ████████████████████░░░░ 450 / 500 pts 90% │ │ │ │ 50 pts to unlock Silver │ │ │ │ │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ How Sarah earns pts: │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Court booking → 10 pts per hour │ │ │ │ Shop purchase → 5 pts per ฿100 spent │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ Available Rewards: │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Free Court Hour 200 pts │ │ │ │ 20% Booking Discount 150 pts │ │ │ │ Club T-Shirt 300 pts │ │ │ │ │ │ │ │ Redeem at the front desk → │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ Recent Activity: │ │ ┌────────────────────────────────────────────────────────────────┐ │ │ │ Mar 28 Booking — Court A, 2hr +20 pts │ │ │ │ Mar 25 Shop — Grip tape +5 pts │ │ │ │ Mar 20 Booking — Court B, 1hr +10 pts │ │ │ └────────────────────────────────────────────────────────────────┘ │ │ │ │ This is a preview — not a real member account │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
The loyalty section landing page. Shows the program's live status, key metrics, earn rate summary, tier ladder visual, and a top earners leaderboard. The central dashboard for operators managing an active program.
Layout Mockup
┌──────────────────────────────────────────────────────────────────────┐ │ CRM / Loyalty │ ├──────────────────────────────────────────────────────────────────────┤ │ │ │ Pad Thai Padel Rewards [ ● ] ACTIVE │ │ crm-v1.4 · points-based · 4 tiers · Smash Points │ │ │ │ ┌───────────────────┐ ┌───────────────────┐ ┌──────────────────┐ │ │ │ Total Members │ │ Points Issued │ │ Redemptions │ │ │ │ 847 │ │ (this month) │ │ (this month) │ │ │ │ enrolled │ │ 12,430 pts │ │ 23 │ │ │ └───────────────────┘ └───────────────────┘ └──────────────────┘ │ │ │ │ Earn Rates Tier Ladder │ │ ┌──────────────────────┐ ┌──────────────────────────────────────┐ │ │ │ Court 10 pts/hr │ │ Bronze ─── 0 Silver ─── 500 │ │ │ │ POS 5 pts/฿100 │ │ ●──────────────────● │ │ │ │ Prog off │ │ Gold ─── 1,500 Platinum ─── 5,000 │ │ │ └──────────────────────┘ │ ●────────────────────────●│ │ │ └──────────────────────────────────────┘ │ │ │ │ Tier Distribution Top Earners — March 2026 │ │ ┌──────────────────────┐ ┌──────────────────────────────────────┐ │ │ │ Bronze 584 (69%) │ │ 1. Ahmad S. Gold 2,840 pts │ │ │ │ Silver 187 (22%) │ │ 2. Maria C. Silver 1,620 pts │ │ │ │ Gold 63 (7%) │ │ 3. James T. Silver 1,580 pts │ │ │ │ Platinum 13 (2%) │ │ 4. Priya N. Bronze 940 pts │ │ │ └──────────────────────┘ │ 5. Tom W. Bronze 880 pts │ │ │ └──────────────────────────────────────┘ │ │ │ │ [ Settings ] [ Rewards ] [ View Member Ledgers → ] │ │ │ └──────────────────────────────────────────────────────────────────────┘
Components
Notes & Edge Cases
Config Reference
Every configurable field in the designer — field name, input type, constraints, default value, and description.
name
Program Name
Displayed on the member web app account page and in all member communications.
points_name
Points Name
What the club calls their currency. Shown everywhere: 'Earn 10 pts' vs 'Earn 10 stars'. Consistent singular form is used (not pluralised in the UI).
earn_rules.booking.enabled
Court Booking Earn — Enabled
When OFF, completing a court booking awards zero points.
earn_rules.booking.type
Court Booking Earn — Rate Type
'Per hour' rewards longer sessions (90 min = 1.5x vs 60 min). 'Per booking' is flat regardless of duration.
earn_rules.booking.points
Court Booking Earn — Points
Points awarded per hour (if per_hour) or per booking (if per_booking).
earn_rules.pos.enabled
POS Earn — Enabled
When OFF, POS orders award zero points.
earn_rules.pos.points_per_100_units
POS Earn — Points per 100 currency units
Points per 100 units of the facility currency (e.g. ฿100 or $1.00). Currency label shown dynamically.
earn_rules.program.enabled
Program Enrollment Earn — Enabled
When ON, enrolling in a paid or free program awards a flat point bonus.
earn_rules.program.points_per_enrollment
Program Enrollment Earn — Points
Flat points awarded per program enrollment. Same value regardless of program price.
tiers[N].name
Tier Name
Displayed on the member's tier badge. Can be customised (e.g. 'Member', 'Regular', 'VIP', 'Elite').
tiers[N].lifetime_threshold
Tier Threshold (lifetime points)
Minimum lifetime points to reach this tier. Based on total ever earned — spending points cannot drop the tier.
tiers[N].court_discount_pct
Tier Court Discount %
Percentage discount applied to court booking price for members at this tier. Applied via calculate_member_price() at checkout.
tiers[N].pos_discount_pct
Tier POS Discount %
Percentage discount applied to POS purchase total for members at this tier.
tiers[N].perks
Tier Perks Description
Freetext description of what this tier unlocks. Displayed on the member web app account page.
expiry_policy.enabled
Points Expiry — Enabled
When OFF, points never expire. Recommended for programs launching for the first time.
expiry_policy.window_days
Expiry Window (days)
Points earned today expire after this many days. Checked nightly at 02:00 (facility timezone).
Design Principles
Live preview eliminates guesswork
Operators should never have to imagine what the program looks like to members. The right panel mirrors the member web app exactly, updating in real time. If a threshold changes, the progress bar moves instantly. If a reward is added, it appears in the preview immediately.
Templates accelerate setup, not restrict
Templates pre-fill every field but lock nothing. An operator who picks 'Tiered Club' can immediately change 'Gold' to 'VIP' and reduce the threshold from 1,500 to 1,000 — no friction. Templates are a starting point, not a cage.
Destructive defaults are opt-in
Points expiry is OFF by default. Program status is Inactive by default. The operator must explicitly activate the program before it affects members. Nothing goes live accidentally.
Contextual guidance at decision points
Every configuration section includes a short rationale alongside the inputs. 'Per hour rewards longer sessions.' 'Spending points does not drop tier.' These micro-explanations reduce support questions and help operators make informed decisions.
Earn preview = confidence builder
The earn rules panel shows concrete examples before saving: 'A 2-hr booking = 20 pts'. Operators immediately understand the mechanics without math. Changes to rates update examples instantly.
Dark, minimal, amber-accented
Follows Setpoint CRM design system exactly: dark background, sharp edges, amber (#F59E0B) for primary accents and active states, muted gray for secondary information. Consistent with the rest of the CRM admin experience.