Qué vas a lograr: conectar un channel WhatsApp listo para inbound/outbound sin tratarlo como requisito de onboarding.
WhatsApp es un deployment target de producción, no un requisito de onboarding. Construye primero en Sandbox y conecta WhatsApp cuando el cliente ya tenga WABA, método de pago y número listos.
- Crea o selecciona un channel
whatsappen Studio. - Ejecuta Embedded Signup desde Studio.
- Confirma
wabaIdyphoneNumberId. - Tsuzuro intercambia el code por token long-lived, valida el token, suscribe webhooks, registra el número y guarda el token cifrado.
- Ejecuta readiness:
tsu whatsapp check --channel-id ch_...Webhooks Meta
Sección titulada «Webhooks Meta»Configura en Meta la URL por channel:
https://api.tsuzuro.com/v1/channels/{channelId}/whatsapp/webhookTsuzuro valida:
hub.verify_tokenen el challenge GET.x-hub-signature-256en POST usando el app secret de la app Meta vinculada al channel.
Mensajes
Sección titulada «Mensajes»- Inbound Meta crea/actualiza Threads y Messages neutrales.
- Outbound desde Console/API/agent se entrega con un outbox job durable.
messages.externalMessageIdguarda elwamid.- Delivery/read receipts generan eventos
channel.message.sent,channel.message.delivered,channel.message.readychannel.message.delivery_failed.
Inbound/outbound persisten attachments. El pipeline descarga media de Meta a R2 (tenant-scoped) antes de que Meta lo expire, y usa URLs firmadas de TTL corto en el read path.
Renovación de tokens
Sección titulada «Renovación de tokens»Un worker renueva tokens long-lived cercanos a expirar. Si el token no es renovable (p. ej. handoff BYOA de agencia), se emite channel.credential.expiring para que el dueño actúe. tsu whatsapp check refleja el estado.
Tests usan mocks/fixtures de Meta. Nunca uses tokens Meta reales ni números de cliente en CI.
Qué sigue
Sección titulada «Qué sigue»- BYOA para agencias con app Meta propia.
- Webhook signatures para Stitches (distintos de la firma Meta).