Lease Renewal Tracker Spreadsheet: Lease Expiration Alerts, Notice Deadlines and Rent Increases (Excel & Google Sheets)
Short on time? The Lease Renewal Tracker ($12) is the finished, tested version of what this tutorial builds.
A lease that ends without a decision is expensive. Either the tenant rolls onto month-to-month at the old rent, or you find out in the last week that you sent the rent-increase notice too late and have to wait another month or more. The fix is boring: one row per lease and a few date formulas that tell you, every Monday, which leases need a decision and which notices have to go out now.
This tutorial builds that sheet. It works the same in Excel, Google Sheets and LibreOffice. We tested every formula below by building a workbook with these exact formulas, recalculating it in LibreOffice, and comparing every cell to the worked example and to an independent Python calculation.
1. A Setup tab with two inputs
Make a tab called Setup:
| A | B | |
|---|---|---|
| 1 | As-of date | 2026-10-07 |
| 2 | Mailing buffer (days) | 5 |
B1 is the date everything is measured from. Type today's date, or use =TODAY() if you want it to move on its own (a typed date is better for a weekly review, because the numbers don't change while you work). B2 is extra time you give yourself for mailing or delivery, so "deadline" means the day you must send it, not the day it must arrive.
2. The Leases tab
One row per unit, starting in row 2. The first six columns are typed:
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Unit | Lease end | Current rent | Proposed rent | Status | Notice days |
| 2 | Oak 1A | 2026-10-31 | 1450 | 1520 | Offer sent | 30 |
Status is one of: Not started, Drafting, Offer sent, Negotiating, Accepted, Declined, Moved out. Use a dropdown (Excel: Data → Data Validation → List; Google Sheets: Insert → Dropdown) so the spelling is always identical, because the formulas below match on it.
Notice days is how many days before the lease end the tenant must receive your renewal or rent-increase notice. It comes from your lease and your state's law, so it can differ per row.
3. The calculated columns
G2: =IF(B2="","",B2-Setup!$B$1)
H2: =IF(G2="","",IF(G2<0,"Past due",IF(G2<=30,"0-30 days",IF(G2<=60,"31-60 days",IF(G2<=90,"61-90 days","90+ days")))))
I2: =IF(OR(B2="",F2=""),"",B2-F2-Setup!$B$2)
J2: =IF(I2="","",IF(OR(E2="",E2="Not started",E2="Drafting"),IF(I2<Setup!$B$1,"MISSED - check lease",IF(I2-Setup!$B$1<=14,"Send notice now","On track")),"Notice sent"))
K2: =IF(OR(C2="",D2="",C2=0),"",D2/C2-1)
L2: =IF(B2="","",EDATE(B2,12))
Fill all six down as far as you have leases (blank rows stay blank). What each one does:
- G, Days until end: lease end minus the as-of date. Negative means the lease has already ended.
- H, Window: buckets G into
Past due,0-30 days,31-60 days,61-90 daysand90+ days. This is the column you filter on. - I, Send-by date: lease end, minus the notice days, minus your mailing buffer. Format column I as a date. If it shows a number like
46321, it's a date that just needs formatting. - J, Notice status: only rows that haven't sent anything yet (
Not started,Draftingor blank) can be late. If the send-by date has passed, it saysMISSED - check lease. If it's within 14 days,Send notice now. Once the status moves toOffer sentor beyond, it saysNotice sent. - K, Bump %: proposed rent divided by current rent, minus 1. Format as a percentage. It stays blank until you type a proposed rent.
- L, Next lease end: the end date of a 12-month renewal (the renewal starts the day after the old lease ends, so it ends on the same date next year).
EDATEhandles month ends correctly, for example February 29, 2028 becomes February 28, 2029.
When a renewal is accepted, type the new lease end from column L into column B, set the status back to Not started, and the row drops out of this year's pipeline on its own.
Optional: notice days that depend on the increase
Some states set the notice period by the size of the increase. For example, for month-to-month residential tenancies, California Civil Code §827(b) requires at least 30 days' written notice for an increase of 10% or less and 90 days for more than 10% (counting other increases in the prior 12 months), and mailed notices get extra time under Code of Civil Procedure §1013. If a rule like that applies to you, calculate column F instead of typing it:
F2 (California month-to-month example): =IF(K2="",30,IF(K2>0.1,90,30))
This is only an example of the pattern. Other states, cities with rent rules, subsidized housing and your own lease can all set different or longer periods, so check yours and put the right numbers in the formula.
4. A small dashboard
On a Dashboard tab, a few counts tell you how the week looks:
B1: =COUNTIFS(Leases!$H$2:$H$200,"0-30 days",Leases!$E$2:$E$200,"<>Accepted",Leases!$E$2:$E$200,"<>Declined",Leases!$E$2:$E$200,"<>Moved out")
B2: =COUNTIFS(Leases!$H$2:$H$200,"Past due",Leases!$E$2:$E$200,"<>Accepted",Leases!$E$2:$E$200,"<>Declined",Leases!$E$2:$E$200,"<>Moved out")
B3: =COUNTIF(Leases!$J$2:$J$200,"Send notice now")
B4: =COUNTIF(Leases!$J$2:$J$200,"MISSED*")
B5: =IFERROR(AVERAGE(Leases!$K$2:$K$200),0)
Label them in column A: Open, ending in 30 days, Open, past due, Notices to send now, Notices missed, Average proposed bump. B5 averages only the rows that have a proposed rent, because AVERAGE skips the blank text that column K returns. Format it as a percentage.
To color the rows, select the Leases data and add a conditional-formatting rule with a custom formula such as =$J2="Send notice now" (amber) and =$J2="MISSED - check lease" (red).
Worked example
As-of date October 7, 2026, mailing buffer 5 days, seven leases:
| Unit | Lease end | Rent | Proposed | Status | Notice days | Days | Window | Send by | Notice status | Bump % | Next end |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Oak 1A | 2026-10-31 | 1,450 | 1,520 | Offer sent | 30 | 24 | 0-30 days | 2026-09-26 | Notice sent | 4.83% | 2027-10-31 |
| Oak 1B | 2026-11-30 | 1,400 | 1,470 | Drafting | 30 | 54 | 31-60 days | 2026-10-26 | On track | 5.00% | 2027-11-30 |
| Elm 2A | 2026-11-15 | 1,525 | Not started | 30 | 39 | 31-60 days | 2026-10-11 | Send notice now | 2027-11-15 | ||
| Elm 2B | 2026-12-31 | 1,475 | 1,550 | Not started | 60 | 85 | 61-90 days | 2026-10-27 | On track | 5.08% | 2027-12-31 |
| Pine 3A | 2026-10-20 | 1,300 | 1,350 | Not started | 30 | 13 | 0-30 days | 2026-09-15 | MISSED - check lease | 3.85% | 2027-10-20 |
| Pine 3B | 2027-03-31 | 1,600 | Not started | 60 | 175 | 90+ days | 2027-01-25 | On track | 2028-03-31 | ||
| Pine 4A | 2026-09-30 | 1,200 | 1,250 | Accepted | 30 | −7 | Past due | 2026-08-26 | Notice sent | 4.17% | 2027-09-30 |
Dashboard: 2 open leases ending in 30 days (Oak 1A and Pine 3A), 0 open past due (Pine 4A is past its end date but already accepted, so you just need to type its new end date), 1 notice to send now (Elm 2A, by October 11), 1 missed (Pine 3A), and an average proposed bump of 4.59%.
What the example shows:
- Elm 2A is the urgent one, not the lease that ends soonest. It ends 39 days out, but with 30 days' notice and a 5-day mailing buffer, the notice has to go out within four days. A plain "days until end" column would have filed it under "next month".
- Pine 3A needs a decision today. Its send-by date passed three weeks ago. Depending on your lease and state, that can mean the increase can't take effect at renewal, or the tenancy rolls to month-to-month. Check before you send anything.
- Elm 2B ends later than Elm 2A but is on track because it uses a 60-day notice period, which pushes its send-by date to October 27.
Common mistakes
- Dates typed as text. If column G shows
#VALUE!, the lease end was pasted as text. Re-enter it as a real date (in Google Sheets, Format → Number → Date). - Counting to the day the notice arrives, not the day you send it. That's what the mailing buffer is for. If you deliver notices in person, set it to 0.
- Statuses typed by hand.
offer sentorOffer Sentwith a trailing space won't match, and a row can show as missed when it isn't. Use a dropdown. - One notice period for everyone. Fixed-term leases, month-to-month tenants and large increases can each have different rules. Keep notice days per row.
Related tutorials
- Build a rent roll that flags late rent automatically.
- Rental property cash flow spreadsheet: monthly NOI and cash flow per property: see what a rent bump does to each property's cash flow.
- Cap rate vs. cash-on-cash vs. DSCR: a worked rental example.
Want it done for you?
The Lease Renewal Tracker is a finished workbook built on the same windows: days until end, 30/60/90-day buckets, bump $ and %, a suggested next action for every lease, a status dropdown, a dashboard and a Monday pipeline view, plus a sample with eight leases. It works in Excel and Google Sheets with no macros.
Not legal advice. Notice periods and rent-increase rules depend on your state, city and lease. Check them before sending a renewal or rent-increase notice.
Free tool: Free Rental Property Calculator: Cash Flow, Cap Rate, Cash-on-Cash, DSCR
Written with AI assistance. Every formula, command and number on this page was tested before publishing (see each section). Product links go to our store.