Capability
Send at volume, with the consent question already answered.
Email, SMS, WhatsApp and post. Nine wired vendors on your own credentials. A block designer that compiles to MJML and cannot express a script tag because a script is not a block type. And recipients resolved again at dispatch, so somebody who opted out after you scheduled it is simply not sent to.
Every channel has at least one working vendor.
You configure the providers you already have contracts with. Credentials live in Secret Manager, never reach a browser and cannot be read back through the interface.
Email
SendGrid, Dotdigital, Mailchimp Marketing, and Mandrill for triggered templates.
SMS
Twilio and Bird, with per-tenant configuration and vendor readiness checked before a send starts rather than mid-dispatch.
WhatsApp
Meta WhatsApp Business. Worth noting: one-time-passcode delivery through it transfers a phone number outside the EEA, so assess it before switching it on.
Post
Stannp and Docmail. Postal reads the address on file rather than a contact channel, reports no engagement data, and sits outside PECR.
A closed vocabulary, and therefore no escape hatch.
Messages are composed as rows, columns and blocks — eight block types: text, image, button, divider, spacer, social, safe HTML and video thumbnail — and compiled to MJML. A script tag is not something the designer refuses; it is something the model cannot express, because there is no block type for it.
Editing runs on an instant client-side canvas, and a separate server-rendered fidelity preview shows what will actually send, in a sandboxed frame. The canvas is never presented as the final appearance, because two renderers with an opinion is how a preview starts lying.
- Reusable blocks, rows and whole templates, inserted as copies rather than live links — so editing the library never changes an approved campaign
- Mobile and desktop preview, and an automatically generated plain-text alternative for every HTML email
- Merge fields from a closed allow-list with a default for every variable, so a missing value never renders a raw token
- Your own brand font can be registered from the asset library with a mandatory fallback stack
From draft to delivered.
- Build the audienceSealed and versioned, up to a million people. Sealing is one-way, so a list cannot grow mid-send and leave the report describing a moving target.
- Design and categoriseTwo-level categories across campaigns, blocks and templates, with every view filterable — including an uncategorised filter, so nothing goes missing.
- Get it approvedApproval is a separate capability from creation and the author is excluded. Any edit to an approved campaign revokes the approval automatically, and approval history is append-only.
- Schedule itAt least fifteen minutes' notice. A planning window of seven, twenty-eight or ninety days flags clashes — same day, same channel, same purpose — as warnings, and surfaces campaigns approved but never scheduled.
- Send itRecipients are resolved from live consent at dispatch. The job is sharded, leased and resumable, so a worker crash never restarts from zero and never double-sends. Cancellation takes effect within one batch.
- Read the resultSends, opens, clicks and bounces by campaign, category and date on screen, and the full grain in your own BigQuery dataset for questions we did not anticipate.
The parts most platforms bolt on.
Consent to every declared purpose
A newsletter combining product news and offers needs consent to both, not either. Capped at six purposes per campaign.
One-click unsubscribe
RFC 8058 on every send — required by the large mailbox providers, and now enforced by outright rejection rather than a warning.
Suppression that carries a reason
'Why didn't Mrs Patel get it' is one lookup rather than an investigation. Every suppressed recipient has a named reason on the record.
Bounces and complaints stick
Hard bounces and complaints suppress across all your future campaigns, not just the one that generated them. A spam complaint withdraws consent rather than merely logging an event.
Complaint-rate guidance
The platform surfaces the recommended ceiling and the enforcement threshold, so you find out before the mailbox provider tells you.
Tracking is optional
Open and click tracking is consent-gated and switchable off per tenant, because a pixel is terminal-equipment access under PECR. External images are recorded as external, with the host named.
A/B variants that report the winner and then wait for a human.
Assignment is random and deterministic rather than attribute-based, which deliberately avoids turning a split test into a profiling question. Variants are ranked on conversions if there are any, then clicks, then opens — explicitly not on raw opens, because mail privacy features pre-fetch images and make that number meaningless on its own.
Negative signals are reported per variant too: bounces, unsubscribes and complaints, since a variant that wins on clicks and loses on complaints has not won. The platform reports the winner and never automatically sends it. No arm may be smaller than a tenth of the split.
- Variant identifiers reach the analytics mirror, so you can run your own analysis beyond the default numbers
- Failures are grouped by cause rather than raw error code, so you know whether to clean a list, slow down or call the vendor
- Retrying creates a new job that excludes recipients who cannot succeed
- Triggered templates appear on the send calendar as a daily total, so four hundred order confirmations do not bury the day's broadcasts
Questions about campaigns
Broadcast or triggered — what is the difference here?
A broadcast goes once to everyone who qualifies and can be scheduled. A triggered send is an approved reusable template your own systems call through the API, once per person, when something happens — an order confirmation firing hundreds of times a day. Triggered sends are never schedulable, because the content is supplied per call.
Why can I not use MailPoet?
Because it has no HTTP API. It is a PHP class inside WordPress, so there is nothing to integrate with from outside. That is the only vendor on the list that cannot be wired at all, and we would rather say so than leave it looking pending.
Can I send bulk mail through Mandrill?
No, and this is a restriction rather than a refusal. Mailchimp's acceptable use policy forbids bulk sending through their transactional product. Triggered templates — one recipient, fired by an event — are exactly what it is sold for and are permitted, so the platform enforces the mode rather than the vendor.
What stops a scheduled campaign going to everybody by accident?
A campaign cannot be scheduled without an audience. Sending to everyone is still supported, but it has to be an explicit choice on the send call rather than an empty field — a defect where an unset audience silently meant 'the whole tenancy' was found and closed.
Where does reporting live?
On screen for the usual questions — sends, opens, clicks and bounces by campaign, category and date, plus per-person campaign history on the record. Underneath, BigQuery in your own dataset is the reporting system of record, with a documented connection pattern for Looker Studio rather than a bundled dashboard, deliberately, so your reporting stays in your hands.
Related capabilities
Audience, design, approval, schedule, dispatch and report — in one sitting, on your own consent purposes.