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:

  1. Reached: Quantos chegaram nesta etapa
  2. Completed: Quantos completaram
  3. Dropped: Quantos abandonaram aqui
  4. 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
});

Próximos Passos