What Bilanc reports
Deployment Frequency
Lead Time for Changes
Change Failure Rate
Time to Restore Service
- Merge to Deploy – merge to running in production. The part of lead time that happens after the PR is done.
- Merge Queue Time – entering a GitHub merge queue to merged.
- Deployment Success Rate – share of production deploy runs that succeeded.
- PRs per Deployment – how many pull requests each deployment carried.
How Bilanc detects a production deployment
Bilanc looks for production deployments per repository, using the first signal in this list that the repository emits:Bitbucket Deployments
Published releases
Production deploy workflow runs
Merge to the default branch
merge_to_default.deployment_source label (bitbucket_deployment, github_release, workflow_run or merge_to_default) so you can always see which rule applied, and group or filter by it. You can override any of this per repository, see Rules.
How Bilanc reads your branching model
“Merge to the default branch” is only right for repositories that ship from trunk. Bilanc looks at a year of merged pull requests per repository and works out which branches are production and which are integration branches, then uses that everywhere below. The Repositories tab of the Rules page shows what was detected, with the evidence, and lets you override it.production_branches rule fixes it permanently.
How a pull request gets a deploy time
A pull request merged into a production branch is assumed to ship with the next production deployment of its repository after it merged (itself, under merge-to-default). A pull request merged into an integration branch (dev, develop, release/1.2) ships when that branch is next promoted into production, and then with the promotion’s own deployment; if the repository has not promoted by pull request in the last 180 days, it ships with the next deployment instead. That is what Merge to Deploy and Lead Time for Changes measure.
Pull requests merged before Bilanc can see any deployment for that repository are left without a deploy time rather than attributed to a later deployment, so a repository’s first tracked release does not inflate its lead time.
Pull requests without a deploy time
Every merged pull request carries adeployment_attribution_status in Data Explorer and Data Studio, and the DORA dashboard shows the share of merged pull requests with a deploy time. The reasons a PR has none:
dev → main) with a PR exclusion rule removes it from Bilanc entirely, so it can no longer serve as the deployment event for the pull requests it carried. Prefer leaving promotions in and filtering on is_promotion_pr in Data Explorer.Metric definitions
How confident should I be in each number?
Each card on the DORA dashboard carries one of three labels, computed from your data, and the same logic applies to the API:Performance bands
The dashboard colours each of the four metrics with the band from the 2023 State of DevOps report. They are indicative: a repository on merge-to-default will look Elite on frequency by construction, so read the band together with the confidence label.Change Failure Rate and Time to Restore: how the proxies work
DORA defines a failed change as a deployment that degrades service and needs remediation. Bilanc has no direct view of your production health, so it infers failures from the signals it does have. A deployment counts as a failed change when any of these is true:- The deploy run itself failed. Only possible for the
workflow_runsource.failure_reason = failed_deployment. - An incident opened within 48 hours and this was the most recent deployment before it (Incident.io connected).
failure_reason = incident. - A revert names a change it shipped. A GitHub-style
Revert "…"pull request whose title names a pull request that shipped in this deployment, within 30 days.failure_reason = revert_pr. - A revert, hotfix or rollback landed shortly after. Any other PR with revert, hotfix or rollback in its title or branch, merged to the same repository within 48 hours, attributed only to the single most recent deployment before it.
failure_reason = revert_prorhotfix_pr.
deployments table also carries remediation_merged_at, so you can split Time to Restore into time-to-notice (deployed → fix merged) and time-to-ship-the-fix (fix merged → fix deployed) in Data Explorer. A revert that lands before the reverted change ever reached production is not counted as a failure.
Getting accurate numbers
Work through this list in order. Each step improves the metrics above it.Connect version control (required)
Connect CI/CD
Publish releases, or name your production deploy workflows clearly
Check what Bilanc detected, accept its suggestions
Connect Incident.io (beta)
If you deploy with a tool Bilanc cannot see yet
ArgoCD, Spinnaker, Flux, Harness, Octopus, Vercel, Netlify and similar tools promote to production inside themselves, and Bilanc only sees what reaches your version control system or CI. Until native integrations land (below), the fastest way to get measured numbers is to leave a trace where Bilanc looks:Where to see them
- DORA Metrics dashboard in the Bilanc app. The strip at the top shows the mix of deployment sources, the share of merged pull requests with a deploy time and whether incidents are connected; each card carries its Measured / Partial / Proxy label and performance band; the Repositories, Teams and Sources tabs break every metric down; the deployments explorer lists each deployment with the pull requests it carried and why it counted as a failure.
- Rules page (Admin tools → Rules), Repositories tab: what Bilanc detected per repository, with confidence and evidence, and the rules and suggestions that change it.
- Data Explorer and Data Studio, on the
pull_requeststable (deployed_at,deployment_source,deployment_attribution_status,branching_model,is_production_merge,is_promotion_pr,merge_to_deploy,lead_time_for_changes,open_to_deploy,queue_time) and thedeploymentstable (one row per deployment, withstatus,workflow_name,is_failed_change,failure_reason,failure_detected_at,remediation_merged_at,restored_atand the pull requests it carried). - Metrics API, see Deployment & DORA Metrics.
FAQ
Why is my lead time so much higher than my pipeline time?
Why is my lead time so much higher than my pipeline time?
Why does a repository show merge_to_default?
Why does a repository show merge_to_default?
deploy_workflow_include rule naming the workflow.A repository used to show releases and now shows merge_to_default
A repository used to show releases and now shows merge_to_default
deployment_source rule.Why is the median so different from the average?
Why is the median so different from the average?
-p50 metrics) for that reason; the API offers both. When they disagree a lot, look at the distribution by repository in the Repositories tab.Bilanc got my production branch wrong
Bilanc got my production branch wrong
production_branches rule replaces the inference for that repository from the next refresh. Common cases: gitflow repositories that promote develop into main outside pull requests, repositories whose production branch is release, k8s-main or staging, and infrastructure repositories that should be ignored (deployment_source = ignore).Why are Change Failure Rate and Time to Restore 0?
Why are Change Failure Rate and Time to Restore 0?
merge_to_default never has a failed deploy run), and Incident.io is connected if you run incidents there. Time to Restore also stays empty until a failed change has actually been restored.We deploy with ArgoCD, Spinnaker or Vercel. Will it work?
We deploy with ArgoCD, Spinnaker or Vercel. Will it work?
Which aggregation should I use for the time metrics?
Which aggregation should I use for the time metrics?
-p50 metrics (lead-time-for-changes-p50, merge-to-deploy-p50, time-to-restore-p50) for a headline figure; they take no aggregation parameter. The base metrics accept AVG, MIN, MAX and SUM when you need them.
