How to inventory an entire Microsoft 365 tenant's Power Platform estate in an afternoon
Every environment, every Power App, every Power Automate flow, every connection — the estate is all there, spread across four admin APIs that each refuse to describe the whole. Here is how to bring it into one list, and what to do about the parts Microsoft will not tell you.

Ask a Power Platform administrator how many apps their tenant has and you will get a number. Ask again a week later and you will get a different number, from a different export, produced by a different script. The estate is knowable — none of it is hidden — but Microsoft exposes it through four separate admin surfaces, each of which describes a slice and none of which describes the whole.
The four places the estate lives
- Business Application Platform (BAP) lists environments: their type, region, Dataverse status and who created them. It knows nothing about what is inside them.
- PowerApps admin API lists canvas apps per environment, with owner, connections and sharing. It does not know about model-driven apps, which live in Dataverse.
- Flow admin API lists cloud flows per environment with state and trigger — but the V2 listing omits the definition, so connectors and action counts need a second read per flow. Desktop flows are not there at all.
- Dataverse Web API, one endpoint per environment, holds solutions, tables, connection references, model-driven apps, desktop flows and the real owner of every solution-aware flow.
Each API paginates. Each throttles. Each authenticates against a different resource. A complete inventory is therefore not one query; it is several hundred, in the right order, with the identifiers from one used to join the results of another.
What you need to sign in with
Tenant-wide results need a Power Platform Administrator, Dynamics 365 Administrator or Global Administrator account. Anything less returns only the environments the account personally belongs to, silently — the API does not say it is filtering, it simply lists fewer rows. Solutions, tables and connection references additionally need a security role inside each environment's Dataverse database; being a tenant admin does not grant one.
The joins that make it an inventory rather than four lists
- 1Owners. The apps and flows APIs return an object id, not a name. Resolve them in one batch through Microsoft Graph; an id Graph cannot resolve is almost always a deleted account, and is worth flagging as such rather than left blank.
- 2Solution membership. Neither the apps nor the flows API says which solution an object belongs to. That lives in Dataverse's
solutioncomponentstable, keyed by ids that do not quite match the ones the other APIs use — a cloud flow's Flow API name is Dataverse'sworkflowidunique, not itsworkflowid. - 3Connections to consumers. A canvas app's connection map names the connection; the environment's connection list has its status and owner. Join them, and you can say which apps run on a leaver's personal credentials.
- 4Desktop flows. Read
workflowswherecategory eq 6and fold them into the flow list, marked as desktop, or your Power Automate count is wrong by however many bots the finance team has built.
Why a stored assessment beats a live query
On a real tenant the full walk takes minutes and several thousand API calls. Doing it on every page load is neither fast nor polite to Microsoft's throttling limits. The pattern that works is one assessment per tenant, stored, refreshed on demand: every page afterwards reads from storage in milliseconds, the numbers on Monday's report are the numbers in Friday's meeting, and a refresh is a deliberate act with a timestamp on it.
What the afternoon looks like
With the joins in place, the order of work is: environments first; then apps, flows, connections and connectors per environment in parallel; then the Dataverse slices where a database exists; then owner resolution in one Graph batch; then solution membership; then the per-flow definition reads. Store the result, build the summary from the stored result, and export from storage. That is an afternoon the first time and a click every time after.
Questions
- Do I need to install anything in the tenant to inventory it?
- No. Everything above is read through Microsoft's admin APIs with delegated permissions from an administrator account. Nothing is deployed into any environment.
- Why is my flow count different in the Power Platform admin center?
- The admin center counts cloud flows per environment and excludes desktop flows and, in some views, flows in a suspended state. A full inventory includes both and labels them.
Keep reading

Premium connector exposure: how to find out what your Power Platform licences actually cover
A licence review starts with one question the admin center does not answer directly: which apps and flows use premium connectors, who runs them, and in which environments? Here is how to build the list, and the three exposures that appear in almost every tenant.

Environment sprawl in Microsoft 365: default, developer, Teams and trial environments explained for governance leads
Thirty-seven environments. Nobody created most of them on purpose. This is what each type is, how it came to exist, and what a governance lead should ask about it — with the one policy change that stops the count growing.

The Power Platform Center of Excellence Starter Kit and Power Insights: what each does best
Microsoft's CoE Starter Kit is the reference toolkit for a Power Platform Center of Excellence, and many tenants run it well. Power Insights covers some of the same ground and none of some of it. This is a plain account of which does what, written for the administrator who has to decide whether they need one, the other, or both.