Power Automate
Build the UsagePoint flows
UsagePoint reads and recommends. Everything that changes Microsoft 365 runs in Power Automate flows you build in your own tenant, with your own connections. Each guide takes 10 to 20 minutes, and most need no Premium licence.
Checked against Microsoft Learn on 27 October 2026. For UsagePoint 1.0.0.16 and later.
Before you start
- Set up UsagePoint's lists: in UsagePoint, Settings, Lists and flows, Set up lists on this site. A site owner does this, so the requests list is private.
- Decide who owns the flows: an account that stays, such as a licence administrator or a service account with a mailbox. The Microsoft Entra ID connection uses that account's rights and cannot be shared.
- Know your Copilot licence group, if you give Copilot through a group. UsagePoint shows how each seat was given (Seats, column "Given").
Which flows need Premium
| Flow | Connectors | Premium |
|---|---|---|
| 1. Reclaim with notice | SharePoint, Microsoft Teams, Approvals, Microsoft Entra ID | No |
| 2. Remove a directly assigned licence | HTTP with Microsoft Entra ID | Yes |
| 3. Reassign a seat | SharePoint, Approvals, Microsoft Entra ID | No for group seats |
| 4. Nudge | SharePoint, Microsoft Teams, Microsoft Entra ID | No |
| 5. Seat requests | SharePoint, Microsoft Entra ID, Microsoft Teams | No |
| 6. Monthly summary | SharePoint, Office 365 Outlook | No |
| 7. Keeping records | SharePoint | No |
| 8. Auto-snapshot (optional) | HTTP with Microsoft Entra ID, SharePoint | Yes |
SharePoint, Microsoft Teams, Approvals, Office 365 Outlook and Microsoft Entra ID are Standard connectors, included with Microsoft 365's Power Automate rights. HTTP with Microsoft Entra ID is Premium. Microsoft Entra ID can add and remove group members but has no licence action, so removing a licence assigned directly to a person needs Microsoft Graph and therefore Premium. Seats given through a group never do. Every flow starts from a SharePoint list item, because the "When an HTTP request is received" trigger is Premium too.
How the web part and flows meet
UsagePoint_Actions: the web part writes a row as pending. A person approves it in UsagePoint (approved). Flows 1, 3 and 4 start when a row becomes approved and write back done, failed or cancelled, a completion date and a note.
UsagePoint_Requests: people send requests from the request page. A site owner approves one in UsagePoint, and flow 5 gives the seat and marks it assigned.
Columns the flows use: ActionType (reclaim, reassign, nudge), TargetUserId, TargetUserName, FromUserId, SkuId, AssignmentRoute (direct, group, direct-and-group), GroupIds, NoticeSentDate, HoldUntil and UserReply.
1. Reclaim with notice (Standard)
Tell the person first, hold the seat for 14 days for a "still need it" reply, then a licence administrator confirms.
- Trigger: SharePoint, When an item is created or modified, list UsagePoint_Actions. Trigger condition:
@and(equals(triggerBody()?['Status']?['Value'], 'approved'), equals(triggerBody()?['ActionType']?['Value'], 'reclaim'), empty(triggerBody()?['NoticeSentDate'])) - Update item: NoticeSentDate =
utcNow(), HoldUntil =addDays(utcNow(), 14). - Get user (Microsoft Entra ID) with TargetUserId, then Post adaptive card and wait for a response (Microsoft Teams, Flow bot, chat with the person's User Principal Name). Two buttons: "I still need it" (
{"reply":"still-need-it"}) and "Fine to free it" ({"reply":"fine-to-free"}). Set the action's timeout toP14D. - If the reply is still-need-it: update the item to
cancelledwith UserReply still-need-it, and stop. Otherwise (agreed, or 14 days passed) continue. - Start and wait for an approval (Approvals) to your licence administrators.
- If approved and the seat came from a group: for each id in
split(triggerBody()?['GroupIds'], ','), Microsoft Entra ID, Remove Member From Group (member TargetUserId), then mark the itemdone. If the seat was assigned directly: without Premium, note "remove the licence in the Microsoft 365 admin center" and tell the administrator in Teams; with Premium, use flow 2.
Group-based licensing does not follow nested groups, so the group ids UsagePoint stores are the groups to change. The Microsoft Entra ID connector cannot change mail-enabled security groups or role-assignable groups.
2. Remove a directly assigned licence (Premium, optional)
- HTTP with Microsoft Entra ID, Invoke an HTTP request, resource
https://graph.microsoft.com. The connection's account needs a role that can assign licences, such as License Administrator. POST https://graph.microsoft.com/v1.0/users/{TargetUserId}/assignLicensewith body{"addLicenses": [], "removeLicenses": ["{SkuId}"]}.- On success mark the item
done; on failurefailedwith the error message.
3. Reassign a seat (Standard for group seats)
Trigger as flow 1 with ActionType reassign, no notice step. After an approval: for group seats, Microsoft Entra ID Add user to group for the new person (TargetUserId) and Remove Member From Group for the old one (FromUserId). Direct seats use flow 2 for the old person and the same assignLicense call with addLicenses for the new one. Then mark the item done.
4. Nudge (Standard)
Trigger as flow 1 with ActionType nudge. Get user, then Post message in a chat or channel (Teams, Flow bot) with a friendly note: two or three things Copilot does well in their work and a link to your training page. Mark the item done. Teams allows the Flow bot 25 messages per connection every 5 minutes, so large batches are spread out.
5. Seat requests (Standard)
- Trigger: When an item is created or modified, list UsagePoint_Requests, condition
@and(equals(triggerBody()?['Status']?['Value'], 'approved'), empty(triggerBody()?['AssignedDate'])) - Microsoft Entra ID, Add user to group: your Copilot licence group, user RequesterId.
- Update item: Status
assigned, AssignedDateutcNow(), then tell the person in Teams that their licence is on its way.
To send Microsoft's own "request a licence" button to UsagePoint: Microsoft 365 admin center, Billing, Licenses, Requests, Connect your request process, then paste your request page's address. Requests made this way do not appear on Microsoft's Requests page.
6. Monthly summary (Standard)
Recurrence monthly. Get the two latest items from UsagePoint_Snapshots (order by SnapshotDate descending), and the pending items from UsagePoint_Actions and UsagePoint_Requests. Send an email (Office 365 Outlook) to the licence owner and finance with seats in use, active people, idle seats, the change since last month and anything waiting. Money columns are in pence: divide by 100. The one-page summary on UsagePoint's Home is a ready-made PDF for the same people.
7. Keeping records (Standard)
Matches Settings, Keeping records (default 13 months). Recurrence monthly. Get items from UsagePoint_Actions with filter (Status eq 'done' or Status eq 'failed' or Status eq 'cancelled') and Modified lt '@{addDays(utcNow(), -395)}', then for each one Send an HTTP request to SharePoint, POST _api/web/lists/getByTitle('UsagePoint_Actions')/items({ID})/recycle(). Items go to the recycle bin and can be restored for 93 days. Repeat for UsagePoint_Requests with the statuses assigned, declined and withdrawn.
8. Auto-snapshot (Premium, optional)
Without it, save a snapshot from Adoption once a month. With it: recurrence monthly; HTTP with Microsoft Entra ID, GET https://graph.microsoft.com/v1.0/copilot/reports/getMicrosoft365CopilotUsageUserDetail(period='D28',version='v2') (the account needs a reports role such as Reports Reader; the answer is CSV) and GET https://graph.microsoft.com/v1.0/subscribedSkus; then create an item in UsagePoint_Snapshots with the date, seats owned and assigned, active people and adoption rate. Leave the department column empty: department figures come from the web part, which hides small groups.
Not in Release 1
Copilot credits sync. Microsoft's Copilot Cost Management API is in beta, mostly delegated-only, and cannot list users. Import Microsoft's Copilot Credits report on Spend instead.
Agent use per person. It lives in Microsoft Purview audit records, which need broad audit permissions and an audit role. Planned for a later release as an optional flow.