SpecialOffer.com

Premium Membership Platform — User Guide

SpecialOffer.com

Premium Membership Platform — Proof of Concept | 9 Modules · 250 Tests · 3 Portals

9 Modules
250 Tests
3 Domains
12 Partners
20+ Offers

Live Demo: https://specialoffer-demo.fly.dev

March 17, 2026

Table of Contents

1. Quick Start & Demo Workflow

Get oriented quickly — open these three URLs and follow the walkthrough to see the full platform in action.

1.1 Three Portal URLs

Admin UI — System-wide control center
https://specialoffer-demo.fly.dev/admin
Manage domains, members, offers, partners, platform config, and real-time event stream
Member Portal — Professional member experience
https://specialoffer-demo.fly.dev/
Member directory, dashboard, offers, profile, career journey, behavioral consent
Partner Portal — Partner analytics dashboard
https://specialoffer-demo.fly.dev/partner
Partner selection, aggregate stats, offer performance, funnel visualization

1.2 Member Directory (Demo Entry Point)

Member Directory
https://specialoffer-demo.fly.dev/

When no member session is active (fresh browser or after clicking "Switch Member"), the portal shows the Member Directory — domain-grouped cards for all pre-seeded members. Each card displays the member's name, email, domain, tier badge, specialty, and profile completeness bar. Click any card to set a session and load their personalized dashboard with domain theming.

At the top, demo invitation links are displayed for walking through the "New Member" signup flow from scratch.

The "Switch Member" link in the navigation clears the current session and returns to the directory.

1.3 Pre-Seeded Demo Members

Medical

Dr. Priya Sharma

Cardiothoracic Surgeon
Tier: Professional
Teal domain theme
Pre-loaded behavioral profile with Clinical Reference and Medical Device affinities
Career moments: Residency, Board Certification, Fellowship
HNW

Victoria Sterling

Family Office Director
Tier: Founders Club
Charcoal + gold domain theme
Pre-loaded behavioral profile with Wealth Management and Estate Planning affinities
Career moments: Wealth Transition, Business Exit

Both members come pre-seeded with behavioral profiles, career moments, life moments, and tier status to demonstrate the full platform without manual setup.

1.4 Demonstration Workflow

Follow these 8 steps for a complete platform walkthrough:

Open the Member Portal — Navigate to the root URL. The Member Directory shows pre-seeded members grouped by domain with accent colors (Medical=teal, HNW=charcoal+gold).
Select Dr. Priya Sharma — Click her card. The Medical dashboard loads with teal theme, personalized offers sorted by affinity. Look for "Recommended" badges on high-affinity offers.
Explore an Offer — Click into a Clinical Reference offer (e.g., UpToDate). See the offer detail with redemption code and "Visit UpToDate" button.
Visit the Partner — Click "Visit UpToDate →". The redirect goes through /go/{offerId}?m={memberId}, recording a PARTNER_VISIT signal, then opens the mock UpToDate page with embedded tracking pixel.
Return to Dashboard — Click "Return to SpecialOffer". Clinical Reference offers are boosted further in the ranking from the visit signal.
Check Admin — Behavioral Profile — Open the Admin UI in a new tab. Go to Members → select Priya → Behavioral Profile tab. See category affinities, signal counts, and recent signal log.
Switch to Victoria Sterling — Click "Switch Member" in nav. Select Victoria. Note the gold/charcoal HNW theme and wealth management offers ranked first.
Test Consent Withdrawal — Click “Privacy” in the nav → scroll to “Withdraw All Consent & Anonymize My Data” → confirm. Page reloads with personalization removed, consent banner reappears.
View Partner Analytics — Open the Partner Portal. Select Stryker (or any partner). See aggregate impression/click/redemption metrics and the offer performance funnel.

1.5 Key Learning Points

Domain-Specific Theming Each professional domain has its own color scheme and UI personality. Medical=teal, Legal=navy, HNW=charcoal+gold.
Event-Driven Personalization Every interaction produces domain events. Behavioral signals feed the affinity scoring engine, which reranks offers in real time.
Full Audit Trail Every state change is an event. The Admin Event Stream page shows all events flowing through the system in real time via SSE.
Partner Tracking Outbound clicks are tracked through redirect links. Partner pages embed a tracking pixel. Both signals feed back into the member's behavioral profile.

2. Member Portal

The member-facing portal at https://specialoffer-demo.fly.dev/ provides the full professional membership experience — from discovery through onboarding, offer redemption, partner visits, and personalized content.

2.1 Member Directory

Member Directory — Demo Entry Point
/

The directory is the landing page when no session is active. Members are grouped by professional domain, each with distinctive accent colors:

  • Medical — Teal accent (#2ba99a)
  • Legal — Navy accent (#1a2d4a)
  • High Net Worth — Charcoal + gold accent (#2d2d2d / #c9a84c)

Each member card shows: name, email, domain badge, tier badge, specialty, and a profile completeness progress bar. Clicking a card sets a session cookie and navigates to their domain-themed dashboard.

Demo invitation links at the top allow walking through the new member signup flow from scratch.

2.2 Invitation Landing Page

Invitation Accept Page
/invite/{code}

Members arrive via an invitation link (emailed in production, shown as demo links here). The landing page displays the invitation details and a prominent "Accept Invitation" button. Accepting triggers the InvitationAccepted event and shows the application form.

2.3 Application Form

Membership Application
/apply/{invitationId}

The application collects professional details specific to the member's domain:

  • All domains: Full name, email, phone
  • Medical: Specialty (from domain config), practice type, NPI number, hospital affiliation
  • Legal: Practice area, bar number, firm name, jurisdiction
  • HNW: Wealth category, net worth range, primary advisor, investment focus

Domain-specific fields are dynamically loaded from the Domain Configuration module. The form also captures geography (city, state, country) for future geographic targeting.

2.4 Application Status & Approval

Application Status Screen
/status/{membershipId}

After submission, the member sees a status screen showing their application state. Non-ACTIVE members are gated from the dashboard — they see only the status screen until approved. Status flow: PENDING → APPROVED → ACTIVE. Admins approve members from the Admin UI, which triggers the ApplicationApproved and MemberActivated events.

2.5 Member Dashboard

Personalized Member Dashboard
/dashboard

The dashboard is the member's home after login, featuring:

  • Stats bar: Membership tier badge, profile completeness percentage, offers available count, career events count
  • Personalized offer grid: Offers sorted by category affinity score. High-affinity offers display a "Recommended" badge (affinity ≥ 30)
  • Career events feed: Recent career moments and life moments from the member's profile
  • Tier-locked offers: Founders Club exclusive offers show a lock icon for non-qualifying tiers

The dashboard applies the member's domain theme — teal for Medical, navy for Legal, charcoal+gold for HNW. Offer cards show category, partner name, discount/benefit, and the affinity-based "Recommended" badge.

2.6 Offer Detail & Redemption

Offer Detail Page
/offers/{offerId}

Clicking an offer card opens the detail page with:

  • Full offer description and terms
  • Partner information and branding
  • Redemption code (revealed on click)
  • "Visit [Partner Name]" button — routes through the tracked partner redirect
  • Offer category and tier eligibility

Viewing the offer records an OFFER_CLICK signal. Dwelling 5+ seconds records an OFFER_DWELL signal. Redeeming records OFFER_REDEEMED. All signals feed back into the affinity scoring engine (when consent is granted).

2.7 Partner Visit Flow

The partner visit flow tracks outbound member activity through a multi-step redirect:

Offer Detail
"Visit Partner" button
Redirect
/go/{offerId}?m=
Records PARTNER_VISIT
Mock Partner Page
Partner branding
Embedded pixel
Pixel Fires
/api/track/pixel.gif
Records PARTNER_PIXEL
Return Link
Back to dashboard

The 5 configured mock partner pages, each with brand-appropriate styling:

Partner Domain Page URL Brand Style
Stryker Medical /partner-demo/stryker Deep blue (#003865)
UpToDate Medical /partner-demo/uptodate Bright blue (#0077c0)
J.P. Morgan HNW /partner-demo/jpmorgan Dark navy (#0a3d62)
Westlaw Legal /partner-demo/westlaw Red (#c41230)
NetJets HNW /partner-demo/netjets Black + gold

Each mock page shows a "SpecialOffer Exclusive" badge, the offer details, and a "View Tracking Integration Code" disclosure that reveals the actual pixel HTML. A "Return to SpecialOffer" link navigates back to the member dashboard.

2.8 Member Profile & Career Journey

Profile & Career Journey
/profile

The profile page has three collapsible sections and a career timeline:

  • Profile completeness bar — Visual progress toward 100% completion, calculated across all profile fields
  • Professional Information — Domain-specific professional details (specialty, credentials, affiliations)
  • Contact & Geographic — Address, phone, geography data
  • Preferences — Communication and offer category preferences

Career Timeline: A chronological view of career moments (domain-specific: board certification, partnership, fellowship, etc.) and life moments (platform-wide: marriage, home purchase, retirement planning, etc.). Members can record new career events directly from the timeline.

Consent Banner & Preferences
(persistent overlay)

A persistent consent banner appears on every page until the member makes a choice. The banner is non-blocking — the member can continue using the portal while it's displayed.

Three options on the banner:

  • "Personalize My Experience" — Grants behavioral tracking consent
  • "No Thanks" — Declines tracking
  • "Manage Preferences" — Opens the preferences panel

The Preferences Panel has three toggles:

  • Behavioral Tracking: Offer interactions, browsing patterns, dwell time
  • Location Services: Browser geolocation (triggers a separate browser permission prompt — two-step consent)
  • Data Sharing: Anonymized insights shared with partners

Consent is stored server-side on the SignalCollection aggregate. Signals are only recorded when consent is granted (enforced at the domain layer). Revoking consent stops signal recording immediately.

The “Privacy” link in the member nav bar lets members access these preferences at any time — not just during the initial prompt. Members can also withdraw all consent via a red button in the preferences panel, which anonymizes their behavioral data and resets personalization. See Section 5.2 for full details.

2.10 Personalized Offer Ranking

Affinity-Based Offer Sorting
/dashboard (offer grid)

When a member has granted consent and has behavioral signal history, offers are ranked by category affinity score (0-100 scale). The ranking is subtle by design:

  • Offers reorder based on the member's strongest category affinities
  • A "Recommended" badge appears on offers with affinity score ≥ 30
  • No explicit "we're tracking you" messaging — just a better experience
  • Members with no consent or no signals see the default offer ordering

2.11 Tier Progression

Tier System
/dashboard (tier badge)

SpecialOffer uses a tiered membership model with four levels:

Tier Access Level How to Reach
Basic Standard offers Default on activation
Professional Standard + professional offers Subscription upgrade
Premium All non-exclusive offers Subscription upgrade
Founders Club All offers including exclusives Invitation only

Tier-locked offers display a lock icon on the dashboard. Founders Club exclusives (e.g., Figure 1 Consult Network, Lexis+ AI Beta) are only visible to Founders Club members. Tier changes produce domain events that trigger cross-module projections.

2.12 Mobile Responsiveness

All three portals are fully responsive. The member portal adapts to mobile viewports with stacked layouts, collapsed navigation, and touch-friendly controls. Offer cards stack vertically, the consent banner adjusts to screen width, and tables scroll horizontally when needed.

3. Admin UI

The Admin UI at https://specialoffer-demo.fly.dev/admin is the system-wide control center. Built with React + Vite, it communicates with the NestJS backend via typed API calls and receives real-time events via SSE.

3.1 Dashboard

Admin Dashboard Overview
/admin

The dashboard provides at-a-glance system statistics across the top, followed by detailed configuration tables. Current metrics:

  • 3 Domains configured (Medical, Legal, HNW) — all ACTIVE
  • 2 Active Members (Dr. Priya Sharma, Victoria Sterling)
  • 12 Partners approved and active
  • 16 Offers across all domains and categories
  • Event count reflecting all seeded aggregate activity

Below the stats, a Configured Domains table displays each domain with completion status and specialty/career stage counts:

Code Name Status Specialties Career Stages Completeness
MEDICAL Medical Professionals ACTIVE 11 6 100.00%
LEGAL Legal Professionals ACTIVE 8 5 100.00%
HNW High Net Worth Individuals ACTIVE 4 5 100.00%

An Event Streams table follows, listing the distinct event stream IDs and their event counts, separated by aggregate type (ProfessionalDomain, Partner, Offer, Campaign, Membership, MemberProfile, TierProgression, SignalCollection).

The dark navy/slate Admin UI has sidebar navigation: Dashboard, Domain Config, Members, Offers & Partners, Platform Config, and Event Stream. This theme distinguishes the admin experience from the member and partner portals.

3.2 Domain Configuration

Domain Management Interface
/admin/domains

The Domain Configuration page manages professional domains. A "+ Create Domain" button enables adding new domains. The domain table lists all configured domains with their type, status, completeness percentage, and action buttons.

Three domains are pre-configured with comprehensive career moments:

  • Medical: 8 career moments (Residency, Fellowship, Board Certification, Department Chief, etc.)
  • Legal: 6 career moments (Bar Admission, Partnership, Judicial Appointment, etc.)
  • HNW: 7 wealth transitions (Liquidity Event, Business Exit, Inheritance, IPO, etc.)

3.3 Domain Detail

Domain Detail — Medical
/admin/domains/{domainId}

Clicking a domain opens its detail page with tabbed sections:

  • Specialties: Domain-specific specializations (e.g., Cardiothoracic Surgery, Family Medicine for Medical)
  • Practice Types: Work settings (Hospital, Private Practice, Academic for Medical)
  • Career Stages: Professional progression levels (Resident, Attending, Department Chief for Medical)
  • Career Moments: Significant career milestones that can be recorded on a member's timeline
  • Verification Methods: How professional credentials are validated per domain

Each tab supports full CRUD operations — add, edit, and remove items. Changes produce domain events that update the read model projections.

3.4 Membership Management

Members List & Detail
/admin/members

The Members page has four tabs: All Members, Pending, Active, and Invitations.

The member list now includes a profile completeness column showing each member's profile progress as a percentage bar.

Clicking a member opens their detail panel with tabs:

  • Overview: Membership status, tier, domain, application details
  • Behavioral Profile: Consent status indicators, category affinity bar chart, top 3 categories, signal stats (total signals, last 24h), last known location, and a recent signal log table
  • Career Timeline: Chronological view of career moments, life moments, and career stage changes

3.5 Offers & Partners

Offers & Partner Management
/admin/offers

Three tabs: Offers, Campaigns, and Partners.

  • Offers tab: Full list of offers with partner, category, domain, tier requirement, and status. 16 offers across Medical, Legal, and HNW domains.
  • Campaigns tab: Grouped offer campaigns with activation status and date ranges
  • Partners tab: 12 partners with contact info, domain associations, and activation status

3.6 Platform Config

Platform Configuration — Life Moment Catalog
/admin/platform-config

The Platform Config page manages platform-level life moments — universal milestone types that apply to all members regardless of domain (unlike domain-scoped career moments).

The life moment table is grouped by category, with admin CRUD operations:

Category Count Examples
Family 5 Marriage, New Child, Child's College, Empty Nest, Divorce
Financial 4 Inheritance, Major Investment, Business Sale, Retirement Planning
Health 4 Health Change, Wellness Program, Insurance Switch, Aging Parent Care
Housing 4 Home Purchase, Relocation, Renovation, Vacation Property
Lifestyle 4 Sabbatical, Philanthropy, Travel, Hobby Pursuit

21 life moments are pre-seeded across these 5 categories. Admins can add, edit, or deactivate life moments. Life moments are available platform-wide at /api/member/life-moments.

3.7 Event Stream

Real-Time Event Stream
/admin/events

The Event Stream page displays all domain events flowing through the system in real time via Server-Sent Events (SSE). Events are color-coded by aggregate type and display:

  • Event type name (e.g., MemberActivated, OfferRedeemed, SignalRecorded)
  • Aggregate ID and stream
  • Timestamp
  • Event payload (expandable JSON)

Events stream in automatically — no polling. The SSE connection listens on the domain-stream.all channel. Historical events can be browsed in the event log table with pagination and filtering by aggregate type.

Consent events: ConsentWithdrawn events appear in the stream with payload showing previous consent state, scope, and anonymization count. The admin behavioral profile tab shows affinities as empty and consent status as withdrawn after a withdrawal.

4. Partner Portal

The Partner Portal at https://specialoffer-demo.fly.dev/partner provides analytics dashboards for approved partner organizations.

4.1 Partner Selection

Partner Selection Screen
/partner

The landing page lists all 12 approved partners. Click a partner card to enter their analytics dashboard. Each card shows the partner name, domain focus, offer count, and activation status.

4.2 Partner Dashboard

Partner Analytics Dashboard
/partner/{partnerId}

The partner dashboard displays aggregate performance statistics:

  • Total Impressions: How many times partner offers appeared in member feeds
  • Total Clicks: How many members clicked into offer details
  • Total Redemptions: How many offers were redeemed
  • Conversion Rate: Click-to-redemption percentage

Below the stats, the Offer List shows all offers from this partner with individual performance metrics.

4.3 Offer Performance Table

Offer Performance Metrics
/partner/{partnerId} (offers table)

Each offer row shows: offer title, category, impressions, clicks, redemptions, click-through rate, and conversion rate. The table is sortable by any column to identify top-performing and underperforming offers.

4.4 Offer Detail

Offer Funnel Visualization
/partner/{partnerId}/offers/{offerId}

Clicking an offer row opens a funnel visualization showing the conversion pipeline: Impressions → Clicks → Redemptions. The funnel uses proportional bar widths to visually represent drop-off at each stage. Percentage labels show stage-to-stage conversion rates.

5. Behavioral Intelligence

The behavioral intelligence system collects member interaction signals, scores category affinities, and personalizes the offer experience — all with explicit consent gating.

5.1 How Signals Are Collected

The client-side useSignalTracker hook batches behavioral signals and flushes them to the backend every 5 seconds. The following signal types are collected:

Signal Type Weight Strength Description
PAGE_VIEW 0.5
Visited a page
OFFER_IMPRESSION 0.5
Offer card appeared in the member's feed
OFFER_VIEW 1
Viewed an offer card in the feed
CATEGORY_BROWSE 2
Scrolled through an offer category
OFFER_CLICK 3
Clicked into an offer detail page
PARTNER_PIXEL 4
Loaded a partner page (pixel confirmation)
OFFER_DWELL 5
Spent 5+ seconds on an offer detail page
PARTNER_VISIT 7
Clicked through to a partner site
OFFER_REDEEMED 10
Redeemed an offer
Implicit signals: Existing offer events (OfferImpression, OfferClicked, OfferRedeemed) are automatically captured as behavioral signals when the member has consent — no double-recording or explicit client-side tracking needed for these events.

Consent is managed through a two-layer system:

Persistent Consent Banner

A banner appears on every page until the member chooses. It's non-blocking — the member can navigate freely while the banner is displayed. Three actions:

Preference Toggles

Consent state is stored on the SignalCollection aggregate (server-side). The domain layer enforces consent — signals are silently dropped when consent is not granted. Revoking consent stops recording immediately.

Privacy Preferences access: The “Privacy” link in the member nav bar (visible for active members only) opens the consent preferences panel at any time — not just during the initial consent prompt.

Server-authoritative consent: Consent state is synced from the server on page load. Clearing browser data does not affect consent — it is not stored in localStorage.

Consent Withdrawal & Data Anonymization

Below the preference toggles, a red “Withdraw All Consent & Anonymize My Data” button allows members to fully withdraw consent. What happens on withdrawal:

Re-consent: Members can grant consent again via the consent banner at any time. They start fresh with a clean behavioral profile.

API Endpoints

GET  /api/member/consent/:memberId          — Returns consent status (behavioralTracking, geographicTracking, thirdPartySharing, isActive)
POST /api/member/consent-withdraw/:memberId — Withdraws consent. Body: { reason: "MEMBER_REQUEST", scope: "ALL" }

5.3 Affinity Scoring Algorithm

The affinity engine converts raw signals into category scores on a 0-100 scale:

Scoring Formula

For each offer category, the raw score is the sum of weighted signals:

raw_score(category) = SUM( signal_weight * time_decay_factor )

Time Decay

Normalization

After computing raw scores for all categories, scores are normalized to a 0-100 scale where the highest-scoring category equals 100:

normalized_score(category) = (raw_score / max_raw_score) * 100

This means the member's strongest category always scores 100, and other categories are relative to it. The normalized scores are stored in the BehavioralProfileEntity as JSONB category affinities.

5.4 Personalized Offer Ranking

When serving the offer feed, the system enriches each offer with two fields:

The member portal sorts offers by affinityScore descending. Offers with isRecommended: true display a "Recommended" badge. Members without consent or without signal history receive the default ordering with no badges.

5.5 Partner Tracking

Partner tracking uses two mechanisms to capture high-intent signals:

Outbound Redirect

When a member clicks "Visit [Partner]" on an offer detail page:

GET /go/{offerId}?m={memberId}
→ Records PARTNER_VISIT signal (weight 7)
→ 302 redirect to mock partner page

Tracking Pixel

Each mock partner page embeds a 1x1 transparent GIF:

<img src="https://specialoffer-demo.fly.dev/api/track/pixel.gif?m={memberId}&p={partnerId}&c={category}&o={offerId}" width="1" height="1" />

The pixel endpoint records a PARTNER_PIXEL signal (weight 4) and returns a 1x1 transparent GIF. This confirms the member actually loaded the partner page (not just that they clicked the redirect).

5.6 Admin Visibility

Behavioral Profile — Admin View
/admin/members/{memberId} → Behavioral Profile tab

Admins can see each member's full behavioral profile:

  • Consent Status: Visual indicators showing which consent types are granted (shows as withdrawn after consent withdrawal)
  • Category Affinity Chart: Horizontal bar chart of affinity scores per category
  • Top 3 Categories: Highlighted strongest affinities
  • Signal Stats: Total signal count, signals in last 24 hours
  • Last Location: Most recent geolocation (if location consent granted)
  • Recent Signal Log: Table of recent signals with type, category, weight, and timestamp

6. Platform Architecture

SpecialOffer is built as a CQRS/Event Sourcing platform using NestJS, with a React admin UI and server-rendered member/partner portals.

6.1 Architecture Portals

Portal Technology URL Pattern Purpose
Admin UI React + Vite SPA /admin/* Domain config, member management, offers/partners, platform config, event stream
Member Portal Server-rendered + client JS /, /dashboard, /profile Directory, onboarding, dashboard, offers, profile, career journey, consent
Partner Portal Server-rendered /partner/* Partner selection, analytics dashboards, offer performance

6.2 CQRS/Event Sourcing Pattern

Command Side Commands are validated and executed by aggregate roots. Aggregates raise domain events via apply(). Events are appended to an in-memory event store with optimistic concurrency control.
Event Store In-memory event store (swappable for EventStoreDB in production). Events are append-only. Aggregates are rehydrated by replaying their event stream. Optimistic concurrency via expected version checks.
Query Side (Projections) @OnEvent('domain.EventType') handlers update TypeORM read models in PostgreSQL. Read models are denormalized for fast queries. No foreign keys (CQRS pattern).
Event Bus EventEmitter2 as the in-process bus. Events published to domain.{EventType} for projections. SSE catch-all listens on domain-stream.all. Cross-module reactions via event handlers.

6.3 Module Overview

Module Path Aggregate(s) Status
Shared Kernel src/shared/ Complete
Domain Config (M9) src/domain-config/ ProfessionalDomain Complete
Membership (M1) src/membership/ Invitation, Membership, Verification Complete
Offers (M3) src/offers/ Offer, Campaign Complete
Partners (M4) src/partners/ Partner Complete
Tiering (M5-lite) src/tiering/ TierProgression Complete
Member Profile (M2) src/member-profile/ MemberProfile, CareerJourney, SignalCollection Complete
Tracking src/tracking/ — (controller only) Complete
Admin src/admin/ Complete

6.4 Domain Type Architecture

Domains are classified by type, which controls offer visibility:

Domain Type Domains Offer Visibility
PROFESSIONAL Medical, Legal Members see only offers tagged to their domain
LIFESTYLE HNW Members see offers from all LIFESTYLE domains

This distinction ensures Medical professionals see only Medical offers, while HNW members can see offers across all lifestyle-oriented domains.

6.5 Cross-Module Event Flow

Key cross-module event chains:

6.6 Technology Stack

Backend: NestJS (TypeScript) CQRS modules, EventEmitter2 bus, TypeORM projections, SSE streaming. Path aliases: @shared/*, @membership/*, etc.
Admin UI: React + Vite + TypeScript SPA at admin-ui/. Vite dev server on :5173, proxies /api to NestJS on :3000. Dark theme with aggregate color coding.
Database: PostgreSQL 16 (Docker) Read-model projections via TypeORM. synchronize: true for PoC. JSONB columns for flexible event data. No foreign keys.
Event Store: In-Memory Append-only store with optimistic concurrency. Swappable for EventStoreDB. Resets on server restart — DB must be truncated and re-seeded.
Event Bus: EventEmitter2 In-process pub/sub. domain.{EventType} for projections, domain-stream.all for SSE. Replaces SNS/SQS for PoC.
Deployment: Fly.io Single-machine deployment. Unified ops.sh script for deploy, seed, test, reset, and status operations.

6.7 Test Coverage

250 automated tests verify the platform end-to-end:

Suite Type Tests Sections
Business Rules API integration tests 209 18 sections covering domain config, membership, offers, partners, tiering, member profile, signal collection, partner tracking, life moments, consent withdrawal
Redemption Flow End-to-end flow test 40 40 sequential steps: invite → apply → approve → activate → browse → redeem → partner visit → behavioral signals → consent withdrawal

Run tests locally or against the remote deployment:

# All tests against local
npm run test:all

# Business rules only
npm run test:rules

# End-to-end flow only
npm run test:flow

# Against remote deployment
npm run test:remote