Pruebas A/B
Variantes de un mensaje a una muestra de la audiencia y envío automático del ganador al resto.
Una prueba A/B envía de 2 a 4 versiones de un mensaje a una muestra de la audiencia. Al terminar la espera, PushHub compara las variantes y envía la ganadora al resto.
- Muestra: del 10 al 50 % de la audiencia (20 % por defecto), repartida en partes iguales entre las variantes. Con 2 variantes y 20 %, cada una llega al 10 % y el ganador al 80 % restante.
- Espera: de 30 a 1440 minutos (120 por defecto). Es el tiempo para medir antes de elegir.
- Métrica: tasa de apertura (
open_rate, por defecto) o de clics (click_rate), sobre las entregas aceptadas. En empate gana la de más clics y, si sigue el empate, la primera.
Cada dispositivo cae siempre en el mismo grupo de la prueba, así que nadie recibe dos variantes ni la variante y el ganador.
Las pruebas A/B son una función de plan. Solo admiten envío inmediato: no se pueden programar.
Cuándo no hay ganador claro
Si alguna variante tiene menos de 100 entregas aceptadas, o ninguna recibe aperturas (o clics), la prueba queda sin ganador claro (inconclusive) y no se envía nada al resto. Puedes elegir el ganador a mano o cancelar la prueba.
También puedes elegir el ganador a mano antes de que termine la espera.
Desde el panel
En Pruebas A/B, elige la app, el topic (opcional), la métrica, la muestra y la espera, y escribe las variantes. La lista muestra el estado, las aceptadas, abiertas y las tasas de cada variante, y los botones Elegir como ganador y Cancelar la prueba.
El detalle de cada envío indica si es una variante o el envío del ganador de una prueba.
Desde la API
Usa una llave secreta con notifications:send. El cuerpo es el mismo de POST /v1/notifications más abTest; cada variante puede cambiar content, deepLink, data, actions y media.
curl -X POST https://api.pushhub.daertec.com/v1/ab-tests \
-H "Authorization: Bearer sk_live_TU_LLAVE" -H "Content-Type: application/json" \
-d '{
"name": "Oferta de fin de semana",
"target": { "type": "topic", "topic": "ofertas" },
"category": "marketing",
"content": { "title": "Oferta", "body": "20 % de descuento" },
"abTest": {
"samplePercent": 20, "waitMinutes": 120, "metric": "open_rate",
"variants": [
{ "content": { "title": "Solo hoy", "body": "20 % de descuento en todo" } },
{ "content": { "title": "Tu cupón te espera", "body": "Úsalo antes de la medianoche" }, "deepLink": "miapp://cupon" }
]
}
}'
Responde 202 con la prueba en estado testing. Consulta el resultado con GET /v1/ab-tests/{id}:
{
"id": "01K…", "status": "completed", "metric": "open_rate",
"samplePercent": 20, "winnerPercent": 80, "decidedBy": "auto", "winnerVariant": 2,
"variants": [
{ "variant": 1, "label": "A", "audiencePercent": 10, "stats": { "accepted": 980, "opened": 72, "openRate": 0.0735, "clickRate": 0.0112 } },
{ "variant": 2, "label": "B", "audiencePercent": 10, "stats": { "accepted": 1004, "opened": 118, "openRate": 0.1175, "clickRate": 0.0199 } }
],
"winner": { "notificationId": "01K…", "status": "sending" }
}
| Estado | Significado |
|---|---|
testing |
Las variantes se enviaron y se está midiendo. |
sending_winner |
Se eligió el ganador y se está preparando su envío. |
completed |
El ganador se envió al resto (decidedBy: auto o manual). |
inconclusive |
Sin ganador claro (inconclusiveReason: insufficient_sample o no_signal). |
cancelled |
Cancelada: no se envía ganador. |
Para elegir a mano: POST /v1/ab-tests/{id}/winner con { "variant": 2 }. Para cancelar: POST /v1/ab-tests/{id}/cancel. Las variantes ya enviadas no se pueden deshacer.
Cada variante y el envío del ganador son envíos normales: aparecen en /v1/notifications con abTest: { id, variant } (variant 0 es el ganador), y sus estadísticas y entregas se consultan y exportan como las de cualquier envío.
Los límites de marketing por app también se aplican a las variantes y al ganador.