Case study · Real Estate

Cantú Propiedades

The internal software of a boutique real estate agency in Coghlan. Three partners, a neighbourhood office, a system that respects the way they work.

2026 · Internal product · Buenos Aires, Argentina
Try the live demo Public access · no sign-up · 3 profiles loaded
Cantú Propiedades dashboard as seen by Zulma — operational KPIs, team News/Updates module, upcoming visits, and recent leads.
The client

A neighbourhood agency that knows the doormen by name.

Cantú Propiedades serves buyers and sellers of apartments in Coghlan, Villa Urquiza, and Belgrano R. It's one of those neighbourhood agencies that knows the doormen, knows which building has damp problems, and remembers the name of every owner's dog.

Three partners. Working this way for nearly thirty years, before real estate CRMs existed.

Z

Zulma

Managing partner

Handles the VIP property portfolio and the relationships with long-standing owners.

M

Martín

Operations partner

Shows properties, leads visits, closes deals.

C

Carolina

Office manager

Keeps the schedule, confirms visits, and stays in active contact with everyone.

Real case. Names and details changed for confidentiality.

The problem

A business with an invisible ceiling.

When they reached out to us, the business was running. But it was running on Zulma, Martín, and Carolina patching the gaps in the system.

Zulma's personal Excel with her VIP owners lived on her laptop. If the laptop died, fifteen years of relational capital went with it.

Carolina's printed calendar took up half the office wall. Visits were pencilled in. When Martín rescheduled something from the street, Carolina found out two hours later on WhatsApp.

Leads came in through six different channels. When someone wrote on Instagram and then called on the phone, they ended up entered twice without anyone noticing.

The monthly reports for owners were done by hand. Every month. Every time.

None of this made them a bad agency. It made them an agency with an invisible ceiling: they couldn't take on more properties without breaking the operation.

Discovery

Three interviews. Three insights that changed the scope.

We ran three interviews the same week. One with each partner, separately. We learned things that weren't even in the brief.

Lead list in Cantú Propiedades. One lead appears with a violet badge reading 'Referred by Zulma' — the sixth channel that surfaced during discovery.
The violet badge for the sixth channel in the lead list.
The decisions

What made it in and what we left out.

After discovery, the scope changed. Some things from the initial brief were dropped. Others the brief never mentioned were added.

What made it in

  • Row Level Security at three tiers.

    Zulma sees everything, including the special arrangements. Martín sees operational data but not the arrangements. Carolina sees the full schedule but not the internal notes. The difference wasn't built by hiding buttons in the frontend — it was built at the Postgres level. If someone tries to access something they shouldn't via the SQL console, the database returns zero rows. It's the only sustainable approach for an operation that requires real confidentiality.

  • Active duplicate detection.

    When someone starts typing a phone number that already exists, the system warns them before saving. It came directly from the problem of Lucía Fernández (not her real name), who appeared twice in different spreadsheets.

  • A News/Updates module in the dashboard.

    Short asynchronous messages like "the owner wants to raise the price — call him Monday." Visible to all three, marked as read by whoever saw them. It's the closest thing to having all three in the same office.

Don Eduardo's property sheet as seen by Martín. The 'Special arrangement' block doesn't appear — Postgres doesn't return that information for his role.
The property sheet as seen by Martín. Even though he has access to the property, the special arrangement block doesn't appear — Postgres doesn't return that row for his role.
New lead entry form. Carolina types a phone number that already exists and an alert appears warning of a possible duplicate, with a direct link to the existing record.
Duplicate detection fires while you type.

What we left out

  • AFIP integration and electronic invoicing.

    The brief asked for it. We evaluated it. We ruled it out for this stage: serious AFIP billing implementation is three extra months of work, and it's not where the business is losing money right now. Having that conversation directly with the client was one of the most important moments in the project.

  • Automated WhatsApp Business API.

    Getting a Meta-verified Business number takes two to three weeks, and nobody wants to depend on Meta's timeline. Planned for a later round.

  • Native photo storage.

    Properties are currently loaded with an external URL. The next round includes it.

Design system

A visual vocabulary with editorial weight.

Cantú didn't need another SaaS dashboard. It needed something that felt like its calling card. So the design system didn't come from a modern kit — it came from a conversation about what makes an owner feel comfortable handing their keys to an agency.

The visual reference was editorial stationery: British arched portals, old agency stamps, typographic posters made by print shops. Not out of nostalgia — because that vocabulary works as a visual synonym for craft.

How it's built

Stack, infrastructure, and AI as a pair programmer.

Stack: Next.js 14 with App Router for the frontend and API endpoints. Supabase for the database (Postgres), authentication, and storage. Tailwind v3 for the style system. Vercel for hosting and deploys.

The database has nine main entities and approximately thirty-two active Row Level Security policies. Every query that goes through the app is filtered by those policies in Postgres before any data is returned. Don Eduardo's confidentiality doesn't depend on the frontend remembering to hide a button — it depends on Postgres refusing to return that row if the user making the query isn't Zulma.

Data model diagram. Nine main entities connected by foreign keys: users, properties, owners, leads, visits, news/updates, inquiries, monthly reports, portals.
Full data model · 9 entities.

Deployment is continuous. Every commit to the main GitHub branch deploys automatically. No servers to maintain, no manual release processes. If we break something, we know in thirty seconds. If we fix something, it's live in thirty seconds.

The public demo resets every twenty-four hours. A cron job runs at four in the morning, Argentina time, and restores the demo data to its original state. Any visitor can try the product without permanently altering it.

Permission matrix by role. Three roles (Zulma, Martín, Carolina) crossed with seven domains show three access levels: full, partial, no access.
The RLS policies translated into human-readable form.

On the process

We worked with Claude Code as a pair programmer. That description is precise: pair programmer, not autopilot. It speeds up implementation but doesn't make product decisions.

The decisions you see in this case study — the sixth channel, asymmetric confidentiality, the news/updates module, what we left out — came from the interviews and from the studio's thinking. Claude Code wrote most of the code that implements them.

Project timeline. Eight weeks with milestones per week, from the initial discovery through to the public demo deploy.
Eight weeks from first contact to deploy.
Result

A live demo, open to anyone.

The product is live at cantu.js80.studio. It has three demo users:

Log in as any of the three by clicking the large buttons on the login screen. No password needed. Data resets every night.

Cantú Propiedades login screen. Traditional form at the top, a divider reading 'or try the demo', three large buttons to log in as Zulma, Martín, or Carolina without a password.
The three quick-login buttons on the public demo.
Weekly schedule view in Cantú Propiedades. Visits distributed across different days with colour by status: scheduled, confirmed, completed.
The weekly schedule with real visits from the demo seed.

Project numbers

8 Weeks from first contact to deploy
9 Entities in the data model
32 Active RLS policies in Postgres
3 Differentiated permission tiers
~5k Lines of code
0 Own infrastructure · Vercel + Supabase
Next rounds

The product isn't finished. It's alive.

That means it keeps evolving. Next rounds:

Let's talk

Does your business look more like Cantú than a startup?

JS80 is a digital solutions studio based in Buenos Aires. We build complete products for real businesses: one idea, one team, one delivery that works.