CAM Reconciliation Skill
CAM reconciliation for every tenant: pro-rata shares, gross-up, caps, admin fee, base-year stops, statements that foot. $29 once, offline.
View CAM Reconciliation Skill
A rent roll can say 95% occupied while units pay nothing, leases ended last year and a third of the tenants moved in last month. Get the real occupancy, loss-to-lease and the questions to ask before you underwrite.

| Situation | Code | Level |
|---|---|---|
| Same unit listed twice | duplicate_unit | high |
| Occupied with no rent | occupied_no_rent | high |
| Vacant but showing rent | vacant_with_rent | high |
| Lease ends before it starts | lease_end_before_start | high |
| Occupied with no lease dates | occupied_no_lease_dates | high |
| Owes more than one month's rent | delinquent_over_one_month | high |
| Rent under 85% of market (adjustable) | rent_below_market | normal |
| Any balance owed | delinquent | normal |
| Concession over 10% of rent | large_concession | normal |
| No market rent | missing_market_rent | normal |
| Lease expired, still occupied (MTM/holdover) | lease_expired_holdover | normal |
| Over 15% of units expiring in one month | expiration_concentration | normal |
| Over 30% of leases started in the last 90 days | recent_move_in_cluster | normal |
| Lease starts after the roll date | future_lease_start | info |
| Rent over 115% of market | rent_above_market | info |
| Square feet far off the unit type's norm | sqft_outlier | info |
| Model, down or employee unit | non_revenue_unit | info |
examples/maple-court-nov/ is a fictional 24-row apartment rent roll as of Nov 1, 2026 with 17 planted situations (a unit pasted twice, an occupied unit at $0, a vacant unit with rent, a lease that ends before it starts, a 2,100 balance, a 7,000 sf one-bedroom, a burst of recent move-ins and more). expected.json labels what an underwriter would flag plus GPR 32,560/mo and 2,400 delinquency; the tests assert exactly that in any row order and with EU dates.
Outputs in out/: report.md, summary.json (occupancy, GPR, loss-to-lease, WALT...), findings.csv, unit_mix.csv, expirations.csv. Exit 0 = no high-priority data problems; 1 = some to fix or explain; 2 = an input problem.

./run_tests.sh
python3 -m rentroll --rent-roll examples/maple-court-nov/rent_roll.csv --as-of 2026-11-01 --name "Maple Court" --out out/Python 3.9+ (tested on 3.10 and 3.13), no dependencies.
Zip, 16 KB, v1.0, 13 files. Use and modify it for yourself and for clients you serve; no resale or redistribution of the kit itself. Full terms in LICENSE.txt.
Rent roll analysis in one command: occupancy, loss-to-lease, delinquency, lease expirations and the data errors that break underwriting. $29, offline.
CAM reconciliation for every tenant: pro-rata shares, gross-up, caps, admin fee, base-year stops, statements that foot. $29 once, offline.
View CAM Reconciliation SkillLevel subcontractor bids in one command: plug exclusions and gaps, flag thin allowances and outlier prices, check totals, rank. $29 once, offline.
View Bid Leveling SkillReorder points, safety stock and order quantities for every SKU from a Shopify orders export, plus ABC classes, dead stock and overstock. $29 once.
View Inventory Reorder Point Skill