ADO Deployment Frequency Tracker
Triggered on Azure DevOps release pipeline completion. Logs each deployment event to a Dataverse table capturing environment, pipeline name, duration, status, and deployer. Monthly flow aggregates deployment frequency, lead time, and failure rate — the core DORA metrics — and emails an executive summary.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
A daily polling flow that tracks Azure DevOps pipeline deployments and calculates DORA metrics. Each day at 8:00 AM EST, the flow queries all ADO pipelines via the Azure DevOps connector, identifies runs from the last 24 hours, and logs each deployment event to a Dataverse table capturing environment, pipeline name, duration, status, and deployer. On the 1st of each month, the flow also aggregates the last 30 days of deployment data to compute Deployment Frequency, Average Lead Time, and Change Failure Rate — the three core DORA metrics — and emails a styled executive summary with DORA-level classifications (Elite/High/Medium/Low).
Connector-first design: This flow uses the Azure DevOps connector's HttpRequest operation for all ADO API calls (pipeline listing and run history), Dataverse CreateRecord/ListRecords for event logging and aggregation, and Outlook SendEmailV2 for both daily and monthly reports. No inline fixtures or HTTP built-in actions.
Use Case
Engineering leaders and platform owners rely on DORA four-key metrics to measure software delivery performance. Deployment Frequency is the most visible leading indicator of delivery health. This flow delivers a daily deployment log plus a monthly executive digest — suitable for leadership reviews, retrospectives, sprint planning, and quarterly OKR scoring. The Dataverse event log also serves as a foundation for Power BI dashboards.
The flow is ideal for teams that:
- Leadership reviews and quarterly OKR scoring
- Engineering retrospectives and sprint planning
- Platform owners measuring delivery performance against DORA benchmarks
- Teams building Power BI dashboards on top of a deployment event log
Flow Architecture
Recurrence Daily
RecurrenceFires daily at 08:00 EST.
Init varAdoAccount
InitializeVariable`varAdoAccount` ← `flowlibs_ADOAccount` env var (Azure DevOps organization name).
Init varAdoProject
InitializeVariable`varAdoProject` ← `flowlibs_AdoProject` env var (Azure DevOps project name).
Init varAdminEmail
InitializeVariable`varAdminEmail` ← `flowlibs_AdminEmail` env var (recipient for daily + monthly reports).
Init varDeployTableName
InitializeVariable`varDeployTableName` ← `flowlibs_DeploymentEventTableName` env var (Dataverse table logical name).
Init varNewDeployCount
InitializeVariableWorking integer counter for new deployments, starts at 0.
Init varReportHtml
InitializeVariableWorking string variable that accumulates HTML table rows for the daily summary email.
Get Recent Pipeline Runs
Azure DevOps HttpRequestGET `{project}/_apis/pipelines?api-version=7.0` — lists all pipelines in the configured ADO project.
Parse Pipelines List
ParseJsonParse the pipeline list response and extract pipeline IDs and names for iteration.
For Each Pipeline
ForeachFor each pipeline: fetch its run history, parse runs, filter to the last 24 hours, and for each recent run compute duration, log a Dataverse deployment event, increment the new-deploy counter, and append an HTML row to the daily summary buffer. Inner steps: Get Pipeline Runs (`GET {project}/_apis/pipelines/{id}/runs?api-version=7.0&$top=10`), ParseJson on the runs, Filter Array on `createdDate >= addDays(utcNow(), -1)`, nested Foreach over recent runs → Compute Duration (Compose `div(sub(ticks(finished), ticks(created)), 600000000)`), Dataverse `CreateRecord` into `flowlibs_adodeploymentevents`, IncrementVariable on `varNewDeployCount`, and AppendToStringVariable on `varReportHtml`.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_ADOAccount | String | <configure> | Azure DevOps organization name (not URL). Set to your ADO org slug, e.g. the value in `https://dev.azure.com/<org>`. |
| flowlibs_AdoProject | String | FlowLibs | Azure DevOps project name that owns the pipelines you want to track. |
| flowlibs_AdminEmail | String | you@yourcompany.com | Recipient address for the daily deployment summary and the monthly DORA executive report. |
| flowlibs_AdminNotificationEmail | String | admin@contoso.com | Secondary notification email used for operational alerts. |
| flowlibs_DeploymentEventTableName | String | flowlibs_adodeploymentevents | Logical name of the Dataverse table that stores deployment events. Must have columns: flowlibs_name, flowlibs_pipelinename, flowlibs_deploystatus, flowlibs_environment, flowlibs_durationminutes, flowlibs_deploydate, flowlibs_releasename, flowlibs_deployer. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Azure DevOps | shared_visualstudioteamservices | HttpRequest (GET pipelines list and per-pipeline runs) |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord (Log each deployment event) ListRecords (Query last 30 days for the monthly DORA aggregation) |
| Office 365 Outlook | shared_office365 | SendEmailV2 (Daily summary + monthly DORA executive report) |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Change the ADO organization and project
- Update the flowlibs_ADOAccount and flowlibs_AdoProject environment variable values to point at your Azure DevOps organization and project. The flow uses these via Initialize Variables bound to the env var parameters, so no expression edits are needed.
- Add more DORA metrics
- The current flow tracks Deployment Frequency, Lead Time (via duration), and Change Failure Rate. To add Mean Time to Recovery (MTTR), add a Filter Array after the monthly query that isolates consecutive failed→succeeded pairs, compute the time delta between them, and average the result.
- Customize the DORA classification thresholds
- The monthly report uses industry-standard DORA thresholds (e.g., >30 deployments/month = Elite, <5% failure rate = Elite). To adjust, edit the if() expressions inside the Compose_DORA_Email_Body action.
- Change the schedule
- The trigger fires daily at 08:00 EST. To change frequency, modify the Recurrence trigger's frequency, interval, and schedule properties. The monthly DORA report is gated by the Check Monthly DORA Report condition (formatDateTime(utcNow(), 'dd') == '01').
- Use a different Dataverse table
- Update the flowlibs_DeploymentEventTableName env var value and ensure the target table has matching columns: flowlibs_name, flowlibs_pipelinename, flowlibs_deploystatus, flowlibs_environment, flowlibs_durationminutes, flowlibs_deploydate, flowlibs_releasename, flowlibs_deployer.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Duration (minutes)
Converts the ticks delta between pipeline finish and create timestamps into minutes (600000000 ticks per minute).
EXPR.02Last 24h filter
Filter Array predicate that keeps only pipeline runs created in the last 24 hours.
EXPR.03Monthly check
Condition that fires the DORA monthly report only on the first day of the month.
EXPR.04Failure rate
Computes the Change Failure Rate as a percentage; uses `float()` to avoid integer truncation.
EXPR.05DORA frequency level
Maps total monthly deployments to a DORA performance band.
EXPR.06DORA lead time level
Maps average deployment duration (minutes) to a DORA lead-time band.
EXPR.07DORA failure level
Maps the change failure rate percentage to a DORA failure-rate band.
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.