TL;DR: User flow mapping visualizes the path users take from entry point to goal completion. Map flows to identify friction points, optimize conversion paths, and design intuitive experiences. This guide covers flow diagram creation, common patterns (linear, branching, cyclical), friction analysis, and optimization techniques. Includes templates, real examples, and tools to create your own flows.
The Hidden Journey Through Your Website
A user lands on your homepage. What happens next?
Most designers assume: “They’ll click Products, browse options, then purchase.”
Reality is messier:
- User lands on blog post from Google
- Clicks sidebar ad to pricing page
- Gets confused by terminology
- Navigates to About page
- Tries to sign up but form errors
- Abandons site entirely
That chaotic path? That’s a user flow. And you probably never designed for it.
User flow mapping makes these invisible journeys visible. Once you see how users actually move through your site, you can design the path you want them to take.
What is User Flow Mapping?
User flow: The complete path a user takes to accomplish a goal on your website.
Flow mapping: Visualizing that path as a diagram showing:
- Entry points (where users start)
- Actions (what users do)
- Decision points (where paths split)
- Pages/screens (what users see)
- Exit points (where users leave)
Think of it as a map of your digital territory. You wouldn’t build a physical store without blueprints. Why build digital experiences without flow maps?
Components of a Flow Diagram
[Entry Point]
↓
[Screen/Page]
↓
<Decision Point?>
↙ ↘
[Path A] [Path B]
↓ ↓
[Goal] [Exit]
Shapes matter:
- Rectangles: Pages/screens
- Diamonds: Decision points
- Circles: Entry/exit points
- Arrows: Direction of flow
- Dotted lines: Optional paths
Why User Flows Matter
1. Reveals Friction Points
Homepage → Products → Product Detail → Add to Cart
→ Cart Page → Checkout Step 1 → [70% abandon here]
Analytics show 70% abandon at checkout step 1. But why? Flow mapping combined with user testing reveals: users didn’t realize shipping costs weren’t calculated until this step. Unexpected costs = abandoned carts.
Solution: Display estimated shipping on product pages. Abandonment drops to 35%.
2. Identifies Wasted Steps
Original flow (7 steps):
Landing → Features → Pricing → Signup → Email Verify
→ Profile Setup → Payment → Dashboard
Optimized flow (4 steps):
Landing → Signup → Payment → Dashboard
(Features/Pricing accessible anytime, profile optional)
Reducing steps from 7 to 4 increased conversion 43%.
3. Exposes Dead Ends
User lands on blog post → reads → [no CTA, nowhere to go]
Blog posts are dead ends. Adding contextual CTAs to posts increased conversions from blog traffic by 89%.
4. Highlights User Confusion
Pricing Page → [users can't tell which plan fits them]
→ Contact Sales (instead of self-serve signup)
Too many users defaulting to “Contact Sales” suggests pricing confusion. Adding a comparison table and plan selector tool reduced sales inquiries 60% while increasing self-serve signups 35%.
Types of User Flows
Linear Flow: Single Path to Goal
When to use: Onboarding, checkout, signup processes where you control the sequence.
[Start]
↓
[Step 1: Enter Email]
↓
[Step 2: Create Password]
↓
[Step 3: Verify Email]
↓
[Goal: Account Created]
Example: SaaS Signup
<!-- Step 1 -->
<div class="signup-step-1">
<h2>Create Your Account</h2>
<input type="email" placeholder="Work email">
<button>Continue</button>
<p>Step 1 of 3</p>
</div>
<!-- Step 2 -->
<div class="signup-step-2">
<h2>Choose Your Password</h2>
<input type="password" placeholder="Password (8+ characters)">
<button>Continue</button>
<p>Step 2 of 3</p>
</div>
<!-- Step 3 -->
<div class="signup-step-3">
<h2>Verify Your Email</h2>
<p>We sent a code to [email protected]</p>
<input type="text" placeholder="Enter 6-digit code">
<button>Complete Signup</button>
<p>Step 3 of 3</p>
</div>
Pros: Predictable, easy to optimize, clear progress indicators
Cons: Inflexible, frustrating if users want to skip steps
Branching Flow: Multiple Paths Based on Decisions
When to use: E-commerce, content sites, products with different user segments.
[Homepage]
↓
<User Type?>
↙ ↘
[Individual] [Business]
↓ ↓
[Personal Plan] [Team Plan]
↓ ↓
[Checkout] [Contact Sales]
Example: Pricing Page Flow
[Pricing Page]
↓
<Monthly or Annual?>
↙ ↘
[Monthly Plans] [Annual Plans (20% off)]
↓ ↓
<Choose Plan> <Choose Plan>
↙ ↓ ↘ ↙ ↓ ↘
[Basic][Pro][Ent] [Basic][Pro][Ent]
↓ ↓ ↓ ↓ ↓ ↓
[Checkout Form] [Checkout Form]
↓ ↓
[Payment] [Payment]
↓ ↓
[Success] [Success]
Pros: Accommodates different user needs, feels personalized
Cons: More complex to design and test, more potential failure points
Cyclical Flow: Users Return to Previous Steps
When to use: Dashboards, apps, content platforms where users repeatedly perform actions.
[Dashboard]
↓
[Create New Project]
↓
[Edit Project]
↓
[Save]
↓
[Dashboard] ← user returns
↓
[View Projects]
↓
[Dashboard] ← user returns again
Example: Project Management App
Main cycle:
Dashboard → Projects → Create/Edit → Save → Dashboard
Secondary cycles:
Dashboard → Team → Invite Members → Dashboard
Dashboard → Settings → Update → Dashboard
Dashboard → Reports → Export → Dashboard
Pros: Flexible, supports repeated use, accommodates exploration
Cons: Can feel directionless without clear navigation, higher learning curve
Creating Your First User Flow
Step 1: Define the Goal
Start with what success looks like.
Examples:
- E-commerce: User purchases product
- SaaS: User creates account and completes first project
- Blog: User subscribes to newsletter
- Lead gen: User fills out contact form
Be specific: ❌ Bad goal: “User engages with site” ✅ Good goal: “User signs up for free trial”
Step 2: Identify Entry Points
Where do users begin? Don’t assume homepage.
Common entry points:
- Homepage (25-40% of traffic)
- Blog posts (30-50% via search)
- Landing pages (paid ads, campaigns)
- Product pages (direct links, social)
- Pricing page (comparison shopping)
Analytics reveal real entry points:
// Track entry pages
analytics.track('page_view', {
is_entry: document.referrer === '' || !document.referrer.includes(window.location.hostname),
entry_page: window.location.pathname,
referrer: document.referrer
});
Design flows for actual entry points, not ideal ones.
Step 3: Map User Actions
What can users do at each step?
Example: Product page
[Product Page]
Users can:
→ View images (gallery)
→ Read description
→ Check reviews
→ See pricing
→ Select options (size, color)
→ Add to cart
→ Add to wishlist
→ Share
→ Continue shopping
→ Leave site
Every possible action = potential branch in your flow.
Step 4: Identify Decision Points
Where do users make choices that affect their path?
<Returning User?>
↙ ↘
[Login] [Sign Up]
↓ ↓
[Dashboard] [Onboarding]
Common decision points:
- New vs returning user
- Plan selection (pricing)
- Shipping vs pickup
- Continue vs save for later
- Standard vs express checkout
Step 5: Document Friction Points
Where do users struggle, hesitate, or abandon?
Analytics signals:
- High exit rate on specific pages
- Long time on page (confusion, not engagement)
- Repeated visits to same page
- Form field abandonment
- Back button usage
User testing reveals:
- Confusion about next steps
- Unclear CTAs
- Unexpected requirements
- Technical errors
- Missing information
Step 6: Draw the Flow
Use flowchart software or pen and paper.
Tools:
- Figma (free, collaborative)
- Miro (whiteboarding)
- Lucidchart (dedicated flowcharts)
- Whimsical (simple, fast)
- FigJam (Figma’s whiteboarding tool)
Basic structure:
[Entry Point]
↓
┌─────────────┐
│ Screen │
│ Name │
└─────────────┘
↓
◇ Decision?
↙ ↘
Path A Path B
↓ ↓
[Goal] [Exit]
Real-World Example: E-commerce Checkout Flow
Current Flow (Problem)
[Product Page]
↓
[Add to Cart]
↓
[View Cart Page]
↓
<Continue Shopping or Checkout?>
↙ ↘
[Products] [Checkout Step 1: Shipping]
↓
[Checkout Step 2: Payment]
↓
[Checkout Step 3: Review]
↓
[Order Complete]
Drop-off rates:
- Cart to Checkout Step 1: 35% abandon
- Step 1 to Step 2: 20% abandon
- Step 2 to Step 3: 15% abandon
- Step 3 to Complete: 10% abandon
Total conversion: Only 36.5% complete purchase
Analysis: Why Users Abandon
Cart to Step 1 (35% abandon):
- Unexpected shipping costs revealed
- Required account creation
- No guest checkout option
Step 1 to Step 2 (20% abandon):
- Form too long (12 fields)
- No autofill support
- Unclear error messages
Step 2 to Step 3 (15% abandon):
- Payment options unclear
- No trust signals (security badges)
- Unexpected fees (tax, handling)
Step 3 to Complete (10% abandon):
- Slow payment processing
- No loading indicator
- Technical errors
Optimized Flow (Solution)
[Product Page]
↓ (Show estimated shipping upfront)
[Add to Cart] → Mini-cart preview with total
↓
<Returning User?>
↙ ↘
[Express Checkout] [Guest Checkout]
↓ ↓
[Shipping + Payment [Shipping Info (6 fields)]
Pre-filled] ↓
↓ [Payment (saved cards or new)]
[Review Order] ↓
↓ [Review Order]
[Complete] ↓
[Complete]
New drop-off rates:
- Cart to Checkout: 18% abandon (was 35%)
- Checkout to Payment: 8% abandon (was 20%)
- Payment to Review: 5% abandon (was 15%)
- Review to Complete: 3% abandon (was 10%)
Total conversion: 69.7% complete purchase
Improvement: +91% conversion rate
Changes Made
1. Upfront Cost Transparency
<!-- Product page shows total upfront -->
<div class="product-pricing">
<div class="price">$49.99</div>
<div class="shipping-preview">
+ Estimated shipping: $5.99
<span class="total">Total: ~$55.98</span>
</div>
</div>
2. Express Checkout for Returning Users
// Detect returning user
if (localStorage.getItem('userId')) {
// Show one-click checkout with saved info
showExpressCheckout();
} else {
// Show guest checkout (no account required)
showGuestCheckout();
}
3. Reduced Form Fields
<!-- From 12 fields to 6 -->
<form class="checkout-form">
<!-- Shipping -->
<input type="text" name="name" placeholder="Full Name" required>
<input type="email" name="email" placeholder="Email" required>
<input type="tel" name="phone" placeholder="Phone" required>
<input type="text" name="address" placeholder="Street Address" required autocomplete="street-address">
<input type="text" name="city" placeholder="City" required autocomplete="address-level2">
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 16px;">
<input type="text" name="state" placeholder="State" required autocomplete="address-level1">
<input type="text" name="zip" placeholder="ZIP" required autocomplete="postal-code">
</div>
<!-- Removed: Country (auto-detected), Phone2, Company, Address2, County -->
</form>
4. Single-Page Checkout
<!-- All steps visible on one page -->
<div class="single-page-checkout">
<section class="checkout-shipping">
<h2>1. Shipping Information</h2>
<!-- Fields here -->
</section>
<section class="checkout-payment">
<h2>2. Payment Method</h2>
<!-- Payment options here -->
</section>
<section class="checkout-review">
<h2>3. Order Summary</h2>
<!-- Order details here -->
<button class="checkout-submit">Complete Purchase</button>
</section>
</div>
5. Trust Signals Throughout
<div class="trust-indicators">
<span>🔒 Secure 256-bit SSL Encryption</span>
<span>💳 All major cards accepted</span>
<span>📦 Free returns within 30 days</span>
</div>
Optimizing Specific Flow Patterns
Pattern 1: Signup/Onboarding Flows
Goal: Convert visitors to registered users
Common friction points:
- Too many required fields
- Unclear value proposition
- No social login options
- Immediate payment requirement
- Lack of progress indication
Optimization tactics:
Minimal initial signup:
[Landing] → [Email + Password] → [Verify Email] → [Dashboard]
Progressive profiling:
[Dashboard] → Prompt to add profile photo
→ Prompt to invite team
→ Prompt to create first project
Users provide info gradually, not all upfront
Code example:
// Progressive onboarding
const onboardingSteps = [
{ id: 'profile', completed: false },
{ id: 'invite_team', completed: false },
{ id: 'first_project', completed: false }
];
function showNextStep() {
const nextStep = onboardingSteps.find(step => !step.completed);
if (nextStep) {
showOnboardingPrompt(nextStep.id);
} else {
markOnboardingComplete();
}
}
Pattern 2: Content Discovery Flows
Goal: Keep users engaged, exploring content
Common friction points:
- No related content recommendations
- Dead-end articles (no next steps)
- Confusing navigation
- No search function
Optimization tactics:
[Article Page]
↓
Related Articles (3-5 recommendations)
↓
<User clicks one>
↓
[New Article]
↓
Related Articles (different recommendations)
↓
[Cyclical engagement continues]
After 3+ articles:
[Newsletter Signup Prompt]
Implementation:
<!-- End of article -->
<section class="related-content">
<h3>Continue Reading</h3>
<div class="article-grid">
<a href="/article-1" class="article-card">
<img src="thumb-1.jpg" alt="">
<h4>Related Article Title</h4>
<p>Brief description...</p>
</a>
<!-- 2-4 more related articles -->
</div>
</section>
<!-- After 3 pageviews -->
<div class="newsletter-prompt" style="display: none;">
<h3>Enjoying our content?</h3>
<p>Get weekly articles delivered to your inbox</p>
<input type="email" placeholder="[email protected]">
<button>Subscribe</button>
</div>
Pattern 3: Lead Generation Flows
Goal: Capture contact information from qualified leads
Common friction points:
- Form appears too early
- Too many required fields
- Unclear value exchange
- No trust signals
Optimization tactics:
[Landing Page]
↓
[Value Demonstration] (video, case study, free tool)
↓
<User engages with content>
↓
[Soft Capture: "Want more?"]
↓
[Email Only] (not full form yet)
↓
[Deliver Promised Value]
↓
[Nurture Sequence]
↓
[Full Form for High-Value Asset]
Progressive form example:
<!-- Step 1: Low barrier -->
<div class="lead-form-step-1">
<h3>Download Free Guide</h3>
<input type="email" placeholder="Your email" required>
<button>Send Me the Guide</button>
<p style="font-size: 12px; color: #666;">No spam, unsubscribe anytime</p>
</div>
<!-- Step 2: After user engaged -->
<div class="lead-form-step-2">
<h3>Unlock Premium Content</h3>
<input type="text" placeholder="Company Name" required>
<input type="text" placeholder="Job Title" required>
<button>Get Premium Access</button>
</div>
Measuring Flow Performance
Key Metrics by Flow Stage
Entry metrics:
- Traffic sources
- Landing page bounce rate
- Time to first action
Progress metrics:
- Step completion rate
- Time per step
- Drop-off points
Exit metrics:
- Conversion rate
- Exit pages
- Abandonment reasons
Analytics Implementation
// Track flow progress
class UserFlowTracker {
constructor(flowName) {
this.flowName = flowName;
this.startTime = Date.now();
this.currentStep = 0;
}
trackStep(stepName) {
this.currentStep++;
analytics.track('flow_step', {
flow: this.flowName,
step: this.currentStep,
step_name: stepName,
time_elapsed: Date.now() - this.startTime
});
}
trackCompletion() {
analytics.track('flow_complete', {
flow: this.flowName,
total_steps: this.currentStep,
total_time: Date.now() - this.startTime
});
}
trackAbandonment(reason) {
analytics.track('flow_abandoned', {
flow: this.flowName,
step: this.currentStep,
reason: reason
});
}
}
// Usage
const signupFlow = new UserFlowTracker('signup');
signupFlow.trackStep('email_entered');
signupFlow.trackStep('password_created');
signupFlow.trackStep('email_verified');
signupFlow.trackCompletion();
Funnel Visualization
// Calculate drop-off at each step
const funnelData = {
'Landing Page': 10000,
'Signup Page': 3000, // 70% drop
'Email Verify': 2100, // 30% drop
'Complete Profile': 1680, // 20% drop
'First Project': 1344 // 20% drop
};
// Overall conversion: 13.44%
// Biggest problem: Landing → Signup (70% drop)
Common Flow Problems and Solutions
Problem 1: High Drop-Off at Single Step
Diagnosis: One step has much higher abandonment than others
Step 1: 100 users → Step 2: 90 users (10% drop) ✓
Step 2: 90 users → Step 3: 27 users (70% drop) ❌
Step 3: 27 users → Step 4: 24 users (11% drop) ✓
Solutions:
- Simplify the problematic step
- Split into multiple easier steps
- Add progress indicators
- Provide help text or examples
- Remove the step entirely if possible
Problem 2: Users Backtrack Repeatedly
Diagnosis: Analytics show users going backward in flow
Step 1 → Step 2 → Step 1 → Step 2 → Step 3
Causes:
- Missing information in earlier steps
- Unclear instructions
- Need to reference previous content
- Form validation errors
Solutions:
<!-- Show summary of previous steps -->
<div class="step-summary">
<h4>Your Information</h4>
<p>Email: [email protected] <a href="#step1">Edit</a></p>
<p>Shipping: 123 Main St... <a href="#step2">Edit</a></p>
</div>
<!-- Current step -->
<div class="current-step">
<h3>Payment Information</h3>
<!-- Payment form -->
</div>
Problem 3: Users Don’t Know What to Do Next
Diagnosis: Long time on page, low click-through rate
Causes:
- No clear CTA
- Multiple competing CTAs
- CTA not visible
- Unclear benefit of next step
Solutions:
<!-- Bad: Unclear next step -->
<div class="page-end">
<p>Thanks for reading!</p>
</div>
<!-- Good: Clear next action -->
<div class="page-end">
<h3>Ready to get started?</h3>
<button class="cta-primary">Create Your Free Account</button>
<p>No credit card required • 14-day trial</p>
</div>
Problem 4: Mobile vs Desktop Flow Differences
Diagnosis: Desktop converts well, mobile doesn’t (or vice versa)
Solutions:
<!-- Desktop: Multi-column comparison -->
<div class="pricing-desktop" style="display: grid; grid-template-columns: repeat(3, 1fr);">
<!-- 3 plans side by side -->
</div>
<!-- Mobile: Stacked with tabs -->
<div class="pricing-mobile">
<div class="plan-selector">
<button class="active">Basic</button>
<button>Pro</button>
<button>Enterprise</button>
</div>
<div class="plan-details">
<!-- One plan at a time -->
</div>
</div>
Advanced Flow Techniques
Multi-Path Attribution
Users rarely take linear paths. Track all touchpoints:
// Track full user journey
const userJourney = [];
function trackTouchpoint(page, source) {
userJourney.push({
page: page,
source: source,
timestamp: Date.now()
});
localStorage.setItem('journey', JSON.stringify(userJourney));
}
// On conversion
function trackConversion() {
const journey = JSON.parse(localStorage.getItem('journey'));
analytics.track('conversion', {
touchpoints: journey,
total_visits: journey.length
});
}
Conditional Flows Based on User Behavior
// Adapt flow to user behavior
function determineNextStep(user) {
if (user.visitCount > 5 && !user.signedUp) {
// High intent, show signup prompt
return 'signup';
} else if (user.timeOnSite > 180 && !user.downloadedGuide) {
// Engaged but not converted, offer lead magnet
return 'guide_download';
} else if (user.pagesViewed > 10) {
// Very engaged, offer demo
return 'demo_request';
} else {
// New visitor, continue normal flow
return 'continue';
}
}
Exit-Intent Flows
// Trigger alternate flow on exit intent
let exitIntentShown = false;
document.addEventListener('mouseleave', (e) => {
if (e.clientY < 10 && !exitIntentShown) {
exitIntentShown = true;
// Show exit-specific flow
showExitFlow();
}
});
function showExitFlow() {
// Different path for users leaving
// Example: Discount offer, email capture, feedback request
}
Tools and Templates
Flow Mapping Tools
Free:
- Figma (with Figjam)
- Draw.io
- Google Drawings
- Whimsical (limited free)
Paid:
- Lucidchart
- Miro
- Microsoft Visio
Flow Analysis Tools
Behavioral:
- Hotjar (funnels, recordings)
- FullStory (session replay)
- Heap (automatic event tracking)
Traditional:
- Google Analytics (behavior flow)
- Mixpanel (funnel analysis)
- Amplitude (user paths)
Template: Basic Flow Document
FLOW NAME: [e.g., "E-commerce Purchase Flow"]
GOAL: [e.g., "User completes purchase"]
ENTRY POINTS:
- Homepage
- Product page (from Google)
- Email campaign
STEPS:
1. [Entry] → Landing page
2. Browse products
3. View product detail
4. Add to cart
5. Begin checkout
6. Enter shipping
7. Enter payment
8. Review order
9. [Goal] Confirm purchase
CURRENT METRICS:
- Entry to Step 1: 100%
- Step 1 to Step 2: 45%
- Step 2 to Step 3: 60%
...
FRICTION POINTS:
- High exit at Step 5 (unexpected shipping costs)
- Long time at Step 6 (form too complex)
OPTIMIZATION IDEAS:
- Show shipping estimate earlier
- Reduce form fields
- Add progress indicator
Conclusion: Map First, Design Second
User flows aren’t documentation—they’re design tools.
Map your flows before designing screens. You’ll spot problems in abstract that would cost thousands to fix in production.
Every pixel you design exists within a flow. Isolated screen designs look beautiful but fail when users can’t figure out where to go next.
Key takeaways:
- Define clear goals before mapping flows
- Map actual behavior, not ideal behavior
- Identify friction early through analytics and testing
- Optimize drop-off points first (highest impact)
- Test flows, not just screens
- Iterate constantly as user behavior changes
- Mobile and desktop often need different flows
Start today: Pick your most important conversion goal. Map the current flow from entry to conversion. Identify the biggest drop-off point.
Fix that one point. Measure impact. Repeat.
User flows aren’t sexy. But they’re the difference between beautiful designs that convert and beautiful designs that don’t.
Frequently Asked Questions
Q: How detailed should flow diagrams be?
Start high-level (major steps only). Add detail where problems exist. A 5-step overview is more useful than a 50-step diagram nobody reads.
Q: Should I map every possible path?
No. Map the happy path (ideal user journey) first, then add major variations. Document edge cases separately.
Q: How often should I update flow maps?
After major design changes, quarterly reviews, or when metrics show new problems. Treat flows as living documents.
Q: What if users take unexpected paths?
Good! Analytics revealing unexpected paths means you’re learning actual behavior. Update your maps and consider designing for those paths.
Q: Do I need special tools?
No. Pen and paper work. Digital tools help with collaboration and iteration, but start simple.
Q: How do I get stakeholder buy-in for flow improvements?
Show data. “This step has 70% abandonment” gets attention. “Reducing this by 10% = $X additional revenue” gets budget.
Q: Should flows be different for different user segments?
Often yes. New vs returning users, different product lines, B2B vs B2C—all may need distinct flows. Map your primary segment first.
Further Reading
Books:
- Don’t Make Me Think by Steve Krug
- The Elements of User Experience by Jesse James Garrett
- Designing for the Digital Age by Kim Goodwin
Articles:
- Nielsen Norman Group: User Experience Mapping
- Smashing Magazine: User Flow Best Practices
- UX Collective: Flow Design Patterns
Tools:
- Figma: figma.com
- Miro: miro.com
- Lucidchart: lucidchart.com