Obliga · guide

Contract renewal reminders in SharePoint: what works, and where it breaks

Let's say you already pay for Microsoft 365 and would rather not buy another thing. Fair enough. You can build renewal reminders with SharePoint and Power Automate, and for a small portfolio it holds up fine. Here is how, and the four places it can fall short.

The build

Make a SharePoint list. Columns for the vendor, the contract owner (a Person column, not text), the expiry date, the notice period in days, and a calculated column for the notice deadline. Attach the signed PDF to each item, or use a document library with the same metadata if you would rather keep the files front and centre.

Then one Power Automate flow. Recurrence trigger, once a day, early morning. Get items from the list with an ODATA filter on the deadline. Send an email to the contract owner. Everything you need is a standard connector, so there is no extra licence to buy.

That is it, really. An afternoon's work.

Where it breaks

The date you care about is not the expiry date

Most people set the reminder on expiry. By then the window to cancel has usually closed. A lease with a ninety day notice clause that expires March 31 has a real deadline of December 31. Store the notice period and count backwards.

If you take one thing from this page, take that. Reminders anchored to the expiry date arrive after the only date that could have changed the outcome.

The flow belongs to a person

It runs under whoever built it, using their connection to SharePoint and Outlook. Change a password, get re-prompted for MFA, or leave the company and have the account disabled, and the flow stops. Nobody notices, because the symptom of a broken reminder system is silence. Put it in a solution owned by a service account, or at the very least add a second owner.

Sending once is not enough. Sending daily is worse

One email ninety days out gets read, archived, forgotten. So you add another at thirty and another at seven, and now you have to record which ones already went out, or the flow mails the same person every morning until they filter you. A Last reminder sent column and a condition will do it. This is also where the afternoon build turns into a weekend.

Column names are not what you think

The ODATA filter wants the internal name, which is set when the column is created and never changes afterwards. Rename Expiry to Expiry Date in the UI and it is still Expiry underneath. That one fails loudly, at least.

The nastier version is the date comparison, because SharePoint stores dates in UTC and a Date Only column checked against utcNow() drifts by a day depending on your regional settings. The filter stays valid. The run reports success. It just returns nothing. Format both sides to yyyy-MM-dd before you compare them. That can run clean for months while notifying nobody.

When to stop

Under about forty contracts this is the right answer and I would not try to sell you anything else. Past that, the cracks widen. Version history will tell you a field changed. It will not tell you that anyone was notified, that they read it, or who approved the renewal. When your insurer asks, or a buyer's lawyer asks during due diligence, a Power Automate run history is not something you want to be handing over.

People keep their contracts in Excel, or they build a SharePoint list like the one above. That gap is why I built Obliga. Same Microsoft account to sign in, reminders sent from your own mailbox, but with a record of who was told and when.

← All Obliga guides