Documentação
Métricas e Indicadores de Onboarding¶
Guia completo para acompanhar e analisar o desempenho dos seus fluxos de onboarding.
Visão Geral¶
O sistema rastreia automaticamente diversas métricas para ajudá-lo a:
- Identificar gargalos no processo
- Medir taxa de conclusão
- Otimizar experiência do usuário
- Detectar problemas de abandono
Métricas no Nível do Flow¶
Total de Inícios (total_starts)¶
Número total de usuários que iniciaram o onboarding.
Como é calculado:
- Incrementado quando POST /start é chamado pela primeira vez
- Não conta reinícios do mesmo usuário
Onde ver:
- Dashboard: Detalhe do flow
- API: Campo total_starts no flow
Como consultar via API:
// Obter métricas do flow
fetch('/api/admin/onboarding/flows/onboarding-clientes/metrics')
.then(res => res.json())
.then(data => {
console.log('Total de inícios:', data.total_starts);
});
Total de Conclusões (total_completions)¶
Número de usuários que completaram todos os passos obrigatórios.
Como é calculado:
- Incrementado quando status vira COMPLETED
- Conta apenas conclusões únicas por usuário
Onde ver:
- Dashboard: Detalhe do flow
- API: Campo total_completions
Taxa de Conclusão (completion_rate)¶
Percentual de usuários que completam o onboarding.
Fórmula:
completion_rate = (total_completions / total_starts) * 100
Interpretação:
- > 70%: Excelente
- 50-70%: Bom
- 30-50%: Precisa melhorar
- < 30%: Crítico - revisar fluxo
Onde ver:
- Dashboard: Card de métricas
- API Admin: GET /api/onboarding/flows/{slug}/analytics
Usuários em Progresso¶
Número de usuários com status IN_PROGRESS.
Como consultar via Dashboard:
- Acesse o painel de Analytics
- Visualize o gráfico de "Usuários Ativos"
- Filtre por período desejado
Onde ver:
- Dashboard: Analytics do flow
- API: Campo in_progress no endpoint de analytics
Usuários que Abandonaram¶
Usuários com status ABANDONED.
Critérios de abandono:
- Sem atividade por mais de X dias (configurável)
- Status pode ser setado manualmente via API
- Automação via webhook/cron job
Como marcar como abandonado:
progress = UserFlowProgress.objects.get(
flow=flow,
external_user_id='user_123'
)
progress.abandon() # Seta status para ABANDONED
Métricas no Nível do Usuário¶
Completion Percentage¶
Percentual de progresso do usuário.
Como é calculado:
# Conta apenas steps obrigatórios completados
required_steps = flow.steps.filter(is_required=True).count()
completed_required = len([
key for key in progress.steps_completed
if flow.steps.filter(step_key=key, is_required=True).exists()
])
percentage = (completed_required / required_steps) * 100
Onde ver:
- API pública: Campo completion_percentage no progresso
- Dashboard: Lista de progressos
Exemplo visual:
Progresso: 60%
[████████████░░░░░░░░]
Steps completados: 3/5
- ✓ Bem-vindo
- ✓ Configurar perfil
- ✓ Adicionar equipe
- ○ Conectar integrações
- ○ Primeiro ticket
Time to Complete¶
Tempo que o usuário levou para completar o onboarding.
Como é calculado:
if progress.completed_at and progress.started_at:
delta = progress.completed_at - progress.started_at
time_to_complete = delta.total_seconds()
Formato de exibição:
- Segundos: 3600.0
- Horas: 1.0h
- Dias: 0.5 dias
Onde ver:
- Dashboard: Detalhes do progresso
- API: Campo time_to_complete
Análise:
- Tempo médio ajuda a entender complexidade
- Outliers podem indicar problemas
- Compare com benchmark do setor
Steps Completados vs Pulados¶
Lista de etapas em cada categoria.
Estrutura:
{
"steps_completed": ["welcome", "configure-profile", "add-team"],
"steps_skipped": ["optional-survey"]
}
Onde ver:
- API: Campos steps_completed e steps_skipped
- Dashboard: Timeline do progresso do usuário
Analytics Avançado¶
Drop-off por Etapa¶
Identifica onde usuários abandonam o processo.
Endpoint:
GET /api/onboarding/flows/{slug}/analytics
Authorization: Bearer {jwt_token}
Response:
{
"total_starts": 1000,
"total_completions": 720,
"completion_rate": 72.0,
"in_progress": 180,
"abandoned": 100,
"average_completion_time": 3600.5,
"step_drop_off": {
"welcome": {
"title": "Bem-vindo",
"reached": 1000,
"completed": 950,
"dropped": 50,
"completion_rate": 95.0
},
"configure-profile": {
"title": "Configure seu Perfil",
"reached": 950,
"completed": 850,
"dropped": 100,
"completion_rate": 89.5
},
"connect-integrations": {
"title": "Conectar Integrações",
"reached": 850,
"completed": 720,
"dropped": 130,
"completion_rate": 84.7
}
}
}
Interpretação:
- Reached: Quantos chegaram nesta etapa
- Completed: Quantos completaram
- Dropped: Quantos abandonaram aqui
- Completion Rate: Taxa de conclusão da etapa
Identificando gargalos:
- Etapa com maior dropped é o gargalo
- Taxa de conclusão abaixo de 80% merece atenção
- Compare com steps anteriores/posteriores
Exemplo de análise:
Step "Conectar Integrações":
- 850 usuários chegaram
- 720 completaram (85%)
- 130 abandonaram (15%)
Ação: Simplificar processo de integração
ou tornar step opcional
Tempo Médio de Conclusão¶
Média de tempo que usuários levam para completar.
Como é calculado:
from django.db.models import Avg
avg_time = UserFlowProgress.objects.filter(
flow=flow,
status='COMPLETED',
time_to_complete__isnull=False
).aggregate(Avg('time_to_complete'))
average_seconds = avg_time['time_to_complete__avg']
Formatação:
def format_time(seconds):
if seconds < 60:
return f"{seconds:.0f}s"
elif seconds < 3600:
return f"{seconds/60:.1f}min"
elif seconds < 86400:
return f"{seconds/3600:.1f}h"
else:
return f"{seconds/86400:.1f} dias"
Benchmarks:
- < 5 min: Onboarding rápido (ideal para SaaS simples)
- 5-15 min: Médio (comum para produtos complexos)
- 15-30 min: Longo (requer comprometimento do usuário)
- > 30 min: Muito longo (considere dividir em sessões)
Funil de Conversão¶
Visualização do funil de onboarding.
Estrutura:
1000 iniciaram
↓ 95%
950 completaram "Bem-vindo"
↓ 89%
850 completaram "Configurar Perfil"
↓ 85%
720 completaram "Conectar Integrações"
↓ 100%
720 CONCLUÍRAM (72%)
Como construir:
def get_funnel_data(flow):
steps = flow.steps.filter(language=flow.default_language).order_by('order')
total_starts = flow.total_starts
funnel = []
for step in steps:
completed = UserFlowProgress.objects.filter(
flow=flow,
steps_completed__contains=[step.step_key]
).count()
funnel.append({
'step': step.title,
'count': completed,
'percentage': (completed / total_starts * 100) if total_starts > 0 else 0
})
return funnel
Dashboards e Visualizações¶
Dashboard Principal¶
Métricas em Cards:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Total Starts │ │ Completions │ │ Completion Rate │
│ 1,000 │ │ 720 │ │ 72% │
└─────────────────┘ └─────────────────┘ └─────────────────┘
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ In Progress │ │ Abandoned │ │ Avg Time │
│ 180 │ │ 100 │ │ 1.5 hours │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Gráfico de Funil:
Bem-vindo ████████████████████ 1000 (100%)
Configure Perfil ███████████████████░ 950 (95%)
Adicione Equipe ██████████████████░░ 850 (85%)
Conectar Integração ████████████████░░░░ 720 (72%)
Primeiro Ticket ████████████████░░░░ 720 (72%)
Linha do Tempo:
Jan Feb Mar Apr May Jun
│ │ │ │ │ │
150 200 180 220 150 100 ← Starts
120 160 144 176 108 72 ← Completions
Métricas por Usuário¶
Lista de Progressos:
Usuario Status Progress Last Activity Time
─────────────────────────────────────────────────────────────
user_001 COMPLETED 100% 2h ago 1.2h
user_002 IN_PROGRESS 60% 5m ago -
user_003 ABANDONED 20% 3d ago -
user_004 IN_PROGRESS 80% 1h ago -
Detalhes Individuais:
Usuário: user_002 (João Silva)
Email: joao@example.com
Client: Empresa XYZ
Progresso: 60% (3/5 steps)
Tempo decorrido: 45 minutos
Última atividade: 5 minutos atrás
Timeline:
✓ Bem-vindo Completado há 40min
✓ Configure Perfil Completado há 30min
✓ Adicione Equipe Completado há 20min
→ Conectar Integração ATUAL
○ Primeiro Ticket Pendente
Dados coletados:
- company_name: "Empresa XYZ"
- employees: "11-50"
- industry: "Tecnologia"
Exportação de Dados¶
CSV Export¶
Exportar progressos:
import csv
from django.http import HttpResponse
def export_progress_csv(request, flow_id):
flow = OnboardingFlow.objects.get(id=flow_id)
progress_list = UserFlowProgress.objects.filter(flow=flow)
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="onboarding_{flow.slug}.csv"'
writer = csv.writer(response)
writer.writerow([
'User ID', 'Email', 'Status', 'Progress %',
'Started At', 'Completed At', 'Time (seconds)'
])
for p in progress_list:
writer.writerow([
p.external_user_id,
p.external_user_email,
p.status,
p.completion_percentage,
p.started_at,
p.completed_at,
p.time_to_complete
])
return response
JSON Export¶
Exportar analytics completo:
import json
def export_analytics_json(flow):
analytics = {
'flow': {
'name': flow.name,
'slug': flow.slug,
'total_starts': flow.total_starts,
'total_completions': flow.total_completions,
'completion_rate': flow.completion_rate
},
'users': []
}
for progress in flow.user_progress.all():
analytics['users'].append({
'user_id': progress.external_user_id,
'status': progress.status,
'completion_percentage': progress.completion_percentage,
'steps_completed': progress.steps_completed,
'time_to_complete': progress.time_to_complete
})
return json.dumps(analytics, indent=2)
Alertas e Notificações¶
Configurar Alertas¶
Exemplo: Alerta de abandono
from datetime import timedelta
from django.utils import timezone
def check_abandoned_users(flow, days=7):
cutoff = timezone.now() - timedelta(days=days)
abandoned = UserFlowProgress.objects.filter(
flow=flow,
status='IN_PROGRESS',
last_activity_at__lt=cutoff
)
for progress in abandoned:
# Marcar como abandonado
progress.abandon()
# Enviar notificação
send_abandonment_notification(progress)
Exemplo: Alerta de baixa conversão
def check_low_conversion(flow, threshold=50):
if flow.completion_rate < threshold:
send_alert_to_admin(
f"⚠️ Taxa de conclusão baixa no flow '{flow.name}': {flow.completion_rate}%"
)
Integração com Ferramentas de Analytics¶
Google Analytics¶
// Enviar eventos para GA
function trackOnboardingEvent(action, label, value) {
gtag('event', action, {
'event_category': 'Onboarding',
'event_label': label,
'value': value
});
}
// Rastrear início
trackOnboardingEvent('start', flowName, userId);
// Rastrear etapa completa
trackOnboardingEvent('step_complete', stepKey, currentProgress);
// Rastrear conclusão
trackOnboardingEvent('complete', flowName, timeToComplete);
Mixpanel¶
// Rastrear onboarding no Mixpanel
mixpanel.track('Onboarding Started', {
'Flow Name': flowName,
'User ID': userId,
'Language': language
});
mixpanel.track('Onboarding Step Completed', {
'Flow Name': flowName,
'Step Key': stepKey,
'Progress': completionPercentage
});
mixpanel.track('Onboarding Completed', {
'Flow Name': flowName,
'Time to Complete': timeToComplete,
'Steps Skipped': stepsSkipped.length
});