Description
MailNest is a fully-featured newsletter and email automation plugin built for WordPress. Send campaigns, automate sequences, track opens and clicks, and manage your subscribers — all without monthly fees or subscriber limits.
Why MailNest?
Most newsletter plugins either charge per subscriber, cap your monthly sends, or hold your data hostage. MailNest is 100% free and open source, runs on your own server, and gives you complete control.
Core Features
Email Sending
* SMTP support (any provider — Hostinger, Gmail, SendGrid, etc.)
* Amazon SES integration (raw API, no SDK required)
* Automatic wp_mail() fallback
* Real PHPMailer error reporting
Subscriber Management
* Double opt-in with confirmation emails
* Single opt-in mode (optional)
* Bulk confirm, delete, and resend confirmation
* CSV import and export
* Inactive subscriber detection and removal
* Bounced email detection
Campaign Builder
* Full WordPress rich-text editor
* Merge tags: {{first_name}}, {{last_name}}, {{email}}
* Schedule campaigns or send immediately
* Insert Post modal — embed your posts as formatted email blocks
* Auto unsubscribe link in every email
Automation
* Auto daily digest — fetches and sends your latest posts automatically
* Welcome email sequence (day 0, 3, 7 — fully customisable)
* Re-engagement emails for inactive subscribers
* Auto-unsubscribe cold subscribers after X days
* Duplicate send protection (race condition safe)
Analytics
* Open tracking (pixel-based)
* Click tracking (redirect-based)
* Subscriber growth charts
* Campaign performance table with open and click rates
* Top clicked links leaderboard
* Cumulative KPI dashboard
Forms
* Inline subscription form via [mailnest_subscribe] shortcode
* Popup form (exit intent / scroll / time delay)
* Visual form builder
* Honeypot spam protection
* Auto-append form after posts (optional)
Access Control
* Role-based permissions (editor, author, contributor)
* Settings locked to admin only
No Limits
- Unlimited subscribers
- Unlimited campaigns
- Unlimited monthly sends (limited only by your SMTP provider)
- No upgrade walls
- No tracking or telemetry
External Services
Amazon Simple Email Service (SES)
This plugin optionally connects to Amazon SES to send emails. This feature is only active if you enter your AWS Access Key and Secret Key in the plugin settings. No data is sent by default.
What is sent: recipient email address, sender name, email subject, and HTML email body.
When it is sent: only when a campaign, confirmation, or automated email is triggered.
Data processor: Amazon Web Services, Inc.
Terms of Service: https://aws.amazon.com/service-terms/
Privacy Policy: https://aws.amazon.com/privacy/
Chart.js (bundled)
This plugin bundles Chart.js locally to render analytics charts in the WordPress admin. No data is sent to any external server.
Amazon SES
* What it does: Sends newsletter emails on your behalf
* Data sent: Email address of recipient, email subject and body
* When: Only when a campaign or automated email is triggered
* Terms of Service: https://aws.amazon.com/service-terms/
* Privacy Policy: https://aws.amazon.com/privacy/
This plugin does NOT collect any user data, phone home, or send any analytics to external servers.
Screenshots






Installation
- Upload the
mailnestfolder to/wp-content/plugins/ - Activate the plugin through the Plugins menu in WordPress
- Go to MailNest Settings to configure your SMTP credentials
- Add
[mailnest_subscribe]to any page or post to show a subscribe form
FAQ
-
Does this plugin charge per subscriber?
-
No. MailNest is 100% free with no subscriber limits.
-
What SMTP provider should I use?
-
Any provider works — Hostinger, Gmail (500/day free), Brevo (300/day free), or Amazon SES (~$0.10 per 1,000 emails).
-
How do I set up the automated daily digest?
-
Go to MailNest Settings Auto Daily Digest. Enable it, set the send time, and configure your logo and accent color.
-
Does it support double opt-in?
-
Yes. Double opt-in is enabled by default and strongly recommended for deliverability.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“MailNest” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “MailNest” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.5
- Fixed every remaining instance where a table name from mailnest_table() was interpolated directly into a SQL string passed to $wpdb->prepare() (rather than passed as a %i argument). This pattern is unsafe regardless of whether the other variables in the same query use real placeholders, and affected 17+ call sites across class-campaign.php, class-subscriber.php, class-cron.php, class-tracker.php, and the admin subscribers list (inactive/bounced filters)
- Rewrote the admin subscribers list “inactive” and “bounced” filter queries to use %i for all table names and $wpdb->esc_like() for search terms (previously raw string concatenation, which could also mishandle a % or _ character typed into the search box)
1.0.4
- Open/click tracking now requires a signed per-recipient token (tt) generated from campaign_id + subscriber_id, so analytics can no longer be forged by guessing sequential IDs; existing confirm/unsubscribe links already used a token and are unaffected. Click redirects still work even without a valid token — only the analytics record is gated.
- Removed the unprefixed
[mn_subscribe]shortcode alias (kept[mailnest_subscribe]) to avoid naming collisions with other plugins - All remaining direct SQL queries now go through $wpdb->prepare(), using the %i identifier placeholder (WP 6.2+) for internal table names
- Two bulk admin actions (confirm, resend) rewritten from a dynamic IN(…) placeholder pattern to a per-ID prepared-query loop, for full Plugin Check compliance
- Minimum WordPress version raised to 6.2 (required for %i placeholder support)
1.0.3
- Fixed broken unsubscribe links: the subscriber token is now retained after confirmation (it doubles as the unsubscribe token), and a token is auto-generated at send time for any legacy rows where it was previously cleared
- Popup form refactored: static layout styles moved to the enqueued stylesheet and user-configured colors delivered via wp_add_inline_style(), so styling no longer depends on inline attributes
- Fixed AJAX form-settings save writing to mn_form_* option keys while the form builder and frontend read mailnest_form_* — saved settings now apply correctly
- Replaced non-atomic set_transient() duplicate-send lock with an atomic add_option() lock (single INSERT against the unique option_name index), with automatic cleanup of the previous day’s lock
- Escaped all dynamic values in the auto-newsletter email builder (site name, tagline, accent color, post titles, excerpts, permalinks, thumbnails, categories, Twitter handle/URL) and sanitized the accent color with sanitize_hex_color()
- Popup form HTML is now output through wp_kses() with an explicit tag/attribute whitelist instead of a phpcs:ignore
- Moved remaining attribute escaping to output time (escape late) in the inline and popup form builders
- Escaped role label output on the Settings permissions table
- Debug logging is now gated behind WP_DEBUG
1.0.2
- Fixed fatal PHP error (gmgmdate typo) in auto-newsletter daily lock
- Fixed admin_url() not wrapped with esc_url() in Pro upgrade notice
- Moved wp_localize_script chart data out of view file into proper admin page callback
- Fixed unescaped output in forms.php color label, analytics.php rate columns, upgrade.php feature table
- Fixed data-id attributes missing esc_attr() in subscribers and campaign-edit views
1.0.1
- Security and compatibility improvements for WordPress.org submission
- Bundled Chart.js locally (removed CDN dependency)
- Improved input sanitization and output escaping throughout
- Fixed email sending to fall back gracefully when SMTP is not fully configured
1.0.0
- Initial release
