Webhooks de entrada
Recibe eventos de plataformas externas y otorga semillas a tus clientes automáticamente. Los webhooks entrantes te permiten conectar cualquier herramienta de te
📥 Webhooks de Entrada
Recibe eventos de plataformas externas y otorga semillas a tus clientes automáticamente. Los webhooks de entrada te permiten conectar cualquier herramienta de terceros — aplicaciones de cuestionarios, formularios, plataformas de reseñas, Zapier, Make, y más — a tu programa de lealtad LoyaltyTree.

Cómo Funciona
El sistema de webhook de entrada utiliza un modelo de Fuentes & Códigos:
- Crea una Fuente — Una fuente representa una plataforma o herramienta externa (por ejemplo, "Typeform", "Zapier", "Mi Aplicación de Cuestionarios"). Cada fuente obtiene una URL de webhook única y una clave secreta para seguridad.
- Agrega Códigos a la Fuente — Cada código define una acción específica que otorga semillas (por ejemplo, "cuestionario_completado", "formulario_enviado", "cumpleaños_reclamado"). Tú estableces cuántas semillas otorga cada código, con límites opcionales.
- Envía solicitudes POST — Tu plataforma externa envía una solicitud POST a la URL del webhook con el código y la información del cliente. LoyaltyTree encuentra o crea al cliente y otorga las semillas automáticamente.
Plataforma Externa → POST a la URL del Webhook → LoyaltyTree valida & otorga semillas → Saldo del cliente actualizado
Cómo Empezar
Paso 1: Crea una Fuente de Webhook
Navega a Tiendas → [Tu Tienda] → Integraciones → Webhooks de Entrada. Haz clic en + Agregar Fuente y dale un nombre que describa la plataforma externa (por ejemplo, "Cuestionarios de Typeform" o "Automatización de Zapier").
Cuando se crea la fuente, recibirás:
- URL del Webhook — El endpoint al que tu plataforma externa enviará solicitudes
- Secreto del Webhook — Una clave secreta para firmar solicitudes (recomendado por seguridad)

Paso 2: Agregar Códigos
Cada código representa una acción específica que deseas recompensar. Haz clic en + Agregar Código en tu fuente para crear uno.
| Campo | Requerido | Descripción |
|---|---|---|
| Código | Sí | El valor exacto enviado en la carga útil del webhook (por ejemplo, cuestionario_completado). Esto debe coincidir con lo que envía tu plataforma externa. |
| Nombre para Mostrar | Sí | Un nombre amigable que se muestra en el panel de administración y el historial de transacciones (por ejemplo, "Cuestionario Completado"). |
| Descripción | No | Una nota opcional para tu equipo sobre cuándo se utiliza este código. |
| Cantidad de Semillas | Sí | Cuántas semillas otorgar cada vez que se activa este código. Por defecto es 1. |
| Máx. Semillas/Cliente | No | El total máximo de semillas que un solo cliente puede ganar de este código. Deja vacío para ilimitado. Una vez que un cliente alcanza este límite, las llamadas de webhook posteriores para ellos devolverán éxito pero otorgarán 0 semillas. |
| Tiempo de Espera (horas) | No | Horas mínimas entre recompensas para el mismo cliente en este código. Previene abusos limitando la frecuencia con la que un cliente puede ganar semillas. Deja vacío para no tener tiempo de espera. |
| Habilitado | — | Alternar para habilitar o deshabilitar este código sin eliminarlo. Los códigos deshabilitados devuelven un error 403. |
Paso 3: Configura Tu Plataforma Externa
Configura tu plataforma externa (Zapier, Typeform, aplicación personalizada, etc.) para enviar una solicitud POST a tu URL de webhook cada vez que ocurra la acción. Consulta la sección Formato de Solicitud a continuación para el formato exacto de la carga útil.
Códigos & Límites Explicados
Los códigos y sus límites trabajan juntos para darte un control preciso sobre cómo se otorgan las semillas:
Cantidad de Semillas
Cada código tiene una cantidad fija de semillas. Cada vez que se activa el webhook con ese código, el cliente recibe exactamente esa cantidad de semillas. Por ejemplo, si estableces "cuestionario_completado" a 5 semillas, cada llamada de webhook que califique otorgará 5 semillas.
Máx. Semillas por Cliente
Esto establece un límite de por vida por cliente por código. Es el total de semillas que ese cliente puede ganar de este código específico, no el número de veces que puede activarlo.
cuestionario_completado con Cantidad de Semillas = 5 y Máx. Semillas/Cliente = 15.
- 1er cuestionario completado → +5 semillas (total: 5) ✅
- 2do cuestionario completado → +5 semillas (total: 10) ✅
- 3er cuestionario completado → +5 semillas (total: 15) ✅
- 4to cuestionario completado → +0 semillas (límite alcanzado) — devuelve éxito pero no se otorgan semillas
Tiempo de Espera (Horas)
Establece un tiempo de espera mínimo entre las recompensas de semillas para el mismo cliente en el mismo código. El temporizador de espera comienza desde la última recompensa exitosa.
visita_diaria con Cantidad de Semillas = 2 y Tiempo de Espera = 24 horas.
- Lunes 10am → +2 semillas ✅
- Lunes 3pm → +0 semillas (tiempo de espera activo, intenta de nuevo en 19 horas)
- Martes 11am → +2 semillas ✅
Formato de Solicitud
Envía una solicitud POST a tu URL de webhook con el siguiente cuerpo JSON:
{
"code": "tu_codigo_aqui",
"customer": {
"email": "cliente@ejemplo.com",
"shopify_customer_id": "12345",
"first_name": "Jane",
"last_name": "Smith"
},
"metadata": {
"quiz_score": 95,
"source_page": "spring-quiz"
}
}
| Campo | Requerido | Descripción |
|---|---|---|
code |
Sí | El valor del código que coincide con uno de tus códigos configurados (por ejemplo, cuestionario_completado) |
customer.email |
Sí* | La dirección de correo electrónico del cliente. Se utiliza para encontrar o crear al cliente. Requerido para nuevos clientes. |
customer.shopify_customer_id |
No* | El ID de Shopify del cliente. Puede usarse en lugar del correo electrónico para identificar a clientes existentes. |
customer.first_name |
No | El primer nombre del cliente. Se utiliza al crear nuevos clientes. |
customer.last_name |
No | El apellido del cliente. Se utiliza al crear nuevos clientes. |
metadata |
No | Cualquier dato adicional que desees almacenar con la transacción (por ejemplo, puntajes de cuestionarios, información de página). Almacenado como JSON y visible en los registros. |
* Al menos uno de email o shopify_customer_id es requerido. El correo electrónico es necesario cuando el cliente no existe ya en LoyaltyTree.
Verificación de Firma HMAC (Recomendado)
Para verificar que las solicitudes provienen genuinamente de tu plataforma (y no de alguien que encontró tu URL de webhook), firma tus solicitudes usando HMAC-SHA256.
- Toma el cuerpo de la solicitud JSON en bruto como una cadena
- Crea un hash HMAC-SHA256 usando tu Secreto de Webhook como clave
- Incluye el hash codificado en hexadecimal en uno de los encabezados soportados
Encabezados de firma soportados (LoyaltyTree verifica todos estos):
X-Webhook-SignatureX-Hub-Signature-256X-Signature
El valor de la firma puede ser ya sea el hash hexadecimal en bruto o prefijado con sha256= (ambos formatos son aceptados).
Alternativa: Autenticación de Token Simple
Si la firma HMAC no es posible en tu plataforma, puedes pasar tu secreto de webhook como un token simple en el encabezado X-Token. LoyaltyTree lo comparará directamente con tu secreto.
Ejemplo: Firmando con Node.js
const crypto = require('crypto');
const payload = JSON.stringify({
code: 'cuestionario_completado',
customer: { email: 'jane@example.com' }
});
const signature = crypto
.createHmac('sha256', 'tu_secreto_de_webhook')
.update(payload)
.digest('hex');
fetch('https://loyaltytree.eco/webhooks/inbound/TU_ID_DE_FUENTE', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
body: payload
});
Ejemplo: Firmando con Python
import hmac, hashlib, json, requests
payload = json.dumps({
"code": "cuestionario_completado",
"customer": {"email": "jane@example.com"}
})
signature = hmac.new(
b'tu_secreto_de_webhook',
payload.encode('utf-8'),
hashlib.sha256
).hexdigest()
requests.post(
'https://loyaltytree.eco/webhooks/inbound/TU_ID_DE_FUENTE',
headers={
'Content-Type': 'application/json',
'X-Webhook-Signature': signature
},
data=payload
)
Ejemplo: Usando cURL (para pruebas)
curl -X POST https://loyaltytree.eco/webhooks/inbound/TU_ID_DE_FUENTE \
-H "Content-Type: application/json" \
-H "X-Token: tu_secreto_de_webhook" \
-d '{"code":"cuestionario_completado","customer":{"email":"jane@example.com"}}'
Formato de Respuesta
Respuesta Exitosa (200)
{
"success": true,
"seeds_awarded": 5,
"transaction_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"customer_id": "f0e1d2c3-b4a5-6789-0123-456789abcdef"
}
Exitoso pero Limitado (200)
Cuando un tiempo de espera o límite de semillas máximas impide la recompensa, aún obtienes una respuesta 200 pero con 0 semillas y una explicación:
{
"success": true,
"seeds_awarded": 0,
"message": "Tiempo de espera activo. Intenta de nuevo en 18 hora(s)."
}
// o
{
"success": true,
"seeds_awarded": 0,
"message": "Máximas semillas (15) ya otorgadas para este código."
}
Respuestas de Error
| Estado HTTP | Error | Significado |
|---|---|---|
| 400 | Falta el campo requerido: code |
El campo code no fue incluido en el cuerpo de la solicitud |
| 400 | Falta el campo requerido: customer.email o customer.shopify_customer_id |
No se proporcionó un identificador de cliente |
| 400 | Código desconocido: xyz |
El código enviado no coincide con ninguno de los códigos configurados para esta fuente |
| 401 | Firma o token de webhook inválido |
La firma HMAC o el token no coinciden. Verifica tu secreto de webhook. |
| 403 | Fuente de webhook deshabilitada |
La fuente ha sido deshabilitada en el panel de administración |
| 403 | Código deshabilitado: xyz |
El código específico ha sido deshabilitado |
| 404 | Fuente de webhook no encontrada |
El ID de fuente en la URL no existe. Verifica la URL del webhook. |
Ejemplos de Casos de Uso
🧩 Finalización de Cuestionarios
Recompensa a los clientes por completar un cuestionario en tu sitio (creado con Typeform, Google Forms, etc.).
- Código:
cuestionario_completado - Semillas: 10
- Máx. Semillas: 10 (una sola vez)
- Tiempo de Espera: ninguno
📋 Respuesta de Encuesta
Otorga semillas cuando un cliente completa una encuesta posterior a la compra.
- Código:
encuesta_completada - Semillas: 5
- Máx. Semillas: 25 (hasta 5 encuestas)
- Tiempo de Espera: 168 horas (una vez por semana)
🎂 Recompensa de Cumpleaños
Otorga semillas en el cumpleaños de un cliente a través de tu plataforma de marketing.
- Código:
recompensa_cumpleaños - Semillas: 25
- Máx. Semillas: ninguna (anual)
- Tiempo de Espera: 8760 horas (365 días)
📸 Etiqueta de Instagram
Recompensa a los clientes que etiquetan tu marca en Instagram (verificado por tu equipo o herramienta de redes sociales).
- Código:
etiqueta_instagram - Semillas: 15
- Máx. Semillas: 60 (hasta 4 etiquetas)
- Tiempo de Espera: 72 horas (una vez cada 3 días)
Conectando con Zapier
Zapier es una de las formas más populares de conectar LoyaltyTree con cientos de otras aplicaciones. Estamos construyendo una integración dedicada de LoyaltyTree en la Tienda de Aplicaciones de Zapier, que hará que la configuración sea aún más fácil — búscala en el mercado de Zapier.
Estamos añadiendo LoyaltyTree como una aplicación nativa de Zapier. Una vez disponible, podrás buscar "LoyaltyTree" en el directorio de aplicaciones de Zapier y conectarlo directamente — no se necesita configuración de webhook. ¡Mantente atento!
Mientras tanto, puedes usar la acción Webhooks de Zapier para conectarte ahora mismo:
- Crea un Zap con tu desencadenador deseado (por ejemplo, "Nueva Respuesta de Typeform")
- Agrega un paso de acción: Webhooks de Zapier → POST
- Establece la URL a tu URL de webhook de entrada de LoyaltyTree
- Establece el Tipo de Carga Útil a JSON
- Mapea los campos:
code→ tu valor de código (por ejemplo, "cuestionario_completado")customer.email→ el correo electrónico del encuestado del desencadenador
- En Encabezados, agrega
X-Tokencon tu valor de secreto de webhook - Prueba y habilita tu Zap
Conectando con Make (Integromat)
También puedes usar el módulo HTTP / Hacer una solicitud de Make para enviar webhooks a LoyaltyTree. Configúralo de la misma manera que Zapier — establece la URL, agrega el cuerpo JSON con code y customer, y incluye tu secreto en el encabezado X-Token.
Registros de Webhook
Cada llamada de webhook de entrada se registra y es visible en la sección Webhooks de Entrada de tu página de Integraciones. Los registros muestran:
- Marca de Tiempo – Cuándo se recibió el webhook
- Fuente – Qué fuente lo recibió
- Estado – Éxito o fallo
- Detalles – Código utilizado, semillas otorgadas, o mensaje de error
- Carga Útil – El cuerpo completo de la solicitud (encriptado en reposo)
Utiliza los registros para verificar que tu integración esté funcionando correctamente y para solucionar cualquier problema.
Solución de Problemas
Recibiendo 401 "Firma de webhook inválida"
- Asegúrate de estar firmando la cadena exacta del cuerpo JSON que estás enviando (sin espacios en blanco adicionales o reformateo)
- Verifica que estés usando el secreto de webhook correcto (puedes revelarlo en el panel de administración)
- Si la firma HMAC no es posible, utiliza el encabezado
X-Tokencon tu secreto como un valor simple - Puedes regenerar el secreto desde la configuración de la fuente si es necesario
Recibiendo 400 "Código desconocido"
- El valor de
codeen tu solicitud debe coincidir exactamente con un código que hayas configurado en el panel de administración - Los códigos son sensibles a mayúsculas y minúsculas:
Cuestionario_Completadoes diferente decuestionario_completado - Verifica que el código esté habilitado (no deshabilitado)
Semillas otorgadas son 0
- Verifica si el cliente ha alcanzado el límite de Máx. Semillas/Cliente para este código
- Verifica si el Tiempo de Espera aún está activo — el mensaje de respuesta te dirá cuántas horas esperar
- Ambos devuelven HTTP 200 con
seeds_awarded: 0y una explicación en el campomessage
Cliente no creado
- Los nuevos clientes requieren una dirección de correo electrónico. Si solo envías
shopify_customer_id, el cliente debe existir ya en LoyaltyTree. - Si se proporcionan tanto el correo electrónico como el ID de Shopify, LoyaltyTree primero busca por correo electrónico, luego por ID de Shopify, y crea un nuevo cliente solo si ninguno coincide.
Seguridad
- Cada fuente obtiene un secreto de webhook único de 64 caracteres, autogenerado y encriptado en reposo
- Los secretos pueden ser regenerados en cualquier momento desde la configuración de la fuente (el antiguo secreto deja de funcionar inmediatamente)
- Las cargas útiles de las solicitudes están encriptadas en los registros por privacidad
- La verificación de firma utiliza comparación segura por tiempo para prevenir ataques de tiempo
- Las fuentes y los códigos pueden ser deshabilitados individualmente sin eliminarlos