Western Casa — a platform for hard-to-move luxury listings, designed and shipped in code
High-end listings sit on the market because agents can't tell which enquiries are real. Western Casa is a production, multi-tenant SaaS that gives each agent a branded listing page with an embedded Buyer Match Quiz, scoring how ready and how appropriate a buyer is before the lead reaches them, then firing a one-tap WhatsApp opener.
I owned all of it: product design, information architecture, and the front-end build. The computeMatchScore engine, a versioned scoring rubric, a multi-tenant Postgres model with row-level security, and Mexico's LFPDPPP privacy law implemented end to end.
Problem
Luxury agents lose deals to slow response. The industry norm is 20–45 minutes to a new lead, and published research (MIT Sloan, HBR) ties response time directly to conversion — while agents burn hours on buyers who were never going to close.
Approach
A per-listing branded page with an embedded Buyer Match Quiz that scores intent before the lead reaches the agent, then fires a one-tap WhatsApp opener. Response compresses to under 5 seconds, and only qualified buyers get through.
What I designed & built
computeMatchScore() — a pure, auditable function turning buyer inputs (budget, timeline, financing, origin) into a 0–100 score, a tier, and a transparent breakdown. A versioned per-listing rubric, never mutated in place. A multi-tenant Postgres model with row-level security and full attribution. Shipped in six phases (and squashed a Vercel serverless dangling-promise bug along the way).
Compliance & outcome
Mexico's LFPDPPP end to end — versioned privacy notice, consent timestamping, automated ARCO rights on a 20-day SLA. Live with first client Kari Estrada (Century 21 Heavenly), a $4.64M MXN listing. Response time: ~30 min → under 5 sec.
The page a buyer actually lands on
The listing sells the house. The one button is what turns a visitor into a scored lead.
Everything above the fold is doing conventional listing work. The single call to action is the entry to the Buyer Match Quiz, and it is the only path into the funnel, which is why nothing else on the page competes with it.
- 1 Quiz entryThe only route into the Buyer Match Quiz. Every scored lead in the funnel starts at this button.
- 2 Per-tenant branding and contactAgent identity, phone and WhatsApp are configuration, not code. One codebase serves every agent.
-
3
Structured listing attributesBedrooms, baths, built area, lot and price are the property side of the comparison
computeMatchScoreruns a buyer against.
- Role
- Design and build. Page, brand system, CTA hierarchy, tenant config.
- Locale
- Spanish-first · MXN pricing · metric area
function computeMatchScore(inputs, rubric): { score: number, tier: 'hot' | 'warm' | 'cold' | 'disqualified', breakdown: Array<{ factor: string, points: number }> } { const breakdown = [ { factor: 'budget', points: rubric.budget[inputs.budget] ?? 0 }, // max 30 { factor: 'timeline', points: rubric.timeline[inputs.timeline] ?? 0 }, // max 25 { factor: 'financing', points: rubric.financing[inputs.financing] ?? 0 }, // max 20 { factor: 'origin', points: rubric.originCity(inputs.origin) }, // max 10 ]; const score = breakdown.reduce((s, b) => s + b.points, 0); const tier = score >= 75 ? 'hot' : score >= 55 ? 'warm' : score >= 30 ? 'cold' : 'disqualified'; return { score, tier, breakdown }; }
computeMatchScore is a pure, deterministic function with no I/O — it takes quiz inputs and a versioned rubric and returns a score, a tier, and a per-factor breakdown. That makes it fully unit-testable, and it locks the rubric version to each lead at capture so historical scores stay explainable.Locate → Translate → Stage → Compound
The stage worth owning is the one where an enquiry becomes a lead worth calling.
Reach is easy to buy and closing belongs to the agent. The stage in between is the one nobody owns, so that is the one the platform runs: turning an anonymous enquiry into a scored, routed lead an agent can act on.
-
01 · REACHPaid + organic impressions
184,000—
-
02 · SESSIONLanding page session
8,420−95.4%
-
03 · INTENTEnquiry submitted
612−92.7%
-
04 · OWNED STAGEScored, deduped, routed
487−20.4%
-
05 · CONTACTAgent first response
368−24.4%
-
06 · OUTCOMEShowing booked
114−69.0%
- Role
- Design and build. Funnel model, schema, UI, routing logic, tenant configuration.
- Stack
- Next.js 14 · TypeScript · Supabase
Row-level tenancy · LFPDPPP-compliant - Outcome
- Live with a paying client.
rosa-morada.western.casa