Automate Basics
Operations

Send Automatic Reminders From a SharePoint List With Power Automate

By

· Updated · 4 min read

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.

A phone on a desk at dawn showing a reminder notification with two overdue items marked by red dots
Image: AI-generated illustration.

Why chasing is the job nobody owns

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.

Add the column that makes this work

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.

Set the schedule

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.

Fetch only what needs chasing

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.

Stop it running on an empty list

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.

Message the right person

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.

Write the reminder down

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.

Test the awkward cases

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.

Where this fits with the rest

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.

Build your first version now

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.

Try this now

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.

Frequently asked questions

How do I send a reminder from a SharePoint list on a schedule?

Sending a scheduled reminder from a SharePoint list takes three Power Automate actions: a Recurrence trigger set to the time you want it to run, a Get items action pointed at the list with a filter query that returns only overdue rows, and an Apply to each loop containing the message. No code is required at any step.

What is the OData filter for items due before today?

The filter compares your date column to the current time, written as DueDate lt '@{utcNow()}' in the Filter Query box of the Get items action, with DueDate replaced by your internal column name. Add a status clause such as and Status ne 'Done' so completed rows stop being chased. Internal column names often differ from display names, which is the usual cause of a filter silently returning nothing.

Why does my flow remind people about the same item every day?

A reminder flow repeats because nothing on the item records that it was already chased. Add a LastReminded date column, write the current date to it at the end of the loop, and include it in the filter so items reminded within the last few days are excluded. Without that, a scheduled flow has no memory between runs.

Can the reminder go to the person the item is assigned to?

Yes, if the list has a Person column for the assignee. Inside the loop, reference the assignee email token from the current item as the To address rather than a fixed mailbox. That turns one flow into a flow that chases everyone about their own work instead of sending the whole list to one manager.

How do I stop the flow emailing people about an empty list?

Wrap the notification in a Condition that checks whether Get items returned anything, using length on the value array and continuing only when it is greater than zero. A flow that sends "here are your 0 overdue items" every morning gets muted within a week, and a muted reminder is the same as no reminder.

For you

Learn to do this with AI, free

Short courses for people who aren't engineers: ChatGPT, Claude, prompting and automation. Every lesson is free, with no card.

Start a free course

For companies

Make an AI or automation tool?

List it in the directory for $9.99, refunded in full if it isn't approved, or claim its page if it is already here.

Tools in this piece

Drafted with AI assistance from our own research and Search Console data, and reviewed by the Automate Basics team before publishing. Tools and prices change; check the linked official source before you act.

Get the next one by email

One email a week: what changed in AI for people who use it at work, and what to do about it.

We aim to send it on Mondays. Unsubscribe in one click.