LealtiApp Release Smoke Checklist
1. Preflight (antes de probar)
- Verifica variables en entorno de produccion:
ROOT_DOMAINAPP_URLRESEND_API_KEYPASSKIT_REST_KEYPASSKIT_REST_SECRETPASSKIT_WEBHOOK_SECRETQSTASH_TOKENQSTASH_CURRENT_SIGNING_KEYQSTASH_NEXT_SIGNING_KEY
- Asegura que DNS de tenant resuelve a la app (ejemplo:
tenant.tudominio.com). - Asegura que el webhook de PassKit apunta a:
https://{tenant}.{ROOT_DOMAIN}/api/admin/passkit/webhook- Header
Authorization: Bearer {PASSKIT_WEBHOOK_SECRET}
2. Smoke de auth staff (magic link)
- Ir a
https://{tenant}.{ROOT_DOMAIN}/admin-auth/login. - Capturar correo staff valido y enviar magic link.
- Validar:
- Llega correo con link al mismo subdominio del tenant.
- Al abrir link, redirige a
/admino/admin/visits. - No rebota a
Subdominio invalido.
- Negativo:
- Si intentas abrir panel sin sesion, redirige a
/admin-auth/login.
- Si intentas abrir panel sin sesion, redirige a
3. Smoke de signup tenant
- Ir a
https://{ROOT_DOMAIN}/signup. - Crear tenant con
slugen mayusculas (ejemplo:Mi-Tienda). - Validar:
- Se crea sin error de formato.
- Se normaliza a minusculas (
mi-tienda). - Se envia magic link al owner.
4. Smoke de wallet/PassKit (cliente)
- Como OWNER/ADMIN, ir a
Admin > Wallet (PassKit). - Guardar:
programIdvalidoregion(ejemplopub1)
- Ir a
Admin > Asignacion de tiersy mapear niveles. - Con cliente OTP autenticado:
- Ejecutar flujo "Agregar a Apple/Google Wallet".
- Validar:
- Endpoint
/api/wallet/enrollrespondeokconpassUrl. - Se guarda en DB customer:
passkitMemberIdpasskitPassUrlpasskitStatus = ENROLLED
- Endpoint
5. Smoke de sync PassKit
- Provocar cambio de datos cliente (ejemplo: canjear recompensa o actualizar perfil).
- Validar que encola job a
/api/wallet/sync-job. - Confirmar en logs:
PassKit sincronizado- no
wallet-sync-job failed
- Negativo:
- sin
passkitMemberIdno debe romper, debe salir silencioso.
- sin
6. Smoke webhook PassKit
- Simular webhook manual:
curl -i -X POST "https://{tenant}.{ROOT_DOMAIN}/api/admin/passkit/webhook" \
-H "Authorization: Bearer {PASSKIT_WEBHOOK_SECRET}" \
-H "Content-Type: application/json" \
-d '{"eventType":"pass_event_uninstalled","pass":{"id":"{passkitMemberId}"}}'
- Validar:
- HTTP
200 OK - customer
passkitStatuscambia aUNINSTALLED.
- HTTP
- Probar sin header auth:
- Debe responder
401 Unauthorized.
- Debe responder
7. Smoke de seguridad/regresion
- Revisar logs de app:
- No debe aparecer OTP en claro.
- No debe aparecer token de magic link.
- Validar multitenancy:
- llamadas API desde tenant A no deben resolver tenant B.
x-tenant-subdomaindebe estar disponible tambien en rutas/api.
8. Criterio de salida
- Solo liberar si todo lo anterior pasa.
- Si falla algo critico (auth, enroll, sync, webhook), rollback.