Sign in Create account
Guides

Integrate your app

Sign-ups become contacts, events become automations and login emails go out through Postal: connect your app's billing and sign-in with no new backend code.

#Overview

Your product's user lifecycle has three moments where Postal steps in without any new code in your backend:

  1. Sign-ups become contacts. When someone signs up in your app (Supabase, Clerk, Auth0, Firebase) or becomes a customer in Stripe, Postal creates the contact with the email, the name and the user's ID in your app (external_id).
  2. Events become automations. Payment succeeded, payment failed, trial ending, cancellation, login: each one is recorded on the contact as an event and can start an automation.
  3. Login emails go out through Postal. Sign-up confirmation, magic links, password resets and invitations are sent from your domain, with your templates, through the same API as transactional emails.

#Choose your integration

#Sign-ups become contacts

In Integrations › Your app, connect the source and paste the connection URL into the provider. Each user is matched by their ID in your app (external_id), so an email change updates the same contact. In Stripe, the customer is matched by email and linked to the Stripe ID (cus_…), and the customer's metadata.user_id, if it exists, becomes the external_id.

If your app already sends events to Postal through the API, use the same user ID in external_id (or user_id) in the calls to contacts and events: the integrations and your own code then refer to the same contact.

#Events become automations

Integration events have stable names, in the format <source>.<type>:

SourceExample events
Stripestripe.invoice.paid, stripe.invoice.payment_failed, stripe.customer.subscription.trial_will_end, stripe.customer.subscription.deleted
Supabasesupabase.user.created, supabase.user.confirmed, supabase.user.deleted
Clerkclerk.user.created, clerk.waitlistEntry.created, clerk.session.created
Auth0auth0.user.signed_up, auth0.user.logged_in, auth0.user.deleted
Firebase Authfirebase.user.created, firebase.user.deleted

Create the automation with the Event received trigger and the event name, or click Create automation next to the event on the connection screen. A few ideas:

  • Welcome: supabase.user.created → welcome email, a 2-day wait, usage tips.
  • Failed payment: stripe.invoice.payment_failed → email with the invoice link ({{event.hosted_invoice_url}}).
  • Trial ending: stripe.customer.subscription.trial_will_end → reminder with the plan ({{event.plan}}).
  • Cancellation: stripe.customer.subscription.deleted → exit survey and a “former customer” tag.

Events your product knows about and the provider does not (a project created, a limit reached) go through POST /events with the same contact. For that, there are SDKs and a CLI: see SDKs and CLI.

#Login emails through Postal

LibraryHow
SupabaseSend Email Hook pointed at Postal: no code, with one template per email type, editable in the dashboard.
Better AuthsendVerificationEmail, sendResetPassword and the magic link plugin calling POST /emails.
Auth.jsAn email provider whose sendVerificationRequest calls POST /emails.
Auth0A custom email provider, built with Actions, calling POST /emails.
Clerk and FirebaseUse Postal SMTP in the provider's email settings, when it accepts a custom SMTP server.

Login emails are sent from a verified domain of your team and count toward the same sending quotas as API emails.

#Your CRM and your AI assistants

The integrations above bring your product's data into Postal. For the rest of the way:

  • CRM: CRM connections sync contacts, pipeline stages and email activity with HubSpot, Pipedrive and RD Station CRM, both ways; the webhook connection does the same with any system that sends and receives webhooks.
  • AI assistants: the MCP server lets Claude, ChatGPT, Gemini, Cursor and others send emails, check deliveries and handle contacts and broadcasts in your account.