Configuration
Environment Variables
See Environment Variables for the full list.
Database
SendDock uses PostgreSQL 17. The Docker Compose file included in the repo sets up a PostgreSQL instance with:
- User:
senddock - Password:
senddock_dev(change in production) - Database:
senddock - Port:
5434(to avoid conflicts)
Using an external database
Set DATABASE_URL to your PostgreSQL connection string:
DATABASE_URL=postgres://user:password@host:5432/dbname?sslmode=requireThen run migrations:
make migrateRedis
Redis is used for per-project rate limiting on /send, /send/batch and /broadcast, and for caching the GitHub releases response that powers the "update available" badge in the dashboard. Port 6380 by default. Self-hosted instances exposed to the internet should run Redis even if you don't think you need it for caching, specifically so the rate limits stay enforced.
Security Checklist
Before exposing to the internet:
- [ ] Change
JWT_SECRETto a random string (min 32 characters):openssl rand -base64 48 - [ ] Change PostgreSQL password from default
- [ ] Set
FRONTEND_URLto your actual domain (used for CORS) - [ ] Set
PUBLIC_URLto the same domain (used for unsubscribe + tracking links inside emails) - [ ] Use HTTPS via reverse proxy —
Securecookies are set automatically whenFRONTEND_URLstarts withhttps:// - [ ] Run with Redis enabled — without it the per-project rate limits on
/send,/send/batchand/broadcastare bypassed - [ ] Keep SendDock updated
If anything misbehaves after going live, see Troubleshooting.
Plans & licensing
SendDock is open-core: the AGPL-3.0 Community edition does everything most one-person operations need, and two paid tiers (Pro and Team) add features for analytics and team collaboration. All paid tiers are unlocked through a single environment variable validated against Lemon Squeezy.
SENDDOCK_LICENSE_KEY=Self-hosted prices below are flat per instance
The $9 and $29 prices on this page are the self-hosted rates — one license per SendDock instance, unlimited subscribers, unlimited sends. The managed cloud at senddock.dev (when it ships) is priced separately on a volume basis because we operate the SMTP relays and deliverability for you.
What each tier unlocks
| Capability | Community (Free) | Pro ($9 / mo, $90 / yr) | Team ($29 / mo, $290 / yr) |
|---|---|---|---|
| Single user, multiple workspaces | ✓ | ✓ | ✓ |
| Subscribers, templates, broadcasts | ✓ | ✓ | ✓ |
| BYO SMTP, unlimited sends | ✓ | ✓ | ✓ |
| Bounce ingestion, suppression list | ✓ | ✓ | ✓ |
| Click & open tracking | ✓ | ✓ | ✓ |
| API keys + webhook dispatcher | ✓ | ✓ | ✓ |
| Pro Analytics dashboard | — | ✓ | ✓ |
| Webhooks management UI | — | ✓ | ✓ |
| Audit log | — | ✓ | ✓ |
| Multi-user workspaces (members + invites) | — | — | ✓ |
| Roles: owner / admin / developer / viewer | — | — | ✓ |
| Admin user creation (no public registration needed) | — | — | ✓ |
| A/B testing, segments & tags, approval workflow | — | — | roadmap |
A future Enterprise tier will add SSO/SCIM, per-project ACLs, white-label tracking domain, per-seat billing and SLA support — pricing on request, starting around $149 / mo.
SENDDOCK_LICENSE_KEY | What unlocks |
|---|---|
| empty | Community — Pro features locked, Team features locked. |
| valid Pro key | Pro features unlocked (Analytics, Webhooks, Audit log). Team features stay locked. |
| valid Team key | Pro and Team features unlocked. |
| invalid / revoked | Locked after the next validation tick (24h grace from the last successful check). |
The validator distinguishes Pro from Team by the Lemon Squeezy variant_id of the license — there is no separate Team key file or env var. Buying Team gives you a single key that the validator recognizes as Team-tier; buying Pro gives a key that validates only the Pro features.
DEPLOYMENT_MODE no longer changes Pro gating — the license requirement applies the same way to self-hosted and cloud. The mode still controls registration (cloud enables POST /api/v1/auth/register; self-hosted keeps registration disabled and relies on the setup screen).
The validator only needs the license key — there is no API key, store ID or webhook secret to configure on the self-hosted side. Those are provisioned on the senddock.dev managed service that issues licenses.
If the license check fails (network outage, key revoked, etc.) SendDock keeps running with the last successful validation result for a grace period, then falls back to free-tier behavior. You'll see the cause on stdout: license: ….
Pro requires the prebuilt image
Pro code lives in a private repository and is compiled into the official ghcr.io/arkhe-systems/senddock image. Building from source (Option 3 in Installation) gives you Core only — setting SENDDOCK_LICENSE_KEY on a source build does nothing because the gated routes are not in the binary.
Ports
| Service | Default Port |
|---|---|
| SendDock API | 8080 |
| Frontend (dev) | 5173 |
| PostgreSQL | 5434 |
| Redis | 6380 |