On a schedule
Post a daily Jira digest in Slack
Each weekday morning Slack shows yesterday's Jira progress grouped by status, plus blockers and what is due soon.
- Runs
- On a schedule
- Apps
- Jira, Slack
- AI
- Optional
- Access
- Jira read; Slack chat:write
Send this to your assistant
Create a ClickRuntime automation: every weekday at 9, summarise tickets updated yesterday in Jira project ENG by status, list blocked tickets and anything due in the next 3 days, and post it to #eng.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A product team of twelve tracks its work in Jira, but only the project manager looks at the board every day. Developers find out a teammate was blocked yesterday when standup comes around, and due dates slip quietly.
A morning digest that groups yesterday's movement, highlights blockers and lists what is due soon gives everyone the same picture before the day starts. Problems get raised earlier, and deadlines are visible to the whole team.
What you get out of it
Blockers surface the same day
Blocked tickets are listed at the top. Someone can help before another day is lost.
Deadlines are visible
Tickets due in the next few days are listed. Nobody is surprised by a due date.
Progress at a glance
Tickets are grouped by status, so the team sees what moved to review or done. It is a quick read over coffee.
A short summary if you want it
With AI turned on, a few sentences sum up the day. Stakeholders get the gist without reading every line.
How it works
What happens, step by step
Every weekday morning, ClickRuntime finds the Jira tickets updated in your project since the previous day.
It groups them by status and picks out blocked tickets and those due in the next 3 days.
If you turn on AI, it adds a short summary.
The digest is posted to your #eng Slack channel.
Before it runs live
- Connect Jira
- Connect Slack, then invite the app to the channel (type /invite @ClickRuntime there)
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Google Sheets
- Combine it with other Jira and Slack steps into one automation
Under the hood
The code that runs this automation
from collections import defaultdict
from datetime import date, timedelta
from clickruntime import on_trigger, credentials, http, notify, ai
JIRA, SITE = "https://api.atlassian.com/ex/jira/your-cloud-id", "https://acme.atlassian.net/browse/"
adf = lambda text: {"type": "doc", "version": 1, "content": [{"type": "paragraph", "content": [{"type": "text", "text": text}]}]}
def jira(method, path, **kw):
resp = http.request(method, JIRA + path, headers={"Authorization": f"Bearer {credentials.connection('jira', 'work')}", "Accept": "application/json"}, **kw)
return resp.raise_for_status() or (resp.json() if resp.content else None)
PROJECT = "ENG"
def search(jql):
return jira("POST", "/rest/api/3/search/jql", json={"jql": jql, "fields": ["summary", "status", "assignee", "duedate"], "maxResults": 100})["issues"]
@on_trigger
def run(event):
since = date.today() - timedelta(days=3 if date.today().weekday() == 0 else 1)
moved = search(f"project = {PROJECT} AND updated >= '{since}'")
blocked = search(f"project = {PROJECT} AND (status = Blocked OR flagged is not EMPTY) AND statusCategory != Done")
due = search(f"project = {PROJECT} AND duedate <= 3d AND statusCategory != Done")
groups = defaultdict(list)
for t in moved:
groups[t["fields"]["status"]["name"]].append(f"<{SITE}{t['key']}|{t['key']}> {t['fields']['summary']}")
fmt = lambda ts: "\n".join(f"• <{SITE}{t['key']}|{t['key']}> {t['fields']['summary']}" for t in ts) or "• none"
text = "\n".join(f"*{s}*\n" + "\n".join(f"• {x}" for x in xs) for s, xs in groups.items())
text += f"\n*Blocked*\n{fmt(blocked)}\n*Due in 3 days*\n{fmt(due)}"
try:
text = ai.generate(text[:10000], system="Summarise this Jira activity in 2 plain sentences, mentioning blockers.", max_output_tokens=120).text + "\n\n" + text
except (ai.AINotIncluded, ai.AILimitReached):
pass
notify.slack(text, channel="#eng")
return {"moved": len(moved), "blocked": len(blocked), "due": len(due)}FAQ
Common questions
How does it know a ticket is blocked?
Can it cover several projects?
Does it post on weekends?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Review stale Jira tickets every week in Slack
Every Monday Slack lists Jira tickets that have not moved in 30 days, with a suggestion for each: close it, chase it or keep it.
See how it worksUpdate Jira and post release notes to Slack when you tag a release
When a release is tagged, the Jira tickets mentioned in its commits get a fix version and move to Done, and Slack gets the release notes.
See how it worksAlert Slack on production errors with one Jira bug per error
Production errors are posted to Slack straight away, and each distinct error opens exactly one Jira bug, with repeats added as comments.
See how it worksKeep exploring
Set up “Post a daily Jira digest in Slack” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.