Nexora
A white-label CRM for real estate agencies, running today for Liliana Cappelli Propiedades.

An agency works across properties, contacts, deals, contracts and WhatsApp. Liliana Cappelli Propiedades, in Villa Gesell, also needed a public website under its own name. Each agent should see only their own portfolio, while the owner role sees everything.
Three decisions that shaped it.
- 01
Access rules live in Postgres
Why. Tenant isolation and each agent's portfolio are row-level security policies. The client never filters by tenant. A bug in a screen cannot leak another agency's data.
Trade-off. Policies are harder to debug than app code. When a deal is reassigned, the old agent stops getting realtime events, so the board refetches on window focus.
- 02
White label by environment variables
Why. The same code serves every agency. One variable makes the root domain serve a single agency's website and moves the dashboard to an app subdomain. Another hides the NEXORA name everywhere.
Trade-off. The proxy has to resolve route collisions, since /propiedades exists on both the site and the dashboard. Two hostnames per agency mean more DNS to set up.
- 03
Public site cached for 30 days, purged by tag
Why. The site used to regenerate every few minutes even when nothing changed, which burned server CPU. Pages now live for 30 days. The actions that change a property or the brand call revalidateTag.
Trade-off. Every write path must remember to invalidate. A missed one shows stale data for weeks, and three such gaps had to be found and closed.




Nexora
A white-label CRM for real estate agencies, running today for Liliana Cappelli Propiedades.
- Role
- Product, architecture and full-stack build
- Stack
- Next.js 16, React 19, TypeScript, Supabase, TanStack Query, Tailwind CSS 4

An agency works across properties, contacts, deals, contracts and WhatsApp. Liliana Cappelli Propiedades, in Villa Gesell, also needed a public website under its own name. Each agent should see only their own portfolio, while the owner role sees everything.
Three decisions that shaped it.
Access rules live in Postgres
Why. Tenant isolation and each agent's portfolio are row-level security policies. The client never filters by tenant. A bug in a screen cannot leak another agency's data.
Trade-off. Policies are harder to debug than app code. When a deal is reassigned, the old agent stops getting realtime events, so the board refetches on window focus.
White label by environment variables
Why. The same code serves every agency. One variable makes the root domain serve a single agency's website and moves the dashboard to an app subdomain. Another hides the NEXORA name everywhere.
Trade-off. The proxy has to resolve route collisions, since /propiedades exists on both the site and the dashboard. Two hostnames per agency mean more DNS to set up.
Public site cached for 30 days, purged by tag
Why. The site used to regenerate every few minutes even when nothing changed, which burned server CPU. Pages now live for 30 days. The actions that change a property or the brand call revalidateTag.
Trade-off. Every write path must remember to invalidate. A missed one shows stale data for weeks, and three such gaps had to be found and closed.



