Ir al contenido

Madurez del usuario

La madurez del usuario es una clasificacion automatica de los usuarios en segmentos de comportamiento. En lugar de segmentar manualmente a los usuarios, Presage calcula la madurez a partir de las senales de comportamiento.

SegmentoDescripcionUmbral por defecto
newRecien comenzando3 sesiones o menos
onboardingAprendiendo a usar la aplicacion4-10 sesiones
activeUsuario regular mas alla de la incorporacionMas de 10 sesiones, menos de 5 funcionalidades usadas
powerGran adoptante de funcionalidades5+ funcionalidades distintas usadas
dormantSe ha quedado inactivo14+ dias desde la ultima visita

El calculo sigue este orden de prioridad:

  1. Verificacion de inactividad — Si el usuario no ha sido visto durante dormantDaysInactive dias, es dormant (independientemente de otras senales)
  2. Verificacion de nuevo — Si sessionCount es igual o menor a newMaxSessions, es new
  3. Verificacion de poder — Si la cantidad de funcionalidades distintas usadas es igual o mayor a powerMinFeatures, es power
  4. Verificacion de incorporacion — Si sessionCount es igual o menor a onboardingMaxSessions, es onboarding
  5. Respaldo — De lo contrario, es active
// Simplified version of the actual computation
function computeMaturity(signals: BehavioralSignals, config: MaturityConfig): Maturity {
const daysSinceLastSeen = daysBetween(new Date(signals.lastSeenAt), new Date())
if (daysSinceLastSeen >= config.dormantDaysInactive) return 'dormant'
if (signals.sessionCount <= config.newMaxSessions) return 'new'
const featuresUsed = Object.keys(signals.featureUsage).length
if (featuresUsed >= config.powerMinFeatures) return 'power'
if (signals.sessionCount <= config.onboardingMaxSessions) return 'onboarding'
return 'active'
}

Sobreescriba cualquier umbral mediante la configuracion maturity:

const client = createAdaptiveClient({
maturity: {
newMaxSessions: 5, // Consider "new" for 5 sessions instead of 3
onboardingMaxSessions: 15, // Extend onboarding period
powerMinFeatures: 8, // Require more features for "power" status
dormantDaysInactive: 30, // Wait longer before marking as dormant
},
// ...rules, persistence
})

La interfaz de configuracion completa:

interface MaturityConfig {
newMaxSessions: number // Default: 3
onboardingMaxSessions: number // Default: 10
powerMinFeatures: number // Default: 5
dormantDaysInactive: number // Default: 14
}

La madurez es accesible en el nivel superior del contexto (no anidada bajo traits o signals):

{
id: 'new-user-onboarding',
adaptationId: 'onboarding',
priority: 10,
conditions: {
all: [
{ field: 'maturity', operator: 'eq', value: 'new' },
],
},
action: { type: 'show', variantId: 'guided-tour' },
}

Puede combinar la madurez con otras condiciones:

{
id: 'dormant-enterprise-reactivation',
adaptationId: 'banner',
priority: 20,
conditions: {
all: [
{ field: 'maturity', operator: 'eq', value: 'dormant' },
{ field: 'traits.plan', operator: 'eq', value: 'enterprise' },
],
},
action: { type: 'show', variantId: 'reactivation-offer' },
}

Ejemplo: Diferente incorporacion para cada nivel de madurez

Sección titulada «Ejemplo: Diferente incorporacion para cada nivel de madurez»
import { createAdaptiveClient, createLocalStorageDriver } from '@presage-kit/core'
const client = createAdaptiveClient({
rules: [
{
id: 'new-guided-tour',
adaptationId: 'onboarding',
priority: 50,
conditions: {
all: [{ field: 'maturity', operator: 'eq', value: 'new' }],
},
action: { type: 'show', variantId: 'guided-tour' },
},
{
id: 'onboarding-tips',
adaptationId: 'onboarding',
priority: 40,
conditions: {
all: [{ field: 'maturity', operator: 'eq', value: 'onboarding' }],
},
action: { type: 'show', variantId: 'contextual-tips' },
},
{
id: 'active-whats-new',
adaptationId: 'onboarding',
priority: 30,
conditions: {
all: [{ field: 'maturity', operator: 'eq', value: 'active' }],
},
action: { type: 'show', variantId: 'whats-new' },
},
{
id: 'power-changelog',
adaptationId: 'onboarding',
priority: 20,
conditions: {
all: [{ field: 'maturity', operator: 'eq', value: 'power' }],
},
action: { type: 'show', variantId: 'changelog-only' },
},
{
id: 'dormant-reengagement',
adaptationId: 'onboarding',
priority: 60,
conditions: {
all: [{ field: 'maturity', operator: 'eq', value: 'dormant' }],
},
action: { type: 'show', variantId: 'welcome-back' },
},
],
persistence: {
driver: createLocalStorageDriver('my-app'),
},
})

Luego en su componente React:

import { Adaptive, Variant } from '@presage-kit/react'
function OnboardingFlow() {
return (
<Adaptive id="onboarding" defaultVariant="contextual-tips">
<Variant id="guided-tour">
<GuidedTour />
</Variant>
<Variant id="contextual-tips">
<ContextualTips />
</Variant>
<Variant id="whats-new">
<WhatsNew />
</Variant>
<Variant id="changelog-only">
<Changelog />
</Variant>
<Variant id="welcome-back">
<WelcomeBack />
</Variant>
</Adaptive>
)
}

La madurez se recalcula cada vez que las senales cambian (despues de cada llamada a track()). Esto significa que un usuario puede transicionar entre segmentos dentro de una misma sesion:

  1. El usuario llega (sesion 1) → new
  2. El usuario regresa para la sesion 4 → onboarding
  3. El usuario usa 5 funcionalidades distintas → power
  4. El usuario desaparece por 14 dias → dormant

Su interfaz se adapta en cada transicion sin ninguna intervencion manual.