Skip to main content
ETL

Identify Which Power Apps Are Using Dataverse

By 03/12/2025No Comments

1. Purpose

To provide repeatable steps for developers to identify:

  1. Which Power Apps in an environment use Dataverse.

  2. Which apps/flows depend on a specific Dataverse table.

This SOP covers:

  • UI-based checks (Power Apps & Dataverse)

  • PowerShell-based discovery

  • (Optional) Python + Dataverse Web API for deeper dependency mapping


2. Scope

Applies to:

  • Power Platform environments where Dataverse is used

  • Canvas apps and model-driven apps

  • Dataverse tables (standard & custom)


3. Prerequisites

3.1 Permissions

  • Environment Admin or System Admin or

  • Sufficient rights to:

    • View apps in the environment

    • View Dataverse tables and solutions

    • Call Dataverse Web API (for Python path)

3.2 Tools (per method)

For UI method

  • Browser access to:

    • https://make.powerapps.com

    • https://admin.powerplatform.microsoft.com

For PowerShell method

  • PowerShell 5+ or PowerShell Core

  • Ability to install modules:

    • Microsoft.PowerApps.Administration.PowerShell

    • Microsoft.PowerApps.PowerShell

For Python method (optional)

  • Python 3.9+

  • requests and msal libraries installed

  • An Azure AD app registered with API permissions to Dataverse


4. Procedure A – UI: Quick Check via Dataverse & Power Apps

Use this when you know the table name and just want to see what’s using it.

4.1 Identify Apps Using a Specific Table (Dataverse UI)

  1. Go to Power Apps Maker Portal

    • Open: https://make.powerapps.com

    • Select the correct environment in the top-right.

  2. Open Dataverse → Tables in the left navigation.

  3. Find and select the table of interest

    • Use the search bar if needed.

  4. In the table’s page, look for:

    • Related / Dependencies or “Uses this table” / “Dependent components” (exact label may vary slightly).

  5. Review the dependency list:

    • Canvas apps

    • Model-driven apps

    • Flows

    • Forms, views, business rules, etc.

  6. Capture the list:

    • Export to Excel (if possible) or

    • Screenshot / copy names into your documentation.

Outcome: You have a list of apps/flows that directly depend on that Dataverse table.


4.2 Identify Dataverse Usage Per App (Canvas Apps via UI)

Use this when you suspect a specific app is using Dataverse.

  1. In make.powerapps.com, go to Apps.

  2. Find the Canvas app → click the three dots (…) → Edit.

  3. In the left panel, open the Data pane (database icon).

  4. Review the Dataverse tables listed under “Data sources”.

Outcome: You confirm whether a particular app connects to Dataverse and which tables it uses.


5. Procedure B – PowerShell: List Apps Using Dataverse Connectors

Use this when you want an environment- or tenant-wide list of canvas apps that use Dataverse.

5.1 Install Required Modules (one-time)

Run in PowerShell:

Install-Module -Name Microsoft.PowerApps.Administration.PowerShell -Scope CurrentUser
Install-Module -Name Microsoft.PowerApps.PowerShell -Scope CurrentUser

5.2 Sign In

Add-PowerAppsAccount

Follow the interactive login.

5.3 Get All Apps Using Dataverse

# Get all apps (admin scope, cross environments)
$apps = Get-AdminPowerApp

# Filter apps that use Dataverse connectors

$appsUsingDataverse = $apps | Where-Object {
$_.Internal.properties.connectionReferences.Values.connectorId -like "*shared_commondataservice*" -or
$_.Internal.properties.connectionReferences.Values.connectorId -like "*shared_commondataserviceforapps*"
}
# Show key info
$appsUsingDataverse |
Select-Object DisplayName, AppName, EnvironmentName |
Sort-Object EnvironmentName, DisplayName

What this does:

  • Scans all apps.

  • Filters only those that have a Dataverse/CDS connector.

  • Displays app name + environment.

5.4 Inspect Connection References Per App (Optional Detail)

foreach ($app in $appsUsingDataverse)
    {Write-Host "App: $($app.DisplayName) ($($app.AppName)) in env $($app.EnvironmentName)"
     $app.Internal.properties.connectionReferences.GetEnumerator() | ForEach-Object {
Write-Host " ConnectionRef: $($_.Key) -> $($_.Value.connectorId)"
}
}

Outcome: You get a programmatic list of all canvas apps using Dataverse across environments.


6. Procedure C – Python + Dataverse Web API (Advanced Dependency Mapping)

Use this when you need a deeper, per-table dependency inventory, including model-driven app components, forms, views, etc.

6.1 One-time Setup

  1. Register an Azure AD app

    • Grant it application permissions to Dataverse (e.g. user_impersonation / Dataverse APIs via your environment’s “server-to-server” auth).

  2. Capture:

    • tenant_id

    • client_id

    • client_secret

    • org_url (Dataverse URL, e.g. https://org123456.crm6.dynamics.com)

  3. Install Python packages:

pip install requests msal

6.2 Script Template – Find Dependencies for a Table

Save as find_dataverse_dependencies.py and adjust the config.

import requests
from msal
import ConfidentialClientApplication
# ===== CONFIG =====
tenant_id = "YOUR_TENANT_ID"
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
org_url = "https://YOURORG.crm6.dynamics.com"
# Dataverse URL
scope = [f"{org_url}/.default"]
# Logical name of the table you want to inspect
table_logical_name = "new_customtable # e.g. "account", "contact", etc.
# ===== AUTH TOKEN =====
app = ConfidentialClientApplication(
client_id,
authority=f"https://login.microsoftonline.com/{tenant_id}",
client_credential=client_secret,
)
result = app.acquire_token_for_client(scopes=scope)
if "access_token" not in result:
     raise Exception(f"Failed to acquire token: {result}")
access_token = result["access_token"]
headers = {
"Authorization": f"Bearer {access_token}",
"OData-MaxVersion": "4.0",
"OData-Version": "4.0",
"Accept": "application/json",
}
# ===== STEP 1: GET TABLE METADATA (MetadataId) =====
url_table = f"{org_url}/api/data/v9.2/EntityDefinitions(LogicalName='{table_logical_name}')?$select=MetadataId,LogicalName"
resp = requests.get(url_table, headers=headers)
resp.raise_for_status()
table_meta = resp.json()
table_metadata_id = table_meta["MetadataId"]
print(f"Table: {table_meta['LogicalName']}")
print(f"MetadataId: {table_metadata_id}")
print("-" * 50)

# ===== STEP 2: QUERY DEPENDENCY RECORDS =====

# Note: You can refine filters and handle paging for large result sets.
url_dep = (
f"{org_url}/api/data/v9.2/dependencies?"
f"$select=dependencyid,dependentcomponentobjectid,requiredcomponentobjectid,"
f"requiredcomponenttype,dependentcomponenttype"
f"&$filter=requiredcomponentobjectid eq {table_metadata_id}"
)
resp_dep = requests.get(url_dep, headers=headers)
resp_dep.raise_for_status()
deps = resp_dep.json().get("value", [])
print(f"Found {len(deps)} dependency records.")
print()
for d in deps:
    print(
f"DependencyId: {d['dependencyid']}\n"
f" DependentComponentType:  {d['dependentcomponenttype']}\n"
f" DependentObjectId: {d['dependentcomponentobjectid']}\n"
f" RequiredComponentType: {d['requiredcomponenttype']}\n"
f" RequiredObjectId: {d['requiredcomponentobjectid']}\n"
)
# NOTE:
# dependentcomponenttype determines what table you should query next:
# e.g. model-driven apps, forms, views, etc.
# You can extend this script to resolve those IDs into human-readable names.

6.3 How Developers Use This

  1. Update the config section:

    • tenant_id, client_id, client_secret, org_url, table_logical_name.

  2. Run:

                  python find_dataverse_dependencies.py
  1. Use dependentcomponenttype + dependentcomponentobjectid to:

    • Look up corresponding rows in tables like appmodules, systemforms, savedqueries, etc.

    • Build a “dependency report” if needed.

Outcome: A detailed list of all Dataverse components that rely on a given table (including things not obvious in the UI).


7. Recommended Usage Pattern

For day-to-day tasks:

  1. Need a quick answer for a single table?
    → Use Procedure A (Dataverse UI dependencies).

  2. Need an inventory of apps using Dataverse in an environment/tenant?
    → Use Procedure B (PowerShell) and export results.

  3. Need a formal dependency report for governance / impact analysis?
    → Start with A + B, and if needed, extend with Procedure C (Python).