Truva · Pricing engine · 4 min read
Making a price guarantee safe to give
within 4%price guarantees vs final sale value
- What
TruIQ, Truva's pricing engine, built from scratch. It values a home using what similar flats actually sold for. It was the first and biggest thing I built at Truva, and most of what came after runs on its data.
- Team
me, working with the valuation team and the founders. There was no product manager or designer on it.
- Result
price guarantees within 4% of the final sale value. Valuation throughput up 10x, mispriced valuations down 25%, and ~₹1Cr saved.
- My part
the PRD, the screens, the success metrics (accuracy first, then turnaround), the pipeline that matches sale records to flats, and how comparables are scored, designed with the valuation team.
01
The problem
Truva signs a 6-month exclusive mandate with a home seller and writes a guaranteed price into the contract. If the home does not sell in time, Truva pays the seller a penalty of 2-3% of its value.
The margins are thin. Truva earns a spread of roughly 5% on a home, so its gross margin is only about 1.5-2% of the home's value. Overprice a home by 1.5% and the profit is gone. Miss by 4% and Truva takes a loss.
Only about 1 in 10 offers becomes a signed mandate, so 10 homes a month needs about 100 accurate valuations.
Before TruIQ, every valuation lived in Excel. Analysts searched CRE Matrix for relevant sales, or exported them, picked the comparables by hand and copied them into a valuation template. Anything already worked out for a flat, like its view rating, had to be entered again the next time a similar flat in the same society came up. It was slow, inconsistent, and about ₹80L a year of staging and renovation spend was at risk from mispricing.
So the bar was simple to say and hard to hit: a guaranteed price has to land within 4% of what the home finally sells for.
02
Who the users were and what I learned
The first users were Truva's valuation analysts, and I shadowed 4-5 of them. The slowest step was finding comparable sales, and it was where most mistakes happened, because comparables got missed.
Underneath was a harder problem. Past sale prices come from government registration records. Those records are in Marathi, in an unstructured free-text field, and the only location in a record is a "village". Villages and Truva's micro-markets do not line up: one village can cover several micro-markets, and one micro-market can cover several villages. Truva had a database of every tower and flat in its regions, but nothing linked a sale record to a flat.
No link meant no comparables. No comparables meant no engine.
03
Options considered
- Keep valuing by hand. To handle 10 times the volume, Truva would have needed a dedicated team of 5-6 more analysts. That cost is where the ~₹1Cr saving comes from.
- ChosenMatch the records with rules plus an LLM (chosen). Rules narrow the search, and the model reads the Marathi text. It was prompt engineering plus ordinary backend work. I started with Meta's models on AWS Bedrock, which were cheaper, and the company only had AWS credits. Later I moved to Gemini, which handles Indian languages best.
- ChosenScore comparables in a straight line, or punish a bad mismatch (chosen: punish). The first relevance score added its factors up evenly. We changed it so that if four factors match well but one is far off, the score drops sharply.
04
What shipped
The matching pipeline, run by background workers:
- Take the record's village and list every tower it could contain.
- Give the model the Marathi text, that list of towers, the rules and a few worked examples.
- The model returns the most likely tower, a confidence score and its reason. The reason is kept, so a bad match can be traced and the prompt fixed.
- Records at 95%+ confidence are mapped to the tower automatically.
- A second worker pulls the unit number from the text and finds the exact flat.
Sale record
गाव ▒▒▒▒▒▒
▒▒▒▒ ▒▒▒▒▒▒ ▒▒▒
सदनिका क्र. ▒▒
▒▒▒▒▒▒ ▒▒▒▒ ▒▒
Free text. The only location is a village.
- 1
Village to towers
List every tower the village could contain
- 2
LLM
Picks the likeliest tower, a confidence score and its reason
- 3
Confidence 95%+
Mapped to the tower automatically
- 4
Exact flat
A second worker reads the unit number
The model's reason is stored with every match, so a bad match can be traced and the prompt fixed.
The comparables. Truva works mostly in high-rise societies, so the closest comparables are the flats directly above and below, then flats with the same layout in the same tower. The relevance score weighs similarity, view, interiors and how recent the sale was.
- The flat being valued
- Directly above and below: the closest
- Same layout, same tower
- Straight line (first version)
- Penalised (shipped)
Four factors can match well, but if one is far off, the shipped score drops sharply instead of averaging the problem away.
One set of data, many uses. Because the matched records now lived in Truva's own database, they powered far more than valuations: an offer generator for sales reps, the public "Get an Offer" page, sale-price data in the broker app, a read-only view for investors and developers, and Metabase dashboards on market share that informed the move from 1 to 8+ micro-markets.
05
Result
- Price guarantees stay within 4% of the final sale value, protecting 20-30% of the gross margin on every exclusive listing.
- Records match the right flat with 95%+ accuracy.
- Valuation throughput rose 10x, and turnaround halved from 4 days to 2.
- ~₹1Cr saved in appraisal costs: the 5-6 analysts Truva did not need to hire.
- Mispriced valuations fell 25%.
- "Get an Offer" brings in 15% of all new exclusive listings.
The two accuracy numbers measure different things. 25% is about how often a valuation goes wrong. 4% is about how badly, even when it does.
06
What I'd do differently
I would write down the scoring formula and the reasoning behind each weight as we decided them. Today I remember why the penalty works, but not the exact function, and the next person to tune it deserves better than my memory.
Next case study
Giving brokers a reason to come back