JQL Examples for Reports: 40 Queries for Jira Cloud
Good reporting JQL does three things: it limits scope to a project, sprint or team, it filters on status category instead of individual status names, and it uses date functions such as startOfWeek() so the query stays correct every week without editing. The 40 queries below are grouped by the report they feed. Replace ABC with your project key and HELP with your service project key.
Every field, function and operator here comes from Atlassian’s JQL documentation for Jira Cloud as of October 2026, except one field that works but isn’t documented, marked where it appears.
Five rules that keep report numbers honest
- Filter on
statusCategory. The three categories, “To Do”, “In Progress” and “Done”, cover every status in every workflow, while status names differ between spaces. Service team-managed spaces have no resolution field at all, so Atlassian suggestsstatusCategory = Donethere. - Know when your week starts.
startOfWeek()begins on Sunday unless the site has ISO 8601 turned on for the date picker in its look and feel settings. Atlassian documentsstartOfWeek("+1d")for a Monday start.endOfWeek()ends on Saturday by default. - Dates follow the searcher’s time zone. Atlassian notes that date searches are relative to your configured time zone, so a colleague in another region can get different items at a week boundary.
- History operators work on six fields only.
WASandCHANGEDsupport Assignee, Fix Version, Priority, Reporter, Resolution and Status. Sprint, labels and custom fields aren’t on the list. - Keep
currentUser()out of shared reports. It resolves to whoever runs the query. In a=JIRA()formula in Google Sheets that’s the sheet owner, because Atlassian runs those formulas through the owner’s account.
A note on names: Atlassian’s documentation now says “work item” and “space” and lists some renamed functions, such as linkedWorkItems(). It also says existing queries don’t change and suggests the old term if a new one fails. The queries below use the long-standing names, such as project and issuetype.
Weekly status (1 to 6)
These feed the tabs in our weekly Jira status report guide, which shows the full layout.
- Done last week, for a Monday meeting:
project = ABC AND statusCategory = Done AND resolved >= startOfWeek("-1") AND resolved < startOfWeek()
- Done this week, for workflows that don’t set a resolution:
project = ABC AND status CHANGED TO Done DURING (startOfWeek(), now())
- In progress, most urgent first:
project = ABC AND statusCategory = "In Progress" ORDER BY priority DESC, updated DESC
- Overdue. Due dates have no time, so
startOfDay()keeps items due today off the list, whichnow()wouldn’t:
project = ABC AND duedate < startOfDay() AND statusCategory != Done ORDER BY duedate ASC
- Due in the next seven days:
project = ABC AND duedate >= startOfDay() AND duedate <= endOfDay("+7") AND statusCategory != Done
- Created this week:
project = ABC AND created >= startOfWeek() ORDER BY created DESC
Monthly throughput and trends (7 to 11)
- Resolved last month:
project = ABC AND resolved >= startOfMonth("-1") AND resolved < startOfMonth()
- Created last month. Put 7 and 8 side by side for created versus resolved:
project = ABC AND created >= startOfMonth("-1") AND created < startOfMonth()
- Open on a past date.
WASmatches the status name in use at the time of the change, so list the names your workflow had then:
project = ABC AND status WAS IN ("To Do", "In Progress", "In Review") ON "2026-09-30"
- Reopened this month:
project = ABC AND status CHANGED FROM Done DURING (startOfMonth(), now())
- Real throughput, without duplicates and declined work (use your site’s resolution names):
project = ABC AND resolved >= startOfMonth("-1") AND resolved < startOfMonth() AND resolution NOT IN (Duplicate, "Won't Do")
Sprint reports (12 to 17)
- Everything in the active sprint:
project = ABC AND sprint in openSprints()
- Not done yet in the active sprint, in backlog order:
project = ABC AND sprint in openSprints() AND statusCategory != Done ORDER BY rank
- Carryover. Atlassian’s docs note that a work item can belong to a completed sprint and an open one at the same time, which is exactly what carried-over work looks like:
project = ABC AND sprint in openSprints() AND sprint in closedSprints()
- One past sprint by name. Autocomplete shows the sprint ID if names repeat:
project = ABC AND sprint = "ABC Sprint 42"
- Next sprint’s plan:
project = ABC AND sprint in futureSprints() ORDER BY rank
- Unestimated work in the active sprint, for sites that use time estimates:
project = ABC AND sprint in openSprints() AND originalEstimate is EMPTY
Epics and releases (18 to 22)
- Children of an epic. The
parentfield works in team-managed and company-managed spaces:
parent = ABC-100
- Open epics by due date:
project = ABC AND issuetype = Epic AND statusCategory != Done ORDER BY duedate ASC
- Work planned for the next release. “Earliest” follows the version order on the Releases page, not release dates:
project = ABC AND fixVersion = earliestUnreleasedVersion(ABC)
- Open work in any unreleased version:
project = ABC AND fixVersion in unreleasedVersions(ABC) AND statusCategory != Done
- What shipped in the latest release:
project = ABC AND fixVersion = latestReleasedVersion(ABC)
Workload and ownership (23 to 27)
- Open work for a group. Pivot by assignee in your sheet. The search fails if the group has more than 10,000 users, and Atlassian teams need
membersOf("id:<teamId>"):
project = ABC AND assignee in membersOf("team-alpha") AND statusCategory != Done
- Urgent work nobody owns:
project = ABC AND assignee is EMPTY AND priority in (Highest, High) AND statusCategory != Done
- Reassigned this week:
project = ABC AND assignee CHANGED DURING (startOfWeek(), now())
- Escalated this week:
project = ABC AND priority CHANGED TO Highest AFTER startOfWeek()
- Linked as blocked. This checks the link only, not whether the blocker is done:
project = ABC AND issueLinkType = "is blocked by" AND statusCategory != Done
Aging and flow (28 to 32)
- In progress for two weeks or more.
statusCategoryChangedDateis a Cloud-only field that holds the last change of status category:
project = ABC AND statusCategory = "In Progress" AND statusCategoryChangedDate <= -14d
- Sitting in one status for three days or more:
project = ABC AND status = "In Review" AND NOT status CHANGED AFTER startOfDay("-3")
- No activity for a month:
project = ABC AND statusCategory != Done AND updated <= -30d
- Sent back from review this month:
project = ABC AND status CHANGED FROM "In Review" TO "In Progress" AFTER startOfMonth()
- In progress at any point this week, even if it has since moved on:
project = ABC AND status WAS "In Progress" DURING (startOfWeek(), now())
JQL finds stuck work but can’t measure how long each step took. For durations, see time in status in Google Sheets.
Time tracking (33 to 36)
These need time tracking turned on. Worklog searches only look at the most recent 1,000 worklogs on a work item.
- Over the original estimate. Work ratio is time spent divided by original estimate, times 100:
project = ABC AND workRatio > 100
- Time logged last week:
project = ABC AND worklogDate >= startOfWeek("-1") AND worklogDate < startOfWeek()
- Time logged by a team this month.
worklogAuthorworks on Jira Cloud but isn’t in Atlassian’s field reference:
project = ABC AND worklogAuthor in membersOf("team-alpha") AND worklogDate >= startOfMonth()
- Work logged against items nobody estimated:
project = ABC AND originalEstimate is EMPTY AND timeSpent is not EMPTY
These return work items, not individual worklog entries. To build a timesheet with one row per entry, see exporting Jira worklogs to Google Sheets.
Service desk SLAs (37 to 40)
Use your own SLA names, in quotes. breached() looks at the most recent SLA cycle; everBreached() at any cycle.
- Breached this month:
project = HELP AND "Time to resolution" = everBreached() AND resolved >= startOfMonth()
- Met this month:
project = HELP AND "Time to resolution" = completed() AND "Time to resolution" != everBreached() AND resolved >= startOfMonth()
- About to breach:
project = HELP AND "Time to first response" = running() AND "Time to first response" < remaining("1h") AND "Time to first response" != breached()
- Waiting more than four hours for a first response:
project = HELP AND "Time to first response" > elapsed("4h")
Our Jira SLA report guide turns these into met rates by priority and request type.
When a count looks wrong
- You see fewer results than a colleague. The query runs with the permissions of whoever runs it, so private spaces and issue-level security drop items out.
- Items jump between weeks. Check the time zone and week-start rules above.
- A status name finds nothing in older history.
WASandCHANGEDmatch the name a status had when the change happened. If “QA” was renamed “In Review” last year, search for both. - Resolution-based queries return nothing in a service space. Team-managed service spaces have no resolution field; switch to
statusCategory = Done. - Sprint totals look inflated. Carried-over items belong to more than one sprint (query 14), so adding up several sprints counts them twice.
From query to report
- Test each query in Filters > Search work items, switched to JQL, and note the count.
- Save it as a filter and star it if you’ll import it with Atlassian’s free Jira Cloud for Sheets add-on, whose Filters tab only lists starred filters.
- Import each query to its own tab, then count with
COUNTAand group withQUERYon a separate summary tab. Our guide to exporting Jira to Google Sheets compares the import methods.
Two traps when automating. The add-on imports every work item on the site if you leave the query empty, and Jira’s search API rejects unbounded queries such as a bare ORDER BY clause, so always include a restriction like project = ABC.
Where Rowduet fits
Rowduet (in development) is a Google Sheets add-on being built to run JQL like this on an hourly or daily schedule, with every field you report on, and to email you when a refresh fails. It isn’t available yet. If your reports depend on these queries, you can join early access.
Frequently asked questions
How do I find Jira issues resolved last week with JQL?
Use project = ABC AND statusCategory = Done AND resolved >= startOfWeek("-1") AND resolved < startOfWeek(). The week starts on Sunday unless your site has ISO 8601 turned on for the date picker; Atlassian documents startOfWeek("+1d") for a Monday start.
Can JQL show how long an issue spent in a status?
Not directly. JQL can find issues that entered, left or sat in a status during a period, and statusCategoryChangedDate shows when an issue last changed status category. Durations need the issue's changelog, which you can pull with a script or an add-on.
Which fields work with the WAS and CHANGED operators?
Only Assignee, Fix Version, Priority, Reporter, Resolution and Status, according to Atlassian's JQL operator reference. On a work item with more than 10,000 changes, these operators only search the most recent ones.
Why does the same JQL give different counts for different people?
Results depend on the permissions of the account that runs the query, currentUser() resolves to that account, and dates are evaluated in that user's time zone. Run shared reports from one account and keep currentUser() out of them.