Connections
Campaigns sends from inboxes you connect: SMTP (optional IMAP), Gmail, or Outlook. Gmail and Outlook use bring-your-own OAuth apps.
System mail (verification, password reset, invitations) is separate. It uses MAIL_* in .env — see Quick start.
Gmail / Outlook OAuth (optional)
Connect buttons appear only when credentials are set. Add to .env:
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
GOOGLE_REDIRECT_URI="${APP_URL}/oauth/google/callback"
MICROSOFT_CLIENT_ID=...
MICROSOFT_CLIENT_SECRET=...
MICROSOFT_REDIRECT_URI="${APP_URL}/oauth/microsoft/callback"
MICROSOFT_TENANT=commonRegister these redirect URIs in Google Cloud / Azure app settings:
https://YOUR_DOMAIN/oauth/google/callbackhttps://YOUR_DOMAIN/oauth/microsoft/callback
Then recreate containers: docker compose up -d.
Signatures
Each connection can use one of the team's signatures, chosen in the Signature column on the Connections page. Put in a step body (the step editor's Insert signature → Sender's signature adds it) and every email gets the signature of the connection that sends it.
A connection left on Team default uses the team's default signature. With no default either, the tag renders empty. Deleting a signature moves the connections using it back to the team default.
The tag is filled only in the email body; in a subject it renders empty.
When sending fails
A send failure only deactivates a connection when its credentials or configuration are rejected (a failed SMTP login, an expired or revoked OAuth grant, HTTP 401/403). Emails due on an inactive connection stay scheduled and are re-checked hourly; once you Verify the connection (or reconnect Gmail/Outlook) they resume within the campaign's sending window.
Other failures leave the connection active:
- A rejected address (for example SMTP 550 "user unknown") bounces that recipient only.
- Temporary problems (timeouts, SMTP 4xx, provider throttling or outages) are retried with increasing delays, up to five attempts, before the email is marked failed.
If the buttons are missing
Gmail/Outlook buttons stay hidden when credentials are not set, or when containers were not recreated after editing .env.