Product Brief

Setpoint CRM

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
  • CRM sidebar navigation — Contacts, Segments, Campaigns, Loyalty, Settings
  • Dashboard — KPI cards: total contacts, active this month, new this week, churn risk count
  • Contacts page — full customer directory with search, filters, sortable table
  • Contact detail page — profile summary, booking stats, POS spend, membership status
  • Staff notes — create, edit, delete private notes per contact (crm_notes table)
  • Tags — assign colour-coded tags to contacts (crm_tags, crm_customer_tags tables)
  • Deploy to Vercel as crm-setpoint project

Database

  • crm_notes — staff notes per customer (profile_id, facility_id, content, created_by)
  • crm_tags — tag definitions per facility (name, colour)
  • crm_customer_tags — join table linking customers to tags per facility
  • Reuse: customers, facilities, user_facility_roles, bookings, pos_orders, memberships

Dependencies

  • Setpoint Supabase DB (utommwznukufegwhltqw)
  • 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
  • Membership events — subscribed, upgraded, cancelled, credit top-up
  • Payment events — payment made, refund processed, credit issued
  • 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

Database

  • crm_segments — id, facility_id, name, type (manual | dynamic), rules JSONB, member_count, last_evaluated_at
  • crm_segment_members — segment_id, profile_id, added_at, added_by (null = auto)
  • 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
  • Campaign builder — name, select segment, choose channel (email/WhatsApp), compose message
  • Email campaigns — subject line, rich text body, merge tags ({{first_name}}, {{facility_name}})
  • WhatsApp campaigns — template message selection, merge tags, send via WhatsApp Business API
  • Message templates — pre-built: welcome, win-back, birthday, program nudge, booking reminder
  • Schedule or send immediately
  • Campaign analytics — sent, delivered, opened, clicked, bounced, unsubscribed
  • Unsubscribe handling — honour opt-outs, mark profile as opted out per channel
  • Send preview — preview email/WhatsApp before sending

Database

  • crm_campaigns — id, facility_id, name, segment_id, channel (email|whatsapp), status, scheduled_at, sent_at, subject, body, template_id
  • crm_campaign_sends — campaign_id, profile_id, sent_at, opened_at, clicked_at, bounced_at
  • crm_message_templates — id, facility_id, name, channel, subject, body
  • crm_opt_outs — profile_id, facility_id, channel, opted_out_at

Dependencies

  • crm-v1.0
  • crm-v1.2

Note

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

Database

  • crm_loyalty_configs — facility_id, enabled, points_name, earning rules JSONB, tier thresholds JSONB
  • crm_loyalty_ledger — id, facility_id, profile_id, event_type (earned|spent|expired|adjusted), points, source (booking_id|order_id|program_id|manual), created_at
  • crm_rewards — id, facility_id, name, description, point_cost, reward_type (credit|discount|session|merchandise), is_active
  • crm_reward_redemptions — id, reward_id, profile_id, facility_id, redeemed_at, redeemed_by, points_used
  • 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
  • Execution log — per-contact log of automation fires (trigger, channel, sent_at, status)
  • Pause / resume automations without deleting

Database

  • crm_automations — id, facility_id, name, trigger_type, trigger_config JSONB, is_active
  • crm_automation_steps — automation_id, step_order, delay_hours, channel, template_id, message_body
  • 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.

Scope

  • RFM scoring — Recency, Frequency, Monetary score per customer, updated nightly
  • Sport Activity Score — bookings + program participation + match play, not just spend
  • Churn risk engine — personal baseline: flagged if silent vs own usual frequency, not a global threshold
  • Playing Partner Network — map who plays with whom, identify squad leaders for retention campaigns
  • Program conversion funnel — track casual → trial → enrolled → completed → re-enrolled drop-off
  • Court time value — surface which customers fill peak vs off-peak slots, targeted offers
  • Referral attribution — track who referred whom, auto-reward both sides on first completed booking
  • Family & group accounts — one wallet, multiple players, corporate accounts with per-employee limits
  • CRM reports — segment growth over time, campaign performance dashboard, loyalty programme ROI

Database

  • crm_rfm_scores — profile_id, facility_id, r_score, f_score, m_score, segment_label, calculated_at
  • crm_partner_edges — profile_id_a, profile_id_b, facility_id, match_count, last_played_at
  • crm_referrals — referrer_id, referred_id, facility_id, referred_at, converted_at, reward_issued
  • crm_group_accounts — id, facility_id, name, primary_profile_id, credit_pool_cents, per_member_limit_cents
  • crm_group_members — group_id, profile_id, joined_at
  • 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.