Before you start

Open Jira's issue search, switch to JQL, and replace ABC with your project key. Each query lists open tickets only, through statusCategory != Done, so it works whatever you call your statuses. The thresholds are examples. Change them to fit how your team works.

Write down the count from each query. The numbers are the point: they show how much of your backlog nobody is working on. The background is in zombie tickets: the Jira backlog problem nobody counts.

The six queries

1. Frozen: open and untouched

project = ABC AND statusCategory != Done AND updated <= -60d ORDER BY updated ASC

The classic. A ticket nobody has touched for two months is probably not going to be done.

2. Stuck in progress

project = ABC AND statusCategory = "In Progress" AND updated <= -14d ORDER BY updated ASC

Work that started and stopped. These make boards look busier than they are.

3. Contradiction: labelled wont-do, still open

project = ABC AND statusCategory != Done AND labels in (wont-do, duplicate, obsolete, cancelled)

Someone already decided. Nobody closed it. Use the labels your team really uses.

4. Carried over from closed sprints

project = ABC AND statusCategory != Done AND sprint in closedSprints() AND sprint not in openSprints()

Tickets that were planned, missed and pushed along. JQL finds the ones that were in any closed sprint. It cannot count how many sprints they rolled through, and a ticket rolled through three sprints is a stronger signal than one that missed once.

5. Empty stubs

project = ABC AND statusCategory != Done AND description is EMPTY AND created <= -7d

A title and nothing else, a week or more after it was created. Either somebody fills it in, or it goes.

6. Finished parents

An epic or a story whose subtasks are all done, but which is still open, is a sixth kind of dead ticket. Plain JQL cannot ask "are all children done?", so this one needs an app or a manual look at your epics. Start with project = ABC AND issuetype = Epic AND statusCategory != Done and check each one.

Where a filter falls short

All of these lean on dates, and the updated field moves for reasons that have nothing to do with people. Automation rules, integrations, bots and bulk edits all touch tickets, and every touch makes a dead ticket look fresh. A filter on the updated date misses exactly those.

Zombie Hunter takes a different route: it looks at what people really did, ignores bots and bulk edits, checks six rules with thresholds you can change, and gives each project a health score from 0 to 100. See how Zombie Hunter works. A filter is still a good way to try the idea first.

Closing them well

Whatever finds them, close them with care:

  • review each list with the team before you bulk-close anything;
  • move tickets to Done through your workflow, so reports stay consistent;
  • leave a comment that says why a ticket was closed, so that anyone can reopen it with context;
  • skip tickets that changed after you ran the query.

For habits that keep the backlog healthy afterwards, read backlog health tips.