SpecialOffer.com — Demo Script

Three stories for business stakeholders

3 Stories ~15 Minutes 3 Portals

Tip: Have three browser tabs ready — Admin UI, Member Portal, Partner Portal

🚀 Quick Start — No Setup Required

The demo is live and pre-loaded at:

Open the Admin UI first — start at Story 1 →

No installation, no commands, no setup.

ℹ️
Note: The hosted demo at specialoffer-demo.fly.dev runs on a shared Fly.io instance with an in-memory event store. Data resets on server restart. Performance may vary slightly from a local instance — projections may take a moment longer to update. If an action doesn't reflect immediately, wait 1–2 seconds and refresh.
🛠️ Developer Setup (only if running locally)

Setup Commands

# Local
npm run restart        # Fast: kill→truncate→build→start→seed (no tests)
npm run restart:full   # Full: same + run all 250 tests

# Remote (Fly.io)
npm run deploy:fly     # Deploy→wait→reset→seed→test

Browser Setup

Open three browser tabs:

  • Tab 1: Admin UI — https://specialoffer-demo.fly.dev/admin (or http://localhost:3000/admin)
  • Tab 2: Member Portal — https://specialoffer-demo.fly.dev (or http://localhost:3000)
  • Tab 3: Partner Portal — https://specialoffer-demo.fly.dev/partner (or http://localhost:3000/partner)
  • Tip: Use Chrome Incognito for Tab 2 — ensures a fresh session and you'll see the consent banner
Pre-seeded data: 3 domains (Medical, Legal, HNW) · 12 partners · 16 offers · 2 demo members (Dr. Priya Sharma & Victoria Sterling) · 21 platform life moments · behavioral signals pre-loaded · demo invitation links ready
Opening — 30 seconds

“SpecialOffer.com is a membership platform for verified professionals. Think of it as the intersection of LinkedIn's trust layer and a premium marketplace — doctors, lawyers, and high-net-worth individuals get curated offers from partners who want to reach exactly these audiences. Partners pay for access. Members get value. Everyone wins.”

“I'm going to walk you through three stories that show what this platform does. Everything you're about to see is a working proof of concept — real code, real data flows, real-time.”

Story 1

“The Velvet Rope”

How a verified professional discovers, applies to, and enters the platform
~3.5 minutes
Scene 1A

The Operations Center

~45 sec Admin UI
Before we bring a member in, let me show you the operations center — this is what powers everything behind the scenes.
  1. Open Admin UI at https://specialoffer-demo.fly.dev/admin (or http://localhost:3000/admin)
  2. Dashboard: point out Platform Overview (active members, offers, partners), Recent Activity feed showing live events
  3. Click Domains — three configured domains: Medical, Legal, HNW. Point out domain types (PROFESSIONAL vs LIFESTYLE), specialties, career stages, completeness %
  4. Click Offers — 16 offers from 12 partners, each targeted to specific domains and tiers
Career stages, life moments, verification methods — these all drive personalization downstream. Adding a new domain is configuration, not code.
Now let's bring a member in →
Scene 1B

A Doctor Gets Invited

~45 sec Member Portal
This is invitation-only — the velvet rope. You don't sign up for SpecialOffer. You get invited.
  1. Open member portal at https://specialoffer-demo.fly.dev (or http://localhost:3000) — Member Directory loads
  2. Briefly show: domain-grouped cards (Medical=teal, HNW=charcoal+gold), tier badges (gold gradient for Founders Club), completeness bars
  3. Note: “This directory is a demo tool. In production, members authenticate with their own credentials.”
  4. Click a demo invitation link from the “New Member Walkthrough” section — opens invitation page at https://specialoffer-demo.fly.dev/invite/{CODE}
  5. Show the premium invitation design — domain name, inviter, the feeling of exclusivity
Accept and apply →
Scene 1C

The Smart Application

~45 sec Member Portal
The application form is domain-aware. Every dropdown, every option comes from the domain configuration we just saw in admin.
  1. Click “Accept Invitation”
  2. Application form loads — point out domain-aware dropdowns: specialties, practice types, career stages all populated from the Medical domain config
  3. Show geography fields (country → state → city cascade)
  4. Show tier selection: Free Vetted (default) vs Founders Club (premium)
  5. Fill in the form and submit
If this were the Legal domain, the specialties would be “Corporate Law”, “Litigation”, etc. The platform adapts automatically.
Now the admin takes over →
Scene 1D

Approval & The Magic Moment

~45 sec Admin + Member
Watch this — the member's screen updates in real-time when they're approved.
  1. Member sees status page: “Application Under Review” with polling indicator
  2. Switch to Admin → Members tab → Review Queue — new application appears
  3. Click Approve, then Activate
  4. Switch to member portal — it auto-detects activation, dashboard loads with personalized offer feed
  5. Consent banner appears at the bottom
The status page auto-detects approval via polling — no page refresh needed. This is the magic moment.
The member is in. Now let's see what happens when they browse →
Story 2

“The Platform Learns”

How behavioral intelligence transforms a blank profile into personalized recommendations
~5 minutes
Scene 2A

Consent-First Tracking

~30 sec Member Portal
Before the platform can learn anything, the member has to opt in. Consent isn't a checkbox — it's enforced at the data layer.
  1. If using a pre-seeded member: click “← All Members” in the nav, then click Dr. Priya Sharma
  2. Point out the consent banner at the bottom with three toggles: Behavioral Tracking, Location Services, Data Sharing
  3. Note: “No consent, no tracking. Period. This is enforced in the domain layer, not just the UI.”
  4. Click “Manage Preferences” to show the three toggles, then “Personalize My Experience”
  5. Note: “The 'Privacy' link in the nav bar lets members access these preferences at any time — not just during the initial prompt.”
Now let's see what the admin sees — before any browsing →
Scene 2B

The “Before” Snapshot

~30 sec Admin UI
Right now, the platform knows almost nothing about this member's preferences. Let's take a snapshot of the “before” state.
  1. Switch to Admin → Members → select the member (or Dr. Priya Sharma)
  2. Click the Behavioral Profile tab
  3. Show: consent status indicators, affinity bars (empty or minimal if new member, populated if Priya), signal count
  4. Note: “Remember this screen. We're coming back to it.”
Now watch the platform learn →
Scene 2C

A Member Browses

~1.5 min Member → Partner
Every interaction is a signal. Click: weight 3. Dwell: weight 5. Partner visit: weight 7. The platform is learning in real-time.
  1. Switch to member portal — offer dashboard
  2. Click into a Surgical Equipment or Medical Equipment offer — stay 5+ seconds (records OFFER_DWELL signal)
  3. Click “Visit [Partner] →” — new tab opens through https://specialoffer-demo.fly.dev/go/{offerId} redirect
  4. Show mock partner page with partner branding + offer card
  5. Click “View Tracking Integration Code” — show the 1x1 pixel HTML. Note: “No cookies, no third-party scripts. Just a simple image request.”
  6. Return to SpecialOffer dashboard
  7. Click another offer in the same category — the effect compounds
PARTNER_VISIT (weight 7) + PARTNER_PIXEL (weight 4) — these are high-intent signals because the member actually left our platform to visit the partner.
Now let's see the transformation →
Scene 2D

The “After” Reveal

~1 min Admin + Member
Before: blank slate. After: the platform knows this doctor is interested in surgical equipment. Watch what that does.
  1. Switch to Admin → Members → same member → Behavioral Profile tab
  2. Show: affinity bars now populated, signal count increased, category breakdown visible
  3. Switch to member dashboard — the offer feed has reorganized
  4. Point out: “Personalized for You” section at the top with count badge, “Recommended for You” badges on relevant offers, affinity summary banner showing top interests
  5. Note: “The offer feed reorganized itself. Combined with career and life events, the platform builds a complete picture of each member.”
This is the core value loop: members browse → platform learns → recommendations improve → partners get better targeting → members get more relevant offers.
Scene 2E

What Partners Pay For

~30 sec Talking Point
This is what partners pay for. Not just impressions — relevance. The platform delivers their offer to exactly the right professional at exactly the right moment. A surgical equipment company reaches a surgeon who just browsed their category — not a corporate lawyer, not a wealth manager.
  1. Pause for effect — let this land
  2. Note: “Three revenue streams: partner commissions on conversions, Founders Club membership fees, and strategic data monetization — aggregated, anonymized insights on professional behavior and spending patterns.”
Now let's show the other side of intelligence — member control →
Scene 2F

The Right to Be Forgotten

~45 sec Member Portal
But what if a member doesn't want this? They have full control.
  1. Click “Privacy” in the nav bar → consent preferences panel opens
  2. Point out the three toggles (behavioral, geographic, third-party sharing)
  3. Scroll down to the red “Withdraw All Consent & Anonymize My Data” button
  4. Click it → confirm the dialog
  5. Page reloads → consent banner reappears → dashboard shows offers in default order
  6. Point out: “Recommended” badges are gone, affinity summary banner is gone, offers are back to default order
Key points:
  • “Their behavioral data has been anonymized — we kept the aggregate analytics but removed all personal attribution.”
  • “They can re-consent at any time and start fresh.”
  • “This is GDPR-ready. The consent withdrawal flows through the same event-sourced architecture — it's an immutable ConsentWithdrawn event, fully auditable.”
Now let's show scale — same platform, completely different world →
Story 3

“One Platform, Many Worlds”

How domain architecture creates distinct experiences and how partners see their ROI
~4 minutes
Scene 3A

The Contrast — Victoria Sterling

~1 min Member Portal
Same platform. Completely different universe.
  1. Click “← All Members” → Member Directory
  2. Click Victoria Sterling (HNW section) — charcoal + gold theme loads
  3. Point out: private aviation, fine wine, wealth management offers. No surgical equipment. No medical conferences.
  4. Note: “Victoria sees a completely different world. Different offers, different theming, different labels. But it's the same platform, the same code, the same architecture.”
The entire UI theme changes — colors, labels, and offer categories are all domain-driven.
Let's look at how this works in admin →
Scene 3B

The Domain Architecture

~1 min Admin UI
Three domains, three different worlds. Adding Accounting is configuration — specialties, career stages, verification methods, partner categories. No code changes.
  1. Switch to Admin → Domains page
  2. Show three domains side by side: Medical (PROFESSIONAL), Legal (PROFESSIONAL), HNW (LIFESTYLE)
  3. Click into Medical — show specialties, career stages, verification methods, completeness
  4. Point out domain type: PROFESSIONAL vs LIFESTYLE
  5. Note: “Want to add Accounting? Create a domain, configure its specialties and career stages, activate it. The platform handles offer targeting, personalization, and partner matching automatically.”
Now let's see how domain types control visibility →
Scene 3C

Professional vs. Lifestyle

~30 sec Member Portal
Professional domains are walled — doctors don't see lawyers' offers. But lifestyle offers like HNW are visible across boundaries. Everyone can see them; Founders Club members can unlock them.
  1. Return to Dr. Priya Sharma's dashboard — she sees Medical offers AND HNW lifestyle offers (gold “Premium Lifestyle” badge)
  2. Point out: Founders Club offers show as “Founders Club Exclusive” and are locked for Free Vetted members
  3. Compare: Victoria (HNW member) saw only HNW offers — no Medical, no Legal
Professional offers are walled by domain. Lifestyle offers cross boundaries. Tier gates control premium access. Three rules, infinite flexibility.
Finally, the partner's perspective →
Scene 3D

The Partner View

~1 min Partner Portal
Partners get real-time visibility into their ROI. This is what answers the question: “Is my investment working?”
  1. Open partner portal at https://specialoffer-demo.fly.dev/partner (or http://localhost:3000/partner)
  2. Select Stryker (or any partner with offer activity)
  3. Show: summary metrics (impressions, clicks, redemptions, CTR, conversion rate)
  4. Show per-offer conversion funnels: Views → Clicks → Redeemed with engagement indicators
  5. Note: “Every impression, click, and redemption captured in real-time. Partners see exactly what's working.”
This data is from the actual browsing we just did. The partner sees the engagement in real-time.
Epilogue

“Under the Hood”

The architecture that makes it all work — and the path forward
~2 minutes
Epilogue

Everything is an Event

~30 sec Admin UI
Every single action in the platform — every click, every approval, every offer view — is an immutable event. Complete audit trail. Complete replay capability.
  1. Admin → Event Stream
  2. Show color-coded chronological stream (green=membership, orange=offers, yellow=invitations, purple=verification, cyan=domains)
  3. Click any event to expand its payload — every field is traceable
Epilogue

Path to Production

~30 sec Talking Point
The architecture is proven. Here's the path forward.
  1. Phase 1 (Day 1–60): Core modules — largely proven here. Auth, payments, real email integration.
  2. Phase 2 (Day 60–90): Growth enablers — analytics dashboards, content engine, notification system.
  3. Phase 3 (Day 120–180): Scale and differentiation — advanced ML personalization, mobile apps, enterprise partner API.
The PoC de-risks the hardest part: proving the event-sourced CQRS architecture works end-to-end with real-time projections, multi-domain configuration, and behavioral intelligence. 250 automated tests verify every business rule.
Epilogue

The Ask

~30 sec Customize
[Customize this section for each meeting. What are you asking for? Investment? Partnership? Feedback? Technical review?]
  1. Summarize the three stories: the velvet rope (exclusivity), the platform learns (intelligence), one platform many worlds (scalability)
  2. State the ask clearly
  3. Open for questions
Bonus: Career & Life Journey Deep Dive

Optional deep dive — use if audience is interested in the personalization engine details. Not part of the main 15-minute flow.

The platform understands where members are in their careers — and their lives.
  1. Navigate to a member dashboard, click Profile in nav
  2. Show: completeness bar, professional section (domain-scoped fields), career timeline (blue=career, green=life, purple=stage change)
  3. Click “+ Career Moment” — dropdown populated from Medical domain config (Fellowship, Board Certification, etc.)
  4. Click “+ Life Event” — dropdown from platform catalog (grouped by category: Family, Financial, Health, etc.)
  5. Note: “Career moments are domain-specific. Life moments are universal. A surgeon's career milestones are different from a lawyer's, but a home purchase is a home purchase.”
  6. Edit professional section → add years of experience → completeness increases in real-time
Career moments, life events, and behavioral signals combine to create a complete picture. A doctor who just completed a fellowship and bought a house gets different offers than one who's been in practice for 20 years.

Key Points to Emphasize

Business

  • Multi-domain configurability — new verticals are config, not code. Add Accounting without a single line of development.
  • Velvet rope membership — invitation-only creates exclusivity and trust. Members are verified professionals, not anonymous users.
  • Behavioral intelligence — platform learns from every interaction. Recommendations improve with usage.
  • Three revenue streams — partner commissions on conversions, Founders Club membership fees, and strategic data monetization.
  • Partner ROI visibility — real-time metrics on every campaign. Partners see exactly what's working.
  • Career-aware personalization — offers target career moments, life events, and professional milestones.
  • Privacy-first design — consent withdrawal with data anonymization, GDPR-ready architecture.

Technical

  • CQRS/Event Sourcing — every action traceable, reads scale independently
  • Consent-gated tracking — enforced at domain layer, not just UI
  • Infrastructure abstraction — swap components without code changes
  • 250 automated tests — verifying business rules end-to-end
  • Consent as a domain event — withdrawal flows through CQRS, fully auditable

Anticipated Questions

How is this different from just a marketplace?
Two things: the velvet rope and the intelligence layer. Members are verified professionals — you can't just sign up. And every interaction teaches the platform, so partners get increasingly precise targeting over time. It's not a billboard. It's a concierge.
How do you make money?
Three streams: partner commissions on conversions, Founders Club membership fees, and strategic data monetization — aggregated, anonymized insights on professional behavior and spending patterns. The verified membership base makes that data uniquely valuable.
How does the personalization work?
Behavioral signals (clicks, dwell time, partner visits) are recorded with consent and fed into an affinity scoring engine. Each offer category gets a 0-100 affinity score based on weighted, time-decayed signals. The offer feed sorts by affinity, and “Recommended” badges appear on categories with high scores. No ML models — it's a transparent, rule-based system that adapts in real-time.
What about privacy?
Full consent lifecycle — grant, manage preferences, withdraw. Tracking is consent-gated at the domain layer — no signals are recorded until the member explicitly opts in. Three separate toggles: behavioral, geographic, and third-party sharing. Members can withdraw consent at any time via the “Privacy” link in the nav, which anonymizes all behavioral signals (memberId replaced with a deterministic hash — aggregate analytics preserved), resets the behavioral profile to zero, and stops personalization immediately. Members can re-consent and start fresh at any time. The ConsentWithdrawn event is immutable and auditable. Server-authoritative consent (not localStorage). Architecture supports PIPEDA (Canada), GDPR (Europe), and CCPA (US) consent models.
How fast can new domains be added?
Configuration, not development. A new domain — specialties, career stages, verification methods, partner categories — can be stood up in the admin console. The platform handles offer targeting, personalization, and partner matching automatically.
How does partner tracking work?
Two mechanisms: (1) outbound redirects through https://specialoffer-demo.fly.dev/go/{offerId} record a PARTNER_VISIT signal before redirecting to the partner site, and (2) a 1x1 tracking pixel at https://specialoffer-demo.fly.dev/api/track/pixel.gif embedded on partner pages fires a PARTNER_PIXEL signal on load. No cookies, no JavaScript — just HTTP requests. These are high-weight signals (7 and 4 respectively) because they indicate strong purchase intent.
How does this scale?
The CQRS pattern means reads and writes scale independently. Read models are denormalized PostgreSQL — fast queries with no joins. The event store handles append-only writes. In production, EventStoreDB handles millions of events, and read models can be rebuilt from the event stream at any time. The in-process event bus swaps to SNS/SQS for distributed processing.
What about the other modules?
The Blueprint specifies 9 modules. This PoC implements the 5 core modules (Domain Config, Membership, Offers, Partners, Member Profile & Career Journey) plus Tiering, the member portal, partner portal, and admin UI. The remaining modules (Rewards, Analytics, Content, Affiliates) follow the exact same patterns — the architecture is proven.
How long to production?
Three phases: Day 1–60 (core modules — largely proven here), Day 60–90 (growth enablers), Day 120–180 (scale and differentiation). The PoC de-risks the hardest part — proving the architecture works end-to-end with real event sourcing, CQRS projections, and multi-domain configuration.

Timing Guide

Segment Target Cumulative
Opening 0:30 0:30
Story 1: The Velvet Rope 3:30 4:00
Story 2: The Platform Learns 4:45 8:45
Story 3: One Platform, Many Worlds 4:00 12:45
Epilogue: Under the Hood 2:00 14:45
Buffer / Q&A start 0:15 15:00

Troubleshooting

Page loads slowly or shows error (Fly.io)
The Fly.io instance may be waking up from sleep (auto-stop is enabled). Wait 10–15 seconds and refresh. The first request after idle wakes the machine.
Data seems stale or members are missing (Fly.io)
The in-memory event store resets on server restart. The hosted instance is re-seeded on each deployment. If data looks wrong, it may have been reset — start fresh from the Member Directory.
Signals or affinities not updating (Fly.io)
On the hosted instance, projection timing may be slightly slower than local. Wait 2–3 seconds after an action before checking results. Refresh the page if needed.
Member Directory empty
Seed hasn't run or server restarted without re-seeding. Run npm run restart to rebuild and re-seed locally. On Fly.io, the instance re-seeds automatically on deploy.
No “Recommended” badges or personalization on offers
Member hasn't granted behavioral consent yet, or no signals have been recorded. Accept the consent banner first, then browse some offers. Wait 5 seconds for signal batching to flush.
Consent banner doesn't appear
Only shows for ACTIVE members. Ensure the member is fully activated (not just approved). If consent has already been granted, use the “Privacy” nav link to manage preferences, or withdraw consent to see the banner again. Consent is server-authoritative — clearing browser data does not affect consent status.
Partner mock page doesn't load
Ensure you're clicking the “Visit [Partner]” link from an offer detail page. The /partner-demo/{slug} routes require offer and member query params.
Status page stuck on “Under Review”
Admin needs to both Approve AND Activate the member. Check the Members tab → Review Queue in admin.
Events not appearing in stream
SSE connection may have dropped. Refresh the Event Stream page. Check that the backend is running.
Build or deploy issues
Run npm run restart for a clean local rebuild. For Fly.io, use npm run deploy:fly which handles the full pipeline.
“Privacy” link not visible in nav
Member must be active (ACTIVE status). The link doesn't appear on the directory, invitation, application, or status pages. Switch to a pre-seeded member to see it.
Consent withdrawal doesn't seem to work
Check that the member has active consent first — you can't withdraw what isn't granted. After withdrawal, hard-refresh the page (Ctrl+Shift+R) if the dashboard still shows old personalization.