Firebase Auth
Duas Cloud Functions avisam a Postal de cada usuário criado ou excluído no Firebase Authentication.
O Firebase Authentication não tem webhooks. A integração usa duas Cloud Functions (gatilhos de usuário criado e excluído) que chamam a URL da conexão com o segredo dela.
#Crie a conexão
No painel, abra Integrações › Seu app e clique em Conectar no cartão do Firebase Auth. A conexão tem a sua URL, que você cola no provedor, e mostra o passo a passo na própria tela.
https://api.postal.so/integrations/crm/01a1c2d3-e4f5-7a6b-8c9d-0e1f2a3b4c5d/webhook
A conexão mostra o segredo e o código já com a sua URL. Guarde o segredo no Firebase:
firebase functions:secrets:set POSTAL_SECRET
As integrações de app contam no limite do plano (app_integrations). Fora do plano, os cartões aparecem bloqueados com o botão Fazer upgrade.
#As 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
As funções usam o fetch do Node.js 18 ou mais novo. O formato aceito é este, então você também pode chamar a URL de outro lugar do seu backend:
{"event": "user.created", "user": {"uid": "abc123", "email": "[email protected]", "displayName": "Fulano Silva", "emailVerified": false}}
#Eventos
| Evento | Evento na Postal | Contato |
|---|---|---|
user.created | firebase.user.created | Criado com o e-mail e o nome (displayName); o uid vira external_id. |
user.deleted | firebase.user.deleted (exclusão) | Pelo uid; nunca cria contato. |
Para as exclusões, a conexão diz o que fazer com o contato: só registrar o evento (padrão), descadastrar o contato (ele continua na audiência, sem receber marketing) ou excluir o contato (sem evento, já que o contato some). Uma exclusão nunca cria um contato que a Postal não tinha.
#Configurações da conexão
- Eventos: só os marcados viram contato e evento; os outros são ignorados (a resposta ainda é
202). - Sincronizar o nome: atualiza nome e sobrenome do contato com o que vier do provedor.
- Adicionar ao segmento e Inscrever no tópico: um segmento estático e um tópico para cada contato que chega.
- Quando o usuário for excluído no app: só registrar, descadastrar ou excluir o contato.
Tudo que a conexão muda no contato leva a origem crm:<id da conexão> (last_change_source), e cada entrega aparece no registro da conexão, com o resultado de cada pessoa. Uma entrega repetida pelo provedor (mesmo ID) não é processada duas vezes.
#Dispare automações
Cada evento fica no contato com o nome firebase.user.created e as propriedades da tabela acima. Na tela da conexão, o botão Criar automação ao lado de cada evento abre uma automação nova com o gatilho Evento recebido já preenchido. Pelos endpoints de automações, o gatilho é {"type": "event", "event": "firebase.user.created"}.
Exemplo: uma sequência de boas-vindas a partir do cadastro. Nos e-mails, as propriedades do evento entram como {{event.amount}} nos passos ou como variáveis do template ({{{amount}}}).