Systems Library / Operations & Admin / How to Build an AI Stand-Up Report Generator
Operations & Admin communication

How to Build an AI Stand-Up Report Generator

Generate daily stand-up reports from project management tool activity.

Jay Banlasan

Jay Banlasan

The AI Systems Guy

Daily standups waste time when everyone just reads off their task list. I built an ai standup report generator that pulls yesterday's activity from your project management tool, summarizes what each person accomplished, and posts the compiled report to Slack. No meeting required.

Async standups that write themselves from real data.

What You Need Before Starting

Step 1: Pull Activity from Your PM Tool

import requests
from datetime import datetime, timedelta

def fetch_yesterday_activity(api_token, base_url):
    yesterday = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
    today = datetime.now().strftime("%Y-%m-%d")

    headers = {"Authorization": f"Bearer {api_token}"}
    response = requests.get(
        f"{base_url}/tasks?updated_after={yesterday}&updated_before={today}",
        headers=headers
    ).json()

    by_user = {}
    for task in response.get("data", response if isinstance(response, list) else []):
        user = task.get("assignee", {}).get("name", "Unassigned")
        if user not in by_user:
            by_user[user] = {"completed": [], "in_progress": [], "created": []}

        status = task.get("status", "")
        if status == "complete":
            by_user[user]["completed"].append(task["name"])
        elif status == "in_progress":
            by_user[user]["in_progress"].append(task["name"])

    return by_user

Step 2: Generate the Standup Summary with AI

import anthropic
import json

client = anthropic.Anthropic()

def generate_standup(activity_data, team_name):
    prompt = f"""Generate a concise daily standup report for the {team_name} team.

Activity data:
{json.dumps(activity_data, indent=2)}

Format each person's update as:
**Name**
- Done: bullet list of completed tasks
- Working on: current tasks
- Blocked: any blockers (if none, skip this line)

Keep it concise. One line per task. No fluff."""

    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1500,
        messages=[{"role": "user", "content": prompt}]
    )
    return message.content[0].text

Step 3: Post to Slack

import requests as req

def post_standup_to_slack(report, channel, slack_token, team_name):
    date_str = datetime.now().strftime("%A, %B %d")
    header = f"Daily Standup: {team_name} - {date_str}"

    req.post(
        "https://slack.com/api/chat.postMessage",
        headers={"Authorization": f"Bearer {slack_token}"},
        json={
            "channel": channel,
            "blocks": [
                {"type": "header", "text": {"type": "plain_text", "text": header}},
                {"type": "section", "text": {"type": "mrkdwn", "text": report}},
                {"type": "divider"},
                {"type": "context", "elements": [
                    {"type": "mrkdwn", "text": "Auto-generated from project activity. Reply in thread to add context."}
                ]}
            ]
        }
    )

Step 4: Allow Manual Additions

from slack_bolt import App

app = App(token="xoxb-your-bot-token")

@app.command("/standup-add")
def add_standup_note(ack, command, client):
    ack()
    user = command["user_id"]
    note = command["text"]

    client.chat_postMessage(
        channel=command["channel_id"],
        text=f"<@{user}> added: {note}",
        thread_ts=get_latest_standup_ts(command["channel_id"])
    )

Step 5: Schedule and Run

def run_daily_standup(config):
    activity = fetch_yesterday_activity(config["pm_token"], config["pm_url"])
    report = generate_standup(activity, config["team_name"])
    post_standup_to_slack(report, config["slack_channel"], config["slack_token"], config["team_name"])
    print(f"Standup posted for {config['team_name']} at {datetime.now().isoformat()}")

# Schedule: weekdays at 9:30am
# 30 9 * * 1-5 python3 /path/to/standup_bot.py

What to Build Next

Add weekly velocity tracking that compares this week's completion count to last week. Surface patterns like "the team completed 40% fewer tasks this week" so managers catch slowdowns early.

Related Reading

Want this system built for your business?

Get a free assessment. We will map every system your business needs and show you the ROI.

Get Your Free Assessment

Related Systems