¡Guau! Crea tu integración de WhatsApp. Empieza gratis. Regístrate ahora
Sincronización de contenido del canal · Caso de uso WhatsApp API

Publicación en canal de WhatsApp cuando el contenido se publica

Los suscriptores pueden ver el mismo lanzamiento o promo en tu canal de WhatsApp en cuanto el sitio o la tienda lo publican, sin que alguien copie el texto a mano en la app. Cuando tu backend marca el contenido como activo, tu worker puede resolver el id del canal y publicar el anuncio a través de Whapi.Cloud. Este caso de uso muestra a los integradores cómo implementar ese flujo con la WhatsApp API.

Se dispara cuando el CMS o la tienda publica getNewsletters y después sendMessageText
Pantalla de publicación del CMS o la tienda junto a un teléfono cuyo canal de WhatsApp muestra un anuncio nuevo con la notificación habitual del canal.
Burbuja decorativa
Caso de uso

Cuándo usar este flujo

El disparador es un evento de publicación en el backend

Usa este flujo cuando un artículo, producto, promo o evento go-live del CMS en own_backend también debe actualizar un canal de WhatsApp, no cuando solo respondes chats entrantes.

El destino de difusión es un canal de WhatsApp

Usa este flujo cuando la publicación va a un JID de canal, no cuando necesitas que todos los miembros de una comunidad vean un anuncio de subgrupo.

Necesitas el id del canal antes de enviar

Usa este flujo cuando el worker debe leer la lista de canales con getNewsletters para elegir el JID correcto, no cuando ya guardas ese id en la configuración.

Canal de WhatsApp en un teléfono con un anuncio nuevo y el banner estándar de notificación del canal.
Experiencia del cliente

Los suscriptores reciben la actualización

El sitio o la tienda muestran el artículo o la promo a tiempo, pero el canal de WhatsApp sigue esperando a que alguien pegue el mismo texto a mano.

Tras ejecutar el flujo, los suscriptores del canal ven el anuncio en el canal y reciben la notificación habitual en el móvil. Los integradores construyen este resultado con la WhatsApp API.

Flujo de trabajo

Del evento de publicación al post del canal

1

La publicación de contenido tiene éxito en el backend

Tu CMS, tienda o planificador indica que el artículo, producto o promo está activo. Un worker compone el texto del anuncio y el enlace opcional para el cuerpo del canal.

2

Resuelve el JID del canal objetivo

GET /newsletters

getNewsletters devuelve tus canales con metadatos. Empareja el canal que debe actualizar tu campaña y toma su id para el paso de envío.

3

Publica el anuncio en el canal

POST /messages/text

sendMessageText publica el texto preparado en ese canal. Pon el id del canal en to y el anuncio en body.

¿Necesitas seguimiento de entrega? Una respuesta correcta de la API no significa que todos los suscriptores ya hayan recibido la publicación. Más sobre el estado de entrega →

Requisitos previos

Antes de ejecutar el flujo

Conecta el número de WhatsApp que posee el canal y autentica cada petición con el token API de ese número. Los hooks de publicación, el mapeo del CMS y qué canal apuntar se quedan en tu backend.

Opcional — profundiza en este flujo

Implementación de API

Lista el canal, luego publica

Lee el JID del canal desde la lista de newsletters y publica el cuerpo del anuncio en ese id cuando se dispara tu evento de contenido.

Obtén tu token de API gratis después de registrarte en whapi.cloud y usa ese token en el código en lugar de Your_Token de los ejemplos.

Resuelve el JID del canal objetivo

Devuelve metadatos del canal para que el worker elija el JID correcto cuando aún no está guardado en la configuración.

curl --request GET \
     --url https://gate.whapi.cloud/newsletters \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/newsletters",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/newsletters"

headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
}

response = requests.get(url, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/newsletters';

const response = await fetch(url, {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/newsletters")
  .get()
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/newsletters");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"fmt"
	"io"
	"net/http"
)

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/newsletters", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)
	fmt.Println(string(body))
}

Publica el anuncio en el canal

Publica el texto del anuncio preparado en ese canal para que los suscriptores vean la actualización con la notificación del canal.

curl --request POST \
     --url https://gate.whapi.cloud/newsletters/link/{InviteCode} \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "1203632001928471@newsletter",
  "body": "New on the site: Summer promo is live. Read more: https://example.com/promo"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/newsletters/link/{InviteCode}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"to\":\"447123456789\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
import requests

url = "https://gate.whapi.cloud/newsletters/link/{InviteCode}"

payload = {
  "to": "1203632001928471@newsletter",
  "body": "New on the site: Summer promo is live. Read more: https://example.com/promo"
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const url = 'https://gate.whapi.cloud/newsletters/link/{InviteCode}';

const response = await fetch(url, {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
  "to": "1203632001928471@newsletter",
  "body": "New on the site: Summer promo is live. Read more: https://example.com/promo"
}),
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"to\":\"447123456789\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/newsletters/link/{InviteCode}")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/newsletters/link/{InviteCode}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "447123456789" });
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{"to":"1203632001928471@newsletter","body":"New on the site: Summer promo is live. Read more: https://example.com/promo"}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/newsletters/link/{InviteCode}", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Entrega

Sabe cuándo la publicación llegó

Una respuesta de envío correcta no significa que todos los suscriptores ya tengan la publicación. El primer estado visible antes de un webhook es pending. Los cambios posteriores llegan solo en statuses.post y statuses.put. Si el estado se queda en pending y no pasa a sent, delivered o un acuse posterior, el mensaje no se entregó. Revisa el payload y el permiso de la cuenta para enviar a ese canal.

  • Una respuesta de sendMessageText no prueba que todos los suscriptores recibieron el anuncio.

  • Un pending que no avanza significa que la publicación no se entregó.

  • Observa statuses.post y statuses.put para acuses posteriores en envíos al canal.

  • Activa webhooks si tu worker debe reintentar cuando la entrega no se completa.

Qué leer sobre entrega y webhooks

Contacta con soporte si algo salió mal
Cuando algo falla

Trata los fallos en cada paso

El contenido puede publicarse en el sitio mientras la sincronización del canal falla si la lista de newsletters está vacía, se elige un JID incorrecto o sendMessageText es rechazado o no se entrega.

¿El sitio se publicó, pero el canal no se actualizó?

Mantén separado el estado de publicación del CMS de la sincronización del canal. Si getNewsletters falla o no devuelve un canal coincidente, o sendMessageText falla, reintenta o avisa a operaciones y no marques el contenido como sincronizado con el canal. Si la publicación en el canal sigue fallando tras un reintento, contacta con el soporte de Whapi con el id del canal y la respuesta fallida.

Contacta con soporte si algo salió mal

Diagnostica por paso de API

Estado Qué significa Qué hacer
400 Wrong request parameters Parámetros de petición incorrectos — revisa count y offset en la petición de listado.
500 Internal Error
Estado Qué significa Qué hacer
400 Wrong request parameters Parámetros de petición incorrectos — revisa to y body en el payload de envío.
401 Need channel authorization for send message Se necesita autorización del canal para enviar mensajes — confirma que el número conectado puede publicar en ese canal.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient Está prohibido enviar a este grupo o destinatario — confirma el JID del canal del paso de listado.
413 Request body too large
429 Too many requests
500 Internal Error
Preguntas frecuentes

Preguntas de integradores

Si el JID del canal ya está en tu configuración, puedes omitir getNewsletters y llamar sendMessageText con ese id. Cuando el id es desconocido o los canales cambian, lista primero.
No. Este flujo publica en un canal de WhatsApp. Los anuncios a toda la comunidad mediante grupos enlazados son un escenario aparte.
No. Este flujo publica una vez en un JID de canal. Los DM fríos a números individuales son otro trabajo.
Sí. Pon la URL en body con el texto del anuncio. Un enlace a chat personal es un CTA opcional cuando el canal no tiene hilo de respuesta en la publicación.
No. Compones el anuncio en body y lo envías con sendMessageText. El envío no espera una plantilla preaprobada para ese mensaje.
Si falla el paso de listado, no hay canal coincidente o falla el envío, reintenta o avisa a operaciones y no marques el contenido como sincronizado con el canal hasta que la publicación tenga éxito.
Funciones compatibles de WhatsApp

Todo lo que necesitas para crear automatizaciones en WhatsApp

Whapi.Cloud te da acceso a un conjunto completo de funciones de WhatsApp — mensajería, multimedia, grupos, canales, webhooks y más. Crea bots, automatizaciones e integraciones sin limitaciones de funciones.

Elegido por desarrolladores

Confiado por más de 3.300 desarrolladores y equipos SaaS

Desarrolladores de todo el mundo confían en Whapi.Cloud para crear automatizaciones, bots, integraciones con CRM, herramientas de mensajería masiva y flujos avanzados de WhatsApp. Nuestra infraestructura procesa millones de solicitudes API con alta estabilidad, y este número crece cada mes.

Icono de característica

5,5K+

canales API activos

Icono de característica

21M+

solicitudes API al mes

“Todo es simple, intuitivo y fácil de usar. La documentación es clara y toda la información está justo donde la necesito. Excelente trabajo.”

Roberto K. / Desarrollador Web

“Conectamos WhatsApp a nuestros flujos en n8n en solo unos minutos. Sin código, sin complicaciones — todo funcionó a la primera.”

Martin P. / Desarrollador

“Whapi.Cloud se convirtió en una parte clave de nuestra comunicación con clientes. Automatizamos actualizaciones de productos, notificaciones de pedidos y mensajes de soporte — sin plantillas ni aprobaciones de Meta.”

Oscar T. / CTO

Burbuja decorativa