Recuperación de carritos abandonados de Shopify por llamada telefónica

Alguien llega al pago y se va sin pagar. Más tarde, tu agente de IA lo llama por su nombre — salvo que ya haya comprado mientras tanto. Configuración completa: la aplicación de Shopify, los permisos y todos los puntos donde esto se queda en silencio.

Actualizado

La mayoría de la recuperación de carritos abandonados se hace por correo electrónico. Una llamada telefónica funciona distinto, porque la llamada es la única que exige juicio. Enviarle un correo a alguien que ya compró es algo pasable. Llamarlo es un mal rato para los dos.

Por eso la mayor parte de esta guía no trata de marcar un número. Trata de todo lo que tiene que ser verdad antes: que exista un pago real, que de verdad no haya comprado, que no sea medianoche para esa persona, que nunca te haya pedido que dejes de llamarla, y que sepas su nombre lo bastante bien para abrir la llamada con él.

Reserva media hora. La mayor parte se va en Shopify, no aquí.

Poco más de dos minutos: el pago que alguien abandona, las tres reglas que deciden si se llama a alguien, la frase que arma el flujo, y la llamada que empieza con su código de descuento.

La versión corta

  1. Crea una aplicación de Shopify, marca cuatro permisos e instálala
  2. Copia dos secretos distintos de Shopify
  3. Guarda ambos en Omni Octo como conexiones
  4. Pídele a Octo que construya el flujo
  5. Copia la dirección del webhook y pégala en Shopify, dos veces
  6. Prueba con una espera de un minuto

Los pasos 1 y 5 son donde la gente se atasca. Tienen sus propias secciones.

Paso 1 — Crea la aplicación de Shopify e instálala

En Shopify: Configuración → Aplicaciones y canales de ventas → Desarrollar aplicaciones → Crear aplicación. Ponle un nombre que reconozcas después.

Marca estos permisos

Abre Configuración → Integración de la API del panel de control → Configurar y concede:

PermisoPara qué sirve
read_ordersComprobar si el comprador terminó comprando
read_all_ordersLa misma comprobación en pedidos de más de 60 días
read_customersSu nombre y su número de teléfono
read_productsLeer qué había en el carrito

Buscarás un permiso de checkout y no lo vas a encontrar. read_checkouts existe, pero Shopify lo trata como protegido: no está en la lista que puedes marcar, y pedirlo necesita la aprobación propia de Shopify. Si llamas a la API de checkouts sin él, Shopify responde:

This action requires merchant approval for read_checkouts scope.

Está bien, y es la razón por la que este flujo nunca lee checkouts. Pregunta algo mejor en su lugar — ¿apareció un pedido? — que solo necesita read_orders.

Instálala

Este es el paso que todo el mundo olvida. Configurar una aplicación no hace nada hasta que pulsas Instalar aplicación en la página Overview de la aplicación. Hasta entonces no hay ningún token de acceso a la API de Admin que copiar, y cada paso posterior falla de una forma que parece otra cosa rota.

Copia dos secretos, y no los mezcles

Necesitas dos cosas distintas, y es fácil confundirlas porque ambas parecen cadenas aleatorias.

QuéDóndeQué hace
Token de acceso a la API de AdminLa pestaña Credenciales de la API de la aplicación, después de instalar. Empieza con shpat_Le permite a Omni Octo hacerle preguntas a Shopify
Secreto de firma del webhookConfiguración → Notificaciones → Webhooks, al final de la páginaLe permite a Omni Octo verificar los mensajes que envía Shopify

Uno sirve para hablar con Shopify. El otro, para comprobar que Shopify realmente envió algo. Mezclarlos es el error más caro de toda esta configuración, y el síntoma no se parece en nada a la causa — ver Cuando no pasa nada.

Paso 2 — Guarda ambos secretos en Omni Octo

Ve a la página Conexiones y añádelos uno a la vez.

El token de acceso a la API de Admin. Pulsa Nueva conexión y elige la tarjeta HTTP / clave de API bajo Otro. Pega el token shpat_. Dale a la conexión un nombre que reconozcas en una lista — “Token de API de Admin de Shopify” es mejor que “Shopify”.

El secreto de firma del webhook. Pulsa Nueva conexión de nuevo y elige Signing secret, luego pega el secreto de la página de Notificaciones. El formulario dice lo que conviene recordar:

The secret the sender signs with, not a key you call them with.

El diálogo de conexión Signing secret, con un campo Nombre y un campo etiquetado Signing secret.
Esta es la tarjeta que la gente pasa por alto. Si pegas aquí el token de Admin, o el secreto de firma en la tarjeta de clave de API, todo lo que viene después falla con un error que no nombra a ninguno de los dos.

Dos conexiones, dos direcciones. Guarda ambas antes de construir nada.

La página Conexiones con dos credenciales de Shopify en la lista: un token de API de Admin bajo HTTP y un secreto de firma de webhook bajo Webhook, ambas marcadas como activas.
Así se ve el trabajo terminado. Dos filas, dos tipos: una para hacerle preguntas a Shopify, otra para comprobar que Shopify realmente envió algo.

Paso 3 — Pídele a Octo que construya el flujo

Tú no escribes la automatización. Abre el chat y describe lo que quieres, incluida la parte de guardar al comprador como contacto:

Cuando alguien abandone el carrito en mi tienda de Shopify, espera unos treinta minutos y llámalo. Guárdalo primero como contacto, con su nombre y su número de teléfono, para que el agente pueda saludarlo por su nombre. Llama desde +1 555 0100 con mi agente Shopify Cart Recovery.

Di la parte del contacto explícitamente. Octo construirá un flujo que funciona sin ella, pero el agente abre con un “Hola” genérico en vez de “Hola, Sarah”, porque el saludo toma el nombre de tu registro de contactos y no del mensaje de Shopify. Pedirlo es la diferencia entre una llamada de recuperación y una llamada en frío.

Octo leerá tus conexiones, encontrará a tu agente y puede preguntarte qué secreto de firma usar si guardaste más de uno. Responde con el secreto de firma, no con el token de Admin.

Octo en el chat describiendo el flujo que construyó: la espera y la comprobación de si compró viven en el disparador, el comprador se guarda como contacto, y después la llamada.
Un párrafo, y esto es lo que devuelve. Nótese que la espera y la comprobación de si compró son parte del disparador: no hay nada que tengas que acordarte de añadir.

Luego comprueba que figure como activo. Un flujo que sigue marcado como borrador rechaza todo lo que Shopify envía, y el registro de entregas de Shopify se llena de fallos que parecen una dirección equivocada.

Paso 4 — Dale la dirección a Shopify

Abre el flujo y busca la tarjeta Webhook endpoint sobre el diagrama. Muestra la dirección y un estado:

  • Ready — activo, con un secreto de firma guardado
  • Inactive — en pausa o todavía como borrador, así que los mensajes de Shopify se rechazan
La tarjeta Webhook endpoint en la pestaña Resumen de un flujo: la dirección, una insignia Ready, un botón Copy y la firma que espera.
La dirección vive aquí, en la pestaña Resumen del flujo. Ready significa que el flujo está activo y que hay un secreto de firma guardado; cualquier otra cosa y las entregas de Shopify se rechazarán.

Pulsa Copy. Luego, en Shopify, ve a Configuración → Notificaciones → Webhooks → Crear webhook y crea dos, pegando la misma dirección en ambos:

EventoFormatoPor qué
Creación de pagoJSONSe dispara cuando alguien llega al pago
Actualización de pagoJSONSe dispara cuando completa más datos

Por qué dos, en palabras simples

Shopify te avisa de un pago en el momento en que alguien lo empieza — que a menudo es antes de que escriba un número de teléfono. Te avisa de nuevo cada vez que completa algo, y uno de esos mensajes posteriores suele ser el que lleva el número.

Suscríbete solo al primero y tendrás flujos que arrancan sin nadie a quién llamar. Suscríbete a ambos y tendrás a alguien a quién llamar.

El mismo menú desplegable ofrece Creación de carrito, que suena bien y no lo es. Un carrito es solo una canasta: Shopify no tiene ni correo, ni teléfono, ni nombre para él, así que no hay a quién llamar. Úsalo solo si quieres una señal inofensiva de que tus webhooks están llegando.

Crea estos webhooks en el administrador de Shopify, a mano, en esta página. No los crees a través de la API de Shopify. Probamos ambos: los creados en esta página llegaron en unos treinta segundos; los creados a través de la API no llegaron nunca, en más de una hora, y Shopify no dio error en ningún caso.

Pulsa Enviar prueba en uno de ellos. Algo debería aparecer en la lista de ejecuciones de tu flujo en menos de un minuto. Ese clic es la forma más rápida de demostrar que la conexión funciona, y no cuesta nada.

Paso 5 — Pruébalo en un minuto

Pídele a Octo que cambie la espera a un minuto.

Primero, pon tu propio número de teléfono en un registro de cliente. En Shopify: Clientes → elige o crea un cliente con tu correo → añade tu número de teléfono y guarda.

Hazlo antes de comprar. Escribir un número de teléfono en la página de pago no basta: en el checkout de una sola página de Shopify no hay ningún paso que lo envíe antes del pago, así que un número escrito ahí puede que nunca llegue a Shopify. Perdimos una noche con esto. El número del registro de cliente viaja con el pago desde el primer mensaje, y eso es lo que hace funcionar la prueba.

Luego:

  1. Inicia sesión en tu tienda como ese cliente
  2. Añade algo al carrito
  3. Ve al pago, para que la página cargue
  4. Cierra la pestaña

Tu teléfono debería sonar más o menos un minuto después de que Shopify entregue el mensaje. No necesitas escribir nada en el formulario de pago.

Luego pídele a Octo que devuelva la espera a treinta minutos. Con un minuto, el flujo llama a personas que todavía están tecleando el número de su tarjeta.

Cuando no pasa nada

Esta es la sección que habríamos querido tener. Recórrela en orden: cada punto es algo que de verdad detuvo una prueba.

No llega nada al flujo

¿Pulsaste Instalar aplicación? Configurar los permisos no es instalar.

¿Creaste los webhooks en el administrador de Shopify, y no a través de la API? Ver arriba. Este fue, con diferencia, el que más tiempo nos costó.

¿Está el flujo activo? Un borrador lo rechaza todo.

¿Acabas de crear o editar el flujo? Dale un par de minutos. Un flujo recién creado responde un momento que no está listo mientras se activa, y Shopify reintenta por su cuenta.

Revisa primero el registro de entregas del propio Shopify, en el webhook que creaste. Si Shopify no muestra una entrega, el problema está de su lado de la línea y nada en Omni Octo te lo va a explicar.

Shopify lo envía, pero el flujo lo rechaza

Casi siempre es el secreto equivocado. Cuál firma depende de cómo se creó el webhook, y eso no es obvio:

Webhook creado…Firmado con
A mano, en la página de NotificacionesEl secreto de firma de esa misma página
Por una aplicación, a través de la APILa clave secreta de API de esa aplicación

Si seguiste esta guía, quieres la primera fila. Apunta el flujo a la conexión del secreto de firma del Paso 2.

El flujo arranca, pero no se llama a nadie

¿Había un número de teléfono? Abre la ejecución y mira qué llegó. Sin número no hay llamada, por diseño.

Añadir al carrito no basta. Un carrito por sí solo no le dice nada a Shopify. La persona tiene que llegar a la página de pago, y Shopify tiene que tener una forma de contactarla: la cuenta con la que inició sesión, o lo que escriba allí.

Escribir un número de teléfono no es lo mismo que enviarlo. En el checkout de una sola página de Shopify no hay botón de “continuar” antes del pago, así que un número que alguien escriba puede que nunca llegue a Shopify. La solución confiable es la siguiente.

Pon un número de teléfono en el registro del cliente. En Shopify: Clientes → la persona → añade su teléfono. El número de un comprador con sesión iniciada viaja entonces con el pago desde el primer mensaje, y nada de lo anterior importa. Este fue el único cambio que hizo funcionar nuestra propia prueba.

Iniciar sesión por SMS no cuenta. Si Shopify envió un código por mensaje de texto para entrar, ese número pertenece al sistema de login de Shopify. Nunca llega a tu registro de clientes y no puedes usarlo.

Probar en una tienda de prueba o protegida con contraseña

Necesitas la contraseña de la tienda para comprar en tu propia tienda, en Tienda online → Preferencias → Protección con contraseña.

No confíes en onlineStoreUrl como señal de que un producto está publicado. En una tienda protegida con contraseña, Shopify lo reporta vacío para todos los productos, publicados o no. Perdimos tiempo publicando productos que ya estaban publicados. Simplemente abre la página del producto con la contraseña y compruébalo.

Qué impide una llamada

Cuatro comprobaciones. Cada una es un punto donde la ejecución termina en silencio y correctamente, en lugar de fallar. Lo que ves después difiere, así que conviene saber cuál es cuál.

Compró. Tras la espera, le preguntamos a Shopify si ya existe un pedido para ese pago. Si existe, la ejecución se detiene. Esta es toda la razón de la espera: Shopify cuenta un pago como abandonado en el momento en que alguien escribe un correo, que muchas veces es mientras todavía está buscando su tarjeta.

No pudimos saberlo. Si esa comprobación falla — token expirado, un permiso retirado, un problema de red — la ejecución se detiene sin llamar. Adivinar hacia el otro lado llama por teléfono a alguien que ya pagó.

Ambas cosas ocurren antes del primer paso, porque la comprobación es parte del disparador. Así que una ejecución detenida así aparece como completada sin pasos ejecutados — no se guardó nada y no se marcó ningún número. Hoy la pantalla de ejecuciones todavía no deja ver cuál de las dos fue; si hay ejecuciones completándose sin pasos y esperabas llamadas, revisa primero la conexión de la API de Admin.

Es de noche para esa persona. Los horarios de llamada salen del código de país del número de teléfono, y un número que no podamos ubicar en una zona horaria es un número al que no llamaremos. Para un país que abarca varias zonas, tiene que ser de día en todas.

Te pidió que pares. Un registro de no llamar para ese número bloquea la llamada antes de marcar nada, y la ejecución anota la negativa en lugar de fallar.

Una ejecución del flujo que guardó al comprador como contacto y luego declinó marcar, con el paso de llamada reportando dialed false y skipped quiet_hours.
Una negativa, por escrito. Esta ejecución guardó al comprador y luego declinó llamarlo a la una y media de la mañana: dialed: false, y la razón escrita al lado.

Lo que esto no hará

No va a crear los webhooks de Shopify por ti. Tú pegas la dirección, dos veces.

No va a inventar un número de teléfono. Sin número, no hay llamada.

Trata una llamada de recuperación como “al menos una vez”, no como “exactamente una vez”. Shopify envía un mensaje cada vez que el comprador cambia algo, y cada uno inicia su propia ejecución. Esas ejecuciones se emparejan, de modo que normalmente producen una sola llamada, pero un intervalo suficientemente largo entre mensajes puede producir una segunda. Conviene saberlo antes de apuntar esto a clientes reales.

Mantén la versión de la API al día. La conexión de la API de Admin registra qué versión de la API de Shopify usar. Shopify da soporte a cada versión durante más o menos un año y luego responde silenciosamente con una anterior en lugar de avisarte. Si ha pasado un año, actualízala.