A self-hosted email marketing platform, built once and forked per business.
Own product. Built first for PuntHub, then forked for a second business as its own tenant. One codebase, separate deployments, separate data.
Email platforms charge per subscriber, and the price steps up exactly when a list starts to be worth something. For a business sending its own mail to its own list, most of that cost buys features it does not use — while the things that actually matter, deliverability and compliance, are the same everywhere.
Next.js · Supabase · Resend · GrapesJS and react-email · deployed on Vercel.
Compliance has to be structural or it rots. An audit of every send call site found the compliance pieces applied inconsistently: campaign sends had unsubscribe headers, tokens and suppression checks; the transactional API had none of the three; the welcome email had a token but no headers and no merge tags. The fix was not to paste four lines into seven places and hope the eighth remembered — every send path now goes through shared helpers that attach sender identity, the unsubscribe URL and RFC 8058 one-click headers, and check the suppression list before sending.
Sender identity is a recorded decision, not a default. The identity block is held byte-identical to the trading terms on the main site, with a comment in the code explaining what may and may not be added to it, so a later change cannot quietly drift out of line with what was published.
Figures read from the production database on 17 September 2026, covering the 90 days to that date.
One honest limit: the delivery rate is not measured. The schema records bounces and complaints but does not persist the provider's delivered event, so "delivered" can only be inferred as sent minus bounced — 99.98%. That is an inference, and it is reported as one rather than as a measurement.
If something here is close to what you need, bring the problem and I will say how close. If it is not, I will say that instead.