Click to Cancel
Self-service membership cancellation with retention offers and digital signatures
Overview
Click to Cancel is a self-service membership cancellation app that streamlines the member cancellation process for fitness clubs. It provides a guided 5-step cancellation wizard with built-in retention offers, eligibility validation, and digital signature capture.
Key Features
5-Step Cancellation Wizard
Step 1: Member Authentication & Details
- Email-based OTP (6-digit code, 5-minute expiration)
- Alternative password authentication
- Auto-creates member record if not exists
- Displays membership status and type
- Validates eligibility (active membership, no pending requests)
Step 2: Choose Action & Reason
- Select "Cancel Membership" or "Freeze Membership"
- Choose from configured cancellation reasons
- Dynamic fields per reason (text input, textarea)
- Required/optional validation
- Reason details stored as structured JSON
Step 3: Retention Offers
- Display offers filtered by selected reason
- Each offer shows label, description, and optional badge
- Member can accept offer or select "No thanks, continue"
- Offer selection tracked for retention analytics
Step 4: Digital Signature
- Canvas-based signature capture
- Displays terms and conditions
- "I agree to terms" checkbox (required)
- Signature stored as base64 data URL
Step 5: Confirmation
- Review summary of request
- Submit button changes status to "pending"
- Success message with next steps
- Confirmation email (future enhancement)
Configuration Management
Branding Settings:
- Theme selection (from default themes)
- Light/Dark mode toggle
- Logo URL and height customization
- Background image URL
- Login page customization (heading, description)
Cancellation Reasons:
- Add/edit/delete reasons
- Unique name slug (e.g., "too_expensive")
- Display label (e.g., "Too expensive")
- Dynamic fields configuration (text, textarea, required)
- Sortable order
Retention Offers:
- Add/edit/delete offers
- Offer type (discount, freeze, training)
- Unique name slug
- Display label and description
- Optional badge text
- Reason filters (show for specific reasons or all)
- Sortable order
Member Management
CRUD Operations (Phase 1 Development Tool):
- Create member records manually
- Edit member details
- Update membership status (active, inactive, none)
- Update membership type (monthly, yearly)
- Manage member balance
- Delete member records
Phase 2 Plan: Replace with automatic sync from ABC Fitness/Club Ready
Cancellation Management
Dashboard Views:
- Tabbed interface (All, Incomplete, Pending, Processed)
- Color-coded status badges
- Action badges (cancel/freeze)
- Reason display
- Selected offer tracking
- Created date sorting
- Pagination support
Status Management:
- Edit modal to update status
- Status progression: incomplete → pending → processed
- Delete confirmation for removal
- Processing notes (admin only)
Detail View:
- Member information
- Cancellation reason and details
- Dynamic field responses
- Selected offer
- Signature preview
- Terms agreement status
- Processing notes and timestamp
Database Models
Core Models
model Ctc_Member {
id String @id @default(cuid())
tenantId String
appId String
locationId String // Soft FK to Location
email String
firstName String
lastName String
membershipStatus String // "active" | "inactive" | "none"
membershipType String? // "monthly" | "yearly"
membershipCreatedAt DateTime?
balance Decimal @default(0.00)
cancellations Ctc_Cancellation[]
@@unique([tenantId, locationId, email])
}
model Ctc_Cancellation {
id String @id @default(cuid())
tenantId String
appId String
memberId String
locationId String // Denormalized for querying
status String // "incomplete" | "pending" | "processed"
action String? // "cancel" | "freeze"
currentStep String @default("1")
reason String?
reasonDetails String? // JSON
dynamicFields String? // JSON: Record<string, string>
selectedOffer String?
signature String? // base64 data URL
agreedToTerms Boolean @default(false)
processedAt DateTime?
processedByUserId String?
processingNotes String?
}
model Ctc_OTP {
id String @id @default(cuid())
tenantId String
email String
locationId String
code String // 6-digit code
expiresAt DateTime // 5 minutes from creation
verified Boolean @default(false)
}Routes
Admin Routes
/app/{tenant}/apps/click-to-cancel- Cancellation dashboard/app/{tenant}/apps/click-to-cancel/settings- Branding and configuration/app/{tenant}/apps/click-to-cancel/settings/members- Member management
API Endpoints
GET /api/app/click-to-cancel/info- Get app configPOST /api/app/click-to-cancel/auth/request-otp- Generate OTPPOST /api/app/click-to-cancel/auth/verify-otp- Verify OTP and authenticatePOST /api/app/click-to-cancel/auth/verify-password- Password authenticationPOST /api/app/click-to-cancel/cancellation/save-step- Save wizard step dataGET /api/app/click-to-cancel/user/current- Get current user info
User Personas
1. Member (External User)
Access: Public-facing cancellation portal
Workflow:
- Visit cancellation portal URL
- Select location
- Authenticate via OTP or password
- System validates eligibility
- Choose cancel or freeze
- Select reason and provide details
- Review retention offers
- Accept offer or decline
- Review terms and sign digitally
- Submit request
- Receive confirmation
2. Front Desk Staff
Access: Click to Cancel dashboard in Blend app
Workflow:
- Log into Blend app
- Navigate to Click to Cancel
- View list of pending cancellations
- Filter by status
- Review cancellation details
- Process in ABC Fitness/Club Ready
- Mark request as "processed"
3. Administrator
Access: Full admin access
Workflow:
- Configure branding (logo, theme, background)
- Set up cancellation reasons with custom fields
- Create retention offers with reason filters
- Manage member database (Phase 1 manual)
- Monitor cancellation trends
- Export reports
Configuration
Installation
- Navigate to Apps section
- Select "Click to Cancel"
- Configure branding and settings
- Set up cancellation reasons
- Create retention offers
- Deploy external portal
External Portal Integration
Technology Stack:
- Nuxt 3 (Vue.js framework)
- Tailwind CSS for styling
- Canvas API for signature capture
- Fetch API for REST calls
Environment Variables:
API_URL=https://blendx.ai
API_KEY=your-tenant-api-key
SESSION_SECRET=your-session-secret
USE_MOCK_API=falseKey Business Rules
- Location Isolation: Members belong to specific locations
- Eligibility Validation: Only active members without pending requests can submit
- One Active Cancellation: Members can only have one pending/incomplete at a time
- OTP Expiration: OTP codes expire after 5 minutes
- One-Time Use: OTP codes can only be verified once
- Auto-Member Creation: Members auto-created during OTP verification if not exists
- Signature Required: Step 4 requires both signature and terms agreement
- Reason Filtering: Offers shown for all reasons or filtered to specific reasons
- Status Progression: incomplete → pending → processed
Security Considerations
Authentication
- 6-digit random OTP codes with 5-minute expiration
- One-time use codes (marked verified after use)
- Email validation before OTP generation
- Password hashing with bcrypt
Authorization
- API Key required for all endpoints
- Tenant isolation for all queries
- Location context for member operations
- Admin-only actions for status updates
Data Privacy
- Personal data encrypted
- Signature storage as base64 data URLs
- GDPR compliance support
- Audit trail with timestamps
Implementation Phases
Phase 1: Core Cancellation Flow ✅ COMPLETED
- Database schema
- Configuration UI (branding, reasons, offers)
- Member management CRUD
- Cancellation dashboard
- API endpoints for external portal
- OTP and password authentication
- Wizard state persistence
- Eligibility validation
- Digital signature capture
Phase 2: MMS Integration ⏳ PLANNED
- ABC Fitness API integration
- Club Ready API integration
- Member sync service (periodic/webhook)
- Membership status sync
- Balance sync
- Auto-create members on first cancellation
- Read-only member data in admin UI
Phase 3: Enhanced Features ⏳ PLANNED
- Email notifications (OTP, confirmation, status updates)
- SMS OTP as alternative to email
- Cancellation analytics dashboard
- Retention offer analytics
- Reason trending reports
- Export to CSV/Excel
- Bulk processing actions
- Staff notes and comments
Troubleshooting
OTP Not Received
- Check spam/junk folder
- Verify email address is correct
- Configure SMTP settings
- Use password authentication as alternative
Eligibility Block
- Verify membership is active in MMS
- Check for existing pending cancellation
- Resolve balance issues first
- Wait until minimum term period expires
Signature Not Saving
- Refresh page and try again
- Re-authenticate with OTP
- Check network connection
- Try different browser
Success Metrics
Adoption
- Members using self-service: Target 60%
- Average completion time: Target < 5 minutes
- Incomplete rate: Target < 20%
- Staff processing time saved: Target 50% reduction
Retention
- Offer acceptance rate: Target 25%
- Freeze instead of cancel: Target 15%
- Successful win-backs: Target 10% return within 6 months
Operational
- Average time to process: Target < 24 hours
- Cancellation processing accuracy: > 98%
- Member satisfaction score: Target 4.5/5
- Staff satisfaction score: Target 4.5/5

