AnyKanban

One board across several projects

A regulatory program rarely respects project boundaries. The same change lands in Claims Platform, Core Insurance and Digital Banking at once, and the person accountable for it needs one place to see all of it. Native Azure Boards cannot give them that place: a board belongs to one team, in one project, over one backlog level, so a portfolio spanning three projects has no board at all. A query has no such boundary, and AnyKanban makes the query the board.

This guide is for the process owner who runs such a program and the admin who sets the board up; it assumes you have read the Prerequisites and the User Guide.

The worked example

Twelve change requests, spread over three projects:

Project Items
Claims Platform Regulatory reporting: claims data extract, Straight-through payout below €500, Retire the fax intake channel, Photo-based damage assessment for motor claims
Core Insurance Repricing of commercial property after the 2025 flood season, Broker portal: quote validity extended to 30 days, Green energy endorsement for commercial policies, Unify customer identifiers across policy and claims
Digital Banking Regulatory reporting: settlement event feed, Instant payments: 10 second SLA on the retail channel, Sanctions screening on beneficiary name, Decommission the legacy batch clearing interface

All twelve are of type Change Request, which is not on any backlog. Three teams, one program, and, until now, three separate places to look.

One board over Change Requests from three projects

The demo has a second board built the same way, One regulatory program across three projects. Its query asks for the backlog items tagged dora in all three projects, so one program's work, DORA, sits on one board while each item stays on its own project's backlog.

Step 1: the query

Only one thing about it differs from a single-project board: it must be allowed to leave its project.

  1. In the query editor, turn on Query across projects. Without it, Azure DevOps scopes the query to the project it is saved in and you get one third of your board.
  2. Keep the query type Flat list of work items, the natural shape for a set of change requests. A tree or direct-links query loads too, flattened to the distinct items it returns; with a work item type configured, that type becomes the cards and items of other levels are counted, visibly, as the tree's structure. One difference to know: As of snapshots are not offered on a link-based query.
  3. Leave it without an ORDER BY, or end it with ORDER BY the order field the type derives, ascending, so the board, the List view and the query results page agree on one order. The board derives your process's own order field when the type carries it, otherwise the other platform field. Change Request in the demo carries no Backlog Priority, the order field of its Scrum-derived process, so with Stack Rank on the type it orders by Stack Rank, which is why the example below sorts by Stack Rank.
  4. Save it in Shared Queries, at the top level or one folder down, because the board's query dropdown reads only the first two levels of the query tree, so a query buried deeper will not appear in it.

The query for the example:

SELECT [System.Id]
  FROM WorkItems
 WHERE [System.WorkItemType] = 'Change Request'
   AND [System.TeamProject] IN ('Claims Platform', 'Core Insurance', 'Digital Banking')
 ORDER BY [Microsoft.VSTS.Common.StackRank] ASC

Screenshot pending: Query across projects, flat, ordered by the order field

Membership is now a contract: if an item matches, it is on the board.

Step 2: the board

Nothing in the board settings is specific to cross-project boards. You create the board in the project you run the program from, the host project, and that choice matters for the rest of this page.

  1. Open Boards → AnyKanban in the host project (Claims Platform here) and select New board, then Use existing query in the gallery that opens.
  2. Name it, pick the saved query under Backing query, and pick Change Request as the work item type.
  3. On the Fields tab, add Team Project (System.TeamProject) to the card fields. Where every card could come from anywhere, the project is the one piece of context the card cannot do without.
  4. Select Create.

Everything else is ordinary board configuration and applies to all three projects at once: a WIP limit of 4 on In Progress, a style rule Regulatory deadline coloring every card tagged regulatory, tag colors, a definition of done on every column, and In Review split into Doing / Done on a boolean field. Two of those behave differently once projects are mixed:

Where the columns come from

The host project's state model, and only that. The board reads the states of the configured work item type in the project the board lives in, orders them by state category (Proposed, In Progress, Resolved, Completed) and starts the board with one column per state. The example board gets New, Triage, In Progress, In Review, Done, taken from Change Request as Claims Platform sees it.

Items from the other two projects are placed by state name. As long as Digital Banking's Change Request also has a state called Triage, Sanctions screening on beneficiary name lands in Triage. The item's own project is never consulted. The same rule applies to everything else read once at load:

Read from the host project Consequence
The columns (the type's state model) Every card is placed by state name against this one list
Which states are in the Removed category An item in a removed state is hidden from the board, exactly like native boards, with a count above it, and the List view still shows it
Field display names and which fields are identity fields Card field labels and the native people picker
The work item type's color and icon The card header
Which order field the type derives in its own process Whether a card can be reordered here

Practical consequence: cross-project boards are comfortable when the projects share one inherited process, and fragile when they do not. If Core Insurance renamed Triage to Assessment on its own copy of the type, those items land in Unmapped.

When a state has nowhere to go

Items whose state is not among the board's columns are never dropped. They collect in an Unmapped column at the right, drawn as soon as the board holds one such item and kept even while the filter bar hides every card in it.

Unmapped holding a Core Insurance item in Assessment, a state the host project's type does not have

Unmapped is a diagnosis, not a workspace:

The List view is the honest one here: it renders the complete query result, removed-state and unmapped-state items included, in query order. When someone asks "is anything missing?", the List is where you answer.

When you cannot read every project

A cross-project board will meet this case, not might: the query spans three projects and a user has work item read permission in only two. The board loads, and the items that user cannot read are not on it. Azure DevOps leaves unreadable items out of the query result before the board receives it, so the board never learns they exist. The rest of the program is usable. Be clear-eyed about what that costs:

So: align read permissions with the board's audience. Everyone meant to steer the program needs read access to every project it spans, which is a governance decision rather than a board setting. Do not use a cross-project board as a control total; for "is everything accounted for", run the query itself as someone with full access. And where access genuinely cannot be granted, scope the board. A board per accessible scope is honest, and a board that silently under-reports is not.

Writing across projects

The board reads and writes all three projects. Dragging Regulatory reporting: settlement event feed from In Progress to In Review writes the state on the Digital Banking item, from a board hosted in Claims Platform, with no extra configuration. Four things are worth knowing about those writes:

Inline add is the one exception to "the board writes everywhere". The New item button on the first column always creates the item in the host project, with the board's work item type, the title you typed, and field values derived from the query's own WHERE clause. System.TeamProject is never among them. On this board, inline add means "add to Claims Platform". To raise a change request in Core Insurance, create it there; it joins the board at the next refresh, because the query says so.

A card's linked backlog items may live in any project, and the link is always Related, never parent/child, precisely because a cross-project card must be able to point at several teams' delivery work at once without owning any of it.

What the board still cannot do by project

Know these before you promise them to a steering group:

Troubleshooting

Symptom Cause and fix
Only one project's items appear The saved query is not set to Query across projects, or its WHERE clause still restricts [System.TeamProject] to a single project.
Cards from one project all sit in Unmapped That project's copy of the work item type has state names the host project's type does not have. Align the process, or host the board in the project whose state model you want as the column set.
Two colleagues see different column counts They do not have the same read access across the projects the query spans. Azure DevOps leaves the items a person cannot read out of that person's query result, and no banner reports it. Grant matching read permissions.
A drag is refused only for one project's cards That project's process restricts the transition, or orders by another field (the card menu says which). The message card carries the server's own explanation.
New item created the item in the wrong project Inline add always creates in the project hosting the board. Create the item in its own project instead.
A style rule never colors cards from one project The condition names a field that does not exist, or is empty, on that project's copy of the type. A missing value evaluates to false.

Checklist