Integrations

Bring in people from Stripe, Firebase, Supabase or Airtable automatically: new customers, sign-ups and rows become contacts.

Connect a tool you already use and the people in it become contacts on their own: new Stripe customers, new sign-ups in Firebase or Supabase, new rows in Airtable. Open Integrations in the dashboard, pick a source, paste a key, and choose which lists they join.

SourceWho comes inHow fast
StripeCustomers, and buyers from Checkout and Payment LinksInstantly, by webhook, or checked every 5 minutes without one
FirebaseAuthentication users, or documents in a Firestore collectionChecked every 5 minutes
SupabaseAuth users, or rows in a tableChecked every 5 minutes
AirtableRows in a table with an email fieldChecked every 5 minutes

How it works#

  • One way only. We read from your tool and never change anything there. Deleting someone there doesn't delete the contact here.
  • New people or everyone. When you connect, choose to bring in only people added from now on, or everyone who's already there too.
  • Same rules as any contact. New contacts get the usual contact checks. People who unsubscribed or bounced stay that way; a sync never subscribes them again.
  • Details come along. Names fill in first and last name. Other fields become contact properties you can use as {{ variables }}, plus the id from the source (for example stripe_customer_id).
  • Keys are stored encrypted and never shown again. Removing an integration forgets its key; contacts it added stay.
  • Only connect people who agreed to get email from you. The connect form asks you to confirm it.

Stripe#

  1. In Stripe, open Developers → API keys → Create restricted key.
  2. Give it Customers: Read and Checkout Sessions: Read, plus Webhook Endpoints: Write for instant updates, and create it.
  3. Paste the rk_live_… key into Maillayer. We register a webhook in your Stripe account so new customers arrive instantly.

One-time payments through Checkout or Payment Links often don't create a Stripe customer, so we also read completed checkout sessions: those buyers come in with their email, name and country. That needs Checkout Sessions: Read.

Don't want a webhook in your Stripe? Untick New customers instantly and the key only needs Customers: Read; we check every 5 minutes instead. The same happens if the key can't create webhooks. Customers' billing country becomes their location, and Stripe metadata becomes contact properties.

Firebase#

  1. In the Firebase console, open Project settings → Service accounts → Generate new private key.
  2. Upload or paste the JSON file in Maillayer.
  3. Choose Signed-up users (Firebase Authentication), or A Firestore collection and the field names.

Disabled users and users without an email address are skipped.

Supabase#

  1. In Supabase, open Project Settings → API and copy the Project URL and the service_role secret key.
  2. Choose Signed-up users (Supabase Auth), or A table and its column names.

For Auth users, names come from full_name, name, first_name and last_name in the user's metadata.

Airtable#

  1. At airtable.com/create/tokens, create a token with the data.records:read scope and access to your base.
  2. Paste the token, the base id (it starts with app; pasting the base's URL works too) and the table's name.
  3. Enter the field names. They're case-sensitive, like Email.

Tables and collections

For a Firestore collection or a Supabase table, add a created-at field if it has one. Then each check reads only new rows, and “only people added from now on” is possible. Without it, the whole table is read each time and everyone in it is imported.

When something goes wrong#

If a key is wrong, revoked or missing a permission, the integration shows Needs attention with the reason and stops checking. Fix the key in your tool, then remove the integration and connect it again. Other problems, like the tool being briefly down, are retried on their own.

Sync now checks right away. Pause stops checking until you resume; nothing is lost while it's paused.