Envío a través de Joinotify Cloud
El plugin entrega los mensajes por un canal. Hay dos canales de WhatsApp, y conviven en el mismo sitio:
| Canal | Cómo conecta | Tipos de mensaje |
|---|---|---|
| WhatsApp (Cloud API) | token de Joinotify Cloud | texto, multimedia, audio y plantilla |
| WhatsApp (Evolution) | código QR, por el relay antiguo | texto, multimedia y audio |
El canal Cloud habla con la API de Joinotify Cloud — la misma que usa cualquier integración externa — y detrás de ella está la Cloud API oficial de Meta. Es el camino recomendado: el número es oficial, el envío va firmado por Meta y no depende de una sesión de WhatsApp Web viva en el servidor.
Configuración
Ve a Joinotify → Configuración → General, en la tarjeta WhatsApp Cloud API.
| Campo | Qué hace |
|---|---|
| Transporte de mensajes | Automático, Cloud API (oficial) o Evolution (heredado) |
| Token de la API | tu token de Joinotify Cloud (sk_live_…) |
| ID del número de teléfono | el phone_number_id usado como origen |
| ID de la cuenta de empresa | el waba_id dueño de las plantillas |
En modo Automático — el predeterminado — el plugin usa la Cloud API siempre que haya un token disponible y recurre a Evolution cuando no lo hay. Los otros dos valores fuerzan un transporte concreto, útil para probar o para retener la migración.
Cuando tu licencia ya tiene un número de Joinotify Cloud aprovisionado, el token, el
phone_number_id y el waba_id llegan con la licencia. Los campos anteriores son
sobrescrituras manuales: rellénalos solo para apuntar el sitio a otro número o a otra cuenta.
En blanco, vale lo que vino con la licencia.
Dónde encontrar cada identificador en el panel de Joinotify Cloud está descrito en Inicio rápido.
La ventana de 24 horas cambia lo que puedes enviar
Esta es la diferencia que más se nota en el día a día. En el relay antiguo, el texto libre salía en cualquier momento. En la Cloud API oficial, fuera de la ventana de 24 horas desde el último mensaje del cliente, solo se entrega una plantilla aprobada — el texto libre es rechazado por Meta.
En la práctica:
- Los flujos que responden a una conversación en curso siguen funcionando igual.
- Los flujos que inician la conversación — "tu pedido salió para entrega", "valora tu compra a los 7 días" — caen fuera de la ventana y necesitan plantilla.
El concepto completo, con las categorías de plantilla y el coste de cada una, está en La ventana de 24 horas y en Plantillas.
El constructor ofrece WhatsApp: mensaje de texto y WhatsApp: mensaje multimedia. El envío de plantillas existe en el canal, pero aún no como nodo del flujo — por ahora se alcanza desde código (más abajo) o directamente por la API de Cloud.
Enviar una plantilla desde código
El envío pasa por la capa de notificaciones, que resuelve el canal activo:
$resultado = joinotify_dispatch_notification( array(
'channel' => 'whatsapp_cloud',
'type' => 'template',
'sender' => joinotify_get_first_sender(),
'receiver' => '5541987111527',
'meta' => array(
'template_name' => 'pedido_enviado',
'language' => 'es_ES',
'components' => array(
array(
'type' => 'body',
'parameters' => array(
array( 'type' => 'text', 'text' => '1042' ),
),
),
),
),
) );
if ( ! $resultado->is_success() ) {
error_log( 'Fallo al enviar la plantilla: ' . $resultado->error );
}
El formato de components es el mismo de la API — consulta
Enviar mensajes.
Cómo elige el plugin el número de origen
El phone_number_id se resuelve a partir del remitente del flujo. Cuando ese número no tiene un
phone_number_id propio mapeado, se aplica el predeterminado de la cuenta — el campo ID del
número de teléfono de la configuración, o el valor aprovisionado con la licencia.
Errores y reenvío
Un envío fallido no se descarta: el mensaje va a la cola de procesamiento (Joinotify → Cola de procesamiento) y se reintenta. Los errores de configuración — token inválido, plantilla inexistente, ventana cerrada — no se reintentan, porque insistir no cambiaría el resultado; quedan registrados en el historial y en los logs.
El error más común en producción es la ventana cerrada, registrado como
window_closed_requires_template. La tabla completa de códigos está en
Errores.
Apuntar a otro entorno
Para probar contra algo que no sea producción, define la constante en wp-config.php:
define( 'JOINOTIFY_CLOUD_API_BASE_URL', 'https://api.ejemplo.com' );
Sin la constante, el plugin habla con https://api.joinotify.com.