Skip to content
namiciLabby pentry
AI Development | Dashboard

Property ERP

Bali Tropical

Our role: whole development

A WhatsApp sales agent, a property catalogue and a double-entry ledger in one system: the bot answers from the same rows the staff maintain, and every instalment lands in the books.

bali-tropical-erp-property-dashboard-ai

A property developer selling housing clusters across Bali and Lombok ran on three things: a WhatsApp inbox, a folder of photos, and a spreadsheet of who still owed what. This replaces all three with one system — an AI agent that answers from the live catalogue, a double-entry ledger that tracks every instalment, and a portal where a buyer can watch their own house being built.

1. The challenge

The spreadsheet survives about forty buyers. The photo folder stops being findable somewhere around the third cluster. And the WhatsApp inbox never stops at all — it fills at midnight and at weekends with the same twelve questions, asked by people who are genuinely interested and will go elsewhere if nobody answers by morning. Each of those is survivable on its own; together they cap how much the business can sell, because the limit stops being the product and becomes how fast somebody can look something up and reply.

2. The approach

The first decision is the one everything else hangs off: the agent knows nothing and retrieves everything. When a customer asks what is available in a cluster, the answer is assembled by semantic search over the same catalogue rows the staff edit in the dashboard — the model's job is to phrase it, not to supply it. It cannot quote a price that is not in the database, invent a unit, or confirm availability it has not been told about, and when the catalogue genuinely cannot answer, it says so. This matters more than it sounds: a model asked to be helpful about a price it does not know will produce a number, confidently, in the right format, and the only reliable fix is to never let the answer come from the model in the first place.

3. Sounding like the business

Customers here want the owner — not an assistant, not a support desk — and a bot that sounds like a call centre destroys the reason they came. Writing a prompt that imitates somebody is a losing game, so rather than describe her the system measures her: real chat exports are stripped of personal data, then analysed in code for reply length, how often she sends three short messages instead of one long one, and which phrases recur often enough to be hers rather than incidental. Her own past answers are indexed by topic, so a customer asking about mortgages puts her mortgage answers in front of the model rather than a generic example about something else. Several personas can exist with one of them live, and identity, greetings and banned phrases are all edited in the dashboard rather than in code.

4. Where the bot stops

Every conversation carries a mode, and flipping one thread to human makes the bot completely silent on it — not quieter, silent — until somebody hands it back, while it keeps working normally for every other customer. The check sits at the top of the pipeline, before the model is called at all, so in human mode no reply is generated and there is nothing that could leak out late: a customer receiving a bot message while a person is mid-conversation with them is the one failure that cannot be apologised away, and it has to be structurally impossible rather than merely unlikely. The system also takes itself out of the conversation — the moment a customer agrees to see a house, the bot hands over and pushes a notification to the sales rep's phone, because a date and a place is a commitment somebody has to actually keep.

5. Instalments are the business

Almost nobody pays for a house at once, which makes the finance module the part that says whether the company is solvent rather than reporting bolted on at the end. Every transaction records both what the money was for and where it physically moved, and that is what makes the balance sheet an integrity check rather than a summary: assets equal liabilities plus equity by construction, not because somebody reconciled it on a Friday. Transactions are drafted, posted or voided and never quietly deleted, payment methods match how money actually arrives in the country, and the aging report answers the question an owner actually asks, which is who is late and by how much.

6. The build

A NestJS API on PostgreSQL with pgvector for semantic search, a Next.js dashboard, and the official WhatsApp Cloud API running on the client's own number and Business Manager — not a phone in a drawer running an unofficial library, and not a reseller sitting between them and Meta. Outbound follows Meta's rules rather than working around them: outside the 24-hour window a customer's own message opens, only an approved template goes out, and that is enforced at send time instead of failing silently. Five roles are enforced at every endpoint rather than hidden in the interface, records are retired rather than erased, and every change is written to an audit log that can be read per record. It is live now, selling actual houses to actual people.

Built with

  • NestJS

    webhook intake and the message pipeline

  • PostgreSQL

    Catalogue, conversations, leads and the ledge

  • pgvector

    Semantic search over catalogue rows and past replies

  • Next.js

    Staff dashboard and the buyer portal

  • WhatsApp Cloud API

    Official Meta channel on the client's own number

What the build covers

  • WhatsApp agent on the official Cloud API, on the client's own number and Business Manager
  • Answers assembled from the live catalogue by semantic search, never from the model's own memory
  • Reads photos, voice notes and documents, and replies with unit photos and video
  • Persona learned from real chat exports — reply length, message rhythm and recurring phrases, measured in code
  • Personal data stripped before anything is stored, indexed or sent
  • Per-thread human takeover that silences the bot on that conversation and logs who took it, when and why
  • Automatic handover with web push to the sales rep the moment a customer agrees to a site visit
  • Leads captured from the conversation itself and moved through six stages, with no form to fill in
  • Approved-template broadcasts with per-contact variables, and Meta approval status shown in the dashboard
  • Contact import from Excel or a WhatsApp export, with a preview step and nothing written until approved
  • Cluster, type and unit hierarchy, with per-unit status the bot reads before offering anything
  • Media at cluster, type or unit level — photos, video, YouTube links and VR tours
  • Buyer portal showing a customer their own unit and the construction progress posted against it
  • Double-entry ledger on a seeded chart of accounts, with instalment plans recorded against both
  • Balance sheet, cash flow, income statement and instalment-aging reports, exportable to Excel
  • Five roles enforced at every endpoint, invitation-based staff onboarding, and a per-record audit log

Got an Idea?

Let's shape it into something people love to use.