Overview
Implement a referral/invite system allowing users to invite friends via Email (SendGrid), SMS (Twilio), or WhatsApp (Twilio).
PR: #259
Branch: feat/invite
Status: Ready for review
Feature Description
User Flow
Authenticated user calls createInvite with contact (email/phone) + method
System validates contact format, checks rate limits, generates secure token
Notification sent via SendGrid (email) or Twilio (SMS/WhatsApp) with Firebase Dynamic Link
New user (within 24h of account creation) calls redeemInvite with token
System validates token, checks contact match, marks invite as accepted
Key Components
Public API:
createInvite mutation - Create and send invite
redeemInvite mutation - Redeem invite as new user
invitePreview query - Preview invite details (unauthenticated)
Admin API:
inviteById query - View invite details with inviter/redeemer info
invitesList query - List/filter invites with pagination
Admin functions: revoke, extend, reset rate limits
Rate Limiting (Redis-based):
10 invites/day per user
3 invites/day per target contact
24-hour invite expiration
Security:
Tokens hashed with SHA-256 (plaintext never stored)
Firebase Dynamic Links for mobile deep linking
Files Changed (37 files, +2117/-111)
Core:
src/app/invite/ - Creation, redemption, rate limiting, queries
src/domain/invite/ - Domain types and validation
src/services/mongoose/models/invite.ts - MongoDB schema
src/services/notification/index.ts - Twilio/SendGrid service
src/services/notifications/invite.ts - Invite notifications
GraphQL:
src/graphql/public/root/mutation/create-invite.ts
src/graphql/public/root/mutation/redeem-invite.ts
src/graphql/public/root/query/invite-preview.ts
src/graphql/admin/root/query/invite-*.ts
Known Issues / Follow-up Work
🔴 HIGH PRIORITY
🟡 MEDIUM PRIORITY
🟢 LOW PRIORITY
Testing Status
Dependencies
Twilio: SMS and WhatsApp delivery
SendGrid: Email delivery
Firebase Dynamic Links: Mobile deep linking (optional)
Depends on: feat/email-registration #212 (feat/email-registration) for email invite validation
Environment Variables Required
# Existing (Twilio)
TWILIO_ACCOUNT_SID
TWILIO_AUTH_TOKEN
# New
TWILIO_FROM # SMS sender number
TWILIO_WHATSAPP_FROM # WhatsApp sender number
# Optional
FIREBASE_DYNAMIC_LINK_DOMAIN
APP_INSTALL_URL
ANDROID_PACKAGE_NAME
IOS_BUNDLE_ID
TWILIO_WHATSAPP_TEMPLATE_SID # For approved templates
Related Issues/PRs
Overview
Implement a referral/invite system allowing users to invite friends via Email (SendGrid), SMS (Twilio), or WhatsApp (Twilio).
PR: #259
Branch:
feat/inviteStatus: Ready for review
Feature Description
User Flow
createInvitewith contact (email/phone) + methodredeemInvitewith tokenKey Components
Public API:
createInvitemutation - Create and send inviteredeemInvitemutation - Redeem invite as new userinvitePreviewquery - Preview invite details (unauthenticated)Admin API:
inviteByIdquery - View invite details with inviter/redeemer infoinvitesListquery - List/filter invites with paginationRate Limiting (Redis-based):
Security:
Files Changed (37 files, +2117/-111)
Core:
src/app/invite/- Creation, redemption, rate limiting, queriessrc/domain/invite/- Domain types and validationsrc/services/mongoose/models/invite.ts- MongoDB schemasrc/services/notification/index.ts- Twilio/SendGrid servicesrc/services/notifications/invite.ts- Invite notificationsGraphQL:
src/graphql/public/root/mutation/create-invite.tssrc/graphql/public/root/mutation/redeem-invite.tssrc/graphql/public/root/query/invite-preview.tssrc/graphql/admin/root/query/invite-*.tsKnown Issues / Follow-up Work
🔴 HIGH PRIORITY
Dead Code / Duplicate Logic
src/app/invite/redeem-invite.tsvs GraphQL mutationsrc/app/invite/redeem-invite.tsor refactor mutation to use itToken Fragment Logged
src/graphql/public/root/mutation/redeem-invite.tsline 156🟡 MEDIUM PRIORITY
Email Validation Deferred (Documented in code)
redeem-invite.tslines 115-127Type Casting Hack
src/app/invite/rate-limits.tsline 21contact as IpAddress- incorrect type castWhatsApp Template Incomplete
src/services/notification/index.tslines 176-189TWILIO_WHATSAPP_TEMPLATE_SIDenv var not in schemaNo Transaction Boundary
redeem-invite.tslines 128-132Status Transition Edge Case
src/app/admin/invite.tsline 61🟢 LOW PRIORITY
https://getflash.io)Testing Status
Dependencies
Environment Variables Required
Related Issues/PRs