On a schedule
Post a daily standup from Asana to Slack
Every weekday morning, your team channel shows what each person finished yesterday, what is due today and what is overdue.
- Runs
- On a schedule
- Apps
- Asana, Slack
- AI
- Optional
- Access
- Asana read; chat:write
Send this to your assistant
Create a ClickRuntime automation: every weekday at 9, post to #team what each person completed yesterday in Asana, what's due today and what's overdue.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A remote team of eight spreads across time zones, so a live standup call never suits everyone. People post updates when they remember, and the team lead spends the first half hour of each day clicking through Asana to see what moved. Overdue tasks are noticed late, often when a client asks.
This automation writes the standup for you from Asana each weekday morning and posts it in Slack. Everyone starts the day with the same picture, without a meeting and without anyone writing an update.
What you get out of it
A standup without the meeting
The summary is ready in Slack when people start work, whatever their time zone. Calls can be kept for problems that need discussion.
Overdue work is visible every day
Late tasks are listed by person each morning, so they are dealt with before they turn into missed deadlines. Nobody has to chase them by hand.
Finished work gets noticed
Yesterday's completed tasks are listed by name, so progress is visible to the whole team. Quiet contributors get credit too.
Built from what is actually in Asana
The update reflects real task status, not what people remember to report. It also nudges the team to keep Asana up to date.
How it works
What happens, step by step
Every weekday at 9:00, ClickRuntime looks at the tasks in your chosen Asana projects.
It groups them by person into three lists: completed since yesterday, due today and overdue.
A short summary is written, with AI tidying it into a readable update if you choose.
The standup is posted in your #team Slack channel.
Before it runs live
- Connect Asana
- 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 Asana and Slack steps into one automation
Under the hood
The code that runs this automation
from datetime import date, datetime, timedelta, timezone
from collections import defaultdict
from clickruntime import on_trigger, credentials, http, ai, notify, log
PROJECT_ID = "your-asana-project-id"
@on_trigger
def run(event):
since = (datetime.now(timezone.utc) - timedelta(days=3 if date.today().weekday() == 0 else 1)).isoformat()
tasks = http.get(f"https://app.asana.com/api/1.0/projects/{PROJECT_ID}/tasks",
headers={"Authorization": f"Bearer {credentials.secret('ASANA_TOKEN')}"},
params={"completed_since": since, "opt_fields": "name,completed,completed_at,due_on,assignee.name"}).json()["data"]
today = date.today().isoformat()
people = defaultdict(lambda: {"done": [], "today": [], "overdue": []})
for t in tasks:
who = (t.get("assignee") or {}).get("name", "Unassigned")
if t["completed"]:
people[who]["done"].append(t["name"])
elif t.get("due_on") == today:
people[who]["today"].append(t["name"])
elif t.get("due_on") and t["due_on"] < today:
people[who]["overdue"].append(t["name"])
lines = [f"*{p}*: done {', '.join(v['done']) or '-'} | today {', '.join(v['today']) or '-'} | overdue {', '.join(v['overdue']) or '-'}"
for p, v in people.items() if any(v.values())]
text = "\n".join(lines) or "No task changes since the last standup."
try:
text = ai.generate(f"Rewrite as a short friendly standup, keep every task:\n{text}", max_output_tokens=600).text
except ai.AIError as e:
log.info("Posting plain standup", {"code": e.code})
notify.slack(f"Standup for {today}\n{text}", channel="#team")
return {"people": len(lines)}FAQ
Common questions
Which projects are included?
Does it post on weekends?
What if someone has nothing to report?
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
Turn your morning watch list into Asana tasks and a Slack summary
Anything on your watch list that needs action becomes an Asana task, and the team gets a short summary in Slack.
See how it worksSet up an Asana project and Slack channel for each new client
When a new client comes in, they get an Asana project from your template and their own Slack channel, with links posted in #clients.
See how it worksScore leads, create Asana tasks and alert sales in Slack
Hot leads are scored on arrival, turned into Asana tasks and posted to your sales channel so someone picks them up straight away.
See how it worksKeep exploring
Set up “Post a daily standup from Asana to Slack” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.