Automate SaaS license reclamation for inactive seats
Stepwork reads each seat's last active date in every app's admin console, warns inactive users, and reclaims their seats on a schedule, with a record of every seat removed.
- Use case
- Reclaiming unused SaaS seats across admin consolesIT
- Best for
- IT Manager, SaaS Operations Lead, FP&A Manager
- Applications used
Zylo
Zoom
Figma
Microsoft 365
ChatGPT Enterprise
- Business outcome
- Seats that go back before the renewal, not after
The problem
Every renewal starts with a guess at how many seats are used
- Sign in to each admin console and export the user list
- Sort by last active date and guess who still needs a seat
- Message each inactive user and wait to hear back
- Downgrade or remove seats one admin console at a time
- Rebuild the seat count by hand before every renewal
- Find leavers still holding AI tool seats months later
Triage
However reclamation starts, it runs the right procedure
Seat questions show up as renewal alerts, finance messages, leaver lists, and invoices. Stepwork reads each one and starts the procedure that answers it.
ZyloRenewal alertUpcoming renewal · Zoom Workplace Licenses: 250 · Notice by: Jan 2 Owner: ITGoes to Pre-renewal usage
SlackFinance messagefigma renews in march and the quote says 140 editors. do we really have 140 people designing?Goes to Pre-renewal usage
SlackChat messageare we still paying for adobe for the people who moved off the video team? nobody's opened premiere in monthsGoes to Weekly seat reclamation
OktaLeaver listDeactivated this month · 9 users Includes: d.osei, k.wright, p.lambertGoes to AI tool seats
OutlookInvoice emailGitHub · Receipt Copilot Business · 85 seats Period: Nov 1 – Nov 30Goes to AI tool seats
Systems
Usage from the screens your integrations don't read
Your SaaS management tool knows what you pay for and when it renews. Usage only shows up where its integrations reach. Stepwork reads seat types and last active dates from each app's admin console with a login your team grants, and makes the change there too.
- SaaS management: Zylo, Productiv, Torii
- Admin consoles where seats come back: Zoom, Figma, Microsoft 365, Google Workspace, Adobe Creative Cloud, Miro, Atlassian, Dropbox
- AI and developer tools: ChatGPT Enterprise, Cursor, GitHub
- Identity and HR: Okta, Microsoft Entra ID, Workday, BambooHR
- Where the results go: Slack, Microsoft Teams, Excel
Example procedures
Three ways seats come back, card by card
One reclaims inactive seats every week, one keeps AI tool seats matched to the people using them, and one sizes each renewal on real usage before the notice date. Swap in Teams, your identity provider, or Torii above each one and the steps stay the same.
Weekly inactive-seat reclamation across every admin console
Excel
Zoom
Figma
Adobe Creative Cloud
Slack
Step by step
- The reclamation list comes inStepwork reads the list IT and Finance keep in Excel: each app, how many days without activity counts as inactive, how long the grace period is, and what a seat costs a month. Each row is one pass through the loop.
- Each admin console gets readInside the solid frame, Stepwork signs in to the app's admin console and reads every paid seat with its type and last active date, including apps your SaaS management tool has no integration for.Repeats: For each app on the list · 15 apps
- The rule checks the thresholdIf any seat's last activity is older than the app's threshold, the run takes the top path. If every seat is active, every seat is kept and nothing changes in the app.
- If any are inactiveWarn newly inactive users in Slack
- If every seat is activeAdd up seats reclaimed and monthly savings
Repeats: For each app on the list · 15 apps - Inactive users hear firstOnly on the top path: each user who just went past the threshold gets a message in Slack saying the seat goes back after the grace period unless they use it.Only on this path: If any are inactiveRepeats: For each app on the list · 15 apps
- Seats past the grace period go backSeats warned in an earlier run that are still inactive get downgraded or removed with the flow recorded for that app, like a Zoom license to Basic or a Figma editor to viewer. Anyone who came back keeps their seat.Only on this path: If any are inactiveRepeats: For each app on the list · 15 apps
- The savings get added upBoth paths meet here. After the last app, the Summary card counts the seats reclaimed in each app and multiplies them by that app's monthly seat cost.
- IT and Finance see itThe totals go to the IT and Finance channel in Slack, with each seat listed, so the savings match what changed in each app.
Field map
| From | To |
|---|---|
AI tool seat governance across ChatGPT Enterprise, Cursor, and GitHub Copilot
Okta
ChatGPT Enterprise
Cursor
GitHub
Slack
Step by step
- Stepwork reads who is activeIt reads every active user from Okta once, so each AI tool's seats are matched against the same list.
- Each AI tool gets readInside the solid frame, Stepwork signs in to the tool's admin settings and reads every seat with its last active date. In Cursor it reads each member's spend too, and for Copilot it reads the seats in GitHub's billing settings.Repeats: For each AI tool · 3 tools
- The rule matches seats to peopleIf any seat belongs to someone who isn't active in Okta, or hasn't been used in 30 days, the run takes the top path. If every seat is in use, they all stay.
- If any left or went idleRemove those seats in the tool's admin settings
- If every seat is in useList each seat removed and why
Repeats: For each AI tool · 3 tools - Idle seats come backOnly on the top path: the recorded flow removes those seats in the tool's admin settings, the same way an admin would, so each one is free for the next person who needs it.Only on this path: If any left or went idleRepeats: For each AI tool · 3 tools
- The month gets listedBoth paths meet here. After the last tool, the Summary card lists each seat removed, by tool and person, and whether it was a leaver or an idle seat.
- IT and Finance see itThe list goes to IT and Finance in Slack, so a team lead who needs a seat back can say so in the thread.
Field map
| From | To |
|---|---|
Pre-renewal usage evidence for every renewal coming up in Zylo
Zylo
Zoom
Microsoft 365
Atlassian
Slack
Step by step
- The renewals come inStepwork reads each renewal in Zylo with a notice date in the next 90 days: the app, the seats on the contract, the notice date, and the owner. Each renewal is one pass through the loop.
- Usage comes from the app itselfInside the dashed frame, Stepwork signs in to the app's admin console and reads how many seats are assigned and how many were used in the last 90 days, even where Zylo has no usage integration for that app.Repeats: For each renewal before its notice date · 5 renewals
- The right-size number gets worked outThe Script card compares the seats on the contract with the seats actually used and works out the count to renew, with the same math for every app.Repeats: For each renewal before its notice date · 5 renewals
- The owner gets the numberThe renewal owner gets a message in Slack with the seats paid for, the seats in use, the right-size number, and the notice date to act by.Repeats: For each renewal before its notice date · 5 renewals
- The week's renewals get listedAfter the last renewal, the Summary card lists every app sized this week and how many seats each one could drop.
Field map
| From | To |
|---|---|
Flows
The seat flows these procedures are built from
Each flow is one recorded check or change in one app. Procedures run them on a schedule, and any of them can also run on its own from a request.
- Zoom
Downgrade licensed user to basic
Changes a user's Zoom license from licensed to basic, reclaiming the paid seat. - Figma
Downgrade editor to viewer
Changes a member's seat from editor to viewer in Figma admin, reclaiming the paid seat. - Microsoft 365
Remove license and convert mailbox to shared
Converts a departed user's mailbox to a shared mailbox and removes their paid license in the admin center. - Slack
Deactivate expired guest accounts
Reviews guest accounts against their intended end dates and deactivates those past expiry. - Zylo
Extract license utilization for renewal prep
Extracts seat assignment, active usage, and engagement for the named app ahead of its renewal negotiation. - Productiv
Extract reclaimable licenses report
Extracts licenses with no meaningful engagement in the window, with reclaimable counts and annualized value. - Adobe Creative Cloud
Extract users with unused licenses
Extracts license holders with no product activity in 60 days from admin reports. - Adobe Creative Cloud
Remove license from user
Removes a Creative Cloud license assignment in the Adobe admin console, freeing the seat. - Miro
Downgrade member to free-restricted
Changes a member from a full license to a free-restricted seat in Miro admin. - ChatGPT Enterprise
Extract seat usage
Extracts workspace members with last-active dates from admin settings. - ChatGPT Enterprise
Remove member from workspace
Removes a departing member from the ChatGPT Enterprise workspace, freeing the seat. - Cursor
Extract seat usage with spend
Extracts team members with usage and spend data from Cursor admin settings. - Cursor
Remove member
Removes a departing member from the Cursor team, freeing the seat. - GitHub
Extract Copilot seat activity
Extracts Copilot seat assignments with last-activity dates from org billing settings. - GitHub
Remove Copilot seat
Removes a user's GitHub Copilot seat assignment, stopping the per-seat charge. - Dropbox
Extract member activity and storage
Extracts members with storage used and last-activity dates into a table.
More procedures
More license procedures
Ready-made procedures in the Marketplace for utilization reports, reclamation drives, and seat reviews by team.
- Zylo · Productiv · Slack
Quarterly license reclamation drive
Quarterly, extracts underutilized licenses from Zylo and reclaimable seats from Productiv, sends each app owner their reclamation candidates with usage evidence, and compiles confirmed reclamations into a savings report for the renewal file. 2 more
Google Workspace · Microsoft 365 · Atlassian + 2 moreMonthly license utilization report
Extracts license usage from Google Workspace, Microsoft 365, Atlassian, Zoom, and Adobe on the first of the month, consolidates seats-owned versus seats-active per platform, and posts the utilization table with waste estimates to the IT leadership channel.- Figma · Miro · Slack
Design tool seat optimization
Quarterly, extracts Figma editor usage and Miro member activity, confirms downgrades with design leads, and converts inactive editors to viewers and dormant members to free-restricted with savings totals. - GitHub · Slack
Copilot seat optimization cycle
Extracts Copilot seat activity monthly, confirms dormant seats with engineering leads in Slack, and removes approved unused seats with the savings noted.
Why Stepwork
Every seat it removes traces back to a run
SaaS management tools see usage where their integrations reach. Stepwork is a deterministic agent platform: it signs in to each admin console, reads last active dates from the screens, and runs the steps you recorded the same way every week. Every run records which seats were read, who was warned, which seats were removed, and when. Credentials stay in your vault, and a seat only changes when a procedure's rule says it should.
FAQ
Common questions
The math
What manual license reclamation costs IT and Finance
Example volumes for a team reviewing seats in 15 paid apps. Swap in yours.
| The manual task | Times a week | Minutes each | Hours a week |
|---|---|---|---|
| Export seats and last active dates from an app | 4 | 15 | 1 |
| Message an inactive user and track the reply | 15 | 4 | 1 |
| Downgrade or remove a seat in an admin console | 12 | 5 | 1 |
| Build a usage count for an upcoming renewal | 1 | 120 | 2 |
- Hours a week
- 5
- Hours a year
- 250
- Of one full-time person
- 13%
