The email arrives Friday at 4:47pm.
"Hey — our MSA with Client X expired Tuesday. They're asking for a new SOW by Monday. Can you pull the old terms?"
You spend the weekend reconstructing a relationship from PDFs in three different folders. The client is annoyed. You look disorganized. The renewal revenue is at risk.
This happens in every agency we audit. Here's the system that stops it.
The Problem Isn't Memory — It's Visibility
You don't need to remember 47 contract dates. You need a dashboard that shows you what's coming in the next 90 days, every Monday morning.
The Contract Tracker (Notion Template)
One database. These properties. No exceptions.
| Property | Type | Purpose | |----------|------|---------| | Contract Name | Title | "Client X — MSA" / "Client X — SOW Q2 2026" | | Type | Select | MSA, SOW, NDA, Addendum | | Counterparty | Relation → Companies DB | Links to client/vendor record | | Status | Select | Active, Expiring Soon (90d), Expired, Renewed, Terminated | | Effective Date | Date | When it started | | Expiration Date | Date | When it ends (or auto-renews) | | Auto-Renew | Checkbox | Yes/No | | Renewal Notice Period | Number (days) | 30, 60, 90 — what the contract requires | | Owner | Person | Who manages this relationship | | Value (Annualized) | Number | For prioritization | | File | Files & Media | PDF of signed contract | | Notes | Text | Key terms, special clauses, negotiation history |
Two views you need:
- Expiring in 90 Days — Filter: Expiration Date ≤ Today + 90d, Status = Active. Sort by Expiration Date ascending.
- By Owner — Group by Owner. Each PM/lead sees their contracts.
The 90/30/7 Cadence
90 days out (Trigger: Expiring Soon view):
- Owner gets Notion notification + Slack DM
- Action: Confirm renewal intent with counterparty
- Decision: Renew as-is, renegotiate, or let lapse
30 days out:
- If renegotiating: Draft terms sent to counterparty
- If auto-renew: Verify nothing changed (scope, rate, contact)
- If letting lapse: Offboarding checklist initiated
7 days out:
- Final signature chase
- New contract filed in tracker
- Old contract status → Renewed
The Auto-Renew Trap
Auto-renew sounds safe. It's not.
What goes wrong:
- Rate increases 15% per auto-renew clause — no one noticed
- Scope creep: SOW auto-renews but deliverables changed 6 months ago
- Counterparty uses auto-renew as leverage ("well, it renewed, so...")
- You're locked into a vendor you wanted to replace
The fix: Treat auto-renew as a trigger, not a decision.
- 90 days out: Review every auto-renew contract
- Active decision: "We want this to renew" or "We're opting out"
- Document the decision in Notes
The Vendor vs. Client Split
Client contracts (revenue):
- Owner = Account Lead / PM
- Priority: High (revenue at risk)
- Escalation: Founder at 30 days if unsigned
Vendor contracts (cost):
- Owner = Ops Lead / Department Head
- Priority: Medium (service disruption risk)
- Escalation: Finance at 30 days for payment terms review
Different cadences, same tracker.
Quick Setup (30 Minutes)
- Create the Notion database with properties above
- Import existing contracts from wherever they live (Drive, DocuSign, inbox)
- Set expiration dates — estimate if unknown, flag in Notes
- Create the two views
- Share with team, assign owners
- Add to Monday 9am recurring: "Review Expiring in 90 Days view"
Quick Win This Week
Find the 3 contracts expiring soonest. For each:
- Confirm the expiration date (check the PDF)
- Identify the owner
- Send the 90-day email: "Hey [counterparty], our agreement expires [date]. Want to set up a quick call to discuss renewal?"
That's it. Three emails. You've just prevented three Friday 4:47pm fires.
Contract chaos is optional. Book a discovery call and we'll build your tracker together.