
Onboarding Cro
- 529 installs
- 23.5k repo stars
- Updated July 17, 2026
- alirezarezvani/claude-skills
onboarding-cro is a Claude Code skill with a Python activation funnel analyzer that quantifies onboarding drop-offs and prioritizes CRO fixes from funnel JSON step counts.
About
Onboarding-cro packages a Python activation funnel analyzer for SaaS founders who need hard numbers on where users stall before they rewrite UX copy blindly. You supply a JSON list of named steps with user counts—signup, verification, profile setup, first action, aha moment, activated—and the tool computes conversion from the top of funnel, step-to-step drop rates, and which step loses the most people. It runs in demo mode without data or from funnel.json with optional JSON stdout for agents. Use it in Grow when you are sizing onboarding experiments, arguing for one CRO bet over another, or feeding lifecycle retros. It complements qualitative session review by ranking leaks by magnitude.
- Activation funnel analyzer script for stepwise users, rates from start, and drop rates between steps
- Identifies worst drop-off step and dropped user counts for prioritization
- Accepts JSON funnel definitions or demo mode when no file is passed
- Optional --json output for piping into dashboards or agent follow-up tasks
- Example ladder from signup through email verify, profile, first action, aha, and day-7 activated
Onboarding Cro by the numbers
- 529 all-time installs (skills.sh)
- Ranked #733 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Jul 31, 2026 (Skillselion catalog sync)
npx skills add https://github.com/alirezarezvani/claude-skills --skill onboarding-croAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 529 |
|---|---|
| repo stars | ★ 23.5k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 17, 2026 |
| Repository | alirezarezvani/claude-skills ↗ |
How do you analyze onboarding funnel drop-off rates?
Quantify onboarding funnel drop-offs and prioritize CRO fixes using stepwise conversion and impact estimates from funnel JSON.
Who is it for?
Growth engineers and PMs with stepwise onboarding funnel JSON who need quantified drop-offs and impact-ranked CRO priorities.
Skip if: Teams without funnel step user counts or projects focused on unrelated marketing channels outside product onboarding.
When should I use this skill?
The user provides onboarding funnel JSON or asks to quantify activation drop-offs and prioritize onboarding CRO fixes.
What you get
Funnel drop-off report, per-step conversion metrics, prioritized CRO recommendations, and optional JSON analysis output.
- Drop-off analysis report
- Prioritized CRO recommendations
- JSON analysis output
Files
Onboarding CRO
You are an expert in user onboarding and activation. Your goal is to help users reach their "aha moment" as quickly as possible and establish habits that lead to long-term retention.
Initial Assessment
Check for product marketing context first: If .claude/product-marketing-context.md exists, read it before asking questions. Use that context and only ask for information not already covered or specific to this task.
Before providing recommendations, understand:
1. Product Context - What type of product? B2B or B2C? Core value proposition? 2. Activation Definition - What's the "aha moment"? What action indicates a user "gets it"? 3. Current State - What happens after signup? Where do users drop off?
---
Core Principles
1. Time-to-Value Is Everything
Remove every step between signup and experiencing core value.
2. One Goal Per Session
Focus first session on one successful outcome. Save advanced features for later.
3. Do, Don't Show
Interactive > Tutorial. Doing the thing > Learning about the thing.
4. Progress Creates Motivation
Show advancement. Celebrate completions. Make the path visible.
---
Defining Activation
Find Your Aha Moment
The action that correlates most strongly with retention:
- What do retained users do that churned users don't?
- What's the earliest indicator of future engagement?
Examples by product type:
- Project management: Create first project + add team member
- Analytics: Install tracking + see first report
- Design tool: Create first design + export/share
- Marketplace: Complete first transaction
Activation Metrics
- % of signups who reach activation
- Time to activation
- Steps to activation
- Activation by cohort/source
---
Onboarding Flow Design
Immediate Post-Signup (First 30 Seconds)
| Approach | Best For | Risk |
|---|---|---|
| Product-first | Simple products, B2C, mobile | Blank slate overwhelm |
| Guided setup | Products needing personalization | Adds friction before value |
| Value-first | Products with demo data | May not feel "real" |
Whatever you choose:
- Clear single next action
- No dead ends
- Progress indication if multi-step
Onboarding Checklist Pattern
When to use:
- Multiple setup steps required
- Product has several features to discover
- Self-serve B2B products
Best practices:
- 3-7 items (not overwhelming)
- Order by value (most impactful first)
- Start with quick wins
- Progress bar/completion %
- Celebration on completion
- Dismiss option (don't trap users)
Empty States
Empty states are onboarding opportunities, not dead ends.
Good empty state:
- Explains what this area is for
- Shows what it looks like with data
- Clear primary action to add first item
- Optional: Pre-populate with example data
Tooltips and Guided Tours
When to use: Complex UI, features that aren't self-evident, power features users might miss
Best practices:
- Max 3-5 steps per tour
- Dismissable at any time
- Don't repeat for returning users
---
Multi-Channel Onboarding
Email + In-App Coordination
Trigger-based emails:
- Welcome email (immediate)
- Incomplete onboarding (24h, 72h)
- Activation achieved (celebration + next step)
- Feature discovery (days 3, 7, 14)
Email should:
- Reinforce in-app actions, not duplicate them
- Drive back to product with specific CTA
- Be personalized based on actions taken
---
Handling Stalled Users
Detection
Define "stalled" criteria (X days inactive, incomplete setup)
Re-engagement Tactics
1. Email sequence - Reminder of value, address blockers, offer help 2. In-app recovery - Welcome back, pick up where left off 3. Human touch - For high-value accounts, personal outreach
---
Measurement
Key Metrics
| Metric | Description |
|---|---|
| Activation rate | % reaching activation event |
| Time to activation | How long to first value |
| Onboarding completion | % completing setup |
| Day 1/7/30 retention | Return rate by timeframe |
Funnel Analysis
Track drop-off at each step:
Signup → Step 1 → Step 2 → Activation → Retention
100% 80% 60% 40% 25%Run the bundled analyzer on your step counts instead of eyeballing:
python3 scripts/activation_funnel_analyzer.py funnel.json --json # no arg = embedded demoIt computes per-step drop-off, an activation score 0-100, and names the biggest-loss step. That step is where the audit focuses first.
---
Output Format
Onboarding Audit
Lead with the analyzer's output: activation score + the named biggest-drop step. Then, for each issue: Finding → Impact → Recommendation → Priority
Onboarding Flow Design
- Activation goal
- Step-by-step flow
- Checklist items (if applicable)
- Empty state copy
- Email sequence triggers
- Metrics plan
---
Common Patterns by Product Type
| Product Type | Key Steps |
|---|---|
| B2B SaaS | Setup wizard → First value action → Team invite → Deep setup |
| Marketplace | Complete profile → Browse → First transaction → Repeat loop |
| Mobile App | Permissions → Quick win → Push setup → Habit loop |
| Content Platform | Follow/customize → Consume → Create → Engage |
---
Experiment Ideas
When recommending experiments, consider tests for:
- Flow simplification (step count, ordering)
- Progress and motivation mechanics
- Personalization by role or goal
- Support and help availability
---
Task-Specific Questions
1. What action most correlates with retention? 2. What happens immediately after signup? 3. Where do users currently drop off? 4. What's your activation rate target? 5. Do you have cohort analysis on successful vs. churned users?
---
Related Skills
- signup-flow-cro — WHEN optimizing the registration and pre-onboarding flow before users ever land in-app. NOT when users have already signed up and activation is the goal.
- popup-cro — WHEN using in-product modals, tooltips, or overlays as part of the onboarding experience. NOT for standalone lead capture or exit-intent popups on the marketing site.
- paywall-upgrade-cro — WHEN onboarding naturally leads into an upgrade prompt after the aha moment is reached. NOT during early onboarding before value is delivered.
- ab-test-setup — WHEN running controlled experiments on onboarding flows, checklists, or step ordering. NOT for initial brainstorming or design.
- marketing-context — Foundation skill. ALWAYS load when product/ICP context is needed for personalized onboarding recommendations. NOT optional — load before this skill if available.
---
Communication
Deliver recommendations following the output quality standard: lead with the highest-leverage finding, provide a clear activation definition, then prioritize experiments by expected impact. Avoid vague advice — every recommendation should name a specific onboarding step, metric, or trigger. When writing onboarding copy or flows, ensure tone matches the product's brand voice (load marketing-context if available).
---
Proactive Triggers
- User mentions low Day-1 or Day-7 retention → immediately ask about their activation event and current post-signup flow.
- User shares a signup funnel with a big drop between "signup" and "first key action" → diagnose onboarding, not acquisition.
- User says "users sign up but don't come back" → frame this as an activation/onboarding problem, not a marketing problem.
- User asks about improving trial-to-paid conversion → check whether activation is defined and being reached before assuming pricing is the blocker.
- User mentions "onboarding emails aren't working" → ask what in-app onboarding exists first; email should support, not replace, in-app experience.
---
Output Artifacts
| Artifact | Description |
|---|---|
| Activation Definition Doc | Clearly defined aha moment, correlated action, and success metric |
| Onboarding Flow Diagram | Step-by-step post-signup flow with drop-off points and decision branches |
| Checklist Copy | 3–7 onboarding checklist items ordered by value, with completion messaging |
| Email Trigger Map | Trigger conditions, timing, and goals for each onboarding email in the sequence |
| Experiment Backlog | Prioritized A/B test ideas for onboarding steps, sorted by expected impact |
#!/usr/bin/env python3
"""
Activation Funnel Analyzer for Onboarding CRO
Analyzes user onboarding funnel data to identify drop-off points
and estimate the impact of improving each step.
Usage:
python3 activation_funnel_analyzer.py # Demo mode
python3 activation_funnel_analyzer.py funnel.json # From data
python3 activation_funnel_analyzer.py funnel.json --json # JSON output
Input format (JSON):
{
"steps": [
{"name": "Signup completed", "users": 1000},
{"name": "Email verified", "users": 850},
{"name": "Profile setup", "users": 620},
{"name": "First action", "users": 310},
{"name": "Aha moment", "users": 180},
{"name": "Activated (Day 7)", "users": 120}
]
}
"""
import json
import sys
import os
def analyze_funnel(data):
"""Analyze onboarding funnel for drop-offs and improvement potential."""
steps = data["steps"]
if len(steps) < 2:
return {"error": "Need at least 2 funnel steps"}
total_start = steps[0]["users"]
analysis = []
worst_step = None
worst_drop = 0
for i in range(len(steps)):
step = steps[i]
users = step["users"]
rate_from_start = (users / total_start * 100) if total_start > 0 else 0
if i == 0:
step_analysis = {
"step": step["name"],
"users": users,
"rate_from_start": round(rate_from_start, 1),
"drop_rate": 0,
"dropped_users": 0,
"is_worst": False
}
else:
prev_users = steps[i - 1]["users"]
dropped = prev_users - users
drop_rate = (dropped / prev_users * 100) if prev_users > 0 else 0
step_analysis = {
"step": step["name"],
"users": users,
"rate_from_start": round(rate_from_start, 1),
"drop_rate": round(drop_rate, 1),
"dropped_users": dropped,
"is_worst": False
}
if drop_rate > worst_drop:
worst_drop = drop_rate
worst_step = i
analysis.append(step_analysis)
if worst_step is not None:
analysis[worst_step]["is_worst"] = True
# Calculate improvement potential
final_users = steps[-1]["users"]
overall_conversion = (final_users / total_start * 100) if total_start > 0 else 0
improvements = []
if worst_step is not None:
worst = analysis[worst_step]
# What if we halved the drop-off at the worst step?
current_drop_rate = worst["drop_rate"] / 100
improved_drop_rate = current_drop_rate / 2
prev_users = steps[worst_step - 1]["users"]
gained_users = int(prev_users * (current_drop_rate - improved_drop_rate))
# Propagate improvement through remaining steps
cascade_rate = 1.0
for j in range(worst_step + 1, len(steps)):
if steps[j - 1]["users"] > 0:
cascade_rate *= steps[j]["users"] / steps[j - 1]["users"]
additional_activated = int(gained_users * cascade_rate)
improvements.append({
"action": f"Halve drop-off at '{worst['step']}'",
"current_drop": f"{worst['drop_rate']}%",
"target_drop": f"{worst['drop_rate'] / 2:.1f}%",
"users_saved": gained_users,
"additional_activated": additional_activated,
"impact_on_overall": f"+{(additional_activated / total_start * 100):.1f}pp"
})
# Score
score = min(100, max(0, int(overall_conversion * 5))) # 20% activation = 100
if overall_conversion < 5:
score = max(0, int(overall_conversion * 10))
return {
"steps": analysis,
"summary": {
"total_start": total_start,
"total_activated": final_users,
"overall_conversion": round(overall_conversion, 1),
"worst_step": analysis[worst_step]["step"] if worst_step else None,
"worst_drop_rate": round(worst_drop, 1),
"score": score
},
"improvements": improvements
}
def format_report(result):
"""Format human-readable report."""
lines = []
lines.append("")
lines.append("=" * 65)
lines.append(" ONBOARDING FUNNEL — ACTIVATION ANALYSIS")
lines.append("=" * 65)
lines.append("")
summary = result["summary"]
score = summary["score"]
bar = "█" * (score // 5) + "░" * (20 - score // 5)
lines.append(f" ACTIVATION SCORE: {score}/100")
lines.append(f" [{bar}]")
lines.append(f" Overall: {summary['total_start']} → {summary['total_activated']} ({summary['overall_conversion']}%)")
lines.append("")
# Funnel visualization
lines.append(" FUNNEL:")
max_users = result["steps"][0]["users"]
for step in result["steps"]:
bar_width = int(step["users"] / max_users * 40) if max_users > 0 else 0
bar_char = "█" * bar_width
marker = " ← WORST DROP" if step["is_worst"] else ""
drop_info = f" (-{step['drop_rate']}%)" if step["drop_rate"] > 0 else ""
lines.append(f" {bar_char} {step['users']:>5} | {step['step']}{drop_info}{marker}")
lines.append("")
# Step-by-step breakdown
lines.append(" STEP BREAKDOWN:")
lines.append(f" {'Step':<25} {'Users':>7} {'From Start':>12} {'Drop':>8} {'Lost':>7}")
lines.append(" " + "-" * 62)
for step in result["steps"]:
drop = f"-{step['drop_rate']}%" if step["drop_rate"] > 0 else "—"
lost = f"-{step['dropped_users']}" if step["dropped_users"] > 0 else "—"
lines.append(f" {step['step']:<25} {step['users']:>7} {step['rate_from_start']:>10.1f}% {drop:>8} {lost:>7}")
lines.append("")
# Improvement potential
if result["improvements"]:
lines.append(" 💡 IMPROVEMENT POTENTIAL:")
for imp in result["improvements"]:
lines.append(f" Action: {imp['action']}")
lines.append(f" Drop: {imp['current_drop']} → {imp['target_drop']}")
lines.append(f" Users saved at step: +{imp['users_saved']}")
lines.append(f" Additional activated: +{imp['additional_activated']}")
lines.append(f" Impact on overall rate: {imp['impact_on_overall']}")
lines.append("")
return "\n".join(lines)
SAMPLE_DATA = {
"steps": [
{"name": "Signup completed", "users": 1000},
{"name": "Email verified", "users": 840},
{"name": "Profile setup", "users": 580},
{"name": "First project created", "users": 290},
{"name": "Invited teammate", "users": 145},
{"name": "Aha moment (Day 3)", "users": 95},
{"name": "Activated (Day 7)", "users": 72}
]
}
def main():
use_json = "--json" in sys.argv
args = [a for a in sys.argv[1:] if a != "--json"]
if args and os.path.isfile(args[0]):
with open(args[0]) as f:
data = json.load(f)
else:
if not args:
print("[Demo mode — analyzing sample SaaS onboarding funnel]")
data = SAMPLE_DATA
result = analyze_funnel(data)
if use_json:
print(json.dumps(result, indent=2))
else:
print(format_report(result))
if __name__ == "__main__":
main()
Related skills
How it compares
Use onboarding-cro for step-count funnel math; use qualitative UX review skills when no quantitative funnel JSON exists.
FAQ
How do you run onboarding-cro analysis?
onboarding-cro runs via `python3 activation_funnel_analyzer.py funnel.json`, with optional `--json` output and a demo mode when no file is passed.
What input does onboarding-cro expect?
onboarding-cro expects funnel JSON with a steps array of objects containing name and users fields, such as Signup completed and Email verified counts.
Is Onboarding Cro safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.