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):
- 🚨 Obstacles - Things blocking me that need someone else to remove
- 📋 Today - What I'm committing to finish today
- 🚀 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:
- Distributed teams - Different timezones can't sync daily
- Async teammates - People on PTO/sick can catch up from written history
- Accountability - "I'll review by 2pm" in writing vs verbal promise
- Pattern detection - Same blocker 3 weeks in a row visible in written history
- 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):
- Facilitator: "Who has blockers?"
- Each person with blocker: State blocker with WHO and WHEN
- Team resolves each blocker or assigns owner
- 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 testingIn 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 meetingsWhy 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 bugsWhy 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 coverageBad Example 3: No Blocker Owner
❌ Bad:
🚨 Obstacles: CI pipeline is broken
📋 Today: Try to figure out CI issue
🚀 Yesterday: Debugged CIWhy 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 reproduceChecklist
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
- It's Not Just Standing Up (Martin Fowler) - Comprehensive guide on effective standups
- Focus on Achievement, Not Activity (J.B. Rainsberger) - Achievement vs activity reporting
- Jason Yip Interview on Standups - Walk the board approach
- Written Communication - How to write clear updates