Skip to content

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=require

Then run migrations:

bash
make migrate

Redis

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_SECRET to a random string (min 32 characters): openssl rand -base64 48
  • [ ] Change PostgreSQL password from default
  • [ ] Set FRONTEND_URL to your actual domain (used for CORS)
  • [ ] Set PUBLIC_URL to the same domain (used for unsubscribe + tracking links inside emails)
  • [ ] Use HTTPS via reverse proxy — Secure cookies are set automatically when FRONTEND_URL starts with https://
  • [ ] Run with Redis enabled — without it the per-project rate limits on /send, /send/batch and /broadcast are 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.

bash
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

CapabilityCommunity (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 workflowroadmap

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.

DEPLOYMENT_MODEself-hosted · cloudself-hostedcloudSENDDOCK_LICENSE_KEY?empty · validSENDDOCK_LICENSE_KEY?empty · validemptyvalidemptyvalidUnlockedlocal devUnlockedlicensedLockedfree tierUnlockedlicensedLemon Squeezy validates the key on startup and re-validates periodically
SENDDOCK_LICENSE_KEYWhat unlocks
emptyCommunity — Pro features locked, Team features locked.
valid Pro keyPro features unlocked (Analytics, Webhooks, Audit log). Team features stay locked.
valid Team keyPro and Team features unlocked.
invalid / revokedLocked 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

ServiceDefault Port
SendDock API8080
Frontend (dev)5173
PostgreSQL5434
Redis6380

Released under the AGPL-3.0 License.