Iniciar sesión Crear cuenta
Integraciones

Stripe

Los clientes, suscripciones, facturas, checkout y disputas de Stripe se convierten en contactos y eventos que disparan automatizaciones.

Con la integración de Stripe, cada cliente se convierte en contacto y cada cobro, suscripción o disputa se convierte en un evento que puede iniciar una automatización: un correo electrónico cuando falla el pago, un recordatorio cuando la prueba gratuita está por terminar, una encuesta cuando alguien cancela.

#Crea la conexión

En el panel, abre Integraciones › Tu app y haz clic en Conectar en la tarjeta de Stripe. La conexión tiene tu URL, que pegas en el proveedor, y muestra el paso a paso en la propia pantalla.

URL de la conexión (ejemplo)
https://api.postal.so/integrations/crm/01a1c2d3-e4f5-7a6b-8c9d-0e1f2a3b4c5d/webhook

En Stripe, abre Desarrolladores › Webhooks, haz clic en Añadir destino, pega la URL y elige los eventos de la tabla de abajo. Después, abre el destino, revela el Secreto de firma (whsec_…) y pégalo en la conexión. El secreto queda cifrado y no vuelve a aparecer.

Cómo comprueba Postal

Cada solicitud necesita el encabezado Stripe-Signature válido para el secreto y con un máximo de 5 minutos. Sin él, la respuesta es 401 y no cambia nada.

Las integraciones de app cuentan en el límite del plan (app_integrations). Fuera del plan, las tarjetas aparecen bloqueadas con el botón Mejorar plan.

#Eventos

Todo evento lleva también stripe_event_id, customer_id y livemode. Los valores de dinero vienen en la unidad de la moneda (49.9 para R$ 49,90), con la moneda en mayúsculas (BRL).

Evento de StripeEvento en PostalCuándoPropiedades
checkout.session.completedstripe.checkout.session.completedCheckout completadocheckout_session_id, amount, currency, mode, payment_status, subscription_id
checkout.session.async_payment_succeededstripe.checkout.session.async_payment_succeededPago asíncrono (boleto, Pix) aprobadolas del checkout
checkout.session.async_payment_failedstripe.checkout.session.async_payment_failedPago asíncrono rechazado o vencidolas del checkout
customer.createdstripe.customer.createdCliente creadocustomer_id, name, phone
customer.updatedstripe.customer.updatedCliente actualizadolas del cliente
customer.deletedstripe.customer.deletedCliente eliminado (eliminación, véase abajo)las del cliente
customer.subscription.createdstripe.customer.subscription.createdSuscripción creadasubscription_id, status, plan, price_id, product_id, amount, currency, interval, trial_end, current_period_end
customer.subscription.updatedstripe.customer.subscription.updatedSuscripción modificada (plan, estado, cancelación programada)las de la suscripción, más cancel_at_period_end
customer.subscription.pausedstripe.customer.subscription.pausedSuscripción pausadalas de la suscripción
customer.subscription.resumedstripe.customer.subscription.resumedSuscripción reanudadalas de la suscripción
customer.subscription.trial_will_endstripe.customer.subscription.trial_will_endLa prueba gratuita termina en 3 díaslas de la suscripción
customer.subscription.deletedstripe.customer.subscription.deletedSuscripción canceladalas de la suscripción, más cancellation_reason
invoice.paidstripe.invoice.paidFactura pagadainvoice_id, invoice_number, amount, currency, status, billing_reason, plan, hosted_invoice_url, invoice_pdf
invoice.payment_failedstripe.invoice.payment_failedFallo en el pago de la facturalas de la factura, más attempt_count y next_payment_attempt
invoice.upcomingstripe.invoice.upcomingPróxima factura (días antes del cobro)las de la factura, más amount_due y period_end
charge.dispute.createdstripe.charge.dispute.createdDisputa abiertadispute_id, charge_id, amount, currency, reason, status
charge.dispute.closedstripe.charge.dispute.closedDisputa cerradalas de la disputa

Los demás eventos de Stripe se aceptan y se ignoran.

#Qué contacto

El contacto es el cliente de Stripe, identificado por el correo electrónico que llega en el propio evento (el del cliente, customer_email de la factura o customer_details.email del checkout). Postal no llama a la API de Stripe: cuando el evento trae solo el ID del cliente (como las suscripciones), vale el contacto que un evento anterior ya vinculó a ese ID. Sin correo electrónico y sin contacto vinculado, el evento se omite y aparece como “ignorado” en el registro.

El nombre del cliente pasa a ser el nombre y el apellido del contacto, y metadata.user_id (o userId, external_id) pasa a ser el external_id: guarda en él el ID del usuario en tu app al crear el cliente en Stripe.

Crear el cliente con el ID de tu app
await stripe.customers.create({
  email: '[email protected]',
  name: 'Fulano de Tal',
  metadata: { user_id: user.id },
})

Para customer.deleted, la conexión define qué hacer con el contacto: solo registrar el evento (predeterminado), dar de baja al contacto (sigue en la audiencia, pero sin recibir marketing) o eliminar el contacto (sin evento, ya que el contacto desaparece). Una eliminación nunca crea un contacto que Postal no tenía.

#Configuración de la conexión

  • Eventos: solo los marcados se convierten en contacto y evento; los demás se ignoran (la respuesta sigue siendo 202).
  • Sincronizar el nombre: actualiza el nombre y el apellido del contacto con lo que llegue del proveedor.
  • Añadir al segmento y Suscribir al tema: un segmento estático y un tema para cada contacto que llega.
  • Cuando el usuario se elimine en la app: solo registrar, dar de baja o eliminar el contacto.

Todo lo que la conexión cambia en el contacto lleva el origen crm:<id da conexão> (last_change_source), y cada entrega aparece en el registro de la conexión, con el resultado de cada persona. Una entrega repetida por el proveedor (mismo ID) no se procesa dos veces.

#Dispara automatizaciones

Cada evento queda en el contacto con el nombre stripe.invoice.payment_failed y las propiedades de la tabla anterior. En la pantalla de la conexión, el botón Crear automatización junto a cada evento abre una automatización nueva con el disparador Evento recibido ya completado. Con los endpoints de automatizaciones, el disparador es {"type": "event", "event": "stripe.invoice.payment_failed"}.

Ejemplo: cuando falla el cobro, envía un correo electrónico con el botón a la factura ({{event.hosted_invoice_url}}) y, si pasados 3 días no hay stripe.invoice.paid, un segundo aviso. En los correos, las propiedades del evento entran como {{event.amount}} en los pasos o como variables de la plantilla ({{{amount}}}).

#Probar

Con la CLI de Stripe, lanza eventos de prueba a tu destino:

Terminal
stripe trigger customer.created
stripe trigger invoice.payment_failed

El contacto aparece en Audiencia y el evento en Eventos. En Stripe, cada entrega muestra la respuesta de Postal (202 aceptado, 401 firma no válida, 409 conexión pausada).

Próximos pasos

La conexión con un clic (app de Stripe, sin copiar el secreto) está en los planes. Por ahora, el destino se crea a mano en Stripe.