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, mark-to-market).

6 stars

Best use case

rent-roll-formatter is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

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, mark-to-market).

Teams using rent-roll-formatter should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/rent-roll-formatter/SKILL.md --create-dirs "https://raw.githubusercontent.com/mariourquia/cre-skills-plugin/main/src/skills/rent-roll-formatter/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/rent-roll-formatter/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How rent-roll-formatter Compares

Feature / Agentrent-roll-formatterStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

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, mark-to-market).

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 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

1. **Format tolerance**: Real rent rolls come from dozens of PM systems, each with its own format. The parser must be resilient.
2. **Preserve originals**: Never modify source data. Map to standard format in output. Include original text in notes for unparseable fields.
3. **Vacant space treatment**: Vacant suites must appear as explicit rows. Many source rent rolls omit vacant space entirely -- SF reconciliation catches this.
4. **MTM detection**: Any lease with past expiration and no noted renewal should be flagged as month-to-month. Direct underwriting implication.
5. **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 |

Related Skills

Market Rent Refresh

6
from mariourquia/cre-skills-plugin

Checks freshness of market rent and concession references against overlay staleness threshold; organizes a refresh plan (comp sources, shop list, 3rd-party export, submarket coverage); produces the intake bundle for `workflows/rent_comp_intake` to process. Outputs a current-state memo and a refreshed benchmark view on completion.

rent-roll-to-database

6
from mariourquia/cre-skills-plugin

Transforms a tokenized/extracted rent roll into validated, typed, auditable, database-ready records: a multi-line charge schedule (base rent, CAM/tax/insurance recoveries, percentage rent, parking, storage) mapped to the canonical chart of accounts, lease- and unit-level facts, GPR and occupancy aggregates, a data-quality grade, and a target-model load plan. Tenant identity is pseudonymized; per-unit natural-person data never leaves the boundary. Triggers on 'load this rent roll into the database', 'normalize the rent roll to our schema', 'rent roll to warehouse', or when extracted rent-roll tokens need to become structured records before underwriting or tie-out.

rent-roll-t12-tieout

6
from mariourquia/cre-skills-plugin

Reconciles a normalized rent roll against a normalized T-12 on a stated, consistent basis (annualized contractual vs recognized accrual; collected cash out of scope) and never forces a tie. Reconciles base rent, recoveries and other income (jointly, per the canonical chart), occupancy, and the EGI / NOI-revenue bridge; classifies each gap as mapping, timing, or missing on a deterministic signature; surfaces residual_unexplained; and routes every untied dimension to human review. Triggers on 'tie out the rent roll to the T-12', 'reconcile contractual rent to actuals', 'NOI bridge from the rent roll', or 'revenue leakage check'.

rent-roll-analyzer

6
from mariourquia/cre-skills-plugin

Ingests raw rent rolls (pasted table, CSV, or PDF extract) and produces a clean dataset with layered analytics: rollover schedule, mark-to-market waterfall, tenant concentration risk, WALT, rent benchmarking, MTM exposure, and data quality flags. Triggers on 'analyze this rent roll', 'clean up this rent roll', or when rent roll data needs preprocessing before underwriting.

rent-optimization-planner

6
from mariourquia/cre-skills-plugin

Quantitative rent optimization framework with loss-to-lease waterfall analysis, renewal probability modeling, effective rent NPV comparison across aggressive/moderate/retention strategies, valuation impact quantification, and market cycle overlay. Maximizes long-term property value, not just next-quarter revenue. Triggers on 'rent raise plan', 'rent optimization', 'loss-to-lease', 'renewal pricing', or when planning rent increases across a portfolio.

workout-playbook

6
from mariourquia/cre-skills-plugin

Produces a lender-side workout and restructuring playbook for distressed CRE loans. Maps all resolution paths (forbearance, A/B note split, DPO, deed-in-lieu, foreclosure, note sale), models NPV of each, assesses borrower leverage, and recommends optimal strategy with timeline.

Work Order Triage

6
from mariourquia/cre-skills-plugin

Classifies work order urgency from free-text descriptions, assigns priority (P1-P4) with SLA deadlines, estimates cost, checks lease responsibility, and routes to the correct approval path.

warehouse-to-exhibit-mapper

6
from mariourquia/cre-skills-plugin

Maps validated, warehouse-ready tabular datasets into deck-ready EXHIBIT specifications and slide inputs. Selects table vs. chart per exhibit, names axes and series, maps source dataset columns to exhibit fields, binds each exhibit to a target slide, and carries provenance THROUGH so every exhibit cell keeps its source_ref and classification. Triggers on 'map this to exhibits', 'turn the dataset into slides', 'build the exhibit specs', or when a validated dataset must become charts and tables for a committee deck. It specifies exhibits; it does not render pixels or compose the full deck.

vendor-invoice-validator

6
from mariourquia/cre-skills-plugin

Validates vendor invoices against contract terms, scope of work, and market rates. Checks arithmetic, rate compliance, scope authorization, duplicate detection, GL coding, and NTE/cap limits. Assigns APPROVED, APPROVED WITH FLAGS, or HOLD FOR REVIEW verdict.

variance-narrative-generator

6
from mariourquia/cre-skills-plugin

Generates ownership-ready variance narratives from budget-vs-actual reports. Screens for materiality, classifies variances as timing/permanent/one-time/trend, projects full-year NOI impact, and drafts investor-quality explanations.

transfer-document-preparer

6
from mariourquia/cre-skills-plugin

Prepare entity transfer documents, closing document packages, and assignment agreements for CRE acquisitions. Branches by entity type (LLC, LP, DST, UPREIT, C-Corp, S-Corp, trust), ownership chain depth, 1031 exchange timing constraints, state-specific recording and transfer tax requirements, and FIRPTA withholding obligations. Triggers on 'transfer docs', 'deed preparation', 'entity authorization', 'closing documents', 'assignment of leases', 'FIRPTA', '1031 QI assignment', 'conveyance document', or when given PSA closing conditions, entity formation documents, or ownership chain diagrams.

title-commitment-reviewer

6
from mariourquia/cre-skills-plugin

Analyze ALTA title commitments, surveys, and Schedule B exceptions for CRE acquisitions. Identifies title defects, chain breaks, lien conflicts, and cure requirements. Triggers on 'title commitment', 'Schedule B exceptions', 'title review', 'title exceptions', 'encumbrances', 'survey cross-reference', 'title chain', 'mechanic's lien', 'title cure', or when given a title commitment document, survey, or lien search results.