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.
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:
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
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))
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:
{"event": "user.created", "user": {"uid": "abc123", "email": "[email protected]", "displayName": "Fulano Silva", "emailVerified": false}}
#Eventos
| Evento | Evento en Postal | Contacto |
|---|---|---|
user.created | firebase.user.created | Creado con el correo electrónico y el nombre (displayName); el uid pasa a ser external_id. |
user.deleted | firebase.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}}}).