What This Template Is For
A user flow documents the step-by-step path a user takes to complete a specific task in your product. It maps every screen, decision point, and edge case between the entry point and the goal. Without documented flows, designers build screens in isolation, engineers discover missing states mid-sprint, and QA does not know what to test.
The difference between a user flow and a customer journey map is scope. A journey map covers the entire relationship (awareness through retention) across channels. A user flow covers one task, within one product, from start to finish. You need both, but user flows are the ones that directly drive design and engineering work.
This template covers three layers of each flow: the happy path (everything goes right), alternative paths (valid but less common routes), and error paths (what happens when something goes wrong). Most teams document the happy path and skip the rest. That is why users encounter blank screens, cryptic error messages, and dead ends. This template prevents that. It pairs well with the information architecture template for understanding where flows sit within the product structure. For validating flows with real users, use the usability test report template. Teams doing product discovery create flow diagrams as part of the design phase, between research and wireframing.
How to Use This Template
- Start with the Flow Overview. Define the user, the entry point, the goal, and the preconditions. If you cannot clearly state the goal in one sentence, the flow is too broad. Split it.
- Map the happy path first. Walk through the ideal scenario where the user completes the task without errors, detours, or unusual conditions. List each screen or state in sequence.
- Add decision points. Every place where the user (or the system) makes a choice that changes the path. Label each branch clearly.
- Map alternative paths. These are valid but less common routes (e.g., returning user vs. new user, guest checkout vs. logged-in checkout). They are not errors. They are legitimate variations.
- Map error paths. For every input, API call, or system operation, document what happens when it fails. The most common missing flows are: network error, invalid input, expired session, permission denied, and empty state.
- Document edge cases in a separate table. These are unusual conditions that require specific handling (e.g., cart with 100 items, username with special characters, user in an unsupported timezone).
The Template
Flow Overview
| Field | Details |
|---|---|
| Flow Name | [Descriptive name, e.g., "New User Signup"] |
| Owner | [Name] |
| Date | [Date] |
| User | [User type or persona] |
| Entry Point | [Where the user starts: URL, button, notification, email link] |
| Goal | [What the user is trying to accomplish, in one sentence] |
| Exit Point | [Where the user lands after completing the flow] |
Preconditions: [What must be true before the user enters this flow]
- ☐ [e.g., User has an account]
- ☐ [e.g., User has items in cart]
- ☐ [e.g., User has verified email]
Postconditions: [What is true after the flow completes successfully]
- ☐ [e.g., Order is placed and confirmation email sent]
- ☐ [e.g., User account is created and session is active]
Happy Path
The ideal scenario where everything goes right.
| Step | Screen / State | User Action | System Response | Notes |
|---|---|---|---|---|
| 1 | [Screen name] | [What user does] | [What system shows/does] | [Notes] |
| 2 | [Screen name] | [User action] | [System response] | [Notes] |
| 3 | [Screen name] | [User action] | [System response] | [Notes] |
| 4 | [Screen name] | [User action] | [System response] | [Notes] |
| 5 | [Success state] | - | [Confirmation] | [Notes] |
Decision Points
| # | Step | Condition | Path A | Path B | Path C |
|---|---|---|---|---|---|
| D1 | [Step #] | [What determines the branch] | [Where user goes if condition A] | [Where user goes if condition B] | [If applicable] |
| D2 | [Step #] | [Condition] | [Path A] | [Path B] | |
| D3 | [Step #] | [Condition] | [Path A] | [Path B] |
Alternative Paths
Legitimate variations from the happy path.
Alt Path 1: [Name, e.g., "Returning User"]
Trigger: [What condition creates this variation]
| Step | Screen / State | User Action | System Response |
|---|---|---|---|
| [#] | [Screen] | [Action] | [Response] |
| [#] | [Screen] | [Action] | [Response] |
Rejoins happy path at: [Step #]
Alt Path 2: [Name]
Trigger: [Condition]
| Step | Screen / State | User Action | System Response |
|---|---|---|---|
| [#] | [Screen] | [Action] | [Response] |
Rejoins happy path at: [Step #]
Error Paths
What happens when something goes wrong.
| # | Step | Error Condition | Error Message | Recovery Action | Fallback |
|---|---|---|---|---|---|
| E1 | [Step #] | [What fails] | [What user sees] | [How user recovers] | [If recovery fails] |
| E2 | [Step #] | [Error condition] | [Message] | [Recovery] | [Fallback] |
| E3 | [Step #] | [Error condition] | [Message] | [Recovery] | [Fallback] |
| E4 | [Step #] | [Error condition] | [Message] | [Recovery] | [Fallback] |
Common error conditions to check:
- ☐ Network failure (offline, timeout, 500 error)
- ☐ Invalid input (wrong format, too long, empty required field)
- ☐ Authentication failure (expired session, wrong credentials)
- ☐ Authorization failure (insufficient permissions)
- ☐ Not found (deleted resource, broken link)
- ☐ Rate limiting (too many requests)
- ☐ Empty state (no data to display)
Edge Cases
| # | Edge Case | Expected Behavior | Tested? |
|---|---|---|---|
| 1 | [Unusual condition, e.g., "User submits form twice rapidly"] | [Expected outcome] | Yes / No |
| 2 | [Edge case] | [Behavior] | [Tested?] |
| 3 | [Edge case] | [Behavior] | [Tested?] |
| 4 | [Edge case] | [Behavior] | [Tested?] |
Flow Diagram
[Entry Point]
│
▼
[Step 1: Screen Name]
│
▼
[Decision Point D1] ─── Condition B ──→ [Alt Path]
│ │
Condition A │
│ │
▼ │
[Step 2: Screen Name] │
│ │
▼ │
[Step 3: Screen Name] ← ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
│
│── Error ──→ [Error State] ──→ [Recovery]
│
▼
[Success State]
(Replace with a FigJam, Miro, or Whimsical diagram link for the actual visual.)
Filled Example: E-Commerce Checkout Flow
Flow Overview
| Field | Details |
|---|---|
| Flow Name | Checkout |
| Owner | Alex Rivera |
| Date | March 2026 |
| User | Logged-in customer with items in cart |
| Entry Point | "Checkout" button on cart page |
| Goal | Complete purchase and receive order confirmation |
| Exit Point | Order confirmation page |
Happy Path
| Step | Screen / State | User Action | System Response |
|---|---|---|---|
| 1 | Cart summary | Clicks "Checkout" | Loads shipping address form (pre-filled if address on file) |
| 2 | Shipping address | Confirms or edits address, clicks "Continue" | Validates address, shows shipping options with prices |
| 3 | Shipping method | Selects shipping speed, clicks "Continue" | Calculates total with tax, loads payment form |
| 4 | Payment | Enters card details, clicks "Place Order" | Processes payment via Stripe, shows loading spinner |
| 5 | Confirmation | Views order summary | Displays order number, sends confirmation email |
Decision Points
| # | Step | Condition | Path A | Path B |
|---|---|---|---|---|
| D1 | 2 | Has saved address? | Pre-fill form (happy path) | Show empty form |
| D2 | 4 | Has saved payment method? | Show saved card with "Use this card" option | Show empty payment form |
| D3 | 4 | Order total > $0? | Show payment form | Skip to confirmation (100% discount code) |
Error Paths
| # | Step | Error Condition | Error Message | Recovery Action |
|---|---|---|---|---|
| E1 | 2 | Address validation fails | "We couldn't verify this address. Please check the street and zip code." | Highlight invalid fields. Allow override with "Use this address anyway." |
| E2 | 4 | Payment declined | "Your card was declined. Please try a different payment method." | Show payment form again with card fields cleared. Suggest alternative methods. |
| E3 | 4 | Network timeout during payment | "We're having trouble processing your payment. Your card has not been charged." | Show "Try Again" button. If retry fails, show "Contact Support" with order details preserved. |
Edge Cases
| # | Edge Case | Expected Behavior |
|---|---|---|
| 1 | User has 50+ items in cart | Collapse cart summary with "Show all items" toggle. Total visible without scrolling. |
| 2 | Item goes out of stock during checkout | Show inline alert: "1 item is no longer available." Link to item. Adjust total. Do not block checkout of remaining items. |
| 3 | Promo code reduces total to $0 | Skip payment step entirely. Show "Complete Order" instead of "Place Order." |
| 4 | User clicks browser back from confirmation | Show "Your order has been placed" message. Do not resubmit. |
Key Takeaways
- Document three layers: happy path, alternative paths, and error paths. Most bugs and UX failures live in the last two
- Define the goal in one sentence. If you cannot, the flow is too broad
- Every decision point should have clear branch conditions and labeled paths
- Error messages should state the problem and suggest recovery. "Error 500" is not a user-facing message
- Review and update flows when usability testing or analytics reveal that users take a different path than documented
About This Template
Created by: Tim Adair
Last Updated: 3/4/2026
Version: 1.0.0
License: Free for personal and commercial use
