A sports-native CRM built into Setpoint — unified customer history, smart segments, messaging automation, and loyalty programs designed for clubs.
Planning7 versions planned34 features6 categories
MVP Plan
Version Roadmap
CRM is a module inside Setpoint — same DB, same auth, same design system as PMS. Each version ships independently and builds on the previous one.
1
crm-v1.0— Foundation Planned
App scaffold, auth, customer directory, deploy
Stand up the CRM as a new Next.js app inside the Setpoint monorepo. Auth and customers reuse the Setpoint Supabase DB. Customer directory reads from existing customers, bookings, and POS tables. Sidebar mirrors PMS admin exactly. Deployed to Vercel.
Scope
Next.js 16 app in apps/crm — mirrors apps/admin structure
Email + password auth via Setpoint Supabase (same auth.users table)
Facility selector — same multi-facility pattern as PMS admin
apps/admin design system (same shadcn/ui components)
@setpoint/database package
@setpoint/common package
Note
No new auth infrastructure. CRM staff log in with the same credentials as PMS admin. RLS on crm_* tables uses the same facility_id scoping pattern as PMS.
2
crm-v1.1— Activity Timeline Planned
Every customer interaction in one chronological feed
Each contact detail page shows a unified activity timeline pulling from all Setpoint data sources — bookings, POS transactions, matches, program enrolments, and payments. Nothing is hidden from staff.
Scope
Timeline component — chronological feed, grouped by date, infinite scroll
Booking events — court booked, checked in, cancelled, no-show
POS events — order placed, items purchased, refund issued
Match events — match played, result submitted, result confirmed, Elo change
Program events — enrolled, waitlisted, promoted, completed
Timeline filters — filter by event type (bookings / POS / matches / programs)
Timeline export — CSV download of activity history per contact
Database
No new tables — read-only joins across: bookings, pos_orders, pos_order_items, matches, match_players, program_enrollments, member_credits, payments
crm_activity_cache (optional) — materialised view or pg function to speed up timeline queries at scale
Dependencies
crm-v1.0
Note
Timeline is read-only — staff cannot edit historical data through the CRM. All writes still happen through PMS admin or POS.
3
crm-v1.2— Segments Planned
Smart customer groups that stay current automatically
Create manual segments by hand-picking members, or define rule-based dynamic segments that update automatically as customer behaviour changes. Inactivity and churn-risk segments run on pg_cron.
Scope
Segment list page — name, type (manual/dynamic), member count, last updated
Manual segments — hand-pick members from contact directory, add/remove anytime
Dynamic segments — rule builder: last visit, booking count, sport, membership tier, spend threshold, join date
Inactivity segments — 'no booking in X days' automatically evaluated nightly
Sport segments — filter by primary sport (padel / tennis / pickleball / multi-sport)
Churn risk segment — personal baseline: flagged if silent relative to own usual frequency
Segment detail page — member list, filter, export CSV
Segment member count badge shown live on sidebar
pg_cron job — nightly refresh of all dynamic segment memberships
RLS: facility-scoped, only facility staff can read/write
pg_cron: nightly evaluate_crm_segments() function refreshes dynamic memberships
Dependencies
crm-v1.0
4
crm-v1.3— Campaigns Planned
Broadcast messages to any segment via email or WhatsApp
Build and send broadcast campaigns to any customer segment. Email campaigns via Resend. WhatsApp via WhatsApp Business API. Scheduled or send immediately. Campaign analytics show open rate, click rate, and bounces.
Scope
Campaign list — name, segment target, channel, status (draft/scheduled/sent), sent count, open rate
WhatsApp requires WhatsApp Business API credentials per facility. Email uses Resend (already integrated). v1.3 ships email first; WhatsApp can follow without a schema change.
5
crm-v1.4— Loyalty & Points Planned
Points, tiers, and rewards that bring members back
Configure how customers earn points — per booking, per baht/dollar spent at POS, per program enrolment. Members advance through Bronze → Silver → Gold → Platinum tiers. Redeem points for court credits, free sessions, and merchandise discounts.
Scope
Loyalty config — enable/disable per facility, points name (pts / stars / tokens), currency display
Earning rules — points per booking (flat or per hour), points per POS spend (per unit currency), points per program enrolment
Tier thresholds — 4 tiers with configurable lifetime-points threshold and tier name
Tier perks — free text description of perks per tier (shown to members)
Points ledger per contact — chronological log of earned, spent, expired
Current tier + progress bar toward next tier on contact detail page
Rewards catalogue — list of redeemable rewards with point cost
Redeem flow — staff redeems on behalf of customer at front desk
Points expiry — configurable window (90/180/365 days or never), nightly pg_cron expiry job
Tier change notifications — auto-email on tier upgrade/downgrade
pg_cron: nightly expire_loyalty_points() function marks expired entries
Dependencies
crm-v1.0
crm-v1.1
Note
Points are earned automatically via Supabase DB triggers on bookings, pos_orders, and program_enrollments inserts. No manual staff action needed for earning.
6
crm-v1.5— Automations & Drip Sequences Planned
Set-and-forget messaging triggered by real behaviour
Define automation triggers that fire when a customer does something — first booking, birthday, post-match, inactivity — and send a message automatically. Drip sequences extend this into multi-step flows.
Scope
Automation list — name, trigger, channel, status (active/paused), fires last 30 days
Trigger types — first booking, birthday (annually), post-match (1h after match), inactivity (X days), tier upgrade, tier downgrade, program enrolment, program completion
Delay controls — send immediately or delay N hours/days after trigger
Drip sequences — chain of messages triggered by a single event, each with its own delay
Channel per step — each step can use different channel (email / WhatsApp)
Merge tags — personalised content using customer and facility data
crm_automation_executions — id, automation_id, step_id, profile_id, triggered_at, scheduled_at, sent_at, status
Dependencies
crm-v1.3
crm-v1.4
7
crm-v2.0— Advanced Analytics & Network Planned
RFM scoring, partner networks, referrals, family accounts
The features that are only possible because Setpoint owns the full data stack — POS, bookings, matches, and programs all in one database. These analytics cannot be replicated by a generic CRM.
pg_cron: nightly recalculate_rfm_scores() and refresh_partner_network()
Dependencies
crm-v1.1
crm-v1.2
crm-v1.4
crm-v1.5
Note
Playing Partner Network is derived from match_players join — two profiles that appear together in matches at the same facility. No new data collection needed, just a materialised graph.
Feature Overview
All 34 Features
Complete feature catalogue across all versions. Each feature card shows which version it ships in.
Customer Profiles
One complete profile per customer — contacts, notes, tags, and full history.
5 features
👤crm-v1.0
Unified Customer Profile
Name, photo, phone, email, tags, and internal notes — all in one place. Staff see the full picture before any interaction.
📋★ Differentiatorcrm-v1.1
Activity Timeline
Chronological feed of every interaction: bought a drink, booked a court, joined a program, won a match. Nothing hidden.
🔍crm-v1.0
Search & Filters
Find any customer instantly by name, phone, email, tag, segment membership, sport, or last visit date.
📝crm-v1.0
Staff Notes
Private comments on any customer visible only to staff. Useful for VIP preferences, payment issues, or injury notes.
🔗crm-v2.0
Duplicate Merge
Detect and merge duplicate records created from different channels (POS walk-in vs online booking) into one clean profile.
Customer History
Every interaction the customer has had with the club, across every product.
5 features
🧾crm-v1.1
POS Transaction History
Full itemized order history from the point of sale — food, drinks, retail, court fees, refunds, and payment methods.
🎾crm-v1.1
Booking History
Every court session the customer has booked: date, sport, court, duration, price, and whether they showed up.
⚔️★ Differentiatorcrm-v1.1
Match History
Results, opponents, scores, and win/loss record from every match played at the club — pulled from OpenRally data.
📚crm-v1.1
Events & Programs History
Every program enrollment, event registration, attendance record, and completion status — in one timeline.
💳crm-v1.1
Payment & Credit History
Gift card balances, redemptions, credits issued, refunds processed, and outstanding balances.
Customer Segments
Group customers intelligently and keep those groups up to date automatically.
6 features
⚡crm-v1.2
Dynamic Segments
Rules-based segments that update automatically as customer behaviour changes. Set it once, always current.
✋crm-v1.2
Manual Segments
Hand-pick members into a group — useful for VIPs, test groups, or lists managed by the front desk.
💤crm-v1.2
Inactivity Segments
Automatically surface members who haven't visited or booked in a configurable number of days.
🎾crm-v1.2
Sport-Based Segments
Filter by primary sport: padel-only players, tennis members, multi-sport bookings, beginner vs advanced.
🚨★ Differentiatorcrm-v2.0
Churn Risk Segments
Players going silent relative to their own personal activity baseline — not a global threshold. If someone usually plays 3x/week and goes dark for 10 days, they're flagged.
📈crm-v2.0
RFM Scoring
Automatically score every customer on Recency, Frequency, and Monetary value. Surface your best customers and those at risk without manual analysis.
Messaging & Automation
Reach customers on the channels they actually use, triggered by real behaviour.
6 features
📢crm-v1.3
Broadcast Campaigns
Send a message to any segment via email or WhatsApp in a few clicks. Scheduled or send immediately.
📄crm-v1.3
Message Templates
Pre-built templates for the most common scenarios: new member welcome, win-back, birthday offer, program nudge, booking reminder.
⚙️crm-v1.5
Automated Triggers
Set-and-forget automations: welcome message on first booking, birthday message, post-match follow-up, re-engagement after inactivity.
🔁crm-v1.5
Drip Sequences
Multi-step message flows triggered by a single event — e.g., 'enrolled in program' → day 1 welcome → day 3 tip → day 7 progress check.
📊crm-v1.3
Campaign Analytics
Open rate, click rate, reply rate, and conversion tracking per campaign. Know what messaging is working.
📱★ Differentiatorcrm-v1.3
WhatsApp & LINE Native
First-class WhatsApp Business API and LINE integration — not just email and SMS. Thai and Indonesian members will actually read and reply.
Loyalty & Rewards
Keep members coming back with a points system, tiers, and redeemable rewards.
6 features
⭐crm-v1.4
Points Earning Rules
Configure exactly how points are earned: per booking, per ฿/Rp spent at POS, per program enrolment, per match played.
🏅crm-v1.4
Loyalty Tiers
Bronze → Silver → Gold → Platinum tiers with configurable thresholds and perks like court credits, priority booking, or free ball rentals.
🎁crm-v1.4
Rewards Catalogue
Members redeem points for real rewards: court credits, free sessions, merchandise discounts, event priority access.
⏳crm-v1.4
Points Expiry & Balance Management
Configurable expiry windows, low-balance alerts, and a full audit log of points earned, spent, and expired per member.
🔔crm-v1.4
Tier Notifications
Automatic messages when a member is close to upgrading a tier, when they unlock a new tier, or when they're at risk of dropping down.
🎖️★ Differentiatorcrm-v2.0
Milestone Badges
Gamified achievements separate from points: 50 hours on court, 100 bookings, first tournament finish, top scorer of the month. Shareable on WhatsApp.
Differentiators
Features only possible because Setpoint owns the full data stack — POS, bookings, matches, and programs.
6 features
📈
Sport Activity ScoreDifferentiatorcrm-v2.0
Scores customers by booking frequency, program participation, and match activity — not just spend. A player booking 4x/week with no café spend is scored higher than a monthly big spender. No generic CRM does this.
🕸️
Playing Partner NetworkDifferentiatorcrm-v2.0
Map who plays with whom. Identify squad leaders — players with 5+ regular court partners whose churn costs a whole cluster. Surface them for priority retention campaigns, not just top spenders.
🔄
Program Conversion FunnelDifferentiatorcrm-v2.0
Track the full journey: casual court player → trial program → enrolled → completed → re-enrolled. See exactly where players drop off and auto-trigger the right nudge at each step.
⏱️
Court Time Value per CustomerDifferentiatorcrm-v2.0
Surface which customers fill peak slots vs off-peak. A Tuesday morning regular is worth more to yield than a Friday evening player. Run targeted offers to shift demand intelligently.
👨👩👧
Family & Group AccountsDifferentiatorcrm-v2.0
One wallet, multiple players. Kids book under a parent account. Corporate accounts with per-employee limits. Designed for how SE Asian families and companies actually use club facilities.
🔗
Referral AttributionDifferentiatorcrm-v2.0
Know who referred whom, tracked across the full customer lifecycle. Auto-reward both sides when the referred member completes their first booking or purchase.