Sign up as the owner
The first account to sign up at /signup becomes the workspace owner. Subsequent signups are blocked unless you explicitly invite them via Team management.
Why signup-blocked-by-default
Self-hosted = your inbox, your contacts, your sender reputation. Open signups would mean anyone who finds the URL can use your provider credentials.
Create your first brand
A "brand" is the unit of isolation in Maillayer. Each one has its own:
- Email provider config (SMTP / SES / SendGrid / Mailgun)
- Sender domain
- Contacts, lists, tags
- Templates, campaigns, sequences, forms
- Integration credentials (Stripe key, Firebase JSON, etc.)
One install can host multiple brands — useful for agencies or anyone with several products. More on multi-brand →
The first 10 minutes
- Brand → Provider. Paste your SMTP or SES credentials.
- Brand → Domain. Add a sender domain so SPF/DKIM can be configured. See Custom domain.
- Send a test. The "Send test email" button goes through the same path as a real send and confirms credentials.
- Import contacts. Upload a CSV via Contacts → Import.
- Send something. A campaign, a sequence trigger, or a transactional send. Whichever fits your use case.
Where data lives
Inside the container at /app/data:
maillayer.db— the SQLite database (contacts, campaigns, events, etc.).auth_secret— the AES-256-GCM key used to decrypt stored credentialsbackups/— nightly VACUUM-INTO snapshots
Mount that path as a volume on your host and you can rebuild the container any time without losing state.