Integrações

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.

URL da conexão (exemplo)
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:

Terminal
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

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

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:

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

#Eventos

EventoEvento na PostalContato
user.createdfirebase.user.createdCriado com o e-mail e o nome (displayName); o uid vira external_id.
user.deletedfirebase.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}}}).