A PowerShell script against the Microsoft Graph presence API is the free, do-it-yourself way to record Teams status history, and it fits a one-off answer. Presify is a maintained presence tracker that captures, stores, and reads that same presence for you, with roles, an audit trail, and retention built in.
A script is the natural first move for an admin: Microsoft Graph exposes a presence endpoint, so you can poll it on a schedule and write the results somewhere. A script is a genuinely good answer for some situations. The rest of this guide is an honest look at where it shines and where a maintained presence tracker like Presify earns its place.
What does a PowerShell presence script actually do?
A typical PowerShell presence script signs in to Graph and reads the presence of a set of users on an interval. The script appends each reading to a CSV or an HTML report, and with enough effort you can chart it, schedule it, and scope it to a group.
Graph can return the presence of many users in one request. A script that polls a whole team also has to handle Graph throttling, when Graph answers 429 Too Many Requests and asks the caller to wait.
The script's value and its limit are the same thing: it does exactly what you build, and nothing you do not build.
Side by side
PowerShell script DIY
Runs where you run it; misses samples if that machine is off.
Presify Maintained
One read-only Microsoft sign-in
AvailableAwayBusyOffline
Runs continuously as a managed service.
| Criterion | PowerShell script | Presify |
|---|---|---|
| Cost | Free to write | Paid subscription, with a free trial |
| Capture reliability | Runs where you run it; misses samples if that machine is off | Runs continuously as a managed service |
| Storage | You own the files | Stored, queryable history |
| Timelines and online time | You build the charts | Built in, per person and per team |
| Flags for presence that looks gamed | None unless you write the pattern analysis | Built in (one on Standard, all six on Pro and up) |
| Access control | None unless you build it | Role-based: owner on every plan; additional admins and scoped monitors on Pro and up |
| Audit trail | None unless you build it | Append-only audit log (viewable and exportable on Pro and up) |
| Retention and deletion | Manual | Plan-based retention, per-user and workspace-wide delete |
| Scoping | Easy to over-collect by accident | Guests never tracked, group scoping, and people whose directory location is set to the EEA, the UK, Switzerland, or Canada excluded automatically |
| Maintenance | Yours forever | Ours |
When the script is the right call
- You have a one-off question and a quick CSV answers it.
- You are comfortable in PowerShell and Graph, and you enjoy owning the plumbing.
- It is a small number of people and you do not need retention, roles, or an audit trail.
There is nothing wrong with the script in those cases. It is the cheapest path to a single answer.
When a maintained tracker earns its keep
- You need the history to be there later, captured reliably without babysitting a scheduled task.
- You want to know whether anyone's presence looks gamed. A mouse jiggler keeps Teams green. Surfacing presence that looks gamed takes pattern analysis across days (unbroken Available stretches, no idle time, status changes at unusually even intervals), not a CSV of samples.
- More than one person needs access, which means roles and an audit trail start to matter (additional admins, scoped monitors, and the viewable audit log are on Pro and up).
- You want presence turned into timelines and online-time trends without building the analysis yourself.
- You want to ask about it in plain language from the AI assistant you already use, with the same read-only permissions as the app.
- You care about doing this carefully: bounded retention, easy deletion, read-only scope, and not accidentally collecting the whole directory.
Past that line, the script's "you build everything" becomes a cost rather than a feature. A service that handles capture, storage, analysis, access, and retention then pays for itself.
All comparisonsWhat Presify is: a Microsoft Teams presence tracker
Presify reads Teams presence through the same Graph presence API on a short, regular interval and stores each change. Presify shows you who's online, when, and for how long, per person and per team. The same history shows the other side of the green dot too. Someone who always looks yellow might be doing their best work at 11pm, and the 24-hour day view shows those hours online.
On Pro and up, six automatic flags run, and each one shows how it’s calculated. Four (unbroken Available, no idle time, robotic regularity, no activity variation) are the patterns a mouse jiggler or keep-alive script tends to leave. Two (overnight presence, weekend uniformity) mark unusual hours that can just as easily be someone working late. Standard runs the Idle suppression flag; Basic and the free trial run none.
A flag is a pattern worth a look, not proof, which is the right posture whether you use a script or a tool.
Setup is one read-only Microsoft sign-in, about five minutes, with nothing installed on anyone's device. Presify is built and hosted in the US, tenant-isolated, and trims history automatically by plan. The people you track can be in most countries except the European Economic Area, the UK, Switzerland, and Canada. People whose Microsoft 365 directory location is set to one of those are excluded automatically.
Wherever your people are, tell them their Teams presence is tracked before you start, and handle any consent or lawful basis local law requires. Some US states require advance written notice, and Presify includes a ready-to-adapt employee-notice template.
A read-only connector built on the open Model Context Protocol (MCP) lets Claude, ChatGPT, Microsoft Copilot (through Copilot Studio), and other MCP clients answer questions in plain language. The connector is on every plan and covers presence history, online time, flags, and coverage; flag and coverage answers follow your plan. It sees only what the signed-in person can already see in Presify and can be revoked at any time. Connections are recorded in the audit log (viewable on Pro and up), and the AI assistants guide covers setup.

Setup takes about five minutes.
One read-only Microsoft sign-in by a Microsoft 365 admin, nothing installed on anyone’s device. Presence is sampled on a short, regular interval, and the history builds from the moment you connect.
- Minute 0An admin connects Microsoft
- Minute 2Pick who to track
- Minute 5The history starts building
- Day 7Your first full week to read
If the DIY script has stopped scaling, see how Presify works or start with one Microsoft sign-in. If you want the broader picture first, the guide to seeing Teams status history walks through every option.