Send Automatic Reminders From a SharePoint List With Power Automate
By Rahul A
By Rahul A
A scheduled Power Automate flow can check a SharePoint list every morning, find the items that are overdue or due soon, and message the person each one is assigned to. It is built from a Recurrence trigger, a Get items action with an OData filter, and a loop. The detail that decides whether people keep the reminders on is filtering in the query rather than in the loop, so the flow only touches rows that genuinely need chasing.
Every list of work has a tail. The renewals nobody renewed, the tickets nobody closed, the documents nobody reviewed. The list is right there in SharePoint and perfectly accurate, and the reason things go overdue is not that the information is missing. It is that looking at the list is somebody's job on top of their actual job, so it happens on Fridays, and only some Fridays.
A scheduled flow makes the chasing happen whether or not anyone remembers. The trick is making it precise enough that people keep it switched on.
Before building anything, add a LastReminded date column to your list.
This looks like an optional nicety and it is the entire difference between a reminder people act on and one they mute. A scheduled flow has no memory between runs. Without somewhere to record that an item has already been chased, every run chases everything, and by day three people have a rule sending your reminders to a folder they never open.
While you are there, confirm you have a Status choice column and a Person column for the assignee. Those three columns are what turn a list into something chaseable.
Create a Scheduled cloud flow with a Recurrence trigger. Once a day, on weekdays, early enough to be read before the day fills up.
Two settings worth opening the advanced options for: set the time zone explicitly rather than accepting UTC, and set the hour deliberately. A reminder that arrives at 03:00 local time is at the bottom of the inbox by the time anyone looks.
Add Get items (SharePoint), point it at the list, and open Filter Query under advanced options.
This is the step that matters. The naive version of this flow fetches everything and decides inside the loop what is overdue, which means it touches every row on the list every morning. The right version asks SharePoint to return only the rows that need action:
DueDate lt '@{utcNow()}' and Status ne 'Done'
Replace DueDate and Status with your internal column names, which are not always what the column is called on screen. A column renamed after creation keeps its original internal name, and this is the single most common reason a filter silently returns nothing at all. Check the internal name in list settings by opening the column and reading the URL.
Add the LastReminded clause too, so recently chased items sit out for a few days:
and (LastReminded lt '@{addDays(utcNow(),-3)}' or LastReminded eq null)
Set Top Count to something sane. If the filter ever goes wrong, a cap is what stops the flow emailing four hundred people.
Add a Condition before the loop and check that anything came back:
length(outputs('Get_items')?['body/value']) is greater than 0
Nothing overdue should mean silence, not a cheerful message saying so. The fastest way to get a reminder flow ignored is to make it send something every single day regardless of whether it matters.
Inside Apply to each, add Send an email (V2) or a Teams message, and set the recipient from the item's assignee column rather than a fixed address. That is what turns one flow into something that chases everyone about their own work instead of dumping the whole list on one manager every morning.
Keep the message short and put the link in it:
[Title] was due on [DueDate].
Open it: [Link to item]
One item, one line, one link. Resist the urge to summarise the whole list in a table; the point is a specific person and a specific thing.
Still inside the loop, add Update item and set LastReminded to utcNow().
This is the step that closes the loop, and it is the one people forget because the flow appears to work perfectly without it, right up until the complaints start on day three. Test this deliberately: run the flow twice in a row and confirm the second run finds nothing.
Run it once with one genuinely overdue item and confirm the right person gets the right link. Then test the cases that actually break it: an item with nobody assigned, an item with no due date at all, and a run where nothing is overdue.
Unassigned and null-date rows are what throw errors in real lists, because real lists are always messier than the one you built to test with.
This is the third piece of the same Microsoft 365 pattern. Requests arrive and become list items, covered in sending Microsoft Forms responses to a SharePoint list. Items that need a decision go through an approval flow. And the ones that sit there anyway get chased by this.
Build all three against the same list and the list stops being a record of what should have happened.
Open Power Automate, add the LastReminded column, and build the straight path: Recurrence, Get items with a filter, a length condition, a loop with one email, and Update item.
Point it at a test list with two rows first. Run it twice. When the second run correctly finds nothing, aim it at the real list.
Add a LastReminded column to your list before you build anything. It is the difference between a reminder people act on and one they filter to trash in week two.
That’s the whole lesson. Try it on a real task while it is fresh, then come back for the next one.
Build this in Power Automate if your list already lives in SharePoint, which is the usual case. The Recurrence trigger and the SharePoint Get items action do the whole job with no code, and the reminder arrives in Outlook or Teams where the person already is. Only move to another tool if the list itself is somewhere other than Microsoft 365.
The same corner of the library, one job further on.
Drafted with AI assistance from our own research and Search Console data, and reviewed by Rahul A before publishing. Tools and prices change; check the linked official source before you act.