Counts your Jira tickets by status every morning and posts the breakdown to Slack, with a short read on what stands out.

UsesClaudeJiraSlack

Daily Jira status report to Slack

Every morning at 08:30, your Jira tickets are counted by status category, To Do, In Progress and Done, broken down by the status names your project uses and by assignee, and the breakdown is posted as one Slack message. Done covers a recent window rather than all time, so it says something about this morning.

You get one message with the counts and, when there is something worth saying, up to three lines on what stands out, such as work piling up in one column or a queue concentrated on one person. Every number is counted by paging through Jira rather than taken from a first page, and a count that hit the paging ceiling is marked as a floor, not passed off as a total. The AI only comments on the finished figures, never produces one, and if that comment fails the report still goes out with its numbers intact.

Before the first run you need a Slack channel to post to. It can cover every project your Jira connection can see or be scoped to one board.

ScheduleRun every day at 08:30.Run every day at 08:30.
ValuesSet slackChannelId to blank.Set slackChannelId to blank.
ValuesSet jiraProjectKey to blank.Set jiraProjectKey to blank.
ValuesSet doneLookbackDays to 7.Set doneLookbackDays to 7.
ValuesSet maxPagesPerStatus to 10.Set maxPagesPerStatus to 10.
ValuesSet assigneeLimit to 10.Set assigneeLimit to 10.
ValuesSet reportTitle to Daily Jira status report.Set reportTitle to Daily Jira status report.
ValuesSet pageSize to 100.Set pageSize to 100.
ValuesSet projectFilter to blank.Set projectFilter to blank.
ValuesSet projectLabel to all visible projects.Set projectLabel to all visible projects.
Decisions & LoopsIf jiraProjectKey isn't emptyIf jiraProjectKey isn't empty
Yes
ValuesChange projectFilter to project = jiraProjectKey AND .Change projectFilter to project = jiraProjectKey AND .
ValuesChange projectLabel to jiraProjectKey.Change projectLabel to jiraProjectKey.
No
No steps
ValuesSet doneWindow to -doneLookbackDaysd.Set doneWindow to -doneLookbackDaysd.
Dates & TimesMake today's date readable as “November 2, 2026” and save it as reportDate.Make today's date readable as “November 2, 2026” and save it as reportDate.
ValuesSet todoJql to projectFilterstatusCategory = To Do ORDER BY updated DESC.Set todoJql to projectFilterstatusCategory = To Do ORDER BY updated DESC.
ValuesSet todoIssues to an empty list.Set todoIssues to an empty list.
ValuesSet todoToken to blank.Set todoToken to blank.
ValuesSet todoPages to 0.Set todoPages to 0.
ValuesSet todoMore to true.Set todoMore to true.
Decisions & LoopsWhile todoMore is yes and todoPages is less than maxPagesPerStatus:While todoMore is yes and todoPages is less than maxPagesPerStatus:
JiraJiraFind issues matching todoJql. Save it as todoPage.Find issues matching todoJql. Save it as todoPage.
ListsCombine todoIssues and todoPage.issues into one list and save it as todoIssues.Combine todoIssues and todoPage.issues into one list and save it as todoIssues.
ValuesAdd 1 to todoPages.Add 1 to todoPages.
ValuesSet todoNextToken to todoPage.next_page_token.Set todoNextToken to todoPage.next_page_token.
Decisions & LoopsIf todoNextToken is emptyIf todoNextToken is empty
Yes
ValuesChange todoMore to false.Change todoMore to false.
No
ValuesChange todoToken to todoNextToken.Change todoToken to todoNextToken.
ValuesSet todoTruncated to todoMore.Set todoTruncated to todoMore.
ValuesSet inProgressJql to projectFilterstatusCategory = In Progress ORDER BY updated DESC.Set inProgressJql to projectFilterstatusCategory = In Progress ORDER BY updated DESC.
ValuesSet inProgressIssues to an empty list.Set inProgressIssues to an empty list.
ValuesSet inProgressToken to blank.Set inProgressToken to blank.
ValuesSet inProgressPages to 0.Set inProgressPages to 0.
ValuesSet inProgressMore to true.Set inProgressMore to true.
Decisions & LoopsWhile inProgressMore is yes and inProgressPages is less than maxPagesPerStatus:While inProgressMore is yes and inProgressPages is less than maxPagesPerStatus:
JiraJiraFind issues matching inProgressJql. Save it as inProgressPage.Find issues matching inProgressJql. Save it as inProgressPage.
ListsCombine inProgressIssues and inProgressPage.issues into one list and save it as inProgressIssues.Combine inProgressIssues and inProgressPage.issues into one list and save it as inProgressIssues.
ValuesAdd 1 to inProgressPages.Add 1 to inProgressPages.
ValuesSet inProgressNextToken to inProgressPage.next_page_token.Set inProgressNextToken to inProgressPage.next_page_token.
Decisions & LoopsIf inProgressNextToken is emptyIf inProgressNextToken is empty
Yes
ValuesChange inProgressMore to false.Change inProgressMore to false.
No
ValuesChange inProgressToken to inProgressNextToken.Change inProgressToken to inProgressNextToken.
ValuesSet inProgressTruncated to inProgressMore.Set inProgressTruncated to inProgressMore.
ValuesSet doneJql to projectFilterstatusCategory = Done ORDER BY updated DESC.Set doneJql to projectFilterstatusCategory = Done ORDER BY updated DESC.
Decisions & LoopsIf doneLookbackDays is greater than 0If doneLookbackDays is greater than 0
Yes
ValuesChange doneJql to projectFilterstatusCategory = Done AND (resolved >= doneWindow OR (resolved IS EMPTY AND updated >= doneWindow)) ORDER BY updated DESC.Change doneJql to projectFilterstatusCategory = Done AND (resolved >= doneWindow OR (resolved IS EMPTY AND updated >= doneWindow)) ORDER BY updated DESC.
No
No steps
ValuesSet doneIssues to an empty list.Set doneIssues to an empty list.
ValuesSet doneToken to blank.Set doneToken to blank.
ValuesSet donePages to 0.Set donePages to 0.
ValuesSet doneMore to true.Set doneMore to true.
Decisions & LoopsWhile doneMore is yes and donePages is less than maxPagesPerStatus:While doneMore is yes and donePages is less than maxPagesPerStatus:
JiraJiraFind issues matching doneJql. Save it as donePage.Find issues matching doneJql. Save it as donePage.
ListsCombine doneIssues and donePage.issues into one list and save it as doneIssues.Combine doneIssues and donePage.issues into one list and save it as doneIssues.
ValuesAdd 1 to donePages.Add 1 to donePages.
ValuesSet doneNextToken to donePage.next_page_token.Set doneNextToken to donePage.next_page_token.
Decisions & LoopsIf doneNextToken is emptyIf doneNextToken is empty
Yes
ValuesChange doneMore to false.Change doneMore to false.
No
ValuesChange doneToken to doneNextToken.Change doneToken to doneNextToken.
ValuesSet doneTruncated to doneMore.Set doneTruncated to doneMore.
CodeRun Python code on todoIssues, inProgressIssues, doneIssues, todoTruncated, inProgressTruncated, doneTruncated, doneLookbackDays, assigneeLimit, pageBudget, projectLabel, reportDate, and reportTitle and save it as counts.Run Python code on todoIssues, inProgressIssues, doneIssues, todoTruncated, inProgressTruncated, doneTruncated, doneLookbackDays, assigneeLimit, pageBudget, projectLabel, reportDate, and reportTitle and save it as counts.
ValuesSet aiRead to blank.Set aiRead to blank.
Decisions & LoopsIf a step below fails, save the error as aiErrorIf a step below fails, save the error as aiError
Try
ClaudeClaudeAsk Claude: 'You are writing the short what stands out note at the bottom of a team's daily Jira status report.Ask Claude: 'You are writing the short what stands out note at the bottom of a team's daily Jira status report. The figures below were counted from Jira, they are correct, and the report already prints them. Your job is only to say what they mean. Rules: - Never repeat a number the report already shows, and never state a number that is not in the facts below. Do not do arithmetic of your own: express a ratio in words (roughly three times, about half) rather than a figure you worked out. - Comment on shape, not size: where work is piling up, a status that is unusually crowded, work concentrated on one person, an empty in-progress column, a backlog growing while nothing finishes. - At most three bullets, one line each, plain Slack-friendly text. No heading, no preamble, no sign-off. - A quiet day is a real answer. If nothing here is worth a team's attention, reply with exactly NOTHING_NOTABLE and nothing else. Today's figures: counts.facts'. Save it as analysis. Maximum response length: 500
TextTrim analysis.response_text and save it as verdict.Trim analysis.response_text and save it as verdict.
Decisions & LoopsIf verdict isn't empty and verdict doesn't start with NOTHING_NOTABLE (ignoring…If verdict isn't empty and verdict doesn't start with NOTHING_NOTABLE (ignoring…
Yes
ValuesChange aiRead to verdict.Change aiRead to verdict.
No
No steps
On error
ValuesShow in the output: Posting the counts without a written read: aiError.message.Show in the output: Posting the counts without a written read: aiError.message.
ValuesSet slackText to counts.report.Set slackText to counts.report.
Decisions & LoopsIf aiRead isn't emptyIf aiRead isn't empty
Yes
ValuesChange slackText to counts.reportChange slackText to counts.report *What stands out* aiRead.
No
No steps
SlackSlackSend a message to slackChannelId. Save it as posted.Send a message to slackChannelId. Save it as posted.slackText
ValuesShow in the output: posted.Show in the output: posted.