IT & Automation

Never Miss a SaaS Renewal: The Power Automate Flow I Use to Track 40-Plus Subscriptions

By Felix Maru · September 29, 2026 · 7 min read

The invoice arrived on a Tuesday. Annual renewal for a project management tool the team had stopped using around eight months earlier. Nobody cancelled it. Nobody remembered it was set to auto-renew. The account owner who signed up had left the company the previous quarter.

That one cost a few hundred dollars and a mildly awkward conversation with finance. It was also entirely preventable. After that, I spent an afternoon building a system I should have built years earlier: a SaaS subscription tracker with automated 30-day and 7-day renewal alerts, running on a SharePoint list and Power Automate.

I now use this across every environment I manage. It surfaces upcoming renewals before anyone has to think about them, routes the alert to the person who actually owns the subscription (not just IT), and flags cost for review at the right moment. It has caught auto-renewals I would otherwise have missed, and it takes about two hours to set up properly the first time.

This post walks through exactly how to build it.

The Data Layer: One SharePoint List

The tracker only works if the data underneath it is clean and maintained. The single biggest failure mode for any subscription tracking system is a spreadsheet that gets updated inconsistently, or a tool that nobody remembers to log new subscriptions into. SharePoint works well here because it integrates natively with Power Automate, permissions are already managed at the org level, and it is accessible to both IT and the business owners of each tool.

Create a SharePoint list called SaaS Subscriptions with these columns:

A few things to get right from the start. The Subscription Owner column must point to a specific person, not a team or shared inbox. Alerts go to whoever is listed here. If IT is listed as owner for every row, you will just recreate the problem of a single inbox absorbing everything.

Also populate the Status field deliberately. "Cancel on Renewal" is the most important value. It means someone has already decided not to renew but the subscription has not lapsed yet. The alert will still fire, but the message will be different: confirm cancellation rather than review the subscription. This saves the awkward last-minute cancellation call.

Building the Power Automate Flow

You need two flows: one for the 30-day alert and one for the 7-day alert. They share the same logic, so build the first one and then duplicate it for the second, changing only the day threshold and the message tone. Here is the structure:

Scheduled trigger (daily, 8 AM) → Get items from SharePoint list → Filter: Renewal Date within 30 days, Status = Active or Cancel on Renewal → Email to Subscription Owner: review or confirm cancellation
The daily flow reads the SharePoint list, filters by upcoming renewal window, and routes a personalised alert to each subscription owner.

Step 1: Create the scheduled trigger

In Power Automate, start a new Scheduled Cloud Flow. Set it to run daily at 8 AM in your local timezone. Name it clearly: "SaaS Renewal Alert: 30-day warning".

Step 2: Get items from SharePoint

Add a "Get items" action. Point it at your SharePoint site and the SaaS Subscriptions list. No filter here yet. You'll filter in the next step using expressions, which gives you more control than SharePoint's OData filter for date comparisons.

Step 3: Apply the date filter

Add an "Apply to each" action over the returned items. Inside it, add a "Condition" that checks two things:

For the date calculation, use the Power Automate expression addDays(utcNow(), 30) for the upper bound and utcNow() for the lower bound. Format both with formatDateTime(..., 'yyyy-MM-dd') so they match the format SharePoint stores dates in. This catches a lot of people the first time they build this.

Step 4: Branch on Status

Inside the "yes" branch of your condition, add a second condition that checks the Status column.

Both email actions should populate the "To" field from the Subscription Owner column. Power Automate will resolve the person field to their email address automatically.

Step 5: Duplicate for the 7-day alert

Save and export the flow, then import it as a new flow. Change the name to "SaaS Renewal Alert: 7-day warning". Update the upper bound expression to addDays(utcNow(), 7). Update the email subject and body to reflect the tighter urgency. The 7-day message should be more direct: the renewal fires in one week, the owner needs to act now or accept the charge.

What Goes in the Alert Email

Keep the 30-day email to five things: tool name and vendor, renewal date (readable, not a timestamp), annual cost, current status, and a direct link to the SharePoint list item. Close with one clear ask: confirm whether the team is still actively using the tool and update the status accordingly.

The 7-day alert is shorter. Tool, date, cost, and one line: "Action needed this week." If the owner did not act after the 30-day alert, they need a push, not a longer email.

What I Got Wrong the First Time

Three mistakes are worth naming explicitly, because I made all of them.

Routing everything to IT. My first version sent all alerts to a shared IT mailbox. Nobody acted on them because IT did not own the budgeting decision for most tools. The alert needs to go to the person whose card is on file, or the team lead who requested the tool. That is almost never IT.

Forgetting free tiers. Several tools on my list started as free or trial accounts. Free tiers do not always have a renewal date because there is nothing to renew yet. But a lot of them automatically convert to paid when a user exceeds a usage threshold or the trial period expires. I added a separate Status value called "Free Tier (Monitor)" and a separate column for the date the free tier was activated. A different flow (monthly, not daily) scans these and sends a single digest to IT for review.

Not updating the Renewal Date after renewal. When a subscription renews, the date in SharePoint does not update itself. I added a short note to the 7-day email reminding the owner to update the Renewal Date in the list after the charge processes. I also do a quarterly audit pass where I manually reconcile the list against the credit card statements. The automation catches most things; the quarterly pass catches the rest.

The Checklist to Run When You First Populate the List

If you are building this from scratch, the hardest part is getting the initial inventory right. Here is the approach that works fastest:

  1. Pull the last 12 months of credit card and bank statements used for software purchases. Every recurring charge is a subscription to log.
  2. Ask department heads to list every tool their team uses and pays for, including personal expense claims that get reimbursed. Shadow IT lives here.
  3. Search your email for receipt keywords: "Your subscription", "Invoice from", "Payment received", "Renewal confirmation". You will find tools nobody mentioned in step 2.
  4. Check your SSO provider or identity platform if you have one. Every connected application is a potential subscription.
  5. Cross-reference your vendor contact list. If you have a vendor relationship but no corresponding row in the tracker, something is missing.

The first population pass usually takes a couple of hours for a team of 20 to 50 people. For a larger org, plan a full day and assign someone in each department to own their section of the list. The point is not perfection on day one. The point is getting enough in there that the flow starts surfacing things before they auto-renew.

Sources

If you are managing IT for a growing team and want to talk through what this kind of tracking looks like at scale, reach out.

Share 𝕏 in