curl y Python porque se leen fácil; cualquier lenguaje con HTTP y JSON sirve. Los tipos y campos completos están en la referencia del esquema.
1. Sincronizar las suscripciones a tu warehouse
Objetivo: tener en BigQuery, Snowflake, Postgres o una planilla una copia de las suscripciones que se actualice sola, sin traer todo cada vez. Cómo: la primera corrida trae todo; las siguientes piden solo lo que cambió desde la última, conupdatedAfter y orden por UPDATED_AT. Guardá la fecha de la última corrida y el endCursor por si una página falla a la mitad.
- Pedí
first: 100(el máximo) y no anidesordersadentro desubscriptions: 100 × 100 supera el tope de nodos por request. Traé los pedidos en una segunda consulta (receta 2). updatedAtcambia con cualquier edición, cobro, pausa o cancelación, así que una suscripción cancelada entra en la próxima corrida sola.- Con 2000 requests por minuto por clave, una tienda con 50.000 suscripciones se sincroniza entera en menos de un minuto; el ritmo lo marca tu warehouse, no la API.
2. Conciliar los pedidos del mes con contabilidad
Objetivo: una lista de todos los cobros de suscripción del mes, con el número de pedido de Shopify y el ID de pago de Mercado Pago, para cruzarla con la liquidación de MP.typedistingue el primer cobro (FIRST) de las renovaciones (RENEWAL); el descuento de primer pedido solo aplica al primero.- Un pedido combinado (auto-merge) aparece una vez por suscripción con el mismo
shopifyOrderId: cada fila es un cobro de Mercado Pago, así que la suma deamountcoincide con lo cobrado aunque el pedido de Shopify sea uno solo. - Si tu contabilidad necesita el IVA, cada suscripción trae
tax { amount rate title included }.
3. Un bot de soporte que pausa, saltea y cancela
Objetivo: que tu equipo de atención (o un agente de IA) resuelva «pausame un mes» o «cancelá mi suscripción» desde su propia herramienta, con las mismas reglas que el portal. Cómo: buscá la suscripción por email, ejecutá la mutation con unIdempotency-Key y mostrá el userError tal cual si lo hay.
- Usá como
Idempotency-Keyalgo que identifique la intención (el ID del ticket más la acción): si tu herramienta reintenta, la API devuelve la misma respuesta sin pausar dos veces. MIN_CYCLESsignifica que el plan tiene un compromiso mínimo que el cliente no cumplió. Es la misma regla que ve en el portal: decidí en tu bot si el agente puede saltearla conoverrideMinCycles: true(actúa como el merchant).- Para cancelar, pedile al agente un motivo de la lista (
TOO_EXPENSIVE,DELIVERY_PROBLEMS…) y pasá el texto libre ennote: aparece en el análisis de bajas del dashboard. - El historial de la suscripción muestra «API (nombre de la clave)», así que nombrá la clave con el nombre de la herramienta («Zendesk bot»).
3b. Un bot que arma el checkout listo para el cliente
Objetivo: que tu bot de ventas (WhatsApp, CRM) cierre la conversación con un link donde el cliente solo revisa, carga la tarjeta y paga — productos, cantidades y sus datos ya puestos. Cómo: armá el link concheckoutLinkCreate — una línea por producto con su planId (los listás con plans) — y pasale los datos del cliente y tu referencia:
- La respuesta trae la URL lista para mandar y
expiresAt. La URL no lleva ningún dato personal — solo un código opaco; los datos viven en Reval, vencen a los 30 días y se borran al usarse. - Los planes pueden tener frecuencias distintas: el cliente paga una vez y cada frecuencia queda como su propia suscripción.
- Cuando el cliente completa la compra, tu
externalRefaparece enSubscription.externalRefy comoexternal_refen el webhooksubscription.created— ahí tu bot cierra el circuito con su conversación. - El link es de un solo uso: para una compra nueva, generá otro. Un link sin
customerniexternalReftambién funciona y es permanente. - Los errores vuelven por
userErrorsindicando la línea (lines[1]: …): plan inactivo (PLAN_UNAVAILABLE), bundle o producto-caja (REJECTED), input inválido (INVALID_INPUT). Nunca se genera un link muerto.
4. Alertas de cobros fallidos en Slack (o donde quieras)
Objetivo: enterarte en el momento cuando Mercado Pago rechaza una renovación, con el motivo en palabras, para contactar al cliente antes de que se cancele. Cómo: un endpoint suscripto solo asubscription.payment_failed. El payload trae reason_text listo para pegar en un mensaje.
- Respondé 200 antes de hacer cosas lentas; si Slack tarda más de 10 segundos, Reval cuenta el intento como fallido y reintenta.
- Mercado Pago reintenta el cobro por su cuenta; si después aprueba, recibís
subscription.chargedpara la misma suscripción. - Si querés ver el estado actual sin esperar el próximo evento, consultá
subscription(id) { lastPaymentFailedAt lastPaymentFailReason status }.
5. Webhooks en Zapier, Make o n8n, sin escribir código
Objetivo: que cada cancelación agregue una fila en Google Sheets, o que cada alta cree un contacto en tu CRM.- En tu herramienta, creá un trigger de tipo Webhook / Catch hook y copiá la URL que te da (es
https, así que Reval la acepta). - En Reval → Integraciones → Webhooks, agregá un endpoint con esa URL y marcá solo los eventos que necesitás (por ejemplo
subscription.cancelled). - Tocá Enviar prueba: tu herramienta recibe un evento
testcon la misma forma que uno real, y con eso mapeás los campos (data.customer_email,data.product_names,data.reason…). - Guardá el flujo. A partir de ahí, cada evento real lo dispara.
- Estas herramientas responden 2xx al instante, que es lo que Reval espera. No hace falta verificar la firma para empezar; si querés hacerlo, Make y n8n tienen pasos de HMAC con los que podés replicar la verificación.
- Usá
data.subscription_idcomo clave en tu planilla o CRM para no duplicar filas cuando Reval reintenta una entrega.
6. Email de retención con link directo al portal
Objetivo: mandarle a un cliente que canceló (o que tuvo un cobro fallido) un email con un botón que abre su suscripción en el portal, ya autenticado, para que la reactive o cambie la tarjeta.- El link está firmado y vence: generalo al momento de mandar el email, no lo guardes.
- Trátalo como una credencial: quien lo tenga entra al portal de ese cliente. No lo mandes por canales donde pueda quedar expuesto.
- Si usás Klaviyo, los eventos que Reval le manda ya incluyen
portal_subscription_url, que abre la suscripción en el portal con el login normal del cliente;subscriptionPortalLinkes para cuando necesitás el acceso directo desde otra herramienta.