SaaS-producten winnen of verliezen in de eerste 7 dagen. Uit onderzoek blijkt dat 60-70% van de gebruikers die zich aanmelden voor een gratis trial, de applicatie na de eerste sessie nooit meer openen. Dat is geen productprobleem — het is een onboardingprobleem.
In dit artikel duiken we diep in het bouwen van geautomatiseerde onboarding-flows die gebruikers activeren, waarde laten zien, en churn drastisch verminderen.
Waarom onboarding je belangrijkste feature is
De meeste SaaS-founders focussen op het bouwen van nieuwe features. Maar de data is duidelijk:
- Gebruikers die de onboarding voltooien hebben een 3-5x hogere retentie na 90 dagen
- Time-to-value (de tijd tot een gebruiker het "aha-moment" bereikt) is de #1 voorspeller van conversie
- Een verbetering van 10% in onboarding-completie kan leiden tot 25%+ meer omzet
Het probleem? De meeste SaaS-applicaties behandelen onboarding als een statische tour of een reeks tooltips. Dat is niet genoeg.
De anatomie van een effectieve onboarding-flow
Een goede onboarding-flow heeft vier lagen:
1. Welcome Flow (Dag 0)
Direct na registratie moet je drie dingen doen:
// Voorbeeld: onboarding state machine met XState
import { createMachine, assign } from 'xstate';
interface OnboardingContext {
userId: string;
completedSteps: string[];
userRole: 'founder' | 'developer' | 'marketer';
companySize: 'solo' | 'small' | 'medium' | 'enterprise';
}
const onboardingMachine = createMachine<OnboardingContext>({
id: 'onboarding',
initial: 'welcome',
states: {
welcome: {
on: { COMPLETE_PROFILE: 'roleSelection' }
},
roleSelection: {
on: {
SELECT_ROLE: {
target: 'guidedSetup',
actions: assign({
userRole: (_, event) => event.role
})
}
}
},
guidedSetup: {
on: {
COMPLETE_SETUP: 'firstValue'
}
},
firstValue: {
on: {
VALUE_ACHIEVED: 'activated'
}
},
activated: {
type: 'final'
}
}
});
Drie cruciale acties bij registratie:
- Vraag naar de rol/context van de gebruiker (personaliseer de ervaring)
- Toon het eindresultaat — niet wat je product doet, maar wat zij ermee bereiken
- Geef één duidelijke volgende stap — niet vijf, niet tien, één
2. Progressieve Activatie (Dag 1-3)
Hier maken de meeste SaaS-producten hun grootste fout: ze dumpen alle features tegelijk op de gebruiker. In plaats daarvan, gebruik progressive disclosure:
// Progressieve feature-ontsluiting op basis van gebruikersgedrag
interface ActivationMilestone {
id: string;
title: string;
description: string;
trigger: () => boolean;
unlocksFeatures: string[];
celebrationMessage: string;
}
const milestones: ActivationMilestone[] = [
{
id: 'first-project',
title: 'Eerste project aangemaakt',
description: 'Maak je eerste project aan om te beginnen',
trigger: () => userProjects.length >= 1,
unlocksFeatures: ['templates', 'collaboration'],
celebrationMessage: '🎉 Geweldig! Je eerste project staat live.'
},
{
id: 'first-integration',
title: 'Eerste integratie gekoppeld',
description: 'Koppel een tool die je al gebruikt',
trigger: () => userIntegrations.length >= 1,
unlocksFeatures: ['automations', 'webhooks'],
celebrationMessage: '🔗 Perfect! Nu wordt het pas echt krachtig.'
},
{
id: 'invite-team',
title: 'Teamlid uitgenodigd',
description: 'Nodig een collega uit om samen te werken',
trigger: () => teamMembers.length >= 2,
unlocksFeatures: ['permissions', 'audit-log'],
celebrationMessage: '👥 Teamwork makes the dream work!'
}
];
3. Geautomatiseerde E-mail Sequences (Dag 0-14)
E-mail is nog steeds het krachtigste kanaal voor onboarding. Maar de meeste SaaS-bedrijven sturen generieke drip-campagnes. Bouw in plaats daarvan gedragsgestuurde sequences:
// Gedragsgestuurde e-mail logica
interface EmailTrigger {
event: string;
delay: string;
condition: (user: User) => boolean;
template: string;
}
const onboardingEmails: EmailTrigger[] = [
{
event: 'user.registered',
delay: '0m',
condition: () => true,
template: 'welcome-with-quickstart'
},
{
event: 'user.registered',
delay: '24h',
condition: (user) => !user.hasCompletedSetup,
template: 'setup-reminder-with-video'
},
{
event: 'user.registered',
delay: '72h',
condition: (user) => !user.hasAchievedFirstValue,
template: 'value-proposition-with-case-study'
},
{
event: 'user.first_value_achieved',
delay: '0m',
condition: () => true,
template: 'congratulations-next-steps'
},
{
event: 'user.registered',
delay: '7d',
condition: (user) => user.isOnTrial && !user.hasConverted,
template: 'trial-midpoint-offer'
}
];
Belangrijke regels voor onboarding e-mails:
- Stuur vanuit een persoon, niet vanuit "noreply@bedrijf.nl"
- Eén call-to-action per e-mail — niet drie links naar verschillende features
- Reageer op gedrag — als iemand al geactiveerd is, stuur geen "heb je hulp nodig?" mail
- A/B test alles — vooral de eerste e-mail (die heeft 80%+ open rate)
4. In-App Guidance (Continu)
Tooltips en product tours zijn niet dood — ze worden alleen verkeerd gebruikt. De sleutel is contextuele hulp:
// Contextuele in-app hulp component
import { useState, useEffect } from 'react';
interface GuidanceRule {
id: string;
targetElement: string;
message: string;
showWhen: (state: AppState) => boolean;
dismissable: boolean;
position: 'top' | 'bottom' | 'left' | 'right';
}
function useContextualGuidance(rules: GuidanceRule[]) {
const [activeGuidance, setActiveGuidance] = useState<GuidanceRule | null>(null);
const appState = useAppState();
const dismissedIds = useDismissedGuidance();
useEffect(() => {
const applicable = rules.find(
rule => rule.showWhen(appState) && !dismissedIds.includes(rule.id)
);
setActiveGuidance(applicable || null);
}, [appState, rules, dismissedIds]);
return activeGuidance;
}
// Gebruik
const guidanceRules: GuidanceRule[] = [
{
id: 'empty-dashboard',
targetElement: '[data-guide="dashboard"]',
message: 'Je dashboard is nog leeg. Begin met het aanmaken van je eerste project!',
showWhen: (state) => state.projects.length === 0 && state.currentPage === 'dashboard',
dismissable: true,
position: 'bottom'
},
{
id: 'first-report',
targetElement: '[data-guide="reports"]',
message: 'Nu je data hebt, kun je je eerste rapport genereren.',
showWhen: (state) => state.dataPoints > 10 && !state.hasGeneratedReport,
dismissable: true,
position: 'left'
}
];
Meten wat ertoe doet: onboarding metrics
Je kunt niet verbeteren wat je niet meet. Volg deze metrics:
| Metric | Formule | Benchmark |
|---|---|---|
| Activation Rate | Gebruikers die aha-moment bereiken / Totaal aanmeldingen | 20-40% |
| Time-to-Value | Mediane tijd van registratie tot eerste waarde | < 5 minuten |
| Onboarding Completion | Gebruikers die alle stappen voltooien / Totaal gestart | 50-70% |
| Day 1 Retention | Gebruikers die dag 2 terugkomen / Dag 1 aanmeldingen | 40-60% |
| Day 7 Retention | Gebruikers die dag 8 terugkomen / Dag 1 aanmeldingen | 20-35% |
-- Onboarding funnel query in PostgreSQL
WITH onboarding_funnel AS (
SELECT
DATE_TRUNC('week', u.created_at) AS cohort_week,
COUNT(DISTINCT u.id) AS total_signups,
COUNT(DISTINCT CASE WHEN os.profile_completed THEN u.id END) AS completed_profile,
COUNT(DISTINCT CASE WHEN os.first_project_created THEN u.id END) AS created_project,
COUNT(DISTINCT CASE WHEN os.first_value_achieved THEN u.id END) AS achieved_value,
COUNT(DISTINCT CASE WHEN s.status = 'active' THEN u.id END) AS converted
FROM users u
LEFT JOIN onboarding_states os ON os.user_id = u.id
LEFT JOIN subscriptions s ON s.user_id = u.id
WHERE u.created_at >= NOW() - INTERVAL '12 weeks'
GROUP BY 1
ORDER BY 1
)
SELECT
cohort_week,
total_signups,
ROUND(100.0 * completed_profile / total_signups, 1) AS profile_pct,
ROUND(100.0 * created_project / total_signups, 1) AS project_pct,
ROUND(100.0 * achieved_value / total_signups, 1) AS value_pct,
ROUND(100.0 * converted / total_signups, 1) AS conversion_pct
FROM onboarding_funnel;
Praktijkvoorbeeld: onboarding-flow voor een projectmanagement-SaaS
Laten we dit concreet maken met een voorbeeld:
Stap 1: Registratie → Vraag: "Wat is je rol?" (PM, Developer, Manager)
Stap 2: Gepersonaliseerde setup → Op basis van de rol:
- PM → Template met sprints en backlog
- Developer → Git-integratie wizard
- Manager → Team-uitnodiging + rapportage-setup
Stap 3: Quick win → Automatisch een voorbeeldproject met realistische data laden, zodat het dashboard er niet leeg uitziet
Stap 4: Guided action → "Sleep deze taak naar 'In Progress' om je eerste statusupdate te maken"
Stap 5: Celebration → Confetti-animatie + "Je eerste sprint is gestart! 🚀"
Dit hele proces duurt minder dan 3 minuten en de gebruiker heeft al waarde ervaren.
Veelgemaakte fouten
- Te veel vragen bij registratie — Houd het bij 2-3 velden. Elk extra veld kost je 10-15% conversie
- Geen lege-state design — Een leeg dashboard is een dood dashboard. Vul het met voorbeelddata of een duidelijke CTA
- Onboarding = product tour — Een rondleiding is geen onboarding. Onboarding eindigt pas als de gebruiker waarde ervaart
- Geen segmentatie — Een solo-founder heeft een compleet andere onboarding nodig dan een enterprise-team
- Set-and-forget — Onboarding is geen éénmalig project. Itereer elke maand op basis van data
Aan de slag
Begin vandaag met drie dingen:
- Definieer je "aha-moment" — Wat is het moment waarop gebruikers denken "dit is precies wat ik nodig heb"?
- Meet je huidige funnel — Waar haken gebruikers af? Na registratie? Na de eerste login?
- Bouw één geautomatiseerde trigger — Start met een welkomstmail die reageert op of iemand de setup wel of niet heeft voltooid
Onboarding is geen nice-to-have. Het is de feature die bepaalt of al je andere features ooit gebruikt worden.