For buy-side analysts, credit teams and property managers
Rent roll PDF to CSV, with the totals proved
Upload the rent roll. Get a CSV whose rent and square footage add up to the totals printed on the page, or the variance to the cent when they do not. The DSCR and NOI you build on it can be defended.
Free: 1 file per day, up to 10 pages, no account.
No file to hand? Open a sample
Show the text this sample was read from
What a proved rent roll is
A rent roll with totals proved is a spreadsheet-ready copy of a rent roll PDF in which the extracted unit rows add up to the totals printed on the original page. RentRoll Engine produces one: it reads the unit table, writes a fixed-column CSV, then sums monthly rent and square feet and compares both with the Total line on the report.
That comparison is the product. Getting text out of a PDF is easy. A dropped row, or a 3 read as an 8, still gives a tidy spreadsheet, and that spreadsheet then feeds an underwriting model, a debt service coverage ratio and a credit memo. When the rows tie to the page, you can say so. When they do not, you see the variance before you build on it.
What it proves is narrow, and the page says so. It shows that the CSV matches the PDF. It does not show that the PDF matches the leases, the general ledger or the bank.
From PDF to CSV in five steps
-
Upload the rent roll PDF
Drop the file from Yardi, RealPage, AppFolio, MRI, Buildium or any system that prints a unit table. Text PDFs and scans both work, up to the page limit of your plan.
-
The tables are rebuilt
The engine reads the page tables, using OCR when the PDF is a scan. A rent roll that runs over several pages is joined into one roll: repeated headings and continuation pages are recognised.
-
Headings are mapped to fixed columns
Unit or Suite, Tenant or Resident, SF or RSF, Rent, Lease From and To, Deposit. Market rent, rent per square foot and unit type are not rent, so they are left out and listed so you can see what was ignored.
-
The rows are summed against the page
Monthly rent and square feet are added up and compared with the Total line the report prints. The banner is green when they agree and amber, with the variance, when they do not.
-
Download the CSV
Ten columns in a fixed order, ISO dates, plain decimals, and a flag on every row that needed a judgement. JSON is included on Pro.
The tie-out, with real numbers
These are the two samples above, produced by the same code that runs on your file. Both properties are fictional. The first rent roll ties. The second is an office roll with an annual rent column, and it does not.
| Check | Rows sum | Page states | Variance | Result |
|---|---|---|---|---|
| Maple Court Apartments (fictional): 12 units, totals tie | ||||
| Monthly rent | $14,545.00 | $14,545.00 | $0.00 | Ties |
| Square feet | 10,600 | 10,600 | 0 | Ties |
| Harborview Professional Center (fictional): 6 units, annual rent column, $150 variance | ||||
| Monthly rent | $27,680.00 | $27,830.00 | -$150.00 | Gap |
| Annual rent, as printed | $332,160.00 | $333,960.00 | -$1,800.00 | Gap |
| Square feet | 15,320 | 15,320 | 0 | Ties |
In the office roll the five occupied rows sum to $27,680.00 a month, and the page total works out to $27,830.00. The difference is $150 a month, or $1,800 a year. The tool cannot say whether a row is missing, a figure was keyed wrongly or the printed total is stale. It does say, before the number reaches a model, that the rows and the page disagree and by how much. If that $1,800 flowed through to NOI, a 7% cap rate would put it at about $25,700 of price.
One row, before and after
Printed on the page | 100 | Harbor Dental Group | 2,400 | Jan 1, 2022 | Dec 31, 2027 | $62,400.00 | $26.00 | $10,400.00 | Two 5-yr options, 3% annual bumps | Written to the CSV 100,Harbor Dental Group,occupied,2400,5200.00,2022-01-01,2027-12-31,10400.00,"Two 5-yr options, 3% annual bumps",rent_annual_to_monthly
The page prints annual rent, so $62,400.00 becomes 5200.00 a month and the row is flagged
rent_annual_to_monthly. The rate per square foot is not rent, so it is left out.
The CSV you get
Every file has the same ten columns in the same order, so a formula or Power Query step written once keeps working.
| Column | What it holds | Format |
|---|---|---|
unit | Unit, suite or space identifier, as printed. | text |
tenant | Tenant or resident name. Blank when the unit is vacant. | text |
status | Occupied or vacant. A blank tenant, or the word VACANT, means vacant. | occupied | vacant |
sqft | Rentable area. Kept on vacant units so occupancy by area works. | number, no commas or units |
monthly_rent | In-place monthly rent. An annual rent column is divided by 12. | decimal, 2 places, no currency symbol |
lease_start | Lease start date. | YYYY-MM-DD |
lease_end | Lease end date. Blank for month-to-month. | YYYY-MM-DD |
deposit | Security deposit held. | decimal, 2 places |
notes | The notes column as printed, plus the text of any cell that could not be read as a number or date. | text |
flags | Machine-readable cautions for the row, separated by a semicolon. | for example rent_annual_to_monthly |
Rules the file follows
- UTF-8, comma separated, CRLF line endings, fields quoted only when they need to be (RFC 4180). No byte-order mark.
- Money has two decimals and no symbol. Negative amounts in parentheses, (1,234.56), or with a trailing minus are written as -1234.56.
- European number formats such as 1.234,56 are recognised when the rest of the page shows the same convention.
- Dates are ISO. When 04/05/2025 could be April 5 or May 4 and nothing else on the page settles it, the row is flagged
date_ambiguousinstead of guessed silently. - A text cell that starts with =, +, - or @ is written with a leading apostrophe, so a spreadsheet cannot run it as a formula.
Want to fill the same layout in by hand? Download the rent roll template.
Who uses it, and what they prove
| Who | What they prove | To whom |
|---|---|---|
| Buy-side analyst | That the in-place rent in the underwriting model is the rent the seller's rent roll states, and that no unit fell out on the way in. | The investment committee, and the lender on the acquisition. |
| Credit analyst at a lender | That the NOI and DSCR in the credit memo rest on a rent roll that was loaded without loss. | The credit committee, and later the loan file. |
| Property or asset manager | That the rent roll sent with a monthly or quarterly report matches the totals the system printed. | The owner, the lender and the servicer. |
By hand, generic OCR, or RentRoll Engine
| What matters | By hand in Excel | Generic OCR or PDF-to-Excel | RentRoll Engine |
|---|---|---|---|
| Check against the page total | Only if someone re-adds the column by hand. | None. The sheet is whatever the converter produced. | Every file. Rows are summed and compared with the printed total, for rent and square feet. |
| A misread or dropped digit | Typos pass unless caught in review. | Passes silently, then sits in the model. | Moves the sum, so the banner turns amber and shows the variance to the cent. |
| Column headings | Matched by eye, every file. | Left as printed; you rename and reorder. | Mapped by synonym: Unit, Suite, Apt; Tenant, Lessee, Resident; SF, RSF, GLA; Rent, Base Rent. |
| Annual versus monthly rent | Easy to miss when a column is headed Rent. | Not handled. | An annual column is divided by 12 and every converted row is flagged. |
| Vacant units | Blank or VACANT, handled inconsistently. | Left as text in the tenant column. | A status column reads occupied or vacant, and vacancy counts feed the occupancy figure. |
| Dates and money formats | A spreadsheet guesses, and may swap day and month. | Text strings. | ISO dates with day/month ambiguity flagged; (1,234.56) and 1.234,56 read correctly. |
| What you get | Whatever was typed. | A spreadsheet that still needs cleaning. | A fixed-column RFC 4180 CSV, the same shape every month. |
| Cost | Analyst hours. | Varies by tool. | Free: 1 file per day, up to 10 pages, no account. Pro is $39/month for 100 files a month, files up to 150 pages; Team is $99/month for 3 seats and 400 files a month. |
Systems it reads
The reader works from the meaning of the column headings, not from the name of the system that printed them. These are the systems rent rolls most often come from.
- Yardi. Resident codes, market versus actual rent, charge lines under each unit.
- RealPage. Floor plan codes, status columns, summary tables after the roll.
- AppFolio. Status values, delinquency columns, rolls with no area column.
- MRI and Buildium. Read by the same table reader. There is no dedicated guide yet.
- Rent rolls built in Excel and printed to PDF, from owners and brokers.
Yardi, RealPage, AppFolio, MRI and Buildium are trademarks of their owners. RentRoll Engine is independent of all of them.
Plans
Free: 1 file per day, up to 10 pages, no account. Subscribe when the volume belongs to a team. Full details are on the pricing page.
Free
$0
One rent roll a day, to see the tie-out on your own file.
- 1 file per day
- Up to 10 pages per file
- No account
- CSV download
Pro
$39 / month
For an analyst or credit officer who works rent rolls every week.
- 100 files per month
- Files up to 150 pages
- CSV + JSON
Team
$99 / month
For a deal team or servicing desk sharing the same volume.
- 3 seats: the same code in three browsers
- 400 files per month
- Files up to 150 pages
- CSV + JSON
The button opens PayPal checkout for that plan. After approval PayPal brings you back to this site, and the page code arrives by email from [email protected] within a few minutes; enter it once in Have a page code? and it stays in this browser.
Questions about rent roll PDF to CSV conversion
How do I convert a rent roll PDF to Excel or CSV?
Drop the PDF into the box at the top of this page. The converter reads the unit table, writes a CSV with ten fixed columns and sums the rows against the Total line on the report. Check the banner, download the CSV, and open it in Excel with Data, then From Text/CSV.
You can try it without a file first: the two samples above run the same code and show a rent roll that ties and one that does not.
What does "totals proved" mean?
Monthly rent and square feet in the CSV are each added up and compared with the totals printed on the rent roll. When both agree the banner is green. They agree to the cent, or to within rounding when the page prints whole dollars. When they do not, the banner is amber and shows both figures and the variance.
Proved describes the extraction, not the property. It shows the CSV matches the PDF. It does not show that the PDF matches the leases or the general ledger.
What if the totals do not tie?
Do not use the CSV until you can explain the variance. Open the PDF and compare it with the rows for a dropped row, a misread digit or a total that includes something the unit rows do not, such as a charge line or a unit on a page that was cut off. The result lists any rows it flagged, which is the quickest place to start.
If the page total counts occupied units only, or includes charge sub-lines, the result says so when it can tell.
What if the rent roll prints no total?
Then there is nothing to prove the rows against. The rows are still extracted, and the banner says in plain words that the result is unverified. Ask the sender for the version with a Total line, or take the total from the source system and compare it yourself.
Which rent roll PDFs can it read?
Any PDF that prints a table with a unit column and a rent column. That covers reports from Yardi, RealPage, AppFolio, MRI and Buildium, and rent rolls built in Excel and printed to PDF. Headings are matched by meaning (Unit, Suite, Apt; Tenant, Lessee, Resident; SF, RSF, GLA), not by vendor, so an unfamiliar report usually works if its headings are ordinary.
Does it read scanned PDFs?
Yes. Scanned pages are read with OCR, which can misread a digit, and the result carries a notice when OCR was used. The tie-out is the check that no digit was lost. A skewed, faint or angled scan is the likeliest to show a variance.
How is annual rent handled?
Commercial rent rolls often print annual rent. When the rent column is annual, each value is divided by 12 into monthly_rent and the row is flagged rent_annual_to_monthly. The tie-out is checked in the page's own annual terms and also shown per month, so a rounding difference on the page is not reported as an error.
If a column is simply headed Rent but is sized like an annual figure, the result warns that monthly rent per square foot looks too high.
How are vacant units, month-to-month leases and dates handled?
A blank tenant, or a tenant of VACANT, becomes status vacant. The unit keeps its square feet and carries no rent. A lease end of MTM or month-to-month becomes a blank lease_end with a month_to_month flag. All dates are written as YYYY-MM-DD, and a date that could be read two ways is flagged rather than guessed.
What is free, and what do the paid plans add?
Free: 1 file per day, up to 10 pages, no account. Pro is $39/month for 100 files a month, files up to 150 pages, and CSV plus JSON. Team is $99/month for 3 seats and 400 files a month. See pricing.
What happens to my file?
Files are processed in memory and deleted after conversion. Pages that need a second look may be sent to Google's Gemini API, which retains data for up to 55 days under Google's terms. Uploads are not used to train models. The privacy page names the sub-processors.
How do I open the CSV in Excel?
Use Data, then From Text/CSV, and choose UTF-8 as the file origin. Double-clicking the file also works, but Excel may misread accented characters in tenant names because the file has no byte-order mark. Google Sheets reads UTF-8 directly.
Does a tie-out prove the rent roll is right?
No. It proves the spreadsheet matches the document. Whether the document matches the leases, the general ledger and the bank is a different question, answered by estoppels, lease audits and the books. Use the tie-out to make sure the first step, getting the page into a model, lost nothing.