Iniciar sesión Crear cuenta
Integraciones

Firebase Auth

Dos Cloud Functions avisan a Postal de cada usuario creado o eliminado en Firebase Authentication.

Firebase Authentication no tiene webhooks. La integración usa dos Cloud Functions (disparadores de usuario creado y eliminado) que llaman a la URL de la conexión con su secreto.

#Crea la conexión

En el panel, abre Integraciones › Tu app y haz clic en Conectar en la tarjeta de Firebase Auth. 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

La conexión muestra el secreto y el código ya con tu URL. Guarda el secreto en Firebase:

Terminal
firebase functions:secrets:set POSTAL_SECRET

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.

#Las Cloud Functions

functions/index.js
const functions = require('firebase-functions/v1')

const POSTAL_URL = 'https://api.postal.so/integrations/crm/<id da conexão>/webhook'

async function sendToPostal(event, user) {
  const response = await fetch(POSTAL_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json', 'X-Postal-Secret': process.env.POSTAL_SECRET },
    body: JSON.stringify({
      event,
      user: { uid: user.uid, email: user.email, displayName: user.displayName, emailVerified: user.emailVerified },
    }),
  })

  if (!response.ok) {
    throw new Error(`Postal respondeu ${response.status}`)
  }
}

const withSecret = functions.runWith({ secrets: ['POSTAL_SECRET'] })

exports.postalUserCreated = withSecret.auth.user().onCreate((user) => sendToPostal('user.created', user))
exports.postalUserDeleted = withSecret.auth.user().onDelete((user) => sendToPostal('user.deleted', user))
Terminal
firebase deploy --only functions

Las funciones usan el fetch de Node.js 18 o superior. El formato aceptado es este, así que también puedes llamar a la URL desde otro lugar de tu backend:

Cuerpo
{"event": "user.created", "user": {"uid": "abc123", "email": "[email protected]", "displayName": "Fulano Silva", "emailVerified": false}}

#Eventos

EventoEvento en PostalContacto
user.createdfirebase.user.createdCreado con el correo electrónico y el nombre (displayName); el uid pasa a ser external_id.
user.deletedfirebase.user.deleted (eliminación)Por el uid; nunca crea un contacto.

Para las eliminaciones, la conexión indica qué hacer con el contacto: solo registrar el evento (predeterminado), dar de baja al contacto (sigue en la audiencia, 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 firebase.user.created 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 rellenado. Con los endpoints de automatizaciones, el disparador es {"type": "event", "event": "firebase.user.created"}.

Ejemplo: una secuencia de bienvenida a partir del registro. En los correos electrónicos, las propiedades del evento entran como {{event.amount}} en los pasos o como variables de la plantilla ({{{amount}}}).