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:
- 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). - 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.
- 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
- StripeCustomers, subscriptions, invoices, checkout and disputes.
- SupabaseSupabase Auth users and the Send Email Hook for login emails.
- ClerkUsers, waitlist and logins, with Svix signatures.
- Auth0Sign-ups, logins and deletions through a Log Stream, and the email provider through Actions.
- Firebase AuthTwo Cloud Functions tell Postal about every user created or deleted.
- Better AuthVerification, password reset and magic link through the API.
- Auth.js (NextAuth)The email provider (magic link) sending through the API.
#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>:
| Source | Example events |
|---|---|
| Stripe | stripe.invoice.paid, stripe.invoice.payment_failed, stripe.customer.subscription.trial_will_end, stripe.customer.subscription.deleted |
| Supabase | supabase.user.created, supabase.user.confirmed, supabase.user.deleted |
| Clerk | clerk.user.created, clerk.waitlistEntry.created, clerk.session.created |
| Auth0 | auth0.user.signed_up, auth0.user.logged_in, auth0.user.deleted |
| Firebase Auth | firebase.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
| Library | How |
|---|---|
| Supabase | Send Email Hook pointed at Postal: no code, with one template per email type, editable in the dashboard. |
| Better Auth | sendVerificationEmail, sendResetPassword and the magic link plugin calling POST /emails. |
| Auth.js | An email provider whose sendVerificationRequest calls POST /emails. |
| Auth0 | A custom email provider, built with Actions, calling POST /emails. |
| Clerk and Firebase | Use 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.