15 min read 3193 words Updated Mar 17, 2026 Created Mar 17, 2026
#authentication#community#email-nurture#mvp-launch#portal#quiz#tech-spec

Lux Living Collective — Portal Tech Spec & Launch Plan (Revised)

Revision note: This replaces the Softr+Airtable approach. You're a software engineer with an existing Astro + Strapi + Cloudflare Workers stack. We build on what exists.


What You Already Have (and it's a lot)

Your existing site at ~/code/active/lux-property is a strong foundation:

AssetWhat It Gives You
Astro 5.14 + SSRServer-rendered pages on Cloudflare Workers — fast, SEO-friendly, can handle auth
Strapi CMSSelf-hosted at content.luxlivingcollective.au — already has Projects, Developers, Architects, Builders, Amenities, News
Cloudflare WorkersEdge compute with KV/D1/R2 available — sessions, storage, file uploads all solved
React componentsExisting component library in src/components/react/ for interactive UI
30 landing page variantssrc/pages/lp/v1 through v30 — template infrastructure already proven
Lead capture systemExit intent modal, enquiry forms, consultation forms with n8n webhook integration
Phone verification APIsrc/pages/api/verify-mobile.ts and verify-code.ts — OTP flow already built
PostHog analyticsEvent tracking already integrated
Meta Conversion APIServer-side tracking via src/pages/api/meta-capi.ts
Tailwind 3.4Design system ready to extend
Bun runtimeFast local dev and builds

Verdict: Don't start from scratch. Extend this.


Architecture: What to Add

EXISTING                           NEW (add these)
─────────────────────────────      ──────────────────────────────────
Astro SSR (Cloudflare Workers)     + Auth middleware (sessions via CF KV)
Strapi CMS                         + New content types (Clients, QuizResponses, Shortlists, Milestones)
React components                   + Portal dashboard components
Landing pages (30 variants)        + 3 segment pages (investors, downsizers, FHB)
Lead capture forms                 + Apartment matching quiz
n8n webhooks                       + Email nurture triggers
PostHog                            + Portal event tracking (funnel analytics)
Meta CAPI                          + Quiz completion events
Phone verification                 + (reuse for portal signup)

What You DON'T Need

  • No separate portal app (build it into the existing Astro site)
  • No Softr/Airtable ($0/month saved)
  • No separate auth provider (Cloudflare Workers + KV handles sessions)
  • No separate community platform yet (start with WhatsApp or a simple /community page)
  • No separate email platform initially (n8n can trigger emails via Resend/Postmark API)

Phase 1: Seal the Funnel (Week 1-2)

This is the highest-impact work. Everything in the repositioning strategy depends on this.

1A. New Pages (Astro)

Create these pages in the existing site:

src/pages/
├── quiz/
│   └── index.astro              ← Apartment matching quiz (React component)
├── book/
│   └── index.astro              ← Consultation booking (Calendly embed or custom)
├── how-it-works/
│   └── index.astro              ← Advisory process explainer
├── for-investors/
│   └── index.astro              ← Investor-focused landing page
├── for-downsizers/
│   └── index.astro              ← Downsizer-focused landing page
├── first-home-buyers/
│   └── index.astro              ← FHB-focused landing page
├── guide/
│   └── index.astro              ← Buyer's guide download (email gate)
└── api/
    ├── quiz-submit.ts           ← Quiz submission → Strapi + n8n
    └── guide-download.ts        ← Guide request → email capture + n8n

Copy: Use the landing page copy from mvp/LANDING-PAGES.md — it's already written.

1B. Apartment Matching Quiz (React Component)

A multi-step form component that lives at /quiz/. This is your primary lead magnet.

src/components/react/Quiz/
├── Quiz.tsx                     ← Main quiz container (step management)
├── QuizStep.tsx                 ← Individual question step
├── QuizResults.tsx              ← "We found 3 matches" teaser + booking CTA
└── quiz-config.ts               ← Questions, options, scoring logic

Quiz flow:

  1. 5 questions (reason for buying, area preference, budget, priorities, timeline)
  2. Animated step transitions
  3. Results page: "Based on your answers, we've matched you with 3 developments"
  4. NO project names shown — just attributes ("a boutique development in the Inner West with rooftop amenities")
  5. CTA: "Book a free 15-min call to get your personalised shortlist"
  6. Capture: name, email, phone
  7. Submit → Strapi (new QuizResponse content type) + n8n webhook (triggers email nurture)

Quiz data goes to Strapi as a new content type:

QuizResponse:
  - name: string
  - email: string (unique)
  - phone: string
  - reason: enum (first-home, upgrade, downsize, investment)
  - areas: json (array of selected areas)
  - budget: enum (under-800k, 800k-1.2m, 1.2m-2m, 2m-plus)
  - priorities: enum (location, design, investment, lifestyle)
  - timeline: enum (now, 3-6-months, 6-12-months, researching)
  - source: string (utm_source, utm_campaign tracking)
  - status: enum (new, contacted, consultation-booked, active-client, purchased)
  - createdAt: datetime

1C. Homepage Rework

Update the existing homepage (src/pages/index.astro) to match the repositioning:

Current: "Elevate Your Living" + 6 named project cards
New: "The Smart Way to Buy a New Apartment in Sydney" + How It Works + quiz CTA

You don't need to delete the project pages yet — just change what the homepage leads with. The project pages can stay but be de-emphasised (remove from nav, keep for SEO).

1D. API Routes

Add to existing src/pages/api/:

// src/pages/api/quiz-submit.ts
// POST: receives quiz answers + contact info
// → Creates QuizResponse in Strapi
// → Sends to n8n webhook (triggers email nurture sequence)
// → Fires Meta CAPI event (Lead / CompleteRegistration)
// → Returns success + redirect to /book/

// src/pages/api/guide-download.ts
// POST: receives name + email
// → Creates or updates contact in Strapi
// → Sends to n8n webhook (triggers guide email + nurture)
// → Returns PDF URL or sends via email

Phase 1 Effort Estimate

TaskEffortNotes
3 segment landing pages3-4 hoursCopy is written, just needs Astro pages + styling
/how-it-works page1-2 hoursStatic page with icons/steps
/book page1 hourCalendly embed or simple booking form
/guide page1 hourEmail capture + PDF download
Quiz React component4-6 hoursMulti-step form, animations, validation
Quiz API route1-2 hoursStrapi + n8n + Meta CAPI integration
Strapi QuizResponse type30 minNew content type in admin
Homepage update2-3 hoursNew hero, reorder sections, add quiz CTA
Total~15-20 hoursSpread over 1-2 weeks

Monthly cost: $0 additional (runs on existing Cloudflare Workers plan)


Phase 2: Client Portal (Week 3-5)

Once you're capturing leads through the quiz, build the portal that keeps them in your ecosystem.

2A. Authentication

Use Cloudflare Workers KV for session management. No need for Auth0/Clerk/Supabase.

src/
├── middleware.ts                 ← Astro middleware: check session cookie, protect /portal/* routes
├── pages/
│   ├── login/
│   │   └── index.astro          ← Magic link login (email-based, no password)
│   ├── portal/
│   │   ├── index.astro          ← Dashboard home
│   │   ├── shortlist.astro      ← Their matched developments
│   │   ├── checklist.astro      ← Buying journey checklist
│   │   ├── resources.astro      ← Guides, documents, links
│   │   └── profile.astro        ← Their preferences and contact info
│   └── api/
│       ├── auth/
│       │   ├── login.ts         ← Send magic link email
│       │   ├── verify.ts        ← Verify magic link token, create session
│       │   └── logout.ts        ← Destroy session
│       └── portal/
│           ├── shortlist.ts     ← CRUD shortlist items
│           └── checklist.ts     ← Update checklist progress

Why magic links:

  • Zero friction (no password to remember)
  • Reuses the phone verification pattern you already have (but via email)
  • Feels premium (like high-end services)
  • You already have their email from quiz/consultation

Session flow:

  1. Client enters email on login page
  2. API generates a token, stores in KV with 15-min TTL, sends email via Resend/Postmark
  3. Client clicks link → API verifies token → creates session cookie → redirects to /portal/
  4. Session stored in Cloudflare KV (key: session token, value: client ID, TTL: 30 days)
  5. Astro middleware checks session cookie on every /portal/* request

2B. Strapi Content Types (Portal Data)

Extend your existing Strapi with:

Client (new content type):
  - name: string
  - email: string (unique)
  - phone: string
  - segment: enum (investor, downsizer, fhb, upgrader)
  - status: enum (lead, quiz-completed, consultation-booked, active, purchased, post-purchase)
  - quizResponse: relation (→ QuizResponse)
  - shortlist: relation (→ Project[], many-to-many)
  - notes: richtext (your internal notes about this client)
  - consultationDate: datetime
  - assignedTo: string (which team member is managing them)
  - source: string (utm tracking)
  - createdAt: datetime

ClientMilestone (new content type):
  - client: relation (→ Client)
  - milestone: enum (joined, quiz-completed, consultation-booked, pre-approved,
                      shortlist-received, display-suite-visited, offer-made,
                      contract-signed, settlement-complete)
  - completedAt: datetime
  - notes: text

Shortlist (new content type):
  - client: relation (→ Client)
  - project: relation (→ Project)
  - yourNotes: richtext (why you recommended this one)
  - status: enum (recommended, interested, visited, rejected, chosen)
  - addedAt: datetime

Key insight: Projects already exist in Strapi with full details (developer, architect, builder, amenities, images, pricing). The Shortlist content type just creates a client-specific view of those projects with your advisory notes attached. The client sees the projects you've curated for them — not the full database.

2C. Portal Dashboard (React Components)

src/components/react/Portal/
├── Dashboard.tsx                ← Overview: stage indicator, next steps, recent updates
├── ShortlistView.tsx            ← Cards showing their matched developments
├── ProjectCard.tsx              ← Individual project in shortlist (uses existing StrapiProject type)
├── JourneyChecklist.tsx         ← Buying journey stages with checkboxes
├── ResourceLibrary.tsx          ← Guides, documents, useful links
└── ProfileSettings.tsx          ← Edit preferences, contact info

Dashboard shows:

  • Where they are in the journey (visual progress bar)
  • Their shortlisted developments (revealed after consultation — this is the funnel seal)
  • Next recommended action ("Book your first display suite visit" / "Review the contract checklist")
  • Upcoming Q&A sessions
  • Direct message link to their advisor (you)

2D. The Funnel Seal in Action

Here's how the portal completes the repositioning strategy:

1. Lead takes quiz → captured in Strapi, no project names revealed
2. Lead books consultation → you discuss needs, recommend 2-3 projects
3. You create Shortlist entries in Strapi → link Client to Projects with your notes
4. Client gets portal access (magic link email)
5. Client logs in → sees their personalised shortlist with YOUR context
   - "We recommend this because..."
   - "The developer has a strong track record..."
   - "This is undervalued compared to..."
6. Client can mark projects as interested/visited/rejected
7. You see their engagement in Strapi admin → know when to follow up

They CAN still Google the project name at this point, but:
- You've already built trust through the consultation
- Your advisory notes add value they can't get from the developer
- The portal gives them a reason to stay in your ecosystem
- They see you as THEIR advisor, not the project's salesperson

Phase 2 Effort Estimate

TaskEffortNotes
Magic link auth system4-6 hoursAPI routes + KV sessions + email sending
Astro middleware (route protection)1-2 hoursCheck session cookie, redirect to login
Strapi content types (Client, Milestone, Shortlist)1-2 hoursAdmin UI config
Portal dashboard page + components6-8 hoursDashboard, shortlist view, checklist
Portal API routes3-4 hoursShortlist CRUD, checklist updates
Email templates (magic link, welcome)1-2 hoursHTML email templates via Resend
Total~20-25 hoursSpread over 2-3 weeks

Monthly cost: ~$5-10/month (Resend for transactional emails, everything else on existing CF plan)


Phase 3: Email Nurture & Automation (Week 4-6)

3A. Email Provider

Existing: Brevo (already in place) — use for now or migrate to Plunk (open-source, self-hostable, clean API for transactional + automated sequences).

Plunk handles nurture sequences natively — no need to route email through n8n. Keep n8n for what it's already doing (form webhooks, other automations). Email delivery and sequencing live directly in your email platform.

Quiz submit → API route:
  1. Save QuizResponse to Strapi
  2. Call Plunk/Brevo API: create contact, tag by segment, trigger sequence
  3. Fire Meta CAPI event
  4. Return success

3B. Email Sequences

Use the 19 emails from mvp/QUIZ-AND-EMAIL.md. They're already written. Set up these sequences in Plunk/Brevo directly:

Sequences (configured in Plunk/Brevo):
├── quiz-nurture-investor (5 emails over 14 days)
├── quiz-nurture-downsizer (6 emails over 21 days)
├── quiz-nurture-fhb (6 emails over 21 days)
├── consultation-booked (confirmation + prep email)
├── post-consultation (shortlist ready + portal invite)
└── no-show-reengagement (2 emails)

Trigger: API call from quiz-submit or consultation-booked API route → Plunk/Brevo adds contact to the right sequence based on segment tag.

3C. Portal Notifications

Once the portal exists, add email triggers for portal events:

  • "Your shortlist is ready — log in to view" (after you create their shortlist)
  • "New development added to your shortlist" (when you add a match)
  • "Monthly Q&A this Thursday — submit your questions" (community)
  • "Market update for [their preferred area]" (content)

These are transactional emails sent via Plunk/Brevo API — not sequences.

Phase 3 Effort Estimate

TaskEffortNotes
Plunk/Brevo API integration1-2 hoursSimple fetch calls from API routes
Email sequences (6 sequences)3-4 hoursConfigure in Plunk/Brevo UI, copy from QUIZ-AND-EMAIL.md
HTML email templates3-4 hoursResponsive templates, 3-4 base designs
Portal notification triggers2-3 hoursTransactional sends from API routes
Total~12-14 hours

**Monthly cost: $0-25/month** (Brevo free tier or Plunk self-hosted, or Plunk Cloud ~$25/mo)


Phase 4: Community (Month 2-3)

Start with the simplest thing that works. Graduate complexity as membership grows.

Zero code. See COMMUNITY-LAUNCH-PLAN.md for the full playbook. Add a /community page to the site with:

  • What the community is
  • What happens there (Q&A sessions, market updates, peer support)
  • Join link (WhatsApp invite)
  • Screenshots/social proof

Option B: Simple Forum Page (When you outgrow WhatsApp)

Build a basic discussion space into the Astro site. Use Cloudflare D1 (SQLite at the edge) as the database.

src/pages/community/
├── index.astro                  ← Topic list
├── [topic].astro                ← Thread view
├── new.astro                    ← New topic form (auth required)
└── api/
    ├── topics.ts                ← CRUD topics
    └── replies.ts               ← CRUD replies

D1 Schema:
  topics: id, title, author_id, category, body, created_at, last_reply_at, reply_count
  replies: id, topic_id, author_id, body, created_at
  categories: id, name, slug, description

This is intentionally simple. No notifications, no reactions, no threading. Just topics and replies. You can add features as the community grows, or migrate to Flarum/Discourse if it takes off.

Option C: Flarum (If community becomes core to the business)

Self-host on a $18/month DigitalOcean droplet at community.luxlivingcollective.au. Only worth it if you hit 100+ active members and need moderation tools, search, notifications, mobile PWA.

Recommended path: A → B → C as the community grows.


Full Cost Summary

ItemMonthly CostNotes
Cloudflare Workers$5 (paid plan) or $0 (free tier)You're likely already on this
Strapi hostingAlready runningcontent.luxlivingcollective.au
Email (Plunk/Brevo)$0-25/monthBrevo free tier, Plunk self-hosted, or Plunk Cloud
n8nAlready runningSelf-hosted
PostHogAlready runningFree tier or existing plan
Domain/DNSAlready running
Total new cost~$0-30/monthvs. $176/month for Softr+Airtable

Tech Stack Summary

FRONTEND        Astro 5.14 + React (existing) + Tailwind 3.4 (existing)
RUNTIME         Cloudflare Workers (existing) + Bun (existing, local dev)
CMS/DATABASE    Strapi (existing) — extended with Client, QuizResponse, Shortlist, Milestone types
AUTH            Magic links + Cloudflare KV sessions (new, ~6hrs to build)
EMAIL           Plunk or Brevo (existing) — sequences + transactional, no n8n needed for email
ANALYTICS       PostHog (existing) + Meta CAPI (existing)
COMMUNITY       WhatsApp initially → built-in forum later → Flarum if needed
FILE STORAGE    Cloudflare R2 (if needed for guide PDFs, documents)

Build Sequence

Sprint 1 (Week 1-2): Seal the Funnel

Priority: Stop the leak. Get quiz live, get segment pages live, update homepage.

  1. Create Strapi QuizResponse content type
  2. Build quiz React component
  3. Build /quiz/ page + /api/quiz-submit route
  4. Create 3 segment landing pages (/for-investors/, /for-downsizers/, /first-home-buyers/)
  5. Create /how-it-works/ and /book/ pages
  6. Update homepage hero + navigation
  7. Set up n8n workflow: quiz submit → email notification to you
  8. Deploy

Sprint 2 (Week 3-4): Email Nurture

Priority: Don't let quiz leads go cold. Automated follow-up.

  1. Set up Plunk (or configure Brevo) — API integration from API routes
  2. Build HTML email templates (base layout + 3-4 variants)
  3. Create email sequences in Plunk/Brevo (investor, downsizer, FHB)
  4. Wire quiz submission → segment detection → correct sequence
  5. Add Meta CAPI events for quiz completion
  6. Create /guide/ page + buyer's guide PDF

Sprint 3 (Week 5-7): Client Portal

Priority: Give consultation clients a reason to stay.

  1. Create Strapi Client, Shortlist, ClientMilestone content types
  2. Build magic link auth (login page, API routes, KV sessions, middleware)
  3. Build portal dashboard page + React components
  4. Build shortlist view (shows projects you've recommended)
  5. Build journey checklist
  6. Wire portal invite email (sent after consultation)
  7. Deploy

Sprint 4 (Week 8-10): Community + Polish

Priority: Start building the peer network.

  1. Launch WhatsApp community (zero code, see community launch plan)
  2. Add /community/ page to site (info + join link)
  3. Run first Q&A session
  4. Add Google Ads campaigns (search intent keywords from repositioning strategy)
  5. A/B test ad creatives (use the 22 ad units from mvp/AD-CREATIVES.md)
  6. Track full funnel: ad → quiz → consultation → portal → purchase

What We Build Together

Given you're a software engineer and I'm here to help, here's how we'd split the work:

You HandleI Help With
Strapi content type config (admin UI)Defining the schemas and relations
Design decisions (look and feel)Component structure, Tailwind styling
Deployment and infra (CF Workers, DNS)Config files, wrangler setup
Business logic reviewWriting the actual code — pages, components, API routes
Testing in productionAutomated tests if you want them

When you're ready to start building, we can work through each sprint together. I can write the code, you review and deploy. The quiz component alone would seal most of the funnel leak and could be live in a day or two.


Success Metrics (Same as Before)

MetricTarget (90 days)
Funnel leakage (leads who bypass us)<10% (down from est. 50%+)
Quiz completions/month200+
Consultation bookings/month40-60
Portal active users30-50
Purchases through us/month3-5
Cost per consultation booking<$20
Consultation → purchase rate10-15%

This approach costs ~$20/month instead of $176/month, gives you full control over the codebase, builds on infrastructure you already maintain, and can be built incrementally starting with the highest-impact piece (the quiz that seals the funnel).