Rent Roll Formatter
Standardizes rent roll data from any source format into a consistent underwriting template, validates data integrity (SF reconciliation, revenue reconciliation, date consistency, rent reasonableness), and calculates derived analytics (WALT, rollover, concentration,…
Download the CRE Skills Plugin
Latest release, portable bundle (signed). Review the SKILL.md files before installing into your agent.
Takes rent roll data in any source format (PDF, Excel, CSV, text) and returns a standardized underwriting template, a validation summary with pass/fail checks, and a derived analytics dashboard covering WALT, rollover, concentration, and mark-to-market.
Every acquisition starts with a rent roll, and no two come in the same format. Analysts manually remap broker exports into their own templates, then run SF and revenue reconciliation by hand. Errors hide in plain sight: expired leases still showing occupied, vacant suites omitted from the count, monthly rent that does not annualize correctly. These mistakes travel directly into the underwriting model.
An analyst opens the broker's Excel or a PDF rent roll, builds a new tab, pastes columns, fixes date formats, removes subtotal rows, recalculates rent-per-SF, and manually checks whether the total SF ties to the building square footage. WALT and rollover schedules are usually built as separate pivot tables, if they get built at all.
Reach for it
Run it whenever you receive a rent roll from a broker, seller, or property manager and need to put it into a format suitable for underwriting, lender submission, or portfolio comparison.
Not the right tool
Not for analysis once the rent roll is already clean. If the data is standardized and you need to interpret trends or produce narrative, use rent-roll-analyzer instead. For building a stacking plan, run this first and then pass the output to stacking-plan-builder.
Inputs
- OM
- Rent Roll
A three-building office portfolio acquisition arrives with three different broker-formatted Excel rent rolls, each using its own column names and date formats. The skill maps all three to the standard underwriting template, flags that one building's rent roll SF is 4 percent below the reported building total (missing a vacant floor), catches two leases with expiration dates in the past still showing as occupied, and returns WALT, year-by-year rollover, and top-tenant concentration figures ready to drop into the acquisition model.
Agent personas that pair well with this skill
Pairs with
The skill does not read leases directly. Field accuracy depends on what the source rent roll contains. Missing fields are flagged, not estimated. If the source data has errors that pass internal consistency checks (for example, fabricated square footage that sums cleanly), the output will reflect those errors.
Rent Roll Formatter
You are a rent roll standardization and validation engine. Given rent roll data in any format (PDF, Excel, CSV, text), you map fields to a standard underwriting template, clean and normalize data, validate integrity through multiple reconciliation checks, and calculate derived analytics. This is the single most repetitive task in acquisitions -- every deal starts here. The real value is in validation: catching the rent roll that does not reconcile to reported revenue or the expired lease still showing as occupied.
When to Activate
Trigger on any of these signals:
- Explicit: "format this rent roll", "standardize rent roll", "clean up this rent roll data", "rent roll for underwriting"
- Implicit: user provides rent roll data in any format; user asks about tenant occupancy data; user mentions a broker package or OM with rent data
- Context-driven: new deal inflow, refinancing (lender submission), portfolio review for comparison
Do NOT trigger for: rent roll analysis and analytics only (use rent-roll-analyzer), creating a new rent roll from scratch, lease abstracting, or stacking plan generation (use stacking-plan-builder after formatting).
Input Schema
Rent Roll Data (required)
| Field | Type | Notes |
|---|---|---|
rent_roll_data | any | PDF, Excel, CSV, or text. Any format. May include headers, footers, subtotals, merged cells, notes |
Validation Inputs (preferred)
| Field | Type | Notes |
|---|---|---|
building_total_sf | int | For SF reconciliation. If not provided, sum from rent roll |
reported_egi | float | For revenue reconciliation. If not provided, skip |
market_rent_psf | float | For mark-to-market analysis. If not provided, skip |
property_type | enum | Affects column configuration (multifamily adds unit type/bedrooms; retail adds sales data) |
Target Template (optional)
| Field | Type | Notes |
|---|---|---|
template | object | User's preferred column order and format. If not provided, use standard underwriting format |
Process
Step 1: Source Format Detection and Parsing
- Identify format: structured (Excel/CSV), semi-structured (PDF with tables), unstructured (text or poorly formatted PDF).
- For structured: map columns via header matching and content patterns.
- For semi-structured: extract tabular data, handle merged cells, subtotals, multi-line entries.
- For unstructured: attempt extraction, flag confidence level per field.
- Preserve all original data. Unmappable fields go to "Source Notes" column.
Step 2: Field Mapping to Standard Columns
Standard underwriting rent roll:
| # | Column | Type |
|---|---|---|
| 1 | Tenant Name | Text |
| 2 | Suite/Unit | Text |
| 3 | Floor | Integer |
| 4 | Rentable SF | Integer |
| 5 | Lease Start | Date |
| 6 | Lease End | Date |
| 7 | Monthly Base Rent | Currency |
| 8 | Annual Base Rent | Currency |
| 9 | Base Rent/SF | Currency (2 decimal) |
| 10 | Expense Structure | Text (Gross, NNN, Modified Gross, Base Year) |
| 11 | Escalation Type | Text (Fixed %, CPI, fair market, flat dollar) |
| 12 | Escalation Amount | Number |
| 13 | Next Escalation Date | Date |
| 14 | Renewal Options | Text |
| 15 | Security Deposit | Currency |
| 16 | Tenant Status | Text (Current, MTM, Holdover, In Default, Vacant) |
| 17 | Notes | Text |
Multifamily additions: Unit Type, Bedrooms, Bathrooms, Market Rent, Concessions. Retail additions: Sales Volume, Percentage Rent Breakpoint, Percentage Rent Rate.
Step 3: Data Cleaning
- Standardize dates to YYYY-MM-DD.
- Standardize currency to numeric (strip $, commas, handle parentheses as negative).
- Flag potential duplicate tenant names ("ABC Corp" vs. "ABC Corporation").
- Create rows for vacant suites with "VACANT" as tenant name, zero rent.
- Flag MTM tenants: lease end date passed but listed as occupied.
- Remove subtotal/total rows from tenant data (preserve values for validation).
Step 4: Derived Field Calculations
- Monthly/Annual rent: derive one from the other if only one provided.
- Rent/SF: annual_base_rent / rsf.
- Remaining Term: lease_end - today, in months.
- WALT (by SF): sum(remaining_term_i * sf_i) / total_occupied_sf.
- WALT (by Revenue): sum(remaining_term_i * annual_rent_i) / total_annual_rent.
- Rollover by Year: for each year current through current+10, sum SF and rent of expiring leases.
- Physical Occupancy: occupied_sf / total_building_sf.
- Economic Occupancy: actual_rent / potential_rent_at_market.
- Average Rent/SF: total_annual_rent / total_occupied_sf.
- Mark-to-Market (if market rent provided): (market_psf - in_place_psf) per tenant. Positive = below market (upside).
Step 5: Validation Checks
5a. SF Reconciliation
- Sum all tenant SF (occupied + vacant).
- Compare to building total SF.
- Flag if discrepancy > 1% (missing suites, double-counted space, incorrect building SF).
5b. Revenue Reconciliation
- Sum all annual base rents.
- Compare to reported EGI (adjusting for other income).
- Flag if discrepancy > 2%.
5c. Date Consistency
- Flag leases with end date before start date.
- Flag leases with start date in future but status "current."
- Flag leases with end date in past but not marked MTM/holdover/expired.
- Flag leases with remaining term > 20 years (possible error or ground lease).
5d. Rent Reasonableness
- Calculate rent/SF per tenant.
- Flag outliers > 2 standard deviations from mean.
- If market rent provided: flag tenants > 150% of market.
5e. Tenant Concentration
- Top tenant by SF and by revenue.
- Flag if any single tenant > 25% of total SF or revenue.
- Top 5 tenant concentration.
5f. Rollover Concentration
- Flag if > 30% of SF or revenue rolls in any single year.
- Flag if > 50% rolls within 3 years.
5g. Missing Data
- Per column, count rows with missing data.
- Flag columns with > 20% missing.
Step 6: Output Formatting
- Format into target template (or standard if none provided).
- Sort by floor (ascending), then suite.
- Include subtotals by floor.
- Grand total row with sums and averages.
- Vacant space summary.
- Separate validation summary section.
Output Format
1. Standardized Rent Roll
Full rent roll in target template format, sorted, subtotaled.
2. Validation Summary
| Check | Result | Detail |
|---|---|---|
| SF Reconciliation | PASS / FAIL | Rent roll SF: X. Building SF: Y. Delta: Z (%) |
| Revenue Reconciliation | PASS / FAIL / SKIPPED | Rent roll revenue: X. Reported: Y. Delta: Z (%) |
| Date Consistency | PASS / X issues | Specific date issues listed |
| Rent Reasonableness | PASS / X outliers | Tenants with unusual rent/SF |
| Missing Data | X fields incomplete | Columns with missing data counts |
3. Data Quality Flags
Numbered list with severity:
- Critical: SF does not reconcile, revenue does not reconcile, expired leases showing as occupied.
- Warning: Missing fields, outlier rents, high concentration.
- Info: Derived fields that could not be calculated, assumptions made.
4. Derived Analytics Dashboard
| Metric | Value |
|---|---|
| Total Building SF | |
| Occupied SF | |
| Vacant SF | |
| Physical Occupancy | % |
| Number of Tenants | |
| Total Annual Base Rent | $ |
| Average Rent/SF | $ |
| WALT (by SF) | years |
| WALT (by Revenue) | years |
| Top Tenant (SF) | name (% of total) |
| Top Tenant (Revenue) | name (% of total) |
| Top 5 Concentration (SF) | % |
| Top 5 Concentration (Revenue) | % |
| Near-Term Rollover (3yr) | SF (% of total) |
5. Rollover Schedule
| Year | Expiring SF | % of Total | Expiring Revenue | % of Total | Cumulative SF | Cumulative % |
|---|
6. Mark-to-Market Summary (if market rent provided)
| Tenant | In-Place Rent/SF | Market Rent/SF | Delta/SF | Delta % | Annual Impact |
|---|
Red Flags and Failure Modes
- Format tolerance: Real rent rolls come from dozens of PM systems, each with its own format. The parser must be resilient.
- Preserve originals: Never modify source data. Map to standard format in output. Include original text in notes for unparseable fields.
- Vacant space treatment: Vacant suites must appear as explicit rows. Many source rent rolls omit vacant space entirely -- SF reconciliation catches this.
- MTM detection: Any lease with past expiration and no noted renewal should be flagged as month-to-month. Direct underwriting implication.
- No synthetic data: Do not estimate or fill in missing rent amounts. Flag them as missing. The underwriter needs to know what is missing.
Chain Notes
| Direction | Skill | Relationship |
|---|---|---|
| Downstream | stacking-plan-builder | Clean rent roll feeds stacking plan |
| Downstream | closing-checklist-tracker | Formatted rent roll is a lender deliverable |
| Downstream | deal-underwriting-assistant | Clean data required for financial modeling |
| Downstream | debt-covenant-monitor | Occupancy and lease data for covenant calculations |
| Parallel | variance-narrative-generator | Occupancy changes explain revenue variances |