A dashboard widget for Azure DevOps that displays the result of an
Analytics OData $count (or aggregate) query as a single large
number with color thresholds (green / amber / red) — and lets you
drill into the underlying rows with one click.
Think Query Tile, but driven by any OData query you can write — no need to maintain a saved Work Items query for every counter.
Features
- Big-number tile styled to match the built-in Azure DevOps Query Tile widget (small label on top, large centered count below).
- Color thresholds — set an amber and red numeric threshold; the whole tile turns solid amber or red when the value crosses them.
- Click-through drill-down — clicking the tile opens a new tab with
the same query without
/$count, fetched with the user's own token, and rendered as a sortable HTML table. - Smart View — the drill-down recognises common ADO Analytics
entities (
WorkItems,WorkItemRevisions,WorkItemSnapshot,WorkItemBoardSnapshot,Iterations,Areas,Users,Teams) and renders only the columns that matter, with clickable work item IDs, colored State and Type pills, relative "Changed" timestamps, and last-segment iteration / area paths. A row-expander (▸) reveals the full record. Unknown entities fall back to a cleaned-up universal view (drops all-null and GUID-only*SKcolumns, promotes Id/Title/ Name/State to the front). Queries using$apply=aggregate(...)/groupby(...)are auto-detected and metric columns are highlighted. - Three view modes — toggle between Smart, All columns, and Raw JSON at the top of the drill-down. Your preference is remembered across queries.
- Live preview in the configuration pane — shows the prettified
drill-down URL (each
¶m=andandclause on its own line) so you can see what users will land on before saving. - Runtime date tokens — use
{Today}or{TodayMinusN}inside the OData URL for rolling date cutoffs. The widget converts them to UTC ISO timestamps at refresh time before sending the request. - Configurable label — short text shown above the number on the tile itself (e.g. "Open bugs in current sprint").
- Configurable widget title — the Azure DevOps host renders the widget's title in the dashboard chrome above the tile.
- Resizable — supports 1×1, 1×2, and 2×2 dashboard cells.
- Security-scoped — every query is sent with the signed-in user's Azure DevOps access token, so all project, area-path, and Analytics permissions apply automatically.
- Endpoint allowlist — only
https://analytics.dev.azure.com/URLs are accepted, hard-coded in the widget for safety.
How to use
1. Add the widget to a dashboard
- On any team dashboard, click Edit → Add a widget.
- Search for OData Counter and add it.
2. Configure it
Open the widget's ⋯ menu → Configure. You will see:
| Field | What it does |
|---|---|
| Title (host-provided, top of the pane) | Shown by Azure DevOps as the widget's title in the dashboard. |
| Label | Short text shown inside the tile, above the number. |
| OData URL | The Analytics URL that returns a number. Must point to https://analytics.dev.azure.com/. |
| Click-through preview (read-only) | Live preview of the URL the tile will open when clicked — same query without /$count, pretty-formatted. |
| Amber threshold | Value ≥ this → tile turns solid amber. |
| Red threshold | Value ≥ this → tile turns solid red. |
3. Save and use
- The tile shows the count, refreshes when the dashboard refreshes.
- Hover the tile → tooltip "Click to view the underlying rows".
- Click → a new tab opens with the rows behind that number. By default you get the Smart View — a curated, sortable table tailored to the entity you queried (work-item IDs link straight to the work item, states and types are colored, dates show as relative time). Use the All columns toggle to see every field returned, or Raw JSON to inspect the response. Click the ▸ at the start of any Smart View row to expand the full record inline.
Example OData URLs
Simple count of active PBIs
https://analytics.dev.azure.com/{org}/{project}/_odata/v3.0-preview/WorkItems/$count?$filter=WorkItemType eq 'Product Backlog Item' and State eq 'Active'
Open PBIs in a sprint where every child Task is Done (useful "ready to close" counter)
https://analytics.dev.azure.com/{org}/{project}/_odata/v3.0-preview/WorkItems/$count?$filter=WorkItemType eq 'Product Backlog Item' and State ne 'Done' and startswith(Iteration/IterationPath,'{project}\Sprint 54') and Descendants/any(d: d/WorkItemType eq 'Task') and not Descendants/any(d: d/WorkItemType eq 'Task' and d/State ne 'Done')
Aggregate alternative — if you prefer to use $apply:
https://analytics.dev.azure.com/{org}/{project}/_odata/v3.0-preview/WorkItems?$apply=filter(WorkItemType eq 'Bug' and State eq 'Active')/aggregate($count as Total)
The widget supports both forms — it parses a plain integer (from
/$count) and the value[0] shape returned by aggregate.
Rolling date token — active Tasks that have been in Active for at
least 3 days:
https://analytics.dev.azure.com/{org}/{project}/_odata/v3.0-preview/WorkItems/$count?$filter=WorkItemType eq 'Task' and State eq 'Active' and StateChangeDate le {TodayMinus3}
On each refresh, {TodayMinus3} is replaced with a concrete UTC ISO
timestamp such as 2026-05-09T00:00:00Z.
Tip: to discover OData paths and field names, browse
https://analytics.dev.azure.com/{org}/{project}/_odata/v3.0-preview/$metadatain your browser.
Permissions
The widget requests these scopes:
vso.work— read work itemsvso.analytics— read Analytics data
All queries run as the signed-in user, so users only see counts of work items they would normally be able to see in the project.
Pricing
Free.
Support
For questions, bug reports, or feature requests, contact [email protected].
Privacy Policy
Publisher: Agilist IT Ltd
This extension does not collect, transmit, or store any personal data. All processing happens locally in the user's browser.
- The widget calls the Azure DevOps Analytics OData endpoint of the organization where it is installed, using the signed-in user's identity. Query results are displayed only to that user.
- Widget configuration (OData URL, label, thresholds) is stored by Azure DevOps as part of the dashboard configuration. The publisher has no access to it.
- The drill-down viewer stores a single UI preference
(
smart/all/raw) in the browser'slocalStorage. - The extension does not use cookies, analytics, telemetry, or any third-party services.
- Required scopes:
vso.work,vso.analytics(read-only).
Questions about privacy: [email protected].
Source code
The source code is not publicly available at this time. We plan to publish it on GitHub in a future release.
License
Distributed under the MIT License — see the License tab on this page. The software is provided "as is", without warranty of any kind, express or implied. Use at your own risk.