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:
| Asset | What It Gives You |
|---|---|
| Astro 5.14 + SSR | Server-rendered pages on Cloudflare Workers — fast, SEO-friendly, can handle auth |
| Strapi CMS | Self-hosted at content.luxlivingcollective.au — already has Projects, Developers, Architects, Builders, Amenities, News |
| Cloudflare Workers | Edge compute with KV/D1/R2 available — sessions, storage, file uploads all solved |
| React components | Existing component library in src/components/react/ for interactive UI |
| 30 landing page variants | src/pages/lp/v1 through v30 — template infrastructure already proven |
| Lead capture system | Exit intent modal, enquiry forms, consultation forms with n8n webhook integration |
| Phone verification API | src/pages/api/verify-mobile.ts and verify-code.ts — OTP flow already built |
| PostHog analytics | Event tracking already integrated |
| Meta Conversion API | Server-side tracking via src/pages/api/meta-capi.ts |
| Tailwind 3.4 | Design system ready to extend |
| Bun runtime | Fast 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
/communitypage) - 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:
- 5 questions (reason for buying, area preference, budget, priorities, timeline)
- Animated step transitions
- Results page: "Based on your answers, we've matched you with 3 developments"
- NO project names shown — just attributes ("a boutique development in the Inner West with rooftop amenities")
- CTA: "Book a free 15-min call to get your personalised shortlist"
- Capture: name, email, phone
- 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
| Task | Effort | Notes |
|---|---|---|
| 3 segment landing pages | 3-4 hours | Copy is written, just needs Astro pages + styling |
| /how-it-works page | 1-2 hours | Static page with icons/steps |
| /book page | 1 hour | Calendly embed or simple booking form |
| /guide page | 1 hour | Email capture + PDF download |
| Quiz React component | 4-6 hours | Multi-step form, animations, validation |
| Quiz API route | 1-2 hours | Strapi + n8n + Meta CAPI integration |
| Strapi QuizResponse type | 30 min | New content type in admin |
| Homepage update | 2-3 hours | New hero, reorder sections, add quiz CTA |
| Total | ~15-20 hours | Spread 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:
- Client enters email on login page
- API generates a token, stores in KV with 15-min TTL, sends email via Resend/Postmark
- Client clicks link → API verifies token → creates session cookie → redirects to /portal/
- Session stored in Cloudflare KV (key: session token, value: client ID, TTL: 30 days)
- 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
| Task | Effort | Notes |
|---|---|---|
| Magic link auth system | 4-6 hours | API routes + KV sessions + email sending |
| Astro middleware (route protection) | 1-2 hours | Check session cookie, redirect to login |
| Strapi content types (Client, Milestone, Shortlist) | 1-2 hours | Admin UI config |
| Portal dashboard page + components | 6-8 hours | Dashboard, shortlist view, checklist |
| Portal API routes | 3-4 hours | Shortlist CRUD, checklist updates |
| Email templates (magic link, welcome) | 1-2 hours | HTML email templates via Resend |
| Total | ~20-25 hours | Spread 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
| Task | Effort | Notes |
|---|---|---|
| Plunk/Brevo API integration | 1-2 hours | Simple fetch calls from API routes |
| Email sequences (6 sequences) | 3-4 hours | Configure in Plunk/Brevo UI, copy from QUIZ-AND-EMAIL.md |
| HTML email templates | 3-4 hours | Responsive templates, 3-4 base designs |
| Portal notification triggers | 2-3 hours | Transactional 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.
Option A: WhatsApp Community (Recommended for launch)
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
| Item | Monthly Cost | Notes |
|---|---|---|
| Cloudflare Workers | $5 (paid plan) or $0 (free tier) | You're likely already on this |
| Strapi hosting | Already running | content.luxlivingcollective.au |
| Email (Plunk/Brevo) | $0-25/month | Brevo free tier, Plunk self-hosted, or Plunk Cloud |
| n8n | Already running | Self-hosted |
| PostHog | Already running | Free tier or existing plan |
| Domain/DNS | Already running | |
| Total new cost | ~$0-30/month | vs. $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.
- Create Strapi
QuizResponsecontent type - Build quiz React component
- Build
/quiz/page +/api/quiz-submitroute - Create 3 segment landing pages (
/for-investors/,/for-downsizers/,/first-home-buyers/) - Create
/how-it-works/and/book/pages - Update homepage hero + navigation
- Set up n8n workflow: quiz submit → email notification to you
- Deploy
Sprint 2 (Week 3-4): Email Nurture
Priority: Don't let quiz leads go cold. Automated follow-up.
- Set up Plunk (or configure Brevo) — API integration from API routes
- Build HTML email templates (base layout + 3-4 variants)
- Create email sequences in Plunk/Brevo (investor, downsizer, FHB)
- Wire quiz submission → segment detection → correct sequence
- Add Meta CAPI events for quiz completion
- Create
/guide/page + buyer's guide PDF
Sprint 3 (Week 5-7): Client Portal
Priority: Give consultation clients a reason to stay.
- Create Strapi
Client,Shortlist,ClientMilestonecontent types - Build magic link auth (login page, API routes, KV sessions, middleware)
- Build portal dashboard page + React components
- Build shortlist view (shows projects you've recommended)
- Build journey checklist
- Wire portal invite email (sent after consultation)
- Deploy
Sprint 4 (Week 8-10): Community + Polish
Priority: Start building the peer network.
- Launch WhatsApp community (zero code, see community launch plan)
- Add
/community/page to site (info + join link) - Run first Q&A session
- Add Google Ads campaigns (search intent keywords from repositioning strategy)
- A/B test ad creatives (use the 22 ad units from
mvp/AD-CREATIVES.md) - 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 Handle | I 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 review | Writing the actual code — pages, components, API routes |
| Testing in production | Automated 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)
| Metric | Target (90 days) |
|---|---|
| Funnel leakage (leads who bypass us) | <10% (down from est. 50%+) |
| Quiz completions/month | 200+ |
| Consultation bookings/month | 40-60 |
| Portal active users | 30-50 |
| Purchases through us/month | 3-5 |
| Cost per consultation booking | <$20 |
| Consultation → purchase rate | 10-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).