IT contract register template: the columns and the notice-date formula
An IT contract register is a single sheet with one row per contract and, for each row, three dates that drive everything else: the end date, the notice period, and the last day on which notice can still be given, computed rather than remembered. Around them sit the owner, the value, the renewal type, a criticality level, risk flags and an alert that shows, ninety days ahead, which contracts need a decision. The core formula is one line of Excel: with the end date in column G and a notice period in months in column H, =EDATE(G2,-H2) returns the last day to give notice.
Why a register beats a shared folder
A folder of signed PDFs stores contracts. It does not tell you which contract renews itself next month unless a letter leaves first, or which one lost its owner when a colleague left. A register pulls the few fields that matter into one table where a formula, not a memory, raises the flag.
If your organisation runs a service management system, ISO/IEC 20000-1:2018 (Service management system requirements, published September 2018) is the standard it can be certified against, and a register helps show that suppliers are under control. If it falls within the scope of the NIS 2 Directive, Directive (EU) 2022/2555 of 14 December 2022 lists among the required cybersecurity risk-management measures "supply chain security, including security-related aspects concerning the relationships between each entity and its direct suppliers or service providers" (Article 21(2)(d)), and requires Member States to ensure that entities, when choosing those measures, take into account the vulnerabilities specific to each direct supplier and service provider and the overall quality of their suppliers' products and cybersecurity practices (Article 21(3)). You cannot weigh suppliers you have not listed; what to ask them is covered in the article on NIS 2 supply chain security.
The columns that matter
About thirty columns are enough. The documents stay in the folder, linked from the last column.
| Group | Columns | Notes |
|---|---|---|
| Identity | ID, vendor, contract object, category | Category list: managed services, telecom, licences, cloud, development, maintenance, security, hardware |
| People | Internal owner, vendor contact | A contract without an owner is a contract nobody will terminate |
| Dates | Start date, end date, notice period, notice unit (months or days), renewal type, renewal term | Renewal type list: fixed term, tacit renewal, evergreen |
| Money | Annual value, total value over the term, currency, budget line | The budget line links the register to the IT budget sheet |
| Risk | Criticality (Critical, Major, Minor), personal data, security-relevant, SLA attached, exit plan exists, data return clause, alternative identified | Yes/No flags behind the risk score and the supplier review |
| Computed | Last day to give notice, days remaining, alert, risk score | Formulas only, never typed |
| Follow-up | Status, next action, action date, link to the document | Updated at the monthly review |
Computing the last day to give notice
Four clause patterns are covered here. The formulas assume the end date in G2, the notice period in H2, the unit in I2 and a named range Holidays.
- Notice in months ("three months before the end date"):
=EDATE(G2,-H2). Microsoft documentsEDATE(start_date, months); a negative value yields a past date. - Notice in days ("sixty days before expiry"):
=G2-H2, in calendar days unless the contract says otherwise. If that day falls on a weekend or holiday,=WORKDAY(G2-H2+1,-1,Holidays)moves it back to the previous working day. - Either unit in one register:
=IF(I2="months",EDATE(G2,-H2),G2-H2). - Notice in business days:
=WORKDAY(G2,-H2,Holidays).WORKDAY(start_date, days, [holidays])skips weekends and the listed holidays; a negative value also yields a past date.
Two refinements. EDATE keeps the day number where it exists: six months before 30 June is 30 December, not 31 December. And subtract a dispatch margin held in the Settings sheet, a week or two, so that the register's deadline precedes the contractual one: =EDATE(G2,-H2)-Settings!$B$5. With that date in J2, days remaining in K2 is =J2-Settings!$B$2, where the Settings cell holds the as-of date of the review.
Tacit renewal has a trap: once the last day has passed, the contract runs to a new end date, which must be entered in the register. The article on tracking auto-renewal notice periods covers the reverse calendar. The governing law and the wording of the clause decide when notice counts as given; have a lawyer read any contract you cannot afford to renew by accident.
Criticality and risk flags
Criticality is assigned, not computed, from three questions: what stops if the service stops, what data the vendor holds, and how long replacing the vendor would take. Critical where any answer is severe, Minor for commodity services with alternatives on the shelf, Major in between. The Yes/No flags say whether the safeguards exist, and a risk score counts the missing ones, =COUNTIF(P2:S2,"No"), over four flags: SLA attached, exit plan exists, data return clause, alternative identified. The review sorts by criticality first and by that count second. Filter on the security-relevant and personal-data flags when preparing a supplier security review.
Alerts and the monthly review
The alert column compares the days remaining with two Settings thresholds, a lead time for renegotiating and a shorter one for the notice itself, and checks the end date:
=IF(G2<Settings!$B$2,"Expired: out of contract",IF(K2<0,"Notice deadline missed",IF(K2<=Settings!$B$4,"Notice due soon",IF(K2<=Settings!$B$3,"Renegotiate","OK"))))
A sixth state is worth adding: once a status column says "Notice given", the alert becomes "Prepare exit" when the end date comes inside the lead time, because the service still has to be handed over. The monthly review is short: sort by days remaining, give every alert a next action, an owner and a date, then check last month's SLA readings on the critical contracts so that service credits are claimed (see SLA service credits).
Example (fictitious data)
As-of date 19 October 2026, lead time 90 days, notice-due-soon threshold 30 days, no dispatch margin and no weekend adjustment, so that the formulas can be checked by hand.
| Contract | End date | Notice | Renewal | Last day to give notice | Days remaining | Criticality | Alert |
|---|---|---|---|---|---|---|---|
| Managed network services | 2027-01-31 | 3 months | Tacit, 12 months | 2026-10-31 | 12 | Critical | Notice due soon |
| Office suite licences | 2027-03-31 | 60 days | Tacit, 12 months | 2027-01-30 | 103 | Major | OK |
| Cloud hosting | 2026-12-31 | 1 month | Tacit, 12 months | 2026-11-30 | 42 | Critical | Renegotiate |
| Managed security monitoring | 2027-06-30 | 6 months | Tacit, 24 months | 2026-12-30 | 72 | Critical | Renegotiate |
| Printer fleet lease | 2026-11-15 | 2 months | Tacit, 12 months | 2026-09-15 | −34 | Minor | Notice deadline missed |
Three lines show the traps. The managed network deadline falls on a Saturday; wrapped in WORKDAY, it moves to Friday 30 October. The security monitoring line shows EDATE keeping the day number, 30 December rather than 31. The printer lease will now renew for a year: roll its end date to 15 November 2027 and set its next notice reminder.
FAQ
As-of date or TODAY()?
Use the as-of date. TODAY() changes every time the file is opened; the as-of date freezes the monthly review, which is what you file with the decisions.
How do I handle an evergreen contract with notice "three months before each anniversary"?
Store the next anniversary in the end date column and compute the notice deadline from it as usual. At each review, if the anniversary has passed without termination, roll the end date forward by twelve months.
Does a register replace a contract management tool?
For a portfolio one person can review each month, a register does the job. Beyond that, a tool helps; the columns above become its specification and the register its first import.