# Software license tracker in SharePoint: seats, cost and renewal dates

> For the full documentation index, see https://250highstreet.com/llms.txt

> Build a software license tracker in a SharePoint list: seats bought and used, yearly cost, owner and renewal date, plus a view and a reminder flow.

Short answer: a software license tracker is one SharePoint list with one row per tool. Each row holds the owner, seats bought, seats used, cost per year, renewal date and notice deadline. Add one view that shows renewals coming up and one scheduled flow that tells the owner before the deadline. This guide shows how to build it, step by step.

A spreadsheet can hold the same columns. It breaks when several people edit it, when nobody owns a row, and when nobody looks at it before a renewal. A list gives each row an owner and lets you build views and reminders on top of it. If your tracker is in a spreadsheet today, see "[Replace a spreadsheet tracker with a SharePoint list](/guides/replace-spreadsheet-with-sharepoint-list/)".

Menu names in Microsoft 365 change from time to time. The exact names may differ from the ones below.

## What this tracker answers

Plan the list around the questions you need answered. For software, these are the four that matter:

1.  Who owns each tool?
2.  How many seats did the team buy, and how many are used?
3.  What does each tool cost per year?
4.  When does it renew, and by what date must someone cancel?

If a column does not help answer one of these, leave it out. One way to start is with eight to ten tools, not all of them.

## Step 1. Create a blank list

1.  Open [https://www.microsoft365.com](https://www.microsoft365.com) and sign in.
2.  Find the Lists app and select it. If you do not see it, ask your admin.
3.  Select New list, then Blank list.
4.  Name it "Software licenses". Choose a site your team already uses, so the right people can open it.
5.  Select Create.

Our advice, not a Microsoft rule: put the list on a team site, not in My lists, so a person leaving does not take it with them.

## Step 2. Plan the columns

Microsoft's introduction to lists names the column types you can pick from: "including Text, Number, Choice, Currency, Date and Time, Lookup, Yes/No, and Calculated."

The Title column is required by default. Rename it to "Tool name" and keep it as the name of the tool. If you do not want it required, open its settings and turn off Require.

Our advice, not a Microsoft rule: type column names without spaces when you first create them (for example RenewalDate). The first name you type is the internal name, and flows and filters use that name. You can change the display name later, but the internal name stays.

One way to start is with these columns. The names are examples.

1.  Tool name. This is the Title column, renamed.
2.  Owner. Type: Person. One person who decides about the renewal.
3.  SeatsBought. Type: Number.
4.  SeatsUsed. Type: Number.
5.  CostPerYear. Type: Currency.
6.  RenewalDate. Type: Date and Time.
7.  NoticeDays. Type: Number. The days of notice the contract needs.
8.  NoticeDeadline. Type: Date and Time. The last day to cancel.
9.  AutoRenews. Type: Yes/No. Set a default value so no row is left blank.
10. Status. Type: Choice, with the choices "1 Active", "2 Under review", "3 Canceled", "4 Ended". Set "1 Active" as the default value.
11. Notes. Type: Multiple lines of text. Put the link to the contract here.

The number in front of each Status choice keeps the choices in your order when you read them. A Choice column sorts by its text, so the number is there to hold your order.

Microsoft's lookup columns page lists Currency among the types a lookup cannot show, so if you ever need cost in another list, use a Number column there.

## Step 3. Add the columns

Build each column from the list header. Microsoft says: "To the right of the last column name at the top of the list or library, select + Add column." After that, work through each column like this:

1.  Choose the type from the menu.
2.  Enter the column name with no spaces.
3.  For Choice, give every option its own line, in the numbered order from Step 2.
4.  For Status and AutoRenews, set the default value before you save. If the setting is hidden, open more options.
5.  Select Save.

Make all eleven columns first, then make views. Renaming a column after a view or flow uses it is slow work.

## Step 4. Enter one sample row

Test the shape with a single dummy entry before you type in real contracts:

- Tool name: Tool 7
- Owner: yourself
- SeatsBought: 40
- SeatsUsed: 31
- CostPerYear: 6400
- RenewalDate: a day roughly 90 days out
- NoticeDays: 60
- NoticeDeadline: 60 days ahead of the renewal day
- AutoRenews: No
- Status: 1 Active

Confirm the save worked and that Owner displays a person's name. Remove this dummy entry once real data is in, because test rows mislead the people who read the list.

## Step 5. Fill in the real tools

Start with the tools that renew soonest. Open each contract or order and copy three things: the renewal date, the notice days, and the cost. Count back from the renewal date to get the notice deadline and type it in.

Seats are the part that takes work. Seat counts live in each tool's own admin page, so open each admin page and copy the numbers. The list does not read them for you. Our advice, not a Microsoft rule: update the seat numbers when you review the list, not every day.

## Step 6. Show unused seats

Paid seats nobody uses are the cheapest saving to find. Microsoft says that column types include "a number that is calculated from other columns". Add a Calculated column called SeatsUnused, return type Number, with this formula:

=\[SeatsBought\]-\[SeatsUsed\]

Check it against three rows by doing the subtraction yourself. Our advice, not a Microsoft rule: keep today's date out of calculated columns and do date logic in a view filter.

## Step 7. Build a "Renewing soon" view

A view is a saved way to show the same list. Build one that shows active tools whose notice deadline is within 60 days.

This view needs the classic view editor. Microsoft says: "There are two keywords that you can use to filter based on the current day \[Today\], or the current user \[Me\]." It also says: "You must use the classic view editor to filter columns using these keywords."

1.  Open the list. Open the view options and choose Edit current view, or create a new view first and save it as "1 Renewing soon".
2.  Choose the classic view editor.
3.  Scroll down to the Filters section. Microsoft says: "Scroll down to the Filters section, and select Show items only when the following is true."
4.  Add the first filter: Status is equal to 1 Active.
5.  Add the second filter: NoticeDeadline is less than or equal to \[Today\]+60. Microsoft shows the \[Today\] math idea like this: "create a filter on the Date column that's greater than or equal to \[Today\] - 30".
6.  Under Sort, sort by NoticeDeadline, ascending.
7.  Select OK.

The Status filter is the flag that keeps old rows out. When you set a tool to 3 Canceled or 4 Ended, it drops out of the view on its own. Our advice, not a Microsoft rule: set blank and "is not equal to" filters in the classic view editor too.

Also save a second view, "2 All tools", with no filter, sorted by Tool name, for the full picture.

## Step 8. Add a reminder flow

A view only helps when someone opens it. A scheduled flow can send a message before the deadline. This is the short version. For a fuller walk-through, see "[Send a reminder before a due date in a SharePoint list](/guides/send-reminder-before-due-date/)" and "[Late tasks nobody notices: setting up late alerts](/guides/late-tasks-nobody-notices/)".

1.  Open [https://make.powerautomate.com](https://make.powerautomate.com) and sign in.
2.  Select My flows, then Create from blank.
3.  Add a trigger and search for Recurrence. Microsoft's example for a weekly run is "Interval = 1 and Frequency = Week".
4.  Set the Start time. Microsoft gives the format "YYYY-MM-DDTHH:MM:SSZ".
5.  Add the SharePoint action Get items. Pick your site and your list.
6.  In Advanced options, set a Filter Query. Use a range, not an equals test on a date. One way to write it: Status eq '1 Active' and NoticeDeadline ge '2026-10-22' and NoticeDeadline lt '2026-11-22'. Replace the dates with expressions, using the formatDateTime and utcNow functions, so the range moves each week. Microsoft shows this idea: "formatDateTime(utcNow(),'yyyy-MM-dd')". Test the query first with fixed dates.
7.  Set Top Count. Microsoft says: "The default item limit is 100". It also says you can raise the limit "up to the list view threshold limit of 5,000". Set Top Count to a number that fits your list, and turn Pagination on in the action settings.
8.  Add Apply to each over the rows Get items returns.
9.  Inside it, add the action that sends an email or a Teams message to the Owner. Put the Tool name and the NoticeDeadline in the message.
10. Save, then run a test.

This flow only reads the list and sends a message. It does not change any row, so it cannot start itself again. If you later add a step that updates the same row, read "[Power Automate flow keeps running itself over and over](/guides/power-automate-flow-triggers-itself-infinite-loop/)" first.

Only 100 rows come back if you leave the defaults. The guide "[Power Automate Get items stops at 100 rows: how to get them all](/guides/power-automate-get-items-only-returns-100/)" covers this in more detail.

## What to avoid

Our advice, not a Microsoft rule, for everything in this section.

Seats and keys cause the trouble in a license list, so start there. A license key or a shared login is a secret. Write down where the contract lives and who administers the tool, and nothing more. Anyone who can open the list can read the key.

Count each seat once. If Tool 7 has 40 seats and one person holds two accounts, SeatsUsed reads 31 when the real number is 30. Copy the count from the tool's admin page and let that page decide.

Watch the free trial that turns paid. Give a trial its own row, set AutoRenews to Yes, and fill NoticeDeadline on day one. Otherwise the first charge is the first sign it existed.

Give every row an owner, and keep the editor list short.

A view only filters what is shown. A person with list access can open another view, so do not treat a view as a lock. Run the first columns for a month before you add more.

## Honest limits

The list stores what you type. It does not connect to your tools and does not count seats for you. Someone has to copy seat numbers from each tool's admin page. The list also gives no advice on which tool to keep. For contract terms you do not understand, ask the person who signed the contract. For renewal dates in other contracts, see "[Contract renewal dates missed: how to track them so none slip](/guides/contract-renewal-dates-missed/)".

## When to get help

You can build all of this yourself in Microsoft 365. If you would rather have it built and tested for your team, I do that. A tracker like this is a fixed price: \$5,000 for one, built in 2 weeks. See "[What a SharePoint tracker costs to build](/guides/what-a-sharepoint-tracker-costs/)". Bring one example of the problem to a free call.

I am Al Davies. I run 250 High Street LLC and build SharePoint trackers and Power Automate flows for operations teams. I work remotely. The first call is free, and I will not try to sell you anything.

See trackers I built: [Tools I built](/portfolio/)

## FAQ

### Which columns do I need at minimum?

Tool name, Owner, RenewalDate and NoticeDeadline. Those four make the list useful. Add seats and cost when the first four are in use.

### Can the list count seats for me?

No. You type the numbers in. A Calculated column can subtract used seats from bought seats, but the two numbers still come from you.

### Why does my "Renewing soon" view not take \[Today\] from the column menu?

Microsoft says: "It is not possible to use the \[Today\] or \[Me\] filters when filtering using a column header." Use the classic view editor, as in Step 7.

### Why does the reminder flow miss tools?

Check three things: Top Count is high enough, Pagination is on, and the Filter Query uses a date range with ge and lt. A tool with a blank Status or a blank NoticeDeadline will not match a filter on those columns.

### Should I track free tools too?

One way to start is to track paid tools only. Add a free tool when it has an owner and a reason to be watched.

## Sources

- [Microsoft Support, Introduction to lists](https://support.microsoft.com/en-us/office/introduction-to-lists-0a1c3ace-def0-44af-b225-cfa8d92c52d7)
- [Microsoft Support, Create a column in a list or library](https://support.microsoft.com/en-us/office/create-a-column-in-a-list-or-library-2b0361ae-1bd3-41a3-8329-269e5f81cfa2)
- [Microsoft Support, Use filtering to modify a SharePoint view](https://support.microsoft.com/en-us/office/use-filtering-to-modify-a-sharepoint-view-3d8efc52-0808-4731-8f9b-3dfaeacea3d4)
- [Microsoft Learn, Run a cloud flow on a schedule in Power Automate](https://learn.microsoft.com/en-us/power-automate/run-scheduled-tasks)
- [Microsoft Learn, In-depth analysis into Get items and Get files SharePoint actions](https://learn.microsoft.com/en-us/sharepoint/dev/business-apps/power-automate/guidance/working-with-get-items-and-get-files)

## Related guides

- [How to set up a vendor list with renewal dates in SharePoint](/guides/setup-vendor-list-renewal-dates-sharepoint/)
- [Contract renewal dates missed: how to track them so none slip](/guides/contract-renewal-dates-missed/)
- [Which Power Automate license does a small team need?](/guides/power-automate-license-small-team/)

Source: https://250highstreet.com/guides/software-license-tracker-sharepoint/
