keep your Mailgun code. change one line.
tinysend speaks the Mailgun API. point your app's base URL at us — Ghost, phpList, Laravel, Django. no rewrite. and replies land in a real inbox.
- create a mailbox — use your own domain or a tinysend.com address
- open the mailbox → Settings → create a Mailgun-compatible key
- point your app's Mailgun base URL at
https://mailgun.tinysend.com/v3and paste the key
Ghost only supports Mailgun for newsletter sending — and it lets you change the base URL. Add this to config.production.json (or the matching env vars), then restart Ghost:
"bulkEmail": {
"mailgun": {
"baseUrl": "https://mailgun.tinysend.com/v3",
"apiKey": "key-...", // from your tinysend mailbox → Settings
"domain": "yourdomain.com" // your mailbox's sending domain
}
} Laravel — set the Mailgun endpoint in .env:
MAILGUN_DOMAIN=yourdomain.com
MAILGUN_SECRET=key-...
MAILGUN_ENDPOINT=mailgun.tinysend.com Django (django-anymail) — override the API URL:
ANYMAIL = {
"MAILGUN_API_KEY": "key-...",
"MAILGUN_API_URL": "https://mailgun.tinysend.com/v3",
"MAILGUN_SENDER_DOMAIN": "yourdomain.com",
} Node (mailgun.js) — pass url: 'https://mailgun.tinysend.com' to the client. Rails (mailgun-ruby) — set api_host: 'mailgun.tinysend.com'. Anything that speaks the Mailgun API and lets you set the host works.
no code rewrite — you keep your Mailgun integration. one config value changes.
replies land in a real inbox — every send is from a tinysend mailbox, so newsletter replies come back somewhere you can read, search, and automate. The SES/SMTP workarounds are send-only.
no $35/month floor — small lists start at $6/mo (or free up to 100 emails). pay for what you send.
no surprise bans — managed deliverability without the abrupt account suspensions Mailgun is known for.
keeps your stats — opens, clicks and bounces flow back to your app, unlike the SES adapters that drop analytics.
questions, feedback, white-label inquiries