Iniciar sesión Crear cuenta
Integraciones

Supabase

Los usuarios de Supabase Auth pasan a ser contactos, y los correos de autenticación salen por Postal con el Send Email Hook.

La integración de Supabase tiene dos partes, en la misma conexión: los usuarios de Supabase Auth pasan a ser contactos (con eventos de registro, confirmación y eliminación), y los correos de autenticación de tu app salen por Postal con el Send Email Hook.

#Crea la conexión

En el panel, abre Integraciones › Tu app y haz clic en Conectar en la tarjeta de Supabase. La conexión tiene su propia 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 Supabase, abre Integrations › Database Webhooks y crea un webhook en la tabla auth.users con Insert, Update y Delete. En HTTP Request, elige POST y pega la URL de la conexión. En HTTP Headers, añade:

Encabezado
X-Postal-Secret: whsec_… (o segredo mostrado na conexão)

El secreto pertenece a la conexión y se puede cambiar en su pantalla (el anterior deja de valer). También vale Authorization: Bearer <segredo>.

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

Cambio en auth.usersEvento en PostalPredeterminado
INSERTsupabase.user.createdactivado
UPDATE que confirma el correo electrónicosupabase.user.confirmedactivado
UPDATE que solo cambia el último inicio de sesiónsupabase.user.signed_indesactivado
Otro UPDATE (correo electrónico, metadatos)supabase.user.updatedactivado
DELETEsupabase.user.deleted (eliminación)activado

Las propiedades son user_id, provider, email_confirmed, created_at y last_sign_in_at. Los cambios en otras tablas se ignoran.

#Qué contacto

El usuario se identifica por el ID de Supabase, guardado en el external_id del contacto: si el correo electrónico cambia, se actualiza el mismo contacto. El nombre sale de los metadatos del usuario, de first_name y last_name (o de full_name / name):

Registro con nombre
await supabase.auth.signUp({
  email: '[email protected]',
  password,
  options: { data: { first_name: 'Fulano', last_name: 'Silva' } },
})

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.

#Correos electrónicos de inicio de sesión (Send Email Hook)

Con el Send Email Hook, Supabase entrega cada correo de autenticación a Postal en lugar de enviarlo. Para activarlo:

  1. En la conexión, en Correos de inicio de sesión con Postal, activa el envío, elige el remitente (de un dominio verificado de tu equipo) y, si quieres, la URL del proyecto (https://abcd.supabase.co).
  2. En Supabase, abre Authentication › Hooks, añade un hook Send Email de tipo HTTPS con la URL del hook que muestra la conexión y genera el secreto.
  3. Copia el secreto (v1,whsec_…) y pégalo en la conexión. Guarda.
URL del hook (ejemplo)
https://api.postal.so/integrations/supabase/01a1c2d3-e4f5-7a6b-8c9d-0e1f2a3b4c5d/send-email
email_action_typePlantilla predeterminada (asunto)
signupConfirma tu registro
magiclinkTu enlace de acceso
recoveryRestablece tu contraseña
inviteHas recibido una invitación
email_changeConfirma el cambio de correo electrónico (con el cambio seguro, un correo a la dirección actual y otro a la nueva)
reauthenticationTu código de confirmación

Cada tipo tiene una plantilla en portugués que editas en la conexión (asunto y HTML). Variables:

VariableQué es
{{{CONFIRMATION_URL}}}El enlace de confirmación. Con la URL del proyecto: https://abcd.supabase.co/auth/v1/verify?token=…&type=…&redirect_to=…. Sin ella: {site_url}/auth/confirm?token_hash=…&type=…&next=…, para quien confirma en la propia app (SSR).
{{{TOKEN}}}El código de 6 dígitos (OTP).
{{{TOKEN_HASH}}}El hash del token, para armar tu propio enlace.
{{{EMAIL}}}, {{{NEW_EMAIL}}}El correo electrónico del usuario y, en el cambio, el nuevo correo.
{{{SITE_URL}}}, {{{REDIRECT_TO}}}La Site URL del proyecto y el destino después de la confirmación.

Los correos siguen el mismo camino que POST /emails: dominio verificado, cuotas diaria y mensual y cola prioritaria. Llevan la etiqueta supabase_auth con el tipo y aparecen en Correos. Los tipos de aviso de seguridad (password_changed_notification y otros) se aceptan sin envío.

La respuesta sigue lo que Supabase espera: {} con 200 cuando el correo pasó a la cola y, en los errores, el estado con el motivo, que aparece en Logs › Auth en Supabase:

Quien recibe estos correos de inicio de sesión también queda guardado en la Audiencia, como contacto sin confirmar, sin recibir marketing hasta que lo confirmes: mira Audiencia automática de los correos transaccionales.

403Error
{
  "error": {
    "http_code": 403,
    "message": "The exemplo.com domain is not verified. Please, add and verify your domain."
  }
}
EstadoCuándo
401Firma ausente o no válida: el secreto pegado en la conexión no es el del hook.
403El dominio del remitente no está verificado, el envío está pausado o la cuenta está suspendida.
409Los correos de inicio de sesión están desactivados en la conexión, o la conexión está pausada.
422La conexión no tiene remitente, o el hook no trajo correo electrónico.
429Se agotó la cuota diaria o mensual de envíos.

#Dispara automatizaciones

Cada evento queda en el contacto con el nombre supabase.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 completado. Con los endpoints de automatizaciones, el disparador es {"type": "event", "event": "supabase.user.created"}.

Ejemplo: una secuencia de bienvenida a partir del registro, y un recordatorio para quien no confirmó el correo electrónico en 2 días (con una condición sobre supabase.user.confirmed). En los correos, las propiedades del evento entran como {{event.amount}} en los pasos o como variables de la plantilla ({{{amount}}}).