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 *SK columns, 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= and and clause 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
- On any team dashboard, click Edit → Add a widget.
- Search for OData Counter and add 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/$metadata
in your browser.
Permissions
The widget requests these scopes:
vso.work — read work items
vso.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
info@agilist.hr.
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's localStorage.
- The extension does not use cookies, analytics, telemetry, or any
third-party services.
- Required scopes:
vso.work, vso.analytics (read-only).
Questions about privacy: info@agilist.hr.
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.