Skip to content

Daily Standup

How to run standups that unblock people in 15 minutes, not waste 30 minutes on status theater.


TL;DR

  • Write first, talk second - Written updates filter signal from noise
  • Skip updates without blockers - Only discuss what needs unblocking
  • Every blocker needs WHO and WHEN - "Blocked on X" is useless, "Need Sarah's approval by 2pm" is actionable
  • If explaining your update, you wrote it wrong - Apply written communication principles
  • No point writing if you end up reading it aloud - Either trust written updates or go full sync

The Problem

Most standups fail in one of two ways:

Pure sync standups:

  • 30 minutes for 6 people = 3 hours of team time
  • Everyone waits while Alice explains her database refactor
  • Bob mentions he's blocked but no one follows up
  • No written record, issues forgotten after meeting

Fake async standups:

  • Team writes updates
  • Then reads them aloud word-for-word in meeting
  • Zero time savings, double the effort
  • Still no follow-up on blockers

Both share the same root cause: Lack of trust in written updates and unclear purpose.


Our Approach: Hybrid (Write First, Discuss Blockers)

Format:

Write before standup (5 min):

  1. 🚨 Obstacles - Things blocking me that need someone else to remove
  2. 📋 Today - What I'm committing to finish today
  3. 🚀 Yesterday - What I shipped since yesterday's standup

In standup (15 min max):

  • Skip all updates without blockers
  • Only discuss obstacles
  • Each blocker must have WHO will help and WHEN

Why this works:

  • Respects time (read 6 updates in 2 min vs listen for 30 min)
  • Forces clear writing (can't hide behind verbal explanation)
  • Focuses meeting on unblocking, not reporting
  • Creates written record for async teammates

Rule 1: If You Need to Explain Your Update, You Wrote It Wrong

Bad update:

🚀 Yesterday: Worked on the payment integration 📋 Today: Continue working on it 🚨 Obstacles: Having some issues with the API

Why it fails:

  • Vague "worked on" (no achievement)
  • "Continue working" (no commitment)
  • "Some issues" (no specific blocker with who/when)
  • Forces verbal explanation in standup

Good update:

🚀 Yesterday: Stripe refund API integrated, passes test suite 📋 Today: Deploy to staging, get Sarah's security review 🚨 Obstacles: Need Bob to approve PR #234 by 2pm to deploy

Why it works:

  • Clear achievement (refund API done, tests passing)
  • Clear commitment (deploy + review today)
  • Actionable blocker (Bob, PR #234, 2pm deadline)
  • No explanation needed

Apply written communication principles:

  • No weasel words ("some", "working on", "issues")
  • Specific names (Bob, Sarah)
  • Specific deliverables (PR #234, Stripe refund API)
  • Specific deadlines (2pm)

Reference: Written Communication for how to write clear updates.


Rule 2: Skip Updates Without Blockers

In the standup:

Do this:

  • Facilitator: "Who has blockers?"
  • Alice: "Need Bob's DB schema review by noon"
  • Bob: "I'll review by 11am"
  • [Done in 1 minute, 5 people saved 29 minutes]

Not this:

  • Alice reads her update aloud
  • Bob reads his update aloud
  • Carol reads her update aloud
  • [Everyone already read this, wasted 20 minutes]

If you're not comfortable skipping non-blocker updates:

  • Your written updates aren't clear enough (see Rule 1)
  • Team doesn't trust written updates (see Rule 4)
  • You're treating standup as status report to manager (see Rule 5)

Rule 3: Every Blocker Needs WHO and WHEN

Bad blocker:

🚨 Obstacles: Blocked on database migration

Why it fails:

  • Who needs to help?
  • When do you need it?
  • What specifically is blocking?
  • This blocker will never get resolved

Good blocker:

🚨 Obstacles: Need Carlos to run migration script on staging DB by 2pm (blocks my integration test)

Why it works:

  • WHO: Carlos
  • WHEN: 2pm
  • WHAT: Run migration script on staging
  • WHY: Blocks integration test

In standup:

  • Alice: "Need Carlos to run migration by 2pm"
  • Carlos: "I'll do it at 1pm"
  • [Blocker resolved in 10 seconds]

If Carlos can't do it:

  • Carlos: "I'm in client meetings until 3pm"
  • Alice: "Can someone else run it? I have staging DB access"
  • Bob: "I'll help at 1pm"
  • [Team self-organizes in 30 seconds]

If blocker not resolved by deadline:

  • Next day's standup, explain why in one line
  • Example: "Carlos's migration delayed - staging DB was down until 4pm"
  • Prevents same blocker appearing daily with no context

Rule 4: Writing vs Talking - Pick One

You have two options:

Option A: Trust Written Updates

  • Team writes clear updates (Rule 1)
  • Standup only discusses blockers (Rule 2)
  • Saves 25+ minutes per day
  • Works for distributed teams

Option B: Full Sync

  • No written updates
  • Everyone shares verbally
  • Takes 30 minutes
  • Works for co-located teams who prefer talking

Don't do both:

  • Writing updates then reading them aloud wastes everyone's time
  • If people explain their written updates verbally, your written updates are unclear
  • Either trust the written word or go full verbal

How to know which to use:

Use Option A (Write + Discuss Blockers) if:

  • Team writes clearly (can apply Rule 1)
  • Distributed team (different timezones)
  • Team >5 people (sync takes too long)
  • Team trusts async communication

Use Option B (Full Sync) if:

  • Team <5 people
  • Everyone co-located
  • Team prefers talking
  • Can stay under 15 minutes

Why Written Updates Matter

Writing forces clarity:

  • Can't hide behind vague verbal explanation
  • Must be specific (who, what, when)
  • Creates accountability (written record of commitments)
  • Enables async review (distributed teams, sick days, vacation)

When written is critical:

  1. Distributed teams - Different timezones can't sync daily
  2. Async teammates - People on PTO/sick can catch up from written history
  3. Accountability - "I'll review by 2pm" in writing vs verbal promise
  4. Pattern detection - Same blocker 3 weeks in a row visible in written history
  5. Onboarding - New teammates read last 2 weeks of standups to understand current work

What happens without written updates:

  • Verbal updates forgotten immediately after standup
  • Blockers mentioned but no record of who committed to help
  • Can't review what was committed vs delivered
  • Async teammates completely out of sync
  • Manager can't spot systemic issues (same blocker weekly)

Example: Verbal vs Written

Verbal only:

  • Alice: "I'm blocked on database stuff"
  • Bob: "I can help later"
  • [Meeting ends, both forget, blocker persists for 3 days]

Written with accountability:

Alice's update:
🚨 Obstacles: Need Bob to review DB schema in PR #456 by 2pm (blocks migration)

[In standup]
Bob: "I'll review by 1pm"

[In Slack after standup]
Bob: "Reviewed PR #456, approved. Migration unblocked."

The pattern: Written updates create accountability. Verbal updates create amnesia.


Rule 5: Don't Report to Manager - Unblock Each Other

Bad standup:

  • Everyone faces manager
  • "Yesterday I worked on X" (reports activity to boss)
  • Manager asks follow-up questions
  • Team members check phones

Why it fails:

  • Becomes status report, not coordination
  • Team doesn't help each other
  • Low energy, feels like performance review

Good standup:

  • Team faces each other (or shared screen with work board)
  • "I'm blocked on X, who can help?" (asks peers for support)
  • Team offers solutions
  • Manager stays quiet unless asked

Why it works:

  • Team coordinates, not reports
  • Blockers get resolved
  • High energy, feels like collaboration

Manager's role:

  • Remove blockers team can't resolve themselves
  • Take notes on systemic issues (same blocker weekly = process problem)
  • Stay quiet unless team asks for help

Common Antipatterns (and Fixes)

Antipattern 1: Activity Theater

What it looks like:

🚀 Yesterday: Worked on feature X, fixed some bugs, attended 3 meetings 📋 Today: Continue working on feature X

Why it fails:

  • No concrete achievement (what shipped?)
  • No commitment (continue working = infinite)
  • Looks busy but nothing moves forward

Fix: Focus on achievement + commitment

🚀 Yesterday: User login API shipped to production (handles 1000 req/s) 📋 Today: Add OAuth support, get Sarah's security review

Reference: J.B. Rainsberger on achievement vs activity


Antipattern 2: Obstacles Never Resolved

What it looks like:

  • Week 1: "Blocked on CI pipeline"
  • Week 2: "Still blocked on CI pipeline"
  • Week 3: "Working around CI issues"
  • [Team stops mentioning blockers]

Why it fails:

  • Breaks trust (why mention blockers if no one helps?)
  • Team works around issues instead of fixing them
  • Velocity drops, morale drops

Fix: Track blockers publicly, assign owner

  • Blocker board visible to everyone
  • Each blocker has owner + deadline
  • Review unresolved blockers weekly

Example:

  • Alice: "CI failing for 3 days"
  • Manager: "Bob, can you pair with Alice by EOD?"
  • Bob: "Yes, 2pm today"
  • [Update blocker board: Bob helping Alice, 2pm]

Antipattern 3: Story Time

What it looks like:

"So yesterday I was debugging this weird issue with Redis, and I thought it was the connection pool, but then I checked the logs and realized it was actually the timeout configuration, so I tried increasing it but that didn't work, so then I..."

Why it fails:

  • Takes 5 minutes for one person
  • Other 5 people zone out
  • No actionable information

Fix: "Take it offline"

  • Anyone can say "take it offline" to pause detailed discussion
  • Interested parties continue after standup
  • Standup stays under 15 minutes

Better update:

🚀 Yesterday: Fixed Redis timeout issue (API latency 500ms → 50ms) 🚨 Obstacles: None, can share debugging approach with anyone interested after standup


Antipattern 4: Starting Too Late

What it looks like:

  • Standup at 11am
  • Team already started work
  • 3 people already blocked for 2 hours
  • Coordination happens too late

Why it fails:

  • Can't unblock people who've been stuck all morning
  • Wastes first half of day

Fix: Start at 9-10am

  • Surface blockers before deep work starts
  • Team can adjust plans based on blockers
  • Maximize productive hours

Reference: Martin Fowler on standup timing


Antipattern 5: No Follow-Through

What it looks like:

  • Alice: "Need Bob's review by noon"
  • Bob: "Sure, I'll review"
  • [Noon passes, no review, no follow-up]
  • Next day same blocker appears

Why it fails:

  • Commitments don't mean anything
  • Trust erodes
  • Team stops asking for help

Fix: Accountability

  • If Bob commits to noon, he sets alarm for 11:45am
  • If Bob can't make it, he messages Alice immediately
  • If blocker not resolved by deadline, explain why in one line next standup ("Bob's review delayed - production incident until 3pm")
  • If blockers repeatedly unresolved, escalate to manager

Template

Written Update (5 min before standup):

🚨 Obstacles
- Need [WHO] to [ACTION] by [TIME] (blocks [WHAT])
- [If no obstacles, write "None"]

📋 Today
- [Specific deliverable 1]
- [Specific deliverable 2]

🚀 Yesterday
- [Concrete achievement 1 with impact]
- [Concrete achievement 2 with impact]

Standup (15 min max):

  1. Facilitator: "Who has blockers?"
  2. Each person with blocker: State blocker with WHO and WHEN
  3. Team resolves each blocker or assigns owner
  4. Done

Good Examples

Example 1: Clear Achievement + Blocker

🚨 Obstacles
- Need Carlos to run DB migration on staging by 2pm (blocks integration test)

📋 Today
- Run integration tests once migration complete
- Deploy to staging if tests pass

🚀 Yesterday
- Stripe refund API integrated, passes unit tests (handles partial refunds + edge cases)
- Fixed CORS issue blocking QA testing (QA unblocked)

Why it works:

  • Obstacle has WHO (Carlos), WHEN (2pm), WHY (blocks tests)
  • Today has 2 concrete commitments
  • Yesterday has 2 achievements with business impact
  • No verbal explanation needed

Example 2: No Blockers

🚨 Obstacles
- None

📋 Today
- Add OAuth Google login
- Get Sarah's security review by EOD

🚀 Yesterday
- Email login shipped to production (0 errors in 24h, 200 signups)
- API latency reduced 500ms → 50ms (Redis timeout fix)

In standup:

  • [Skipped - no blockers]
  • Team reads in 30 seconds
  • Moves to next person

Example 3: Multiple Blockers

🚨 Obstacles
- Need Bob to approve PR #234 by 11am (blocks deployment)
- Need design specs for checkout flow from Lisa by EOD (blocks sprint planning)
- AWS staging environment down, need DevOps help

📋 Today
- Deploy PR #234 to staging once approved
- Start checkout UI once design ready
- Work on unit tests (not blocked) while waiting

🚀 Yesterday
- Payments dashboard UI complete (Lisa approved)
- Fixed 3 bugs from QA testing

In standup:

  • Bob: "I'll review PR #234 by 10:30am"
  • Lisa: "Design ready, will send in 10 min"
  • Carlos: "I'll check AWS, should be up by 10am"
  • [3 blockers resolved in 90 seconds]

Bad Examples (and How to Fix)

Bad Example 1: Vague Activity

❌ Bad:
🚨 Obstacles: Some issues with the API
📋 Today: Continue working on payment integration
🚀 Yesterday: Worked on payment stuff, had some meetings

Why it fails:

  • "Some issues" - what issues? Who can help?
  • "Continue working" - no commitment, could take 5 more days
  • "Worked on" - no achievement
  • Forces verbal explanation
✅ Fixed:
🚨 Obstacles: Stripe API returns 429 rate limit. Need higher limit from Stripe support or need to implement retry logic. Need decision from @Sarah by noon.

📋 Today: Implement exponential backoff retry (if Sarah approves) OR contact Stripe support (if we want higher limit)

🚀 Yesterday: Stripe payment capture works in test mode (tested with 50 transactions, 0 failures)

Bad Example 2: No Specifics

❌ Bad:
🚨 Obstacles: Waiting on Bob
📋 Today: Make progress on the feature
🚀 Yesterday: Fixed bugs

Why it fails:

  • Waiting on Bob for what? By when?
  • "Make progress" - not a commitment
  • "Fixed bugs" - which bugs? What's the impact?
✅ Fixed:
🚨 Obstacles: Need Bob to approve DB schema change in PR #456 by 2pm (blocks migration script)

📋 Today: Run migration on staging after Bob's approval, verify no data loss

🚀 Yesterday: Fixed cart calculation bug (affected 20 users, now resolved), added test coverage

Bad Example 3: No Blocker Owner

❌ Bad:
🚨 Obstacles: CI pipeline is broken
📋 Today: Try to figure out CI issue
🚀 Yesterday: Debugged CI

Why it fails:

  • Who will fix CI? When?
  • No progress (yesterday debugged, today still figuring out)
  • Will appear again tomorrow
✅ Fixed:
🚨 Obstacles: CI fails on Docker build step. Need DevOps (Carlos or Ana) to check Docker registry permissions. Blocking 3 PRs.

📋 Today: Deploy 3 PRs to staging once CI fixed. If CI not fixed by 2pm, deploy manually.

🚀 Yesterday: Identified CI failure root cause (Docker registry 403 error), documented steps to reproduce

Checklist

Before standup, check your written update:

  • [ ] Obstacles: Each has WHO, WHEN, and WHY
  • [ ] Today: Concrete deliverables, not "continue working"
  • [ ] Yesterday: Achievements with impact, not activities
  • [ ] No weasel words: No "some", "might", "working on", "issues"
  • [ ] No explanation needed: Could someone understand without asking questions?

In standup:

  • [ ] Under 15 minutes
  • [ ] Skip updates without blockers
  • [ ] Every blocker gets owner + deadline
  • [ ] Team faces each other, not manager
  • [ ] Take detailed discussions offline

After standup:

  • [ ] If blocker missed deadline: Explain why in one line next standup

Why This Matters

Standups are the "daily build" for team coordination. Just like continuous integration catches code conflicts early, daily standups catch coordination conflicts early.

Good standups:

  • Surface blockers in hours, not days
  • Team self-organizes to unblock each other
  • Everyone knows what everyone else is working on
  • Takes 15 minutes

Bad standups:

  • Waste 30+ minutes on status theater
  • Blockers mentioned but never resolved
  • Team doesn't know who's working on what
  • Low energy, feels like chore

The difference isn't standup vs no standup. It's clear communication vs theater.


References