Produto lançado. Cliente se cadastrou. E agora?
Sem onboarding estruturado:
- 85% abandonam nos primeiros 7 dias
- Taxa de ativação: 12-18%
- Conversão trial → paid: 8-12%
Com onboarding guiado:
- Retenção 30 dias: 80%+
- Taxa de ativação: 60-75%
- Conversão trial → paid: 35-50%
Este artigo mostra framework completo de onboarding testado em 30+ produtos, com timelines, automações e resultados mensuráveis.
As 3 fases do onboarding
Fase 1: Ativação (Dia 1) — “Hello World”
Objetivo: Cliente vê valor em menor que 5 minutos.
Problema comum: Cadastro → tela vazia → abandono.
Solução: Quick wins imediatos.
Exemplo — Marketplace de professores:
// pages/onboarding/welcome.tsx
export default function WelcomeFlow() {
const [step, setStep] = useState(1)
const steps = [
{
title: "Bem-vindo(a) ao Conecta Prof!",
action: "Criar primeiro perfil",
quickWin: "Em 2 minutos você estará visível para 5.000 alunos"
},
{
title: "Defina sua disponibilidade",
action: "Marcar 3 horários disponíveis",
quickWin: "Alunos já podem agendar com você"
},
{
title: "Primeiro aluno!",
action: "Aceitar agendamento simulado",
quickWin: "Pronto! Você está no ar 🎉"
}
]
return (
<OnboardingContainer>
<ProgressBar current={step} total={3} />
<StepContent step={steps[step - 1]} />
<CTAButton onClick={() => handleStepComplete(step)}>
{steps[step - 1].action}
</CTAButton>
</OnboardingContainer>
)
}
Checklist fase 1 (primeiros 5 minutos):
- Progresso visual (barra ou steps)
- Máximo 3 passos
- Cada passo = ação concreta (não só “ler”)
- Quick win final (“Você está no ar!”)
- Skip opcional (para power users)
Métrica de sucesso: maior que 60% completam onboarding.
Fase 2: Aha Moment (Dia 1-7) — “Agora entendi o valor”
Objetivo: Cliente experimenta o valor core do produto.
Aha moments por tipo de produto:
| Produto | Aha Moment |
|---|---|
| Marketplace | Primeira transação completada |
| SaaS produtividade | Primeira tarefa marcada como concluída |
| Ferramenta de agendamento | Primeira confirmação automática |
| E-commerce | Primeiro pedido recebido |
| Plataforma educação | Primeira aula assistida completa |
Estratégia: Guiar cliente até aha moment em menor que 7 dias.
Email sequence (D+0 a D+7):
// lib/email-sequences/onboarding.ts
export const onboardingSequence = [
{
day: 0, // Imediato após cadastro
subject: "Bem-vindo! Comece em 3 passos simples",
template: "welcome",
cta: "Completar perfil",
condition: user => !user.profileCompleted
},
{
day: 1,
subject: "{{name}}, sua primeira aula está a 1 clique",
template: "first-action",
cta: "Agendar agora",
condition: user => user.profileCompleted && user.bookingsCount === 0
},
{
day: 3,
subject: "Dica: 85% dos professores fazem isso",
template: "social-proof",
cta: "Ver como funciona",
condition: user => user.bookingsCount === 0
},
{
day: 5,
subject: "Precisa de ajuda? Estamos aqui",
template: "help-offer",
cta: "Falar com suporte",
condition: user => user.lastLoginDaysAgo > 2
},
{
day: 7,
subject: "🎉 Parabéns! Você já tem {{count}} aulas agendadas",
template: "milestone",
condition: user => user.bookingsCount > 0
}
]
// Automação com Resend
async function sendOnboardingEmails(userId: string) {
const user = await prisma.user.findUnique({ where: { id: userId } })
for (const email of onboardingSequence) {
const shouldSend = email.condition(user)
if (shouldSend) {
await scheduleEmail({
to: user.email,
subject: interpolate(email.subject, user),
template: email.template,
sendAt: addDays(user.createdAt, email.day)
})
}
}
}
In-app guidance (tooltips progressivos):
// components/OnboardingTooltips.tsx
import { driver } from "driver.js"
import "driver.js/dist/driver.css"
export function useOnboardingTour() {
const startTour = () => {
const driverObj = driver({
showProgress: true,
steps: [
{
element: '#calendar',
popover: {
title: 'Seu calendário',
description: 'Marque aqui seus horários disponíveis',
side: "left",
align: 'start'
}
},
{
element: '#bookings',
popover: {
title: 'Solicitações de aula',
description: 'Alunos aparecem aqui. Aceite em 1 clique!',
}
},
{
element: '#earnings',
popover: {
title: 'Seus ganhos',
description: 'Acompanhe quanto já ganhou este mês',
side: "top"
}
}
]
})
driverObj.drive()
}
return { startTour }
}
Checklist fase 2:
- Email sequence (D+0, D+1, D+3, D+5, D+7)
- In-app tooltips (máximo 5 steps)
- Progresso visível (“Você está 60% completo”)
- Gamificação opcional (badges, pontos)
- Suporte proativo (chat aparece no dia 3)
Métrica de sucesso: maior que 40% atingem aha moment em 7 dias.
Fase 3: Hábito (Dia 8-30) — “Virou rotina”
Objetivo: Cliente usa regularmente (3x/semana mínimo).
Estratégias:
1. Notificações comportamentais:
// lib/notifications/behavioral.ts
export const triggers = {
INACTIVITY_3_DAYS: {
condition: (user) => user.lastLoginDaysAgo >= 3,
message: "Você tem 2 novas solicitações de aula!",
cta: "Ver agora",
channel: ["email", "push"]
},
INCOMPLETE_PROFILE: {
condition: (user) => !user.profileCompleted && user.createdDaysAgo > 2,
message: "Professores com perfil completo recebem 3x mais solicitações",
cta: "Completar perfil",
channel: ["email"]
},
FIRST_MILESTONE: {
condition: (user) => user.earningsTotal >= 500 && !user.milestones.includes("first_500"),
message: "🎉 Você já ganhou R$ 500! Continue assim",
cta: "Ver ganhos",
channel: ["email", "push", "in-app"]
}
}
// Executa diariamente
async function sendBehavioralNotifications() {
const users = await prisma.user.findMany({
where: { createdAt: { gte: subDays(new Date(), 30) } }
})
for (const user of users) {
for (const [key, trigger] of Object.entries(triggers)) {
if (trigger.condition(user)) {
await sendNotification(user.id, trigger)
}
}
}
}
2. Weekly digest (resumo semanal):
// emails/weekly-digest.tsx
import { render } from '@react-email/render'
export function WeeklyDigest({ user, stats }: Props) {
return (
<Html>
<Head />
<Body>
<Container>
<Heading>Sua semana no Conecta Prof</Heading>
<Section>
<Row>
<Column>
<Text className="metric-value">{stats.bookingsCompleted}</Text>
<Text className="metric-label">Aulas realizadas</Text>
</Column>
<Column>
<Text className="metric-value">R$ {stats.earningsWeek}</Text>
<Text className="metric-label">Ganhos esta semana</Text>
</Column>
</Row>
</Section>
<Section>
<Heading level={2}>Próximas aulas</Heading>
{stats.upcomingBookings.map(booking => (
<BookingCard key={booking.id} booking={booking} />
))}
</Section>
<Button href={`${baseUrl}/dashboard`}>
Ver dashboard completo
</Button>
</Container>
</Body>
</Html>
)
}
3. Progressão gamificada:
// lib/gamification/levels.ts
export const levels = [
{
level: 1,
name: "Novato",
requirement: "Completar perfil",
reward: "Badge + Destaque no perfil"
},
{
level: 2,
name: "Professor Ativo",
requirement: "5 aulas completadas",
reward: "Comissão reduzida (18% vs 20%)"
},
{
level: 3,
name: "Professor Destaque",
requirement: "20 aulas + NPS maior que 4.5",
reward: "Selo 'Top Professor' + Prioridade em buscas"
},
{
level: 4,
name: "Professor Expert",
requirement: "50 aulas + 100% pontualidade",
reward: "Comissão 15% + Suporte prioritário"
}
]
async function checkLevelUp(userId: string) {
const user = await getUserWithStats(userId)
const currentLevel = user.level
const nextLevel = levels.find(l => l.level === currentLevel + 1)
if (nextLevel && meetsRequirement(user, nextLevel.requirement)) {
await prisma.user.update({
where: { id: userId },
data: { level: nextLevel.level }
})
await sendNotification(userId, {
title: `🎉 Level up! Agora você é ${nextLevel.name}`,
body: `Recompensa desbloqueada: ${nextLevel.reward}`,
cta: "Ver benefícios"
})
}
}
Checklist fase 3:
- Notificações comportamentais (inatividade, marcos)
- Weekly digest (resumo semanal por email)
- Gamificação (níveis, badges)
- Comunidade (grupo WhatsApp/Telegram para usuários ativos)
- Programa de referência (indique e ganhe)
Métrica de sucesso: maior que 50% são usuários ativos (3+ sessões/semana).
Métricas de onboarding
Funil completo:
Cadastros: 1.000 usuários
↓ (-40%, abandono no onboarding)
Completaram onboarding: 600 (60%)
↓ (-33%, não atingiram aha moment)
Aha moment (D0-7): 400 (40%)
↓ (-20%, não formaram hábito)
Usuários ativos D30: 320 (32%)
↓ (-15%, churn primeiros 90 dias)
Usuários retidos D90: 272 (27,2%)
Benchmarks por tipo de produto:
| Métrica | B2C | B2B SaaS | Marketplace |
|---|---|---|---|
| Completam onboarding | 40-60% | 60-75% | 50-65% |
| Aha moment D7 | 30-45% | 45-65% | 35-50% |
| Ativos D30 | 20-35% | 50-70% | 40-55% |
| Retidos D90 | 15-25% | 40-60% | 30-45% |
Cálculo de impacto:
Cenário A (sem onboarding estruturado):
- 1.000 cadastros
- 15% ativos D30 = 150 usuários
- LTV médio: R$ 800
- Receita: R$ 120.000
Cenário B (com onboarding estruturado):
- 1.000 cadastros
- 50% ativos D30 = 500 usuários
- LTV médio: R$ 800
- Receita: R$ 400.000
Ganho: R$ 280.000 (+233%)
Ferramentas de onboarding
1. Email sequences:
- Resend (R$ 0-120/mês): Simples, React Email templates
- Customer.io (R$ 500-2K/mês): Avançado, comportamental
- Loops (R$ 150-800/mês): Meio termo
2. In-app guidance:
- Driver.js (grátis, open-source): Tooltips simples
- Intro.js (grátis): Tour guiado
- Appcues (R$ 1.500-5K/mês): Solução enterprise
3. Analytics:
- Mixpanel (R$ 0-1.200/mês): Tracking de eventos
- Amplitude (R$ 0-2K/mês): Funnels avançados
- PostHog (R$ 0-800/mês): Open-source, self-hosted
Setup recomendado (MVP):
- Resend (emails): R$ 0-120
- Driver.js (tooltips): R$ 0
- Mixpanel (analytics): R$ 0
- Total: R$ 0-120/mês
Case real: Onboarding que aumentou retenção de 18% para 73%
Perfil: SaaS de gestão para salões de beleza.
Problema (antes do onboarding):
- Retenção D30: 18%
- Conversão trial → paid: 9%
- Suporte: 40 tickets/semana (maioria “como usar?”)
Solução implementada (6 semanas):
Semana 1-2: Redesign do primeiro acesso
- Removeu tela vazia
- Adicionou onboarding de 3 passos
- Quick win: “Primeiro agendamento criado”
Semana 3-4: Email sequence
- 7 emails automatizados (D+0 a D+7)
- Condicionais (só envia se usuário não fez ação)
- Templates com React Email
Semana 5: In-app tooltips
- Driver.js com 5 steps
- Aparece apenas na primeira sessão
- Skip opcional
Semana 6: Gamificação
- 4 níveis (Novato → Expert)
- Badges por marcos (10, 50, 100 agendamentos)
- Comunidade no Telegram (usuários nível 3+)
Resultado (3 meses pós-implementação):
| Métrica | Antes | Depois | Variação |
|---|---|---|---|
| Completam onboarding | 42% | 68% | +62% |
| Aha moment D7 | 28% | 55% | +96% |
| Retenção D30 | 18% | 73% | +306% |
| Conversão trial → paid | 9% | 38% | +322% |
| Tickets suporte/semana | 40 | 12 | -70% |
ROI:
- Investimento: R$ 48K (6 semanas de dev)
- MRR antes: R$ 18K (200 trials × 9% × R$ 999)
- MRR depois: R$ 76K (200 trials × 38% × R$ 999)
- Ganho mensal: R$ 58K
- Payback: menor que 1 mês
Erros comuns de onboarding
Erro 1: Onboarding longo demais
Sintoma: 12 steps, leva 20 minutos.
Problema: 80% abandonam no step 4.
Correto: Máximo 3 steps, menor que 5 minutos. Resto vem depois (progressivo).
Erro 2: Explicar features, não valor
Errado: “Esta é a tela de relatórios. Aqui você pode filtrar por data…”
Certo: “Veja quanto você ganhou este mês em 2 cliques!”
Regra: Foque em benefícios (ganho tempo, ganho dinheiro), não em funcionalidades (botões, menus).
Erro 3: Ignorar usuários que não completam
Realidade: 40-50% não completam onboarding. Não desista deles.
Solução: Re-engagement campaign.
// Email D+3 para quem não completou
Subject: "Precisa de ajuda para começar?"
Olá {{name}},
Vi que você se cadastrou mas ainda não completou seu perfil.
Posso ajudar? Responda este email e te guio em 5 minutos.
Ou clique aqui para retomar de onde parou:
[Continuar cadastro]
Abraço,
{{founder_name}}
Taxa de recuperação: 15-25% (dos que não completaram).
Erro 4: Mesmo onboarding para todos
Problema: Professor tem jornada diferente de aluno (marketplace).
Solução: Onboarding segmentado.
// Detecta perfil e carrega fluxo apropriado
if (user.role === 'TEACHER') {
return <TeacherOnboarding />
} else if (user.role === 'STUDENT') {
return <StudentOnboarding />
}
Próximos passos
Para implementar onboarding no seu produto:
- Definir aha moment (qual ação = “entendi o valor”)
- Mapear jornada ideal (quantos passos até aha moment?)
- Implementar onboarding básico (3 steps, menor que 5min)
- Setup email sequence (Resend + 7 emails)
- Adicionar in-app tooltips (Driver.js)
- Configurar tracking (Mixpanel: onboarding_started, step_completed, aha_moment)
- Lançar e medir (meta: maior que 40% atingem aha moment em 7 dias)
- Iterar baseado em dados (onde usuários abandonam?)
Lembre-se: Onboarding não é “nice to have”. É diferença entre produto que cresce e produto que morre.
Produtos com onboarding estruturado têm 3-5x mais retenção. Vale cada hora investida.