WordPress
Send every WordPress email through the eusend API with the official plugin — password resets, WooCommerce receipts and form notifications, with real delivery status on each message.
WordPress sends mail with PHP's mail() function. It is unauthenticated, it fails
SPF and DKIM, and receiving servers drop it quietly. The official eusend plugin
replaces that path: every wp_mail() call — core, WooCommerce, Contact Form 7,
Gravity Forms, your theme — goes through the eusend API instead.
It uses the HTTP API rather than SMTP, so nothing depends on outbound port 465 being open. That is the usual reason an SMTP plugin fails on shared or managed hosting.
Already using WP Mail SMTP or FluentSMTP? Those keep working — point them at the SMTP relay instead. The plugin is the better path when you want delivery status inside WordPress; run one or the other, never both.
Setup
Verify your sending domain
Add your domain under Domains and publish the DNS records. The plugin can only send from a verified domain — see domains if you have not done this yet.
Install the plugin
In WordPress admin go to Plugins → Add New, search for eusend, install it and activate.
Add the API key
Create a key under API keys, then open Settings → eusend and paste it in. Set From address to an address on your verified domain — the screen tells you straight away whether that domain is actually verified on your account.
Send a test
Use Send a test email on the same screen. It goes through wp_mail(), so a
delivered test proves the whole path rather than just the API key.
Turn on delivery events
Press Turn on delivery events. The plugin registers this site as a webhook endpoint on your account and eusend starts posting back as each message moves — delivered, bounced, complained, opened, clicked.
The email log then records what actually happened to every message, including the receiving server's own words on a bounce. Your site has to be reachable from the public internet for this; private and loopback addresses are refused.
Configuring without the database
Every setting also reads a constant in wp-config.php or an environment variable
of the same name. Anything set that way wins over the settings screen and is shown
there as read-only, which is what you want on a site deployed from git.
define( 'EUSEND_API_KEY', 'eu_live_...' );
define( 'EUSEND_FROM_EMAIL', 'no-reply@yourdomain.com' );
define( 'EUSEND_FROM_NAME', 'Your site' );| Parameter | Type | Description |
|---|---|---|
EUSEND_API_KEYrequired | string | The API key used for every send. |
EUSEND_FROM_EMAILrequired | string | Sender address. Its domain must be verified. |
EUSEND_FROM_NAME | string | Display name paired with the sender address. |
EUSEND_FORCE_FROM | boolean | Override the From address other plugins set. On by default. |
EUSEND_TRACK_OPENS | boolean | Per-site open-tracking override. Defaults to the account setting. |
EUSEND_TRACK_CLICKS | boolean | Per-site click-tracking override. Defaults to the account setting. |
EUSEND_LOG_LEVEL | string | disabled, errors, metadata, or full. |
EUSEND_LOG_RETENTION_DAYS | number | How long log entries are kept. 0 keeps them indefinitely. |
EUSEND_ENABLED | boolean | Set to false to hand mail back to WordPress without deactivating the plugin. |
The email log
Settings → eusend → Email log lists every message, what happened to it, and
which plugin or theme called wp_mail() — so a WooCommerce receipt is
distinguishable from a form notification at a glance.
Logging has four levels. metadata is the default and keeps recipient, subject and
status; full additionally stores the message body, which frequently contains
personal data, so pair it with a short retention window. errors records only
failures, and disabled writes nothing.
WP-CLI
wp eusend status # configuration, and whether another mailer conflicts
wp eusend test you@example.com # send a test through wp_mail()
wp eusend domains # sending domains and their verification state
wp eusend log --status=bounced # recent failures, with the reason
wp eusend events on # turn delivery events on or offHooks
// Keep one plugin's mail on the old path.
add_filter( 'eusend_should_send', function ( $send, $atts ) {
return str_contains( $atts['subject'], '[internal]' ) ? false : $send;
}, 10, 2 );
// Tag sends so you can filter the eusend log by what produced them.
add_filter( 'eusend_email_tags', function ( $tags, $atts, $source ) {
$tags['category'] = 'woocommerce';
return $tags;
}, 10, 3 );
// React to a bounce with the receiving server's own reason.
add_action( 'eusend_webhook_event', function ( $type, $payload ) {
if ( 'email.bounced' === $type ) {
error_log( $payload['diagnostic'] ?? '' );
}
}, 10, 2 );eusend_email_payload filters the request body just before it is sent, and
eusend_email_sent fires with the eusend email ID after a message is accepted.
Troubleshooting
| Symptom | Cause |
|---|---|
| Mail is not appearing in eusend at all | Another mail plugin is also replacing wp_mail(). The settings screen and Site Health both warn about this. Deactivate the other plugin. |
DOMAIN_NOT_VERIFIED in the log | The From address is on a domain that is not verified. Leave Force the From address on so no plugin can override it. |
| Delivery events will not turn on | The site is not reachable from the public internet — eusend refuses private and loopback endpoints. Sending still works without them. |
Every send fails with UNAUTHORIZED | The API key is wrong or has been revoked. Create a new one and paste it in. |
See error codes for the full list.
Payload CMS
Send Payload's verification, password-reset and application email through eusend with the official email adapter — a REST adapter that works on serverless, unlike SMTP.
Email Templates
Create reusable email templates by submitting rendered HTML, personalized at send time via {{variable}} placeholders.