Guides
Power Automate recipe
Reminders on a fixed schedule and Microsoft Teams messages, from flows your organisation owns, built from Microsoft's standard connectors in a few minutes.
Why a flow
ExpiryPoint has no server of its own: review data stays in hidden lists on each SharePoint site. Two things therefore need a flow that your organisation owns:
- Reminders on a fixed schedule, even on days when nobody opens ExpiryPoint. ExpiryPoint's own reminders go out when a site owner opens it, if switched on in Settings.
- Microsoft Teams messages to reviewers. ExpiryPoint itself sends email through Microsoft Graph, once an administrator approves its optional Mail.Send permission.
Every action ExpiryPoint takes is also a list row, so flows can react to decisions and approvals too. ExpiryPoint never needs a flow to work; flows only add scheduling and Teams messages.
The review register
ExpiryPoint_Reviews is the review register: one row per document in scope on the site, kept up to date whenever a site owner opens ExpiryPoint (a few hundred rows per visit, so a large site fills over a few visits).
| Column | Meaning |
|---|---|
| Title | File name |
| XPStatus | current, refresh (update requested), awaiting-approval, retire-marked, retired or unassigned |
| XPNextReview | Next review date, YYYY-MM-DD (for an update request, the date the update is due) |
| XPDueToEmail, XPDueToName | Who the next action is due from (empty: the site owners) |
| XPLink | Link to the document |
| XPReviewerEmail, XPBackupEmail, XPOwnerEmail | Reviewer, backup reviewer and owner, when set |
| XPLastReviewedAt, XPLastReviewedBy | The last review |
The decision log
ExpiryPoint_Log is the audit trail: one row per action. XPAction is one of current, refresh, retire, notmine, submitted, approved, rejected, assigned, retire-executed, reminder or undone, with XPActorEmail, XPAt (UTC), XPComment, XPPrevReview, XPNextReview and XPStage.
Both lists are hidden from the site navigation, so the SharePoint connector does not offer them in its list picker: choose Enter custom value and type the list name exactly as above.
Flow 1: a weekly digest in Teams and email
- Trigger: Recurrence, every week (or every day), at 08:00 in your time zone.
- SharePoint, Get items: Site address is the site; List name is
ExpiryPoint_Reviews(custom value); Filter QueryXPStatus ne 'retired' and XPStatus ne 'awaiting-approval' and XPNextReview le '@{formatDateTime(addDays(utcNow(), 7), 'yyyy-MM-dd')}'; Top Count 5000. - Data operation, Select the fields you want: Title, XPNextReview, XPLink and XPDueToEmail.
- Group per person: add an Apply to each over the distinct
XPDueToEmailvalues, with a Filter array for that person. - For each person, Microsoft Teams, Post card in a chat or channel (post as Flow bot, in a chat with Flow bot, recipient the email): an adaptive card listing the documents (name, due date, link) with a button to your ExpiryPoint page. Add or use instead Office 365 Outlook, Send an email (V2).
- Rows with an empty
XPDueToEmailbelong to the site owners: send those to the site owners' group or a channel.
Flow 2: tell a channel when something is retired
- Trigger: SharePoint, When an item is created, List name
ExpiryPoint_Log(custom value). - Condition:
XPActionis equal toretireorretire-executed. - Microsoft Teams, Post message in a chat or channel:
@{triggerBody()?['Title']} was retired by @{triggerBody()?['XPActorName']}: @{triggerBody()?['XPComment']}
Flow 3: start a formal approval
If your organisation already uses Power Automate approvals, trigger on ExpiryPoint_Log rows where XPAction is submitted, and use Approvals, Start and wait for an approval. Ask the approver to record the outcome in ExpiryPoint, so the review date and the audit trail stay in step, or keep ExpiryPoint's built-in approval stages and use the flow only to notify.
Good to know
- Flows run with the permissions of the connection's account. Use an account that can read the site.
- Flows run under your own Power Automate licence, in your own tenant; nothing goes through Apps 365.
- Columns are only ever added, never removed or renamed, so flows built on these names keep working after updates.