Conectar WordPress y WooCommerce
Con el plugin Joinotify conectado a tu cuenta, un sitio WordPress puede hacer más que enviar mensajes: se sincroniza con la plataforma. Los clientes de la tienda se convierten en contactos, con lo que la tienda sabe de ellos — cuántos pedidos hicieron, cuánto gastaron, cuándo compraron por última vez. Y lo que pasa en el sitio — un pedido pagado, un registro, un carrito abandonado, un formulario enviado — llega a los flujos como un evento del sitio, por el disparador Evento del sitio.
La diferencia con el disparador webhook: no hay URL que pegar ni campos
que mapear. El sitio ya dice quién es el cliente y envía cada evento con un nombre —
wc.order.paid — que cualquier flujo de la cuenta puede escuchar. Lo que trae cada evento está en
el catálogo de eventos del sitio.
Activar la sincronización
El sitio tiene que estar conectado a Joinotify. La conexión sola no envía nada más allá de lo que necesita el envío de mensajes: la sincronización está desactivada por defecto, y nada sale del sitio antes de que la actives.
- En WordPress, ve a Joinotify → Configuración → Aplicaciones y pulsa Configurar en la tarjeta Joinotify Cloud sync.
- Lee el texto de arriba de la ventana: dice exactamente lo que el sitio va a enviar.
- Elige qué sincronizar (tabla de abajo), activa la tarjeta y guarda.
Las etiquetas de la ventana aparecen aquí en inglés, el idioma de origen del plugin:
| Opción | Por defecto | Qué hace |
|---|---|---|
| WooCommerce orders and customers | activada | Eventos de pedido y de suscripción, y cada cliente con su número de pedidos, total gastado y última compra |
| WordPress users | activada | Registros y actualizaciones de perfil |
| Form submissions | desactivada | Envíos de WPForms y Elementor Pro — con todos los campos del formulario |
| Abandoned carts | activada | Contactos capturados y carritos abandonados, recuperados o perdidos de Flexify Checkout |
| Send the items of each order | activada | Productos, cantidades y categorías de cada pedido |
| Send billing and shipping addresses | desactivada | La dirección completa. Ciudad, estado y país se envían siempre |
| Tag for contacts from this site | vacío | La etiqueta de todo contacto que envía el sitio. Vacío, vale el nombre del sitio |
| Ask customers for marketing consent | desactivada | La casilla de consentimiento en el checkout, en los registros y en Mi cuenta (ver abajo) |
| Consent checkbox text | vacío | El texto de la casilla. Di qué va a recibir la persona y por qué canal |
Además de los clientes, el sitio informa su propia dirección, su nombre, la versión de Joinotify, qué plugins de tienda, formularios y checkout están activos y un ejemplo inventado de cada evento — así el editor de flujos muestra los campos antes de que llegue el primer pedido.
Nada se envía durante el checkout. Cada evento se guarda en una cola del propio sitio y se envía por lotes, en segundo plano, justo después. Si Joinotify no responde, el evento espera en la cola y se envía de nuevo más tarde. Desactivar la tarjeta detiene el envío en el acto; lo que ya llegó se queda en tu cuenta.
Qué hace la plataforma con cada contacto
La sincronización añade y nunca borra:
- El contacto se busca primero por quién es en el sitio (el usuario de WordPress, el cliente de la tienda) y después por teléfono. Un cliente que cambia de número sigue siendo un solo contacto; si el número nuevo ya es de otro contacto, no se une nada y el conflicto queda en la línea de tiempo.
- Sin teléfono no se crea ningún contacto — la plataforma es WhatsApp. El evento queda registrado como Sin contacto.
- El nombre y el correo solo rellenan lo que está vacío: lo que alguien escribió en el panel vale más.
- Las etiquetas solo entran. Cada persona recibe la etiqueta de origen del sitio, que sirve para armar públicos y campañas solo con los clientes de esa tienda.
- Los campos de la tienda — Pedidos, Total gastado, Ticket medio, Primera compra, Última compra, Estado del último pedido, Ciudad, Estado/provincia, Registro en el sitio, Rol en el sitio y, con suscripciones, Estado de la suscripción y Próximo pago — los crea la plataforma en la primera sincronización y reciben la fotografía que calcula el sitio: reemplazan el valor anterior.
- Un contacto nuevo cuenta en el límite de contactos del plan. Por encima de él, el contacto no se crea y el evento queda como Límite de contactos. Quien ya es contacto sigue con normalidad.
En la ficha del contacto, el origen aparece como Sitio conectado, y la sección En el sitio muestra quién es la persona en cada sitio conectado — Usuario de WordPress, Cliente de WooCommerce, Comprador sin cuenta o Lead de formulario o carrito — y de cuándo son los datos.
Consentimiento de marketing
Con Ask customers for marketing consent activada, aparece una casilla desmarcada:
- en el checkout — el clásico y el de bloques (WooCommerce 8.9 o más reciente);
- en los formularios de registro de WordPress y de WooCommerce;
- en Mi cuenta → Detalles de la cuenta.
Quien ya aceptó no vuelve a ver la casilla en el checkout. Quien la marca queda con el texto de la casilla, dónde y cuándo guardados en el pedido o en el usuario, como evidencia, y el próximo evento de esa persona lleva el opt-in a Joinotify. Quien desmarca la preferencia en Mi cuenta hace opt-out en la plataforma — y ese opt-out vale siempre.
Dos reglas protegen tu base:
- El consentimiento solo sube desde desconocido: una casilla marcada en un pedido antiguo nunca deshace un opt-out ni saca a nadie de la lista de supresión.
- El camino de vuelta también funciona: un opt-out hecho en Joinotify — por palabra clave, en el panel, por un flujo — se avisa al sitio, y la preferencia de la persona aparece desmarcada allí. Un opt-in hecho en Joinotify también vuelve.
Sin la casilla, los contactos llegan con el consentimiento desconocido: los mensajes transaccionales siguen siendo posibles, y las campañas de marketing siguen las reglas de Contactos y consentimiento.
Enviar los clientes que ya tienes
Los eventos solo alcanzan a quien compra o se registra de ahora en adelante. Para que tu primera campaña llegue a los clientes que la tienda ya tiene, envíalos una vez:
- En la ventana de la sincronización, en Existing customers, pulsa Send existing customers.
- Revisa la estimación: cuántos usuarios tienen teléfono y cuántos pedidos se hicieron sin cuenta.
- Pulsa Send them. El envío corre en segundo plano — puedes cerrar la página. Stop lo interrumpe, y quien ya entró en la cola se envía igual.
Cada persona va una vez: primero los usuarios, después los compradores sin cuenta, por correo (quien tiene cuenta va como la cuenta). Ningún flujo empieza para quien llega así. Quien no tiene teléfono queda fuera y se cuenta, y se respeta el límite de contactos del plan. Al final, la ventana muestra cuántos se enviaron, cuántos esperan, cuántos se abandonaron y qué hizo la plataforma con algunos — sin teléfono, teléfono no válido, por encima del límite del plan, mantenido en opt-out.
Seguimiento desde WordPress
La parte de arriba de la ventana muestra si la sincronización está activada (Sync on), desactivada (Sync off) o en pausa (Sync paused), la última entrega y el último error, y tres contadores: lo que espera (Waiting), lo que se envió en los últimos 7 días (Sent (7 days)) y lo que se abandonó (Given up).
Un envío que falla se reintenta con intervalos crecientes — de 1 minuto a 1 hora. Tras 12 intentos, o cuando la plataforma rechaza el evento por lo que es, se abandona y aparece en la lista con el motivo. Corregido el problema, Send again lo envía de nuevo; Discard lo borra. Los abandonados se quedan 30 días en el sitio.
La sincronización se pausa cuando reintentar no serviría:
| Motivo | Qué hacer |
|---|---|
| La clave del sitio se revocó o no puede enviar estos datos | Conecta el sitio de nuevo; la sincronización se reanuda sola |
| El sitio se quitó de tu cuenta | Conecta el sitio de nuevo |
| El sitio está en otra dirección que la de su clave | Si es una copia de staging, déjala en pausa. Si el sitio se mudó, conéctalo de nuevo |
En pausa, la sincronización sigue guardando los eventos en la cola del sitio, y no se pierde nada. Try again reintenta en el acto. Un sitio pausado en el panel (abajo) no pausa el plugin: los eventos esperan y se vuelven a ofrecer cada 15 minutos, hasta que lo reanudes.
Copias de staging
Una copia del sitio en otra dirección — staging, un clon, un entorno de pruebas — que se llevó la clave de producción es rechazada por Joinotify y se queda en pausa: los pedidos de prueba nunca llegan a los clientes de verdad. En el panel, el sitio muestra que una copia intentó usar su clave. Para probar la sincronización en una copia, conecta la copia por su cuenta: se convierte en un sitio aparte en Integraciones.
En el panel: Integraciones
La página Integraciones lista los sitios conectados, con las integraciones activas de cada uno, su último evento y sus eventos y problemas de las últimas 24 horas. Desde ella puedes:
- Pausar un sitio: lo que envíe se rechaza hasta que lo Reanudes — el plugin lo guarda y lo envía después;
- Desconectar: la clave del sitio se revoca en el acto. Los contactos y el historial se quedan, y conectar el mismo sitio de nuevo retoma donde lo dejó;
- Ver eventos: cada evento que envió el sitio, su contacto y su resultado.
| Estado | Qué significa |
|---|---|
| En cola | Llegó y está por procesarse |
| Procesado | Se entregó a los flujos que escuchan este evento |
| Entregado a una espera | Ningún flujo empezó, pero una ejecución en Esperar evento siguió |
| Ningún flujo escucha | Ningún flujo activo usa este evento |
| Sin contacto | El evento no trajo un contacto que se pueda encontrar o crear |
| Límite de contactos | El contacto sería nuevo y la cuenta está en el límite de su plan |
| Cuenta bloqueada | La cuenta no tiene acceso al envío |
| Error | Algo falló al procesarlo |
Solo problemas deja lo que necesita atención. El detalle de cada evento muestra los datos, el contacto enviado por el sitio y lo que hizo cada flujo con él — Inició, Filtrado, Repetido, En intervalo, Otro sitio, Sin siguiente paso. Volver a procesar entrega el evento de nuevo a los flujos; Volver a procesar aunque ya se haya tratado ignora el Actuar una vez por del disparador. Los datos de un evento se guardan 30 días, o el plazo de retención de mensajes de tu plan, si es menor.
Armar un flujo con el disparador Evento del sitio
- En el editor, añade un disparador y elige Evento del sitio.
- En Evento, elige el evento en la lista, agrupada por origen. Muestra los eventos que informaron tus sitios conectados; para un evento de tu propio código, usa Evento personalizado.
- En Sitios, marca de qué sitios vale el evento. Ninguno marcado: cualquier sitio de la cuenta.
- El Ejemplo del evento muestra los campos — haz clic en un campo para usarlo en los mensajes.
- Conecta el disparador al primer paso, publica y activa el flujo.
No hay contacto que mapear: viene en el propio evento. El disparador tiene las mismas opciones que
el webhook — Filtro, Guardar en el contacto, Línea de tiempo del contacto, Con otras
automatizaciones del contacto (por defecto, Ejecutar a la vez) e Intervalo mínimo por
contacto — y una más: Actuar una vez por. Con order.id, el mismo pedido no inicia el flujo
dos veces en 24 horas, ni siquiera en wc.order.status_changed, que sale en cada cambio de
estado. Un mismo evento entregado dos veces por el sitio nunca inicia el flujo dos veces.
Los datos del evento están en {{trigger.…}} — {{trigger.order.number}},
{{trigger.order.total:money}}, {{trigger.links.payment_url}} — y el flujo tiene además
{{trigger.$event.name}} y {{trigger.$site.name}}. Las rutas de cada evento están en el
catálogo.
Esperar un evento del sitio
El paso Esperar evento detiene la ejecución hasta que un sitio conectado envíe un evento que coincida con ella. En Esperar, elige Un evento de sitio y completa:
- Evento del sitio — lo que se espera, como
wc.order.paid; - Valor de esta ejecución — una variable de esta ejecución, como
{{trigger.order.id}}; - Dónde está el mismo valor en el evento esperado — la ruta en el evento que va a llegar, como
order.id; - el tiempo máximo de espera, obligatorio (hasta 30 días).
Los valores se comparan como texto, sin distinguir mayúsculas. Si el evento llega, la ejecución
sigue por la salida Llegó; si se acaba el tiempo, por No llegó. Con Guardar como
variable, el evento que llegó queda en {{flow.<nombre>.…}}.
Recetas
Pix pendiente
Quien generó el Pix y no pagó recibe un recordatorio 30 minutos después — y quien pagó, no.
- Disparador Evento del sitio:
wc.order.created. Filtro:order.statusigual apendingyorder.payment_methodigual al id de tu medio de pago Pix (compruébalo en el Ejemplo del evento). - Esperar evento:
wc.order.paid, valor{{trigger.order.id}}, rutaorder.id, hasta 30 minutos. - Por la salida No llegó, envía el recordatorio con
{{trigger.order.total:money}}y el enlace{{trigger.links.payment_url}}. Por la salida Llegó, termina — o da las gracias.
Lo más probable es que el cliente no haya escrito a la tienda en las últimas 24 horas: el recordatorio tiene que ser una plantilla.
Carrito abandonado
- Disparador Evento del sitio:
fcrc.cart.abandoned, con Actuar una vez porcart.id. - Una plantilla con el enlace de vuelta al carrito,
{{trigger.cart.recovery_url}}. - Esperar evento:
fcrc.cart.recovered, valor{{trigger.cart.id}}, rutacart.id, hasta 1 día. - Por la salida No llegó, el segundo recordatorio. Por la salida Llegó, termina.
Reseña después de la compra
- Disparador Evento del sitio:
wc.order.completed, con Actuar una vez pororder.id. - Esperar 7 días.
- Una plantilla que pide la reseña de
{{trigger.order.line_items[0].name}}, con el enlace{{trigger.links.review_urls[0]}}.
Una condición con customer.is_first_order separa la primera compra de las siguientes — para un
agradecimiento distinto a quien acaba de conocer la tienda.
Flujos de WordPress y de la plataforma
Los flujos del constructor del plugin, en WordPress, y los flujos de la plataforma funcionan de forma independiente: el mismo pedido puede disparar los dos, y nada avisa ni lo impide. Evitar mensajes repetidos es responsabilidad de quien opera la tienda — al pasar una automatización a la plataforma, desactiva la de WordPress (y viceversa).
Eventos personalizados
Con la sincronización activada, tu código puede enviar eventos propios con la función
joinotify_track():
joinotify_track(
'custom.quote.requested',
array( 'quote' => array( 'id' => 991, 'total' => '1290.00' ) ),
array(
'ref' => array( 'kind' => 'wp_user', 'id' => (string) $user_id ),
'phone' => '+5511987654321',
'first_name' => 'Ana',
)
);
- El nombre empieza con
custom.y tiene de una a tres partes de letras minúsculas, números y_. - El segundo argumento es el
datadel evento: en el flujo,{{trigger.quote.total}}. - El tercero dice de quién es el evento y necesita un
ref; sin él, el evento queda registrado pero no llega a ningún contacto. Parawc_guestylead, elides un hash, nunca el correo en texto plano. - La función devuelve el id del evento, o
falsecon la sincronización desactivada o un nombre fuera decustom..
Para que el editor ofrezca el evento con sus campos, descríbelo con un ejemplo inventado en el
filtro Joinotify/Cloud_Sync/Catalog:
add_filter( 'Joinotify/Cloud_Sync/Catalog', function( $entries ) {
$entries[] = array(
'name' => 'custom.quote.requested',
'schemaVersion' => 1,
'sample' => array( 'quote' => array( 'id' => 1, 'total' => '100.00' ) ),
);
return $entries;
} );
La acción Send webhook en el constructor de WordPress
El constructor de flujos del plugin tiene la acción Send webhook, que envía los datos a cualquier URL — n8n, Zapier, Make, tu ERP o el disparador webhook de un flujo de la plataforma:
- el cuerpo es el dato del disparador, con la misma forma que los eventos del sitio (pedido, cliente, enlaces, usuario, carrito), o un JSON tuyo, con los placeholders del plugin;
- método
POST,PUToPATCH, y cabeceras con el formatoNombre: valor, una por línea; - con un secreto, cada llamada lleva
X-Joinotify-TimestampyX-Joinotify-Signature-256(sha256=y el HMAC-SHA256 detimestamp.cuerpo), para que quien recibe compruebe el origen.
Solo se aceptan direcciones públicas. La llamada sale cuando el flujo llega a la acción, espera hasta 10 segundos y no sigue redirecciones; un fallo va al registro del plugin. La acción no depende de la sincronización.
Privacidad
Las herramientas de privacidad de WordPress (Herramientas → Exportar datos personales y Herramientas → Borrar datos personales) cubren la sincronización:
- exportar lista el consentimiento de marketing de la persona y lo que la cola del sitio guarda sobre su correo;
- borrar quita el consentimiento y las filas de la cola, y pide a Joinotify que borre los contactos que este sitio vinculó a la persona — encontrados por quién es en el sitio, nunca por teléfono. El contacto se borra entero, como en el borrado del panel. Si Joinotify no puede borrarlo en el momento, WordPress lo avisa: bórralo desde el panel o repite la solicitud.
Desactivar la sincronización no borra lo que ya llegó: los contactos se quedan en la cuenta, donde puedes borrarlos.
Por la API
Los eventos llegan por POST /site-events, y los clientes de la carga inicial por
POST /contacts/sync, siempre con la clave del sitio. El sobre está en el
catálogo de eventos, y las rutas, en la referencia de la API.