How to build a software renewal tracker in a spreadsheet (and the point it stops working)
Almost every software renewal tracker starts as a spreadsheet, and that is the right place to start. A sheet costs nothing, needs no approval, and on the first afternoon it will already tell you more about your software spend than you knew that morning. If you are looking for a template, you do not need to download one: the useful version is about eight columns and four formulas, and building it yourself means you understand what every cell is for.
What follows is that build, in full, with the formulas written out so you can paste them in. Then the part most templates leave out: the specific points at which a spreadsheet stops protecting you, so you can recognise them when you get there rather than after a contract has rolled over.
What a renewal tracker actually has to do
A list of software is not a renewal tracker. A renewal tracker has one job: tell you, before it is too late, that a decision is due on a tool. Everything in the design below serves that.
Which means the date you build the sheet around is not the renewal date. It is the cancellation deadline: the last day you can give notice before the contract renews itself. A tool that renews on 1 October with a 90-day notice period has to be cancelled by 3 July. Track the renewal date alone and you will find out you were three months late when the invoice lands.
The columns
Eight columns you type, and four the sheet works out for you. Resist adding more on day one - a wide sheet nobody fills in is worse than a narrow one that is true.
Type these in yourself:
- A - Tool: the product name as you would say it out loud.
- B - Vendor: who you actually pay. Use the billing domain, not the brand, so two products from one supplier group together.
- C - Owner: a named person. Not a team, not an inbox. If a tool has no owner, that empty cell is itself the finding.
- D - Cost: the amount on the invoice.
- E - Billing cycle: Monthly, Quarterly or Annual. Keep it to those three words so the formulas can read them.
- F - Renewal date: the date the current term ends.
- G - Notice days: the number of days notice the termination clause demands. If you have not read the clause, put 90 and highlight the cell as unconfirmed - assuming a long notice period fails safe.
- H - Auto-renews: yes or no. This decides whether missing the deadline costs you money or just access.
And let the sheet derive these:
- I - Annual cost: the cost normalised to a year, so a monthly tool and an annual one can be compared and totalled.
- J - Cancellation deadline: the renewal date less the notice period.
- K - Days left: how long until that deadline.
- L - Status: what you should do about it right now.
The four formulas
These work unchanged in both Excel and Google Sheets. They assume your first data row is row 2, and headers in row 1.
Annual cost (column I)
Normalise every cost to a yearly figure so the column can be summed and sorted meaningfully:
- =IF(E2="Monthly", D2*12, IF(E2="Quarterly", D2*4, D2))
Sorting descending on this column is the single most useful thing the sheet will do for you in week one. It almost always reorders your assumptions about where the money goes.
Cancellation deadline (column J)
Dates are just numbers in a spreadsheet, so subtracting days works directly:
- =IF(OR(F2="", G2=""), "", F2-G2)
The guard matters. Without it, a blank renewal date produces a deadline in 1899, which then sorts to the top of your sheet and screams at you forever until you learn to ignore the whole column.
Days left (column K)
- =IF(J2="", "", J2-TODAY())
This is the only cell in the sheet that changes on its own, and it is the reason the sheet is worth opening.
Status (column L)
Turn the number into an instruction, so the sheet tells you what to do rather than making you work it out:
- =IF(K2="", "No date", IF(K2<0, "Deadline passed", IF(K2<=30, "Act now", IF(K2<=90, "Decide soon", "Watch"))))
Make it shout: conditional formatting
A tracker you have to interpret will not get read. Add three conditional formatting rules on the whole data range, each using a custom formula so the entire row colours, not just one cell:
- Red: =AND($K2<>"", $K2<=30) - the notice window is closing or has closed.
- Amber: =AND($K2>30, $K2<=90) - a decision is due this quarter.
- Grey: =OR($C2="", $F2="") - missing owner or missing renewal date. These rows are not tracked, whatever the sheet implies.
That third rule is the one people skip and the one that earns its keep. A renewal tracker's blind spots are not the rows that look bad, they are the rows that look fine because they are empty.
Two habits that keep it true
The spreadsheet is the easy part. Keeping it accurate for longer than a month is the part that fails, and it fails for the same two reasons every time.
First, tie it to buying. A tool is not bought until it has a row, an owner and a renewal date. If new spend can appear without a row, the sheet drifts out of date from the day you finish it, and you will not notice, because nothing about a spreadsheet tells you it has gone stale.
Second, put a recurring appointment in one named person's calendar to open the sheet, roll forward any renewal date that has passed, and clear the red rows. Monthly is enough. Nobody else will do it, and "the team" owning the sheet reliably means no one does. If you want the fuller version of this, our guide on running a SaaS audit covers the first full pass end to end.
Where the spreadsheet stops protecting you
None of what follows is an argument against starting in a sheet. It is a list of the specific failures a sheet cannot design its way out of, so you can spot which one you have hit.
- It waits to be opened. This is the fundamental one. Column K is correct every single day and tells nobody. A deadline is only ever missed by someone who did not look, and the sheet's entire safety model is that a person remembers to look.
- Renewal dates rot. Once a renewal passes, the date is historical and every derived cell below it is wrong until a human retypes it. An annual tool needs that edit once a year, which is exactly the interval at which people forget the sheet exists.
- Nobody knows who changed what. Version history can technically tell you, but not in a way anyone reads. When a notice period is quietly wrong, there is no trail explaining who set it or from which contract.
- The contract is not in it. The notice period lives in a PDF in someone's email, so the number in column G cannot be checked without a hunt. Numbers that cannot be verified stop being trusted, and then stop being maintained.
- Sharing is all or nothing. Either everyone who needs to see the estate can also overwrite it, or you keep it locked and it becomes one person's private file. Neither survives that person changing role.
- It cannot answer the forward question. "What are we committed to over the next twenty-four months, and how much of that is still cancellable?" needs per-tool term ends, notice windows and billing cycles resolved together. It is not a SUM of column I, and building it in a sheet means a second, more fragile sheet.
When to move on
There is no tool count that makes a spreadsheet wrong. The honest signal is different: you have outgrown the sheet when the cost of it being wrong exceeds the cost of replacing it. In practice, that is the first time one of these is true.
- A renewal has already slipped past its notice window while it was sitting correctly in the sheet.
- More than one person needs to maintain it, and you have started emailing each other versions.
- Someone has asked what you are committed to next year and you could not answer from the file.
- You cannot say, without checking, whether the sheet was updated this quarter.
The point of the spreadsheet was never the spreadsheet. It was the discipline of one record per tool, a named owner, and a deadline computed rather than remembered. Keep all of that. What you are replacing is only the part where a person has to remember to look.
That is the whole of what StackTrackr does differently: the same register, but the cancellation deadline is derived and kept current, the contract sits on the record next to the notice period it came from, and the reminder reaches the named owner before the window shuts instead of waiting for someone to open a file. See the features overview, or start free and move your sheet across in an afternoon.