ListingLab is a reconciliation gate: before a book can export, the numbers inside it have to agree with each other. These checks run automatically when you open Verify on a deal.
This is not about tracing every figure back to CoStar or the model — it is about catching when the rent roll total does not match base rent, when comp averages are wrong, or when the same headline appears twice with different values. Rules use two severities only — see legend below. They are coded in the engine today — not user-editable.
“Partial” on a product gap means we told the truth about what’s unfinished — it does not mean the risk got cheaper. That label is for roadmap honesty elsewhere — it is not a third rule severity on this page. The catalog below is the live check list — unfinished product work stays unfinished until it ships.
We add checks when real broker books expose a gap — not claiming exhaustive coverage across every asset class or Tier-2 probe yet.
Line items and subtotals add up — rent roll, expenses, income cascade, unit mix.
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Rent-roll rows sum to totals | |
| Blocking | Rent-roll total = base rent | |
| Blocking | Expense lines sum to total | |
| Blocking | Income cascade closes | |
| Blocking | EGI − expenses = NOI | |
| Blocking | Unit mix counts = units | |
| Blocking | Unit mix SF = NRSF | |
| Blocking | Unit mix rents = GPR | |
| Blocking | Count facts agree across sections | |
| Blocking | Rent-roll SF = GLA/NRSF | |
| Blocking | Reimbursement income lines sum | |
| Blocking | Tenant reimbursements total | |
| Blocking | % of building sums to 100% |
Member properties sum to portfolio headline units, SF, and price (portfolio BOVs only).
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Portfolio members sum to totals |
The same fact in two places shows the same value — headlines, maps, body copy, and model vs finished OM when both are loaded.
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Same fact, same value | |
| Blocking | Display rounding consistent | |
| Blocking | Headline matches source | |
| Blocking | Comp map pins match comp cards | |
| Blocking | Label denominator matches computation |
Comp averages, selection counts, subject not in comps, pinned model cells.
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Comp averages | |
| Blocking | Per-comp $/unit and $/SF | |
| Blocking | Model cell matches pinned revision | |
| Blocking | Two methods agree | |
| Blocking | Published n matches selection | |
| Blocking | Subject not in comps | |
| Warning | Allocated comps marked | |
| Blocking | Approved provenance unchanged | |
| Warning | om_published headline drivers marked |
Ratios and per-unit math match what the numbers imply — cap, GIM, $/unit, $/SF.
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Price ÷ units | |
| Blocking | Price ÷ SF | |
| Blocking | NOI ÷ price = cap | |
| Blocking | Price ÷ income = GIM | |
| Warning | Expense ratio | |
| Warning | Vacancy % × GPR | |
| Warning | Management fee % | |
| Warning | Down payment % × price | |
| Warning | Loan = LTV × price | |
| Warning | NCFADS = NOI − DS | |
| Warning | Combined %/$ cell consistency | |
| Warning | DSCR = NOI ÷ debt service | |
| Blocking | Annual = monthly × 12 | |
| Blocking | Monthly rent = $/SF × SF | |
| Blocking | Per unit / per SF = total ÷ denominator | |
| Blocking | Acres × 43,560 = lot SF |
Physical and economic occupancy, lease flags, and roll facts agree internally.
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Physical occ + vac = 100% | |
| Blocking | Economic occ + vac = 100% | |
| Warning | Economic occ ≤ physical occ | |
| Blocking | Stated occupancy vs roll | |
| Blocking | Expired lease needs MTM flag | |
| Warning | Current/Market formula parity | |
| Warning | Market rent ≥ current rent per type | |
| Blocking | $/SF period monthly vs annual |
Lease terms, rent schedules, escalations, and expiration lines line up.
| Rule | Severity | What it checks |
|---|---|---|
| Blocking | Lease term arithmetic | |
| Blocking | Rent schedule contiguous | |
| Blocking | Last period ends on expiration | |
| Blocking | Rent step = prior × (1 + increase) | |
| Blocking | Headline escalation matches schedule | |
| Blocking | Term remaining uses single as_of | |
| Blocking | Options summary matches schedule | |
| Blocking | Exercised option counted once | |
| Blocking | Expiration schedule matches roll |