A developer emails a revised price list on a Tuesday afternoon. The file is called "Final Price List v4.xlsx," which is what the last three were called too. Someone on the sales operations team opens it and works down Tower A. They update 18 units in the platform. Tower B sits on a second sheet, using the same unit numbers, 101 through 118, because that's how the architect labeled both floor plates. Half of Tower B gets Tower A's numbers pasted over it.
Nobody catches it. The units are all listed, all priced, all live. Three weeks later a buyer standing in a show apartment quotes a figure from the portal that is about 9% under the developer's actual list. The agent has to choose between honoring a price that was never real and telling the buyer the site is wrong.
The failure there wasn't reading. Every number in that spreadsheet was legible, and a person read them correctly. The failure was that the platform stored an answer and kept no memory of where the answer came from, with nothing to check it against and nothing to raise a flag when it changed. Most real estate document processing AI gets sold as a reading engine, and reading is the part that already mostly works. The part that breaks is storage. This article sets out a better design: store every field as a claim with a source attached, never as a bare value.

Why property inventory is harder than invoices
An invoice is a closed problem. It has one issuer and one date. It has one issuer, one date, and one truth, and the arithmetic checks itself because the line items have to sum to the total. Once it's paid, it stops changing. That's why the invoice and ledger reconciliation work we do for finance teams can be validated so tightly, since the document contains the evidence needed to prove the extraction right or wrong.
Property inventory has none of those properties. A development is a moving target. Phase one releases in March, phase two in October, and the two phases share a project name, a brochure, and sometimes a numbering scheme. Prices move weekly, and they move in both directions. Availability shifts daily. A unit can be blocked, then released, then blocked again by a different agency.
Then there's the format problem. Twelve developers means twelve formats. A single developer will change format when they change sales agency. One sends a clean spreadsheet with a header row. One sends a 40-page PDF brochure with the price table rendered as an image. One sends a photo of a printed availability sheet with handwritten strikethroughs. One sends a message in a group chat that says "Tower C, 2 beds, 5% up from Monday."
None of those documents contains enough information to prove itself correct. The only way to know whether a number is right is to compare it against what the last document said. That requires keeping the last document's answer instead of overwriting it.
Store claims, not values
The core design decision is small and it changes everything downstream. A field in the platform does not hold a value. It holds a list of claims, and each claim carries four things:
- What it says. The extracted value, normalized into a defined type.
- Which document said it. File, page, sheet, cell or bounding box, plus a content hash of the source file.
- When it was true. The effective date stated in or on the document, which is often not the date the file arrived.
- How sure we are. A confidence band, and whether a person has confirmed it.
So a single unit's price is not one cell. It's a stack that reads something like this:
| Value | Source | Effective from | State |
|---|---|---|---|
| 8,450,000 | Launch price list, sheet "Tower B," row 42 | 4 March 2025 | Superseded |
| 8,715,000 | Revised list v2, sheet "B," row 42 | 19 May 2025 | Superseded |
| 8,715,000 excl. tax | Sales agency brochure, page 27, image table | 2 June 2025 | Conflict, unresolved |
| 8,290,000 | Agency chat message, screenshot | 11 September 2025 | Released, human confirmed |
The live price on the portal is a query, not a field. It's the highest-precedence released claim as of today. Everything else stays. When a buyer disputes a number, the answer to "where did this come from" is one click, not an archaeology project through someone's inbox. When a developer insists they never sent a lower figure, the screenshot is attached to the claim.
This costs more storage and some extra query logic. Next to a wrong price quoted to a buyer, that is cheap.
Five traps that break real estate document processing AI
Each of these follows the same shape. Here is what teams usually do, here is how it fails, and here is what the claim model does instead.
Identity: which unit is this row about? The usual approach is to key units on the label printed in the document, so "101" becomes the identifier. It fails because labels repeat across blocks, phase two reuses phase one's numbering, and compact rows like "Type C2, floors 3 to 14, 2 bed" hide twelve units behind one line. Two cases make it worse. Units get renumbered between launch and sale, usually when marketing decides the 13th floor should be the 14th. And two adjacent units sometimes get merged into one sale, so the inventory count drops by one without anything being sold twice. The fix is to decide a composite identity before extraction starts, built from project, phase, block, level and label, and to expand range rows with code rather than with a model. Expansion is arithmetic. It should never guess.
Type: what kind of number is this? The usual approach treats price as a number and area as a number. Price is a bundle. A figure means nothing without the payment plan it belongs to, the offer window it expires in, and the discount already applied. The same figure can be tax-inclusive in one document and tax-exclusive in the next, which in many markets shifts the number by 5% or more. Parking bays and storage rooms are often priced as separate line items, so a "unit price" may or may not include them. Area has the identical problem. Carpet, built-up and saleable areas can differ by 20% or more on the same apartment, and price per square meter derived from mismatched pairs is worse than no figure at all. The fix is typed fields with the qualifier as part of the type, so a claim is never just 8,290,000 but 8,290,000, tax-exclusive, parking not included, 60/40 payment plan, valid to 30 September.
Silence is not a sale. The usual approach is to treat this week's availability list as the full picture, so anything missing gets marked sold. It fails because most lists are partial. A unit can drop off because it sold, because it was never released, because the agency only sends their own allocation, or because someone filtered the sheet before exporting. On a partial list, "not yet released" and "sold" look exactly the same, which is to say they look like nothing. Absence is not evidence. Under the claim model, a missing unit generates no claim at all. It generates a review item saying this unit has not appeared in the last two documents, and its status stays whatever a human last released.
Two documents disagree. The usual approach is last write wins, and the old number disappears. Under the claim model, both claims stay and precedence is a written rule. A direct developer file beats an agency brochure, a later effective date beats an earlier one, and a human-confirmed claim beats an unconfirmed one. The loser stays visible, marked superseded, with its source attached. One case this catches that filename logic never will: a revised brochure saved under the same filename as the original. Compare content hashes rather than names and the revision announces itself. Compare names and you skip the file as a duplicate.
Which plan belongs to which unit? Matching floor plans and renders to units is where confident systems quietly go wrong, because a wrong plan looks fine until a buyer measures a room. An explicit confidence ladder. An unambiguous label printed on the plan itself is the top rung. Page position relative to a labeled table is the second. A filename guess like "2BR-TypeB-final.pdf" is the third. Only the top rung publishes without review. Everything below it queues for a person, because a plausible match and a correct match are not the same thing, and no extraction model we've used can tell them apart without human confirmation.
Read, Reconcile, Release
Three stages, and the order matters more than the tooling.
Read. Turn a source into candidate claims, and spend AI only where the format is genuinely unpredictable. Brochures, scanned sheets, photos of printed lists and pasted chat messages need a model, but spreadsheets with a stable header row do not. Parse those with plain code, which costs close to nothing per file, runs in milliseconds, and never invents a number that wasn't there. Roughly speaking, the more of your incoming volume you can move into deterministic parsers, the flatter your running cost curve gets as you add developers.
Reconcile. Resolve identity, merge new claims against existing ones, apply precedence, and raise conflicts. This stage is deterministic code with stated rules, not model judgment. It's also where most of the engineering time goes, and where most vendors have nothing to show you, because it's invisible in a demo.
Release. Nothing reaches the live portal until a person approves it. That gate is not a formality. On a project where a wrong number costs a sale or a reputation, a person approves anything that touches a price or a customer-facing status. The approval and routing steps built into the workflow decide what a reviewer sees first, but they don't decide what goes live.

Source mapping, done once per developer
Each developer's drop point gets mapped one time: this shared folder, this email alias, this chat export, this project, this phase, these expected sheet shapes, this precedence rank. After that, files route themselves. A new drop in a mapped folder knows which project it belongs to and which parser to use before anyone opens it.
Where documents can't leave your own environment, this whole pipeline can run inside your infrastructure with a private deployment and compliance architecture around it, which matters more in the Middle East and Europe than most vendors admit.
The weekly update is the real product
Launch data gets imported once. Changes arrive forever, and the migration is the part everyone scopes. A platform carrying 3,000 units across 40 developments will absorb price revisions, release tranches, blocked and unblocked units and replaced renders every week for years. That flow is the product. The initial import is a weekend.
So the review queue is where the design earns its money, and a queue sorted by arrival time wastes your reviewers. We rank by business risk instead. A price drop on a released unit goes to the top, because it's either a genuine discount that should be live today or an extraction error that will be quoted to a buyer. A status change to sold comes next, because it removes sellable stock. Area changes and payment plan changes follow. A new render lands at the bottom, because a wrong image is embarrassing and a wrong price is costly.

Each item shows three things side by side: the claim currently released, the claim proposing to replace it, and the cropped snippet of the source document the new claim came from. The reviewer's job is a comparison, not an investigation. Approve, reject, or escalate to the developer with the snippet attached.
Three ways to buy real estate data extraction services
Compare the options on three axes, and ignore the feature lists.
Who holds the data model. A system you own keeps the claim history, the identity scheme and the precedence rules in your database. Per-document vendors return you extracted fields, and the reconciliation logic, which is the actual asset, stays theirs. Subscription platforms hold both, and your history lives inside their schema. Ask what you walk away with if you leave in year three.
What the monthly cost does when volume doubles. Per-document and per-page pricing scales linearly with everything, including the clean spreadsheets that cost almost nothing to parse. Here's the arithmetic, using illustrative numbers rather than quoted market rates. If 40 developers send you 200 files a month and 30 of those files are genuinely unstructured, a design that spends model calls only on those 30 leaves your AI cost tied to the messy minority. Priced per page, you pay for all 200. Get any vendor to price your actual mix, not their average.
Who can change the rules when a developer changes format. This happens multiple times a year. If it means a support ticket and a queue position, your inventory stays stale until someone else prioritizes you. Most real estate data extraction services will not commit to a turnaround on format changes, which tells you something.
Owning the system costs more up front and less over time. It's the wrong answer if you handle inventory from two developers who both send clean spreadsheets. We'll say so when that's the case. With many developers, mixed formats and weekly revisions, the build pays for itself on reviewer hours alone.
Before you hire, bring your three worst files
Pick the three ugliest real documents you have. The photographed availability sheet with pen marks. The brochure where the price table is an image. The spreadsheet with merged cells and a sales manager's notes in column M. Send those, not your cleanest export, and watch what the vendor does in the room.
Then ask five questions and listen for specifics:
- How does your system decide a unit is sold? If the answer involves a unit disappearing from a list, stop there.
- What happens when two documents disagree? You want a stated precedence rule and a visible loser, not a last-write-wins shrug.
- Show me where this value came from. Pick a price on their demo and ask for the page, the cell, and the file it came from.
- What does the monthly bill look like at twice today's volume? Ask them to separate AI cost from platform cost.
- Who owns the repository, the accounts and the keys on day one? Our answer is you, named in the contract, with a fixed price agreed before work starts.
If you'd rather see the extraction and review layer before committing to a full inventory build, that's what our document processing and OCR work covers, and it's the same claim-based foundation we describe here. We've built listing and marketplace platforms for eighteen years, which publishes listings in twelve languages, and the pattern holds across markets.
Bring your three worst files to a free automation audit and we'll tell you what a claim-based system would do with them, including the parts that still need a person. If the honest answer is that your volume doesn't justify custom real estate document processing AI yet, we'll say that too, and you can see how we work before deciding anything.
Wondering what this would take against your own systems?
The audit costs nothing, and you keep the costed plan and the risks whether you go ahead or not.
Book a free automation audit
Arun Andiselvam
LinkedInI am a startup veteran who has built five brands. I sold the first, an SEO tool, for a six figure exit, and now build AI automation products for businesses. I bootstrapped every one of them from day one.





