Reconciliation rules

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.

Rule severities

“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.

60 checks on a standard MF deal+ SUM-14 on portfolio BOVs · 61 in catalog · 48 blocking · 13 warnings

See it on a real deal

Live check list

We add checks when real broker books expose a gap — not claiming exhaustive coverage across every asset class or Tier-2 probe yet.

Sums & totals(13)

Line items and subtotals add up — rent roll, expenses, income cascade, unit mix.

RuleSeverityWhat it checks
BlockingRent-roll rows sum to totals
BlockingRent-roll total = base rent
BlockingExpense lines sum to total
BlockingIncome cascade closes
BlockingEGI − expenses = NOI
BlockingUnit mix counts = units
BlockingUnit mix SF = NRSF
BlockingUnit mix rents = GPR
BlockingCount facts agree across sections
BlockingRent-roll SF = GLA/NRSF
BlockingReimbursement income lines sum
BlockingTenant reimbursements total
Blocking% of building sums to 100%

Portfolio(1)

Member properties sum to portfolio headline units, SF, and price (portfolio BOVs only).

RuleSeverityWhat it checks
BlockingPortfolio members sum to totals

Cross-references(5)

The same fact in two places shows the same value — headlines, maps, body copy, and model vs finished OM when both are loaded.

RuleSeverityWhat it checks
BlockingSame fact, same value
BlockingDisplay rounding consistent
BlockingHeadline matches source
BlockingComp map pins match comp cards
BlockingLabel denominator matches computation

Comps & sources(9)

Comp averages, selection counts, subject not in comps, pinned model cells.

RuleSeverityWhat it checks
BlockingComp averages
BlockingPer-comp $/unit and $/SF
BlockingModel cell matches pinned revision
BlockingTwo methods agree
BlockingPublished n matches selection
BlockingSubject not in comps
WarningAllocated comps marked
BlockingApproved provenance unchanged
Warningom_published headline drivers marked

Derived math(16)

Ratios and per-unit math match what the numbers imply — cap, GIM, $/unit, $/SF.

RuleSeverityWhat it checks
BlockingPrice ÷ units
BlockingPrice ÷ SF
BlockingNOI ÷ price = cap
BlockingPrice ÷ income = GIM
WarningExpense ratio
WarningVacancy % × GPR
WarningManagement fee %
WarningDown payment % × price
WarningLoan = LTV × price
WarningNCFADS = NOI − DS
WarningCombined %/$ cell consistency
WarningDSCR = NOI ÷ debt service
BlockingAnnual = monthly × 12
BlockingMonthly rent = $/SF × SF
BlockingPer unit / per SF = total ÷ denominator
BlockingAcres × 43,560 = lot SF

Occupancy & rent roll(8)

Physical and economic occupancy, lease flags, and roll facts agree internally.

RuleSeverityWhat it checks
BlockingPhysical occ + vac = 100%
BlockingEconomic occ + vac = 100%
WarningEconomic occ ≤ physical occ
BlockingStated occupancy vs roll
BlockingExpired lease needs MTM flag
WarningCurrent/Market formula parity
WarningMarket rent ≥ current rent per type
Blocking$/SF period monthly vs annual

Lease arithmetic(9)

Lease terms, rent schedules, escalations, and expiration lines line up.

RuleSeverityWhat it checks
BlockingLease term arithmetic
BlockingRent schedule contiguous
BlockingLast period ends on expiration
BlockingRent step = prior × (1 + increase)
BlockingHeadline escalation matches schedule
BlockingTerm remaining uses single as_of
BlockingOptions summary matches schedule
BlockingExercised option counted once
BlockingExpiration schedule matches roll