← Back to all products
$19
Onboarding Flow
Onboarding wizard with progressive profiling, conditional setup steps, and completion tracking.
PythonMarkdown
📄 Product Preview
Try the interactive reader and demo tools below, or get the full product with all content unlocked.
📖 Interactive Reader (Free Preview) ⚙ Try Demo Tools 📦 Download Free Sample📁 File Structure 9 files
onboarding-flow/
├── LICENSE
├── README.md
├── examples/
│ └── basic_example.py
├── free-sample.zip
├── guide/
│ ├── 01_features.md
│ ├── 02_quick-start.md
│ └── 03_project-structure.md
├── index.html
└── src/
└── main.py
📖 Documentation Preview README excerpt
Onboarding Flow
A Python onboarding wizard for SaaS applications. Guides new users through setup steps with progressive profiling, conditional step logic, completion tracking, and automated welcome/completion emails — all built on Python's standard library.
Features
- Multi-step flows — Define ordered onboarding steps (form, choice, info, action types)
- Progressive profiling — Collect user data across multiple steps without overwhelming them
- Conditional steps — Show/hide steps based on user attributes (role, plan, etc.)
- Skip support — Optional steps can be skipped; required steps must be completed
- Completion tracking — Percentage-based progress tracking per user
- Welcome emails — HTML email templates with step overview and CTA buttons
- Completion emails — Congratulations email with summary of completed/skipped steps
- Template engine — Built-in
{{variable}}and{{#if condition}}template rendering - JSON persistence — Save/load flow definitions and user progress
Requirements
- Python 3.10+
- No external dependencies (stdlib only)
Quick Start
# Start with demo flow
python src/main.py --init-demo
# Custom port
python src/main.py --port 8002
Then try the API:
# List available flows
curl http://localhost:8002/api/flows
# Start onboarding for a user
curl -X POST http://localhost:8002/api/flows/<flow_id>/start \
-H "Content-Type: application/json" \
-d '{"user_id": "user_123", "context": {"role": "admin"}}'
# Complete a step
curl -X POST http://localhost:8002/api/flows/<flow_id>/complete-step \
-H "Content-Type: application/json" \
-d '{"user_id": "user_123", "step_id": "profile", "data": {"company": "Acme Corp"}}'
# Check progress
curl http://localhost:8002/api/flows/<flow_id>/progress/user_123
API Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/flows | List all onboarding flows |
| POST | /api/flows/:flow_id/start | Start a user on a flow |
| POST | /api/flows/:flow_id/complete-step | Complete a step with data |
| GET | /api/flows/:flow_id/progress/:user_id | Get user's progress |
... continues with setup instructions, usage examples, and more.
📄 Code Sample .py preview
src/main.py
#!/usr/bin/env python3
"""
Onboarding Flow — Progressive User Onboarding Wizard
======================================================
A complete onboarding system for SaaS applications. Guides new users through
setup steps with progressive profiling, tracks completion state, generates
welcome emails, and persists progress — all with Python's standard library.
Zero dependencies. Just run: python3 main.py
Part of the SaaS Starter collection by DataNest.
License: MIT
"""
from __future__ import annotations
import argparse
import json
import logging
import os
import re
import time
import uuid
from dataclasses import asdict, dataclass, field
from datetime import datetime, timezone, timedelta
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from http.server import BaseHTTPRequestHandler, HTTPServer
from pathlib import Path
from typing import Any, Optional
from urllib.parse import parse_qs, urlparse
# ---------------------------------------------------------------------------
# Configuration
# ---------------------------------------------------------------------------
DEFAULT_HOST = "0.0.0.0"
DEFAULT_PORT = 8002
DATA_DIR = Path("./onboarding-data")
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s — %(message)s",
datefmt="%Y-%m-%dT%H:%M:%S",
)
logger = logging.getLogger("onboarding")
# ---------------------------------------------------------------------------
# ... 656 more lines ...