JoeSMTP
A self-service email and SMS marketing platform, built as a JoeCMS module: contacts, campaigns, automations, forms, a public API and an SMTP gateway.
The problem
Anyone who writes to their customers faces two extremes: commercial platforms that are powerful but expensive, priced on the number of stored contacts, or home-made scripts that work until unsubscribes, bounces and sender reputation show up.
JoeSMTP sits in between: a complete panel with prepaid credits instead of a per-contact subscription, and the freedom to switch sending provider without users noticing.
How it works
Structure
Contacts per project with custom fields, static lists and rule-based segments recalculated at every send. Email and SMS campaigns with a visual editor and merge fields, automations with triggers, delays, quiet hours and an exit event, embeddable signup forms with double opt-in.
Usage flow
A campaign goes through a step-by-step wizard: details, recipients, content, header and footer, send now or schedule. The credit cost is frozen at creation, so a price change never rewrites history; credits are spent in batches that expire.
Technical choices
No provider is hard-wired: one adapter per provider behind a shared interface, resolved in cascade from project, system default and configuration. Switching provider is a choice in a panel, not a deploy. Deliveries, opens, clicks and bounces arrive by webhook in a single events table.
Known limits
Provider constraints show up once the integration is done: one SMS adapter is complete but stays off until the provider enables the account. Deploys are manual, so the code checks the schema before reading a new column.
Numbers
| Service endpoints | 96 |
|---|---|
| Panel pages | 35 |
| Public API endpoints | 8 |
| Integrated sending providers | 6 |
| Versioned migrations | 38 |
| Cron jobs in production | 6 |
Stack
- PHP
- MySQL
- JoeCMS
- JavaScript
- Haraka (SMTP)
- OpenAPI