18 — Loyalty

Programs, rules, multipliers, POS earn/redeem

CEO Summary

Loyalty programs drive repeat visits. Earn points on purchase; redeem as POS tender. Business value: Customer retention, spend increase. Key metrics: Active members, points issued/redeemed, redemption rate. If this breaks: POS cannot apply loyalty; customers lose points visibility.

Architecture

flowchart TB subgraph client [Client] POS[POS] Admin[Admin] end subgraph api [API] LR[loyalty.routes] LMR[loyaltyManagement.routes] POSR[pos.routes] end subgraph svc [Services] LS[loyalty.service] LPS[loyaltyPoints.service] LMS[loyaltyManagement.service] end subgraph db [Tenant DB] Programs[(LoyaltyPrograms)] Accounts[(LoyaltyAccounts)] Events[(LoyaltyEvents / audit_events)] end POS --> POSR Admin --> LR Admin --> LMR LR --> LS LMR --> LMS POSR --> LPS LS --> Programs LS --> Events LPS --> Accounts LPS --> Events

Overview

Loyalty programs define earn rules (points per dollar) and redemption rules. Customers earn on purchase; redeem at POS.

File Structure

backend/
├── routes/
│   ├── loyalty.routes.js           # Grant, redeem, balance
│   ├── loyaltyManagement.routes.js # Program CRUD
│   └── admin.programs.routes.js    # Admin programs
├── services/
│   ├── loyalty.service.js
│   ├── loyaltyPoints.service.js    # Earn/redeem logic
│   └── loyaltyManagement.service.js
└── models/
    ├── loyaltyProgram.model.js
    ├── loyaltyAccount.model.js
    └── loyaltyEvent.model.js

API Endpoints

MethodPathPurpose
POST/api/loyalty/grantManager grants points (customerId, points, reason)
POST/api/loyalty/redeemRedeem points (customerId, points, orderId, reason)
GET/api/loyalty/balance/:customerIdGet customer balance
POST/api/pos/carts/:id/tender/loyaltyPOS tender: apply loyalty redemption

Database Schema

TablePurpose
LoyaltyProgramsProgram config: earn rules, multipliers
LoyaltyAccountsCustomer balance per program
LoyaltyEvents / audit_eventsEvents: loyalty.grant, loyalty.redeem

Program Structure

Programs define rules (earn per dollar, category multipliers). Accounts hold customer points. Events log earn/redeem.

POS Integration

Earn: Points on sale (rules, multipliers). Redeem: POST /api/pos/carts/:id/tender/loyalty — deduct points, add to cart payments. See 06 — POS & Invoicing.

Integration Points

SystemConnection
POSTender type: loyalty
CustomerscustomerId links to Customers
AnalyticsposAnalytics.service, customerAnalytics — loyalty events
Auditaudit_events for loyalty.grant, loyalty.redeem

Key Paths

PathPurpose
backend/routes/loyalty.routes.jsGrant, redeem, balance
backend/services/loyaltyPoints.service.jsEarn/redeem logic
backend/models/loyaltyAccount.model.jsCustomer balance