Keep up to date

Download latest version (v6.1.1)

Download Sendy with your license key below. If the downloaded zip isn't the latest version 6.1.1, your Sendy license requires an upgrade using the form on the right.


Upgrade to version 6.x for only $34

If you purchased or upgraded Sendy before May 31, 2021, upgrade your license to 6.x below. In other words, if you're unable to download the latest version 6.1.1, your license key requires an upgrade.

Pay with Stripe

Release notes

💡 If you send more than 5,000 emails at any one time, update to the latest version so that your emails continue to reach Gmail and Yahoo accounts. See the release notes from version 6.0.9 to learn more.


  • Scheduled campaigns now displays their scheduled dates in the 'Sent' column of the campaign item in 'All campaigns'. If you have a bunch of campaigns scheduled for sending later, you can see all scheduled dates at a glance without having to mouse over each campaign's title.

  • The unsubscribe link in the ‘List-unsubscribe’ header will bypass double opt-out even if it is set in the list settings. This is to comply with RFC 8058. Unsubscribe links in the email body will still respect double opt-out if it is set as such. (Thanks James Cridland for the tip)
  • Signing up to a list via the API will no longer update segments to prevent overwhelming the server for users with a large volume of subscribers. Segments should be updated exclusively using a cron job or manually at the segments section.
  • If an email address ‘Bounced’, their subscription status will display as 'Bounced' in the ‘Search all lists’ page regardless of whether they confirmed their subscription previously. This follows the same display behaviour as the subscriber list page.
  • Fixed deprecation warning in the header.php script
  • Fixed fatal error for uncaught type error for some users in tracking script. (Hat tip Mathieu Landry)
  • Fixed deprecation errors in PHP 8.1+ for AbstractModel.php and AbstractRecord.php
  • Updated geolocation database


  • When using the [Name] or [Name,fallback=] tag, Sendy now capitalizes the first character of the subscriber’s name if the name is in all lowercase.
  • When updating a subscriber's email in the 'Subscriber info' modal, any previous bounce, marked as spam, or unsubscribe status will reset as the subscriber becomes new.
  • When hitting ‘Enter’ to change a subscriber’s email address in the ‘Subscriber info’ modal, the ‘Email already exist in this list’ JS alert will no longer show up
  • Support ‘eventType’ in addition to ‘notificationType’ when handling JSON payload from SNS notifications. This is to ensure bounces and complaints are handled when using configuration sets to send emails in Amazon SES. (Thanks Chris Denning for the heads up)
  • Google no longer supports QR code generation, this causes QR code images to be broken when enabling 2 Factor Authentication. This update fixes that.
  • Fixed broken link for attachments when editing Autoresponder emails
  • Resolved an issue where attachments were not included in the autoresponder email when sending a 'test' autoresponder email.
  • Updated geolocation database



    One click unsubscribe

    Starting from February 1, 2024, bulk email senders who sends more than 5,000 messages a day to Gmail or Yahoo email accounts are required to include both the List-Unsubscribe-Post: List-Unsubscribe=One-Click and List-Unsubscribe headers in their emails. Sendy already supports the List-Unsubscribe header since version, more than a decade ago. This latest version now also includes the List-Unsubscribe-Post: List-Unsubscribe=One-Click header as mandated by Google and Yahoo.

    Email authentication

    Authenticating your sending domain with DKIM, SPF and DMARC used to be email sending's best practice. Now, it is a mandatory requirement. As Sendy uses Amazon SES to send emails, you can refer to the following links to learn how to set up DKIM, SPF, and DMARC for your sending domains if you haven't done so already.

    Reduce spam rates

    Maintain a spam complaint rate under 0.3%. As Gmail does not share complaint rates (a.k.a. marked as spam rate) data with Amazon SES or any other ESPs, you can register your sending domain with Google's Postmaster Tools to see and monitor your spam rate with Gmail.

    Learn more:

  • AWS secret key password field in the main settings will now be blank (previously obfuscated in the password field). To update the AWS secret key, enter the new secret key in the field. If left blank, the secret key will not be changed.
  • Sendy will now remove 'unicode white spaces', in addition to 'regular white spaces', in email addresses when importing CSV files.
  • Resolved issue where exporting CSVs with an empty date-based custom field would result in an incorrect date (1969/12/31) displayed in the corresponding column.
  • Fixed bug where submitting the standard subscribe form with empty date based custom field returns Jan 01, 1970 instead of an empty value.
  • Updated geolocation database


  • Added ‘Precedence: Bulk’ header to outgoing campaigns to inform ISPs that your email campaign is sent in bulk, preventing them from sending out-of-office replies to you and reducing the chances of your bulk emails from being sent to the spam folder.
  • The ‘Search all lists’ function now includes ‘lists’ in the search results page (in addition to ‘subscribers’). If you have numerous lists and want to avoid paging through the 'View all lists' page to locate a specific one, you can now conveniently use the 'Search all lists' feature located at the top right of the page to search for lists.

  • The results page for 'Search all lists' and 'Search campaigns' now includes the search field that is in focus when the page load. This allows you to continue searching without the need to go back to the previous page.
  • A paper clip icon now appears alongside the campaign or autoresponder email title if an attachment is present

  • If a campaign includes an attachment, it will now be visible in the campaign report. You can view, download, or delete it.

  • Fixed alignment issues in the sub-menu header of the subscribers page in Safari (Thanks Anthony Chan for the heads up)
  • Apply the same sorting preference for segments as for lists in the 'Define recipients' page (the page where you select lists to send your campaigns to) (Thanks Francisco Vásquez Neira)
  • Some fixes to eliminate PHP notices (Thanks James Cridland)
  • [PHP 8.2.7+] Trim and type cast ‘total_recipients’ with ‘int’ when sending campaigns without a cron job setup (thanks Gary Cornelisse)
  • Updated geolocation database

  • Added a 5 second timeout to curl calls for click tracking to prevent server timeouts or crashes when large numbers of clicks are being recorded (Thanks James Cridland & DJ Ramones)
  • Fixed ‘Get lists’ API returning hidden lists by default or if ‘include_hidden’ is set to ‘no’ (Thanks Heiner Gassen)
  • Fixed date based custom field setting the value to “Jan 01, 1970” instead of “not set” when emptying it. (Thanks Sander Devrieze)
  • Fixed accented characters not showing up correctly when importing a CSV
  • Get host of Sendy install using explode function if parse_url doesn’t return ‘host’ data when creating or editing a brand
  • Changed method to derive APP_PATH_DOMAIN
  • Updated geolocation database

  • You now have the option to decide if you want Sendy to check for broken links while creating or editing a campaign.

  • Also added a 5 seconds timeout to broken link detection curl
  • Streamlined the design for ‘Also save as template?’ checkbox option when creating / editing a campaign or autoresponder
  • Updated geolocation database


  • New 'unsubscribe tag' detection

    Sendy now checks for missing unsubscribe tags in your email before sending out your campaign. A message will appear reminding you (or your clients) that an unsubscribe tag is missing in your email and it is recommended to add one to minimise complaint rates.

  • Automatically fix incorrect usage of unsubscribe tag

    Sendy now checks if you accidentally used a 'dummy placeholder unsubscribe link' in your email instead of a proper unsubscribe tag. If the latter is used, Sendy will automatically replace it with the correct [unsubscribe] tag.

  • Broken links detection

    Sendy now checks all links in your email for broken links before you send out your campaign. If there are broken links in your email, Sendy will inform you with the list of broken links so that you can fix them before sending out your email.

  • The 1 x 1 pixel tracking image has been substituted with a base64 version of the image to reduce the file size and eliminate one HTTP redirect. Although this may appear insignificant for a single open, it can result in thousands of HTTP redirects being saved for numerous opens. ~ Thanks James Cridland for the suggestion
  • Adjusted CSS for mobile view
  • Fixed ‘Uncaught DivisionByZeroError’ in Autoresponders emails page
  • Updated geolocation database


  • In the brand settings, you now have the option to choose whether new lists should use 'single' or 'double' opt-in as the default setting.

  • When creating or editing a template, you now have the ability to specify the 'From name', 'From email', and 'Reply to' fields.
  • Updated CKEditor to version 4.21.0
  • When adding a new list, you’ll now be redirected to the main subscribers page of that list instead of the ‘Add subscribers’ page.
  • Changed ‘blue informational message’ to ‘yellow informational message’ in cron job setup instructions
  • [PHP 8.2] Fix for 500 error when importing CSV with special characters ( eg.: “” or • ) ~ Thanks Michele Biasizzo
  • Updated geolocation database


  • You can now enable or disable individual rules easily with Yes or No toggle buttons. This way, you don’t need to delete a rule in order to disable a rule.

  • You can now pass variables into your custom ‘Already subscribed’ URL in the list settings. Supported variables are %n for name, %e for email and %l for list ID.
  • [PHP 8.1] Some PHP 8.1 fixes
  • [PHP 8.2] Fix for CSV import may get stuck at a certain percentage when importing CSVs with custom fields
  • [PHP 8.2] Fix for PHP 8.2 error - ‘Using ${var} in strings is deprecated’
  • [PHP 8.2] Fixed ‘PHP Fatal error: Uncaught TypeError: mysqli_query(): Argument #1 ($mysql) must be of type mysqli, null given in /includes/helpers/class.amazonses.php
  • Changed Ukrainian capital city from ‘Kiev’ to ‘Kyiv’ in timezone selection. (hat tip: Tamara Zakharova)
  • Updated geolocation database


  • Updated link and copy of on-screen instructions for Amazon SES sandbox mode in the 'Define recipients' page (the page where you select lists to send your campaign to)
  • [PHP 8.1] Fixed ‘Uncaught TypeError: mysqli_num_rows(): Argument #1 ($result) must be of type mysqli_result, bool given’ for CSV import
  • Fixed subscribe API returning ‘Invalid API key’ when list ID is incorrect. Error message now returns ‘Invalid list ID.’.
  • Fixed issue with pagination in subscribers view where some subscribers may not appear in the list view (although they do exist in the database)
  • Updated copy for cron job setup instructions at the 'Define recipients' page (the page where you select lists to send your campaign to)
  • Updated geolocation database


  • Added support for the new ‘Jakarta’ Amazon SES region.

    Sendy supports Amazon SES in all available regions - N. Virginia, Ohio, Oregon, N. California, Osaka, Mumbai, Sydney, Singapore, Seoul, Tokyo, Jakarta, Canada, Ireland, Frankfurt, London, Paris, Stockholm, Milano, Bahrain, São Paulo and Cape Town.

    Please note that you don't need to be located physically in any of the above regions to use Amazon SES. You can use Amazon SES no matter where you are.

  • Updated ‘Stop’ button design for CSV import to match the ‘Stop campaign’ button for consistency

  • Added a confirmation prompt when user clicks the ‘Stop’ button for CSV imports
  • Updated copy for ‘skipped emails CSV’ to inform users that the existing subscriber’s data has been updated even though it was skipped from the last import
  • [PHP 8.1+] Fixed DivisionByZeroError in the campaigns and report page for certain scenarios
  • Updated geolocation database


  • ✅ Stop campaigns with one click of a button

    You can now ‘Stop’ any campaigns that are in ‘Preparing’ or ‘Sending’ status with one click of a button.

    If the campaign is in ‘Preparing’ status, it will put the campaign back to ‘Draft’ status.

    If the campaign is in ‘Sending’ status, it will stop the campaign from sending further emails and mark the campaign as ‘Sent’.

  • The link to Amazon SES console in the 'Define recipients' page (the page where you select lists to send your campaign to) returns a 404 error. The link is now replaced with the updated link.
  • Fixed slight central misalignment of the standard subscription form
  • Fixed 500 error for users on PHP 5.3 and below due to usage of function session_status() that requires PHP 5.4 and above
  • Some PHP 8+ compatibility fixes included in this update too
  • Fixed ‘Undefined array key "id”’ warning for housekeeping
  • Fixed a bug where the ‘Opened’ data in the campaigns list indicates 1 open when there are no opens yet for a campaign.
  • Used mb_substr() instead of substr() in the campaigns RSS feed page so that multibyte-characters aren’t being broken up in some cases. (Thanks Marcus Jaschen)
  • Changed copy in the installation screen that incorrectly says 4.x to 6.x
  • Updated geolocation database

  • ✅ Preview personalization tags using real subscriber data in newsletter preview

    You can now preview personalisation tags and custom fields in your email using real subscriber data in the 'Define recipients' page (the page where you select lists to send your campaign to).

    Select the list(s) you want to send your campaign to. At the top right of the email preview, click the right and left buttons to cycle through up to 100 subscribers to see your personalisation tags and custom fields replaced with real subscriber data in the email preview!

    (Thanks Cabel Sasser for the suggestion)

  • Note to users who updated to 6.0.1 previously: Update to this version. Sending a test email using the ‘Test send this campaign’ (when using Amazon SES) no longer shows an ‘unknown’ error.
  • New API: Get a full list of brands (ids and names)
  • New API: Get a full list of lists (ids and names) from any particular brand
  • ‘Campaigns sent’ and ‘Campaign now sending’ email notifications now include the ‘Brand’ the campaign belongs to.
  • When sending via Amazon SES, email addresses with bounceType ‘Transient’ but bounceSubType ‘General’ will not have its bounce_soft flag incremented in the database as it will generally fix itself. (Thanks James Cridland for the tip)
  • Fixed a bug where ‘year' did not appear correctly when creating date based lists segmentation (Thanks Stasys for the tip)
  • Correctly reports error when sending test emails using the test function (Thanks 'Apartment Lines' for the tip)
  • Made some strings that weren’t previously translatable, translatable. (Thanks Timo Mackowiak for the tip)
  • Fixed query in update.php that slows down the app for some users
  • Fixed bug where new columns weren’t created for some users
  • Updated geolocation database

🎉 6.0

  • ✅ Native support for Elastic Email, Sendgrid and Mailjet!

    Other than Amazon SES, you now have new ways to send emails with!

    When you send emails via Elastic Email, Sendgrid or Mailjet SMTP, Sendy now handles bounces and complaints natively and automatically. Any emails that bounced or 'marked as spam' will be flagged accordingly in your list(s) when sending via these services. There is no longer any need for manual post processing when you use Elastic Email, Sendgrid or Mailjet SMTP to send emails in Sendy!

  • ✅ Different SMTP services for certain brands while leaving Amazon SES as the default for other brands

    Previously, you had to remove IAM credentials in the main settings if you wanted to send emails via SMTP for a certain brand. With Sendy 6, you no longer need to remove your IAM credentials in the main settings. Sendy now checks if SMTP credentials are set for the brand, if so, it will send via SMTP, otherwise, it'll fallback to send via Amazon SES API.

    This also means that you can use different SMTP services in your Sendy install alongside Amazon SES (or without). You can set certain brands to send via any SMTP service you want and leave the rest to send via Amazon SES by default.

  • ✅ Easily see what email sending service each brand is using

    Now that you can send emails via different SMTP service providers for each brand on top of (or alongside) Amazon SES, the main dashboard page (first page when you login to Sendy) now shows the respective email sending service icons on each brand item so that you know which email sending service each brand is using at a glance.

  • ✅ Hide old or unused lists!

    You now have options to hide old or under-utilized lists!

    You may have lists that you no longer use, but don’t want to delete them either (in order to maintain past campaign statistics or for other reasons). Now you can hide them! Hidden lists won’t show up at the 'Define recipients' page (the page where you select lists to send your campaign to), making it easier to see the lists that currently matters.

    After lists are hidden and for some reasons you want to un-hide them again, visit the brand’s settings, go to the ‘Miscellaneous’ tab and set the ‘Hide hidden lists’ setting to ‘No’. Hidden lists will now show up in the lists page with slightly lesser opacity indicating their hidden status. You can then ‘unhide’ any hidden lists that you want.

  • ✅ Stop CSV imports with one click!

    CSV imports can now be stopped or cancelled easily by clicking the new ‘Stop’ button next to the list’s name.

  • ✅ Set language of your email's web version!

    You can now set the language of your web version for your email campaigns!

    When your recipient receive your email and visits the web version link, the web version content will be translated via Google Translate into the language that you’ve selected.

    You can use this feature as a means for your subscribers to translate the web version into a language they are comfortable with!

  • ✅ Brand new look for all email notifications!

    Campaign sent, campaign is sending, new subscriber or unsubscriber notifications, forgot password emails etc now spots a refreshed design!

  • ✅ Refreshed look with new graphics for all confirmation pages!

    Confirmation pages now spots refreshed graphics, giving them a brand new look! This applies to pages like ‘You’re unsubscribed’, ‘You’re subscribed’, etc.

  • ✅ Import HTML file or URL when creating campaigns

    When creating a campaign, you can now conveniently import a HTML file or import an email from a URL.

  • This one seems to get requested a lot - you can now delete all email addresses or domains in the ‘Suppression list’ or ‘Blocked domains’ list respectively via a new ‘Delete all’ button
  • Autoresponder email lists are now sort by sending time instead of time created
  • Reorganised data displayed in campaign and autoresponder reports in a more readable manner
  • Thank you email no longer sends again after sending once when subscription confirmation page is refreshed when using double opt-in
  • Increased character limit for webhook endpoints
  • Call Google’s API using curl instead of file_get_contents for maximum compatibility
  • Fixed subscribe form HTML code not displaying the brand’s name in GDPR ‘Marketing permission’ copy
  • Fixed ‘Invalid list ID’ error showing for some instances when list ID is correct. Older users may not have a row in ‘login’ table created alongside the brand’s row. This causes the subscribe API to fail when trying to get the brand’s language, timezone and the list’s gdpr_enabled status. This does not happen for newer users.
  • Changed query in update script for checking if ‘suppression_list’ table exists to an optimal one
  • [PHP 8.1] Fixed deprecation errors for passing null into stripslashes(), explode() and str_replace() native functions
  • [PHP 8.1] mysqli_report(MYSQLI_REPORT_OFF) to prevent Exceptions as the default error handling behavior of the MySQLi extension has changed from silencing errors to throwing an Exception on errors.
  • Updated geolocation database


  • The new Web version link that displays in the ‘Define recipients’ page now respects the custom domain if it is set.
  • Changed message in the left sidebar when no IAM credentials are set in the main settings. The new message is more informative, communicating different ways you can send emails with Sendy - via Amazon SES or other SMTP services.
  • Campaigns search now includes ‘query string’ in addition to subject, HTML and plain text message
  • When calling the subscribe API and the subscriber exists in the list, country, referrer URL and IP address will now be updated (if passed) along with name and any custom fields.
  • 30 character limit for custom field names
  • Updated geolocation database


  • The web version link now displays in the ‘Define recipients’ page. This gives you easy access to the web version link of the campaign for various purpose, eg. sharing with your team mates or colleagues before sending out the campaign, viewing the web version in a new tab etc.

  • Added support for the new ‘Osaka’ Amazon SES region.
  • Moved include statement for includes/helpers/geo/geolite/ into conditional statement that checks if PHP is below 5.4 to prevent PHP 8 from throwing “Fatal error: Cannot redeclare geoip_country_code_by_name() when PHP geoip extension is enabled”.
  • Change row_format of all tables to Dynamic if otherwise, for a small number of users who may be getting a blank page when saving brand settings, list settings etc due to ‘Row size too large’ error.
  • Fixed PHP 8+ warning: SimpleEmailServiceRequest::__responseWriteCallback(): Argument #1 ($curl) must be passed by reference, value given in /includes/helpers/ses.php
  • Updated geolocation database


  • Dates in any exported CSVs are now formatted in a way that you can sort them in your spreadsheet program (eg. subscriber exports from lists or reports)
  • The database updating script will now only check for new columns, tables or indexes to be added once.
  • Show actual curl error when unable to communicate with Amazon SNS API for some reason
  • Added header to prevent search engines from possibly indexing tracking links which will skew click tracking data as a result (Thanks James Cridland)
  • Fixed a bug where emails aren’t being sent when scheduled via the new scheduling API
  • Fixed resubscribing to a double opt-in list from the standard unsubscribe page not actually resubscribing the user (Thanks Nils Bader)
  • Updated geolocation database


  • When creating new lists, you can now set the list as ‘Single’ or ‘Double’ opt-in on the fly without having to visit the list settings to change it.

  • Campaigns > Create API now lets you schedule emails to be sent at a later date
  • Sendy now provides a sample CSV for download at the CSV import page to clarify any doubts on how the CSV format should be
  • Set the session’s sql_mode to exclude ONLY_FULL_GROUP_BY instead of disabling sending of campaigns entirely if ONLY_FULL_GROUP_BY is detected to be set globally.
  • The favicon now displays the brand user’s avatar when logged in as a ‘brand user’.
  • Updated CKEditor to v4.16.1
  • Updated geolocation database


  • Added support for the latest Milan and Cape Town Amazon SES regions. Please note that to use any of these regions, you’d need to enable them here.
  • ‘Create Campaign‘ API now supports ‘Anonymous tracking’. Set track_opens or track_clicks to 2 for anonymous tracking.
  • Fixed incorrect web version in email notification for autoresponders’ rule
  • If list ID is invalid when calling the subscribe API, the error message ‘Invalid list ID.’ will be returned instead of ‘Unable to decrypt string with openssl_decrypt’.
  • Updated geolocation database


  • 🙈 Anonymous email tracking

    As email tracking has become sensitive topic of late because of privacy concerns, some users have reached out on wanting to respect the privacy of their subscribers whom they send emails to, while at the same time continue to track the effectiveness of their campaigns with basic statistics like open and click rates.

    Hence, in addition to 'Yes' or 'No' for open and click tracking, Sendy now offers you a third option to track opens and clicks 'Anonymously':

    When you set your campaign or autoresponder to track opens and clicks 'Anonymously', opens and clicks will continue to be tracked, however, these data will NOT be attributed to the recipients who opened and/or clicked them.

    In the campaign or autoresponder reports, statistics for open and click rates are still visible, but you will not be able to see exactly who opened or clicked them. You'll not be able to export CSVs of subscribers who opened or clicked and do any re-targeting on them. In other words, subscribers who opened or clicked your email will remain anonymous, protecting their privacy.

  • ⚙️ Set default tracking options

    You will be able to set your default email tracking preference in the brand settings so that new campaigns and autoresponders you create will default to your preferred setting.

  • Include subscriber’s name in ‘To’ field when sending double opt-in confirmation emails, thank you and goodbye emails.
  • Fixed illegible attachment filename color in the 'Define recipients' page when in 'Dark mode'
  • Updated instructions on setting up ‘Auto Return’ in PayPal when setting a PayPal email address in the main settings
  • Fixed being redirected to main domain when saving a segment while logged in via a custom domain. (Thanks Abdun Syakuur)
  • When importing segments into lists from reports, it sets the import-csv.php cron job status to ‘1’, creating a false positive. This is now fixed. (Thanks Peter Schulz)
  • Fixed API key check in `subscribe` API
  • Added indexes to links table
  • Fixed some PHP notices
  • [PHP 8] Fixes for `subscribe` API and fixed some notices
  • [PHP 8] Fixed fatal error when checking for CSV import progress
  • [PHP 8] Fixed not being able to create ‘new’ segments
  • [PHP 8] Emails with attachments can now be sent in PHP 8
  • [PHP 8] Deleted a redundant line that causes a fatal error in PHP 8 when duplicating an Autoresponder email (Thanks Cris Ravazzano)
  • [PHP 8] Other fixes with respect to PHP 8
  • Updated geolocation database


  • When viewing your ‘Newsletter preview’ in the 'Define recipients' page (the page where you select lists to send your campaign to), you can now see how your email would look in 'Desktop' or 'Mobile' by selecting the appropriate buttons. Or manually set any custom width you’d like to view your newsletter in.

  • A unique secret hash is now used for the authentication session cookie
  • Replaced usage of mt_rand() with cryptographically secure random_int() for any random string generation. As random_int() is only supported on PHP 7+, a polyfill is used to enable backwards compatibility with PHP 5.x.
  • The core encryption script now explicitly uses openssl_encrypt() and openssl_decrypt() for encryption and will no longer fallback to using intval() and base_convert() if PHP version is lower than 5.3 or if openssl_encrypt() and openssl_decrypt() is not enabled. Instead, an error will be displayed and logged.
  • Email address with slashes / in the name portion will no longer pass email address validation
  • Lots of various other security fixes. Major thanks to Nicholas Sherlock for your incredible work!
  • Place query string before #anchor in URLs instead of after if a query string is set for the campaign or autoresponder to ensure URL validity (Thanks Andrei)
  • Perform segmentation in the exact order the conditions are created. (Thanks Evgeny Drokov)
  • Campaigns with opens and clicks tracking turned off will now be used as a criteria when computing ‘Inactive subscribers’ in the Housekeeping section (Thanks Andreas Grau)
  • Enabled the following strings for translation: sec ago, secs ago, min ago, mins ago, hr ago, hrs ago, day ago, days ago, week ago, weeks ago (Thanks David Israel Revivo)
  • Set the string ‘Ready-to-use subscribe form’ for translation
  • This update also brings lots of fixes for compatibility with PHP 8. A few of them are as follows.
  • [PHP 8] Campaign sending fixes
  • [PHP 8] Fixed error when using PHP 8 in CSV parsing script (Thanks Eddie Kovarski)
  • [PHP 8] Fixed ‘Uncaught TypeError’ in Housekeeping (Inactive) page when there are no records to show (Thanks Hustle OU)
  • [PHP 8] Deleted a redundant line that causes a fatal error in PHP 8 when duplicating an Autoresponder email (Thanks Cris Ravazzano)
  • [PHP 8] Updated database update script for PHP 8 compatibility
  • [PHP 8] Many other small fixes with respect to PHP 8
  • Updated geolocation database


  • Added the latest Bahrain Amazon SES region in addition to the current N. Virginia, Oregon, North California, Ohio, Ireland, Mumbai, Singapore, Tokyo, Seoul, Sydney, Frankfurt, London, Paris, Stockholm, Canada and Sao Paulo regions. Please note that you’d also need to manually enable this region in your Amazon SES console if you want to use this region in Sendy.
  • Changed %G to %Y when using strftime() to determine the year where applicable as %G may produce the wrong year at the end and start of the year. This solves issues where monthly quotas may reset prematurely or not reset as expected.
  • Fixed a bug caused by the previous update where selecting 'On campaign sent' or 'On autoresponder email sent' when creating a new rule stops short of showing the next option.
  • Fixed ‘Grand total’ not being visible in dark mode when logged in as a brand user
  • Removed mention of Sendy in segments page for white labelling
  • Updated geolocation database


  • Added support for Amazon SES's 3 new regions, namely North California, Paris and Stockholm, in addition to the current N. Virginia, Oregon, Ohio, Ireland, Mumbai, Singapore, Tokyo, Seoul, Sydney, Frankfurt, London, Canada and Sao Paulo regions.
  • Added ‘edit icon’ next to brand title displayed at the top to make it obvious that the brand settings can be accessed by clicking the title

  • Save campaign title when clicking outside the text field (in addition to hitting ‘Enter’ on the keyboard) in the campaign report

  • Fixed plain text version not saved to template when checking the box ‘Also save as template?’ when saving a new campaign or autoresponder
  • Fixed ‘Save’ button (not ‘Save & next’ button) not being able to save a campaign or autoresponder when in ‘HTML only’ mode
  • Fixed white text on white text field in WYSIWYG editor when using dark mode
  • Security enhancement
  • Updated geolocation database

🔥 5.0

  • 🌙 Dark mode!

    Sendy now has a dark theme! You can now set the interface of Sendy to a dark appearance by clicking a button in the footer or setting it in your main settings. Or use a keyboard shortcut Ctrl+g to toggle between dark and light appearance. Visit the new online demo to try it out!

  • 🔗 Rules & Webhooks!

    You can now setup 'Rules' to trigger webhooks, send notification emails, etc when something happens. For example, setup a rule to get notified by email when a scheduled campaign starts sending. Or, trigger a webhook when the last autoresponder email in the series is triggered.

    Try it in the demo →

  • ⬇️ Import segments from reports directly into lists!

    With a click of a button, you can now directly import subscribers from a campaign or autoresponder report into new or existing lists for users who did not open, opened (or opened from any particular country) or clicked at least one link (or any particular link), in addition to exporting any group of these subscribers as CSV. This makes it easy to send future email campaigns to subscribers who interacted (or did not interact) with your email(s).

    For instance, you can easily import people who opened your campaign into a new list with one click. Then send another campaign to the same lists, but this time, use the 'Exclude' feature to exclude the list that contains people who already opened your previous campaign - essentially sending only to people who 'did not open'.

  • 🗄 Segments for Autoresponders!

    You can now set Autoresponder emails to trigger for certain segments only. You can also ‘exclude’ any segments from receiving your Autoresponder email.

  • 💌 Improvements for Autoresponder!

    Send test emails for any autoresponder email. Or duplicate an autoresonder email to speed up creation of your 'Drip campaign' email series.

    Also, you can now use pre-existing templates when creating new Autoresponders just like 'Campaigns'.

  • 🏆 Updated Brands page!

    Updated ‘Brands’ page with useful quick link buttons to frequently visited sections, including a a quick link button that displays the open rate of the latest campaign as well as linking you directly to the report.

  • 🥧 New pie chart in subscribers page

    New pie chart added to subscribers page to show percentage breakdown of subscribers with different statuses (active, unsubscribed, unconfirmed, bounced & marked as spam)

  • When saving ‘Campaigns’ and ‘Autoresponders’, you now have a new option to save the campaign or autoresponder as a template as well.

  • You can now search past campaigns from the ‘All campaigns’ section.

  • You can now export CSVs of subscribers who did not open or click any campaigns ever sent to them from the ‘Housekeeping > Inactive subscribers’ section, in addition to deleting them.
  • You can now enable or disable ‘opens’ and ‘clicks’ tracking when creating a campaign via the API.
  • New animated loading icon
  • Added ‘Plain text version’ support for templates. You can now populate the ‘Plain text version’ when creating or editing a template.
  • Prevent the browser from autofilling Google's reCAPTCHA fields when editing brand settings
  • Turn off autocomplete for fields in main and brand settings to prevent browser from filling in incorrect data without the user’s knowledge
  • Zapier integration now uses curl instead of file_get_contents for all API calls for maximum compatibility with different server configurations
  • urlencode email passed into the ‘Unsubscribe confirmation URL’
  • urlencode 'name' and 'email' for custom subscribe success URL variables
  • Unsubscribe page now says ‘You’re unsubscribed’ instead of ‘Email does not exist’ if the email address exists in the list but is unsubscribed
  • Removed borders for dropdown menus for a cleaner look
  • Added helpful tooltips when hovering over segments and autoresponders number labels in ‘View all lists’ page
  • Updated JQuery to version 3.5.1, CKEditor to version 4.14.1, Fancybox to version 3.5.7 and Highcharts to version 8.1.2
  • Fixed form field validation in the main settings page
  • Fixed footer not displaying properly in the main settings
  • Updated geolocation database

  • Fixed a bug where selecting a list, then selecting a segment or vice versa (with the previously selected list or segment being automatically deselected) may result in the campaign sending to the automatically unselected list or segment. Thanks Gordon Bühler for the exact steps to replicate this.
  • Disable autofill suggestions in the ‘DELETE’ field when deleting brands, campaigns, templates and lists to make deletion a more conscious effort
  • Updated geolocation database


  • Added support for Amazon SES's 4 new regions, namely Ohio, Singapore, Tokyo and Seoul, in addition to the current N. Virginia, Oregon, Ireland, Mumbai, Sydney, Frankfurt, London, Canada and Sao Paulo regions.

    Please note that Amazon SES 'regions' have no relation with where you are physically located. Anyone in the world can use Amazon SES. It only matters where your web hosting server is located. For example, if you're hosting Sendy on a hosting server situated in Canada, use Amazon SES in 'Canada' region and you will get the fastest sending speed.

  • Replace spaces with hyphens in filenames of exported CSVs from segments for maximum browser compatibility
  • Security enhancements
  • Updated geolocation database


  • To safeguard against accidental deletion of brands, campaigns, lists or templates, the confirmation prompt will now ask you to type the word ‘DELETE’ in addition to clicking the ‘Delete’ button before they can be deleted.

    This can be turned off in Settings > Miscellaneous.

  • More information is now provided when regenerating the API key. Also, a new option is now available to restore your API key to the previous one should you change your mind later.
  • Fixed inability to login to brand account via a custom domain when 2 Factor Authentication is active
  • Removed ‘window.location’ line of code that appears in the ‘Miscellaneous’ section of the main settings
  • Displays precise error message if saving list settings displays a blank page
  • Added unix timestamp to curl request in segmentation cron job script in case the server is setup to cache curl requests
  • Fixed ‘Undefined offset’ notice when segmenting
  • The installation page now provides a link to the troubleshooting page when showing an ‘Unlicensed domain error’
  • Updated geolocation database


  • You can now export ‘Suppression list’ and ‘Blocked domains’ as CSV
  • More helpful information when setting up ‘Custom domains’
  • ‘Unlicensed custom domains’ domain error no longer shows when invalid license key is stored in the database
  • The QR code generated for 2 Factor Authentication now uses the current Sendy installation URL’s protocol (Thanks Kilian Valkhof)
  • The ’Subscription status’ API now returns ‘Bounced’ and ‘Marked as spam’ even if the email address was ‘Soft bounced’ before. (Thanks Alessandro Serena)
  • Updated geolocation database


  • Added support for Amazon SES's 3 new regions, namely Canada, London and Sao Paulo, in addition to the current N. Virginia, Oregon, Ireland, Mumbai, Sydney and Frankfurt regions.

    Please note that Amazon SES 'regions' have no relation with where you are physically located. Anyone in the world can use Amazon SES. It only matters where your web hosting server is located. For example, if you're hosting Sendy on a hosting server situated in Canada, use Amazon SES in 'Canada' region and you will get the fastest sending speed.

  • Fixed warning “Array and string offset access syntax with curly braces is deprecated” for PHP 7.4+ in CSV parsing code
  • Updated geolocation database

  • Fixed ‘Unable to save segment conditions’ when saving a list segment experienced by some users


  • Based on popular demand, you can now set a list to automatically unsubscribe a user from another list whenever they are subscribed to a list. You can set this up in list settings.

  • You can now use [Name] tag (without a fallback) in addition to [Name,fallback=] tag for name personalization in ‘Campaigns’, ‘Autoresponders’ as well as ‘Thank you emails’, ‘Double opt-in confirmation emails’ and ‘Goodbye emails’.
  • Updated geolocation database


  • Added more currencies to the list of PayPal supported currencies, including 'Indian rupee' (for charging of client campaigns)
  • Changed column name grouping to group_id to support MySQL 8.0+ (the word ‘grouping’ is now a reserved word in MySQL 8.0+) (Thanks Josh Jennings)
  • Updated geolocation database
  • Changed 'subscribe' API response from Invalid email address to Bounced email address when attempting to signup an email address that was previously marked as 'Bounced' (Thanks James Cridland)
  • Subscribe API now returns Invalid list ID instead of Invalid API key when an invalid list ID is passed into the 'subscribe' API call (Thanks Timo Mackowiak)
  • Set the user's timezone before performing segmentation (Thanks Blaine)
  • Fixed bug for email sending retry part of the script when sending with multithread (Thanks Thanakorn Charlee)
  • Edited copy for GDPR feature description in the main settings for white-labeling (Thanks Cody)

  • Following up on the previous update, Amazon SNS class now uses ‘AWS Signature Version 4’ signing method too when calling Amazon SNS APIs (fixed Amazon SNS API error when using Frankfurt region)


  • Sendy now supports Amazon SES’s 3 new regions, namely Mumbai, Sydney and Frankfurt, in addition to the current N. Virginia, Oregon and Ireland regions.

    Please note that Amazon SES 'regions' have no relation with where you are physically located. Anyone in the world can use Amazon SES. It only matters where your web hosting server is located. For example, if you're hosting Sendy on a hosting server situated in Australia, use Amazon SES in 'Sydney' region and you will get the fastest sending speed.

  • Sendy now uses ‘AWS Signature Version 4’ signing method for Amazon SES API calls where the new regions support. This also future proofs Amazon SES's availability in other regions.
  • Fixed 'API key not passed' error when re-subscribing after unsubscribing
  • Other enhancements

  • Zapier integration now passes api_key into the 'subscribe' API call
  • Fixed inability to initialize email verification with Amazon SES brought on by the previous update

  • Fixed reCAPTCHA implementation where changing a client side parameter causes reCAPTCHA to be bypassed (applicable for the standard subscribe forms that Sendy provides)
  • Previously the subscribe API is secured by the AES-256-CBC encrypted list ID. To make the subscribe API more secure and less prone to abuse, this update requires you to pass your API key into the call with the api_key parameter.
  • Important: If you’re currently using the subscribe API call in your website or application, add a new parameter api_key to your API call with your API key wherever you use the subscribe API. Your API key can be obtained from your main settings, eg. http://your_sendy_installation_url/settings.
  • Stay tuned for the next update where the latest 3 Amazon SES regions (Mumbai, Sydney and Frankfurt) will be supported.

  • Autoresponder title can now be edited
  • Login page’s title bar now displays the brand’s name when accessing the page via the brand’s custom domain
  • Unsubscribe now checks if user is already unsubscribed before sending goodbye email message if set in list settings
  • ‘Thank you email’ and ‘Double opt-in confirmation email’ will no longer be sent when an email that exists in the blacklist is signed up to a list via the subscribe API or the standard subscribe form
  • Added ‘nofollow’ meta tag to 11 public facing pages to prevent links like 'unsubscribe' and 'webversion' from being indexed by search engines
  • Strengthen the security of campaigns RSS feed
  • Changed SMTP debug mode to 3 instead of 2

  • WYSIWYG editor now shows up when creating or editing a template from the templates section
  • Fixed campaigns not using custom domain (if previously setup) when sending without a cron job


  • New search function for brands - you can now search for a brand in the brands page

  • You can now set the number of brands to display in the brands page

  • Re-designed the ‘Resume’ button to make it more obvious and prominent (if you setup a cron job for sending, the resume button will not appear as the cron job will automatically resume any server timeouts while sending)

  • Source URLs of images uploaded through the WYSIWYG editor will use custom domain if it’s been set and enabled in the brand settings
  • Some strings that were previously not translatable are now translatable
  • Strip quotes when saving name in subscriber modal window for enhanced security


  • Added option in brand settings to set lists and templates sorting by ‘name’ or ‘date’

  • You can now add emails and/or domains into 'Suppression list' and 'Blocked domains' lists quickly and easily into a text area in addition to CSV imports

  • Wrap apostrophes around constant in compatibility checklist script to eliminate ‘undefined constant’ error when using PHP 7.2


  • Fixed issue with ability to send campaigns when logged in as a brand user through a custom domain
  • Includes other small fixes
  • Please logout and re-login after updating to this version

🔥 4.0

  • 💄 New facelift! Fresh new look!

    Sendy’s interface has been updated and enhanced with a fresher new look! Everything from colors, spacing, buttons to input fields have been improved aesthetically. Check out the new online demo to explore.

  • 🌍 Custom domains!

    You can now set custom domains for your brands. Once a custom domain is set, unsubscribe, web version and all trackable links in emails you send will use the custom domain set for the brand instead of the domain Sendy is installed on. Also, the custom domain can be used for the login URL that your client use to login to their brand accounts.

  • 🧹 New House keeping section!

    • Unconfirmed subscribers

    You can now easily remove unconfirmed subscribers from the new ‘Housekeeping’ section. ‘Unconfirmed’ subscribers are those who did not click the double opt-in confirmation link to confirm their subscription. Easily remove users who are unconfirmed for 1 week, more than 1 week, more than 2 weeks or not at all. This will keep your database lean and mean.

    • Inactive subscribers

    You can now easily remove inactive subscribers from the new ‘Housekeeping’ section. Easily remove all subscribers who did not open or click any campaigns ever sent to them. This will not only keep your list clean, you save even more money by not having to pay for emails sent to inactive subscribers.

  • 🛑 New Blacklist section!

    • Suppression list

    You can now import suppression lists! If you have email addresses that should never receive any email campaigns or autoresponders from you, import them into the new ‘Suppression list’. Any email addresses you import via CSV or API into any list in future will not be imported if they appear in the suppression list.

    • Blocked domains

    If you'd like block email addresses that belong to certain domains (eg. disposable emails) from ever being imported into any lists in a certain brand, import them into the ‘Blocked domains’ list. Any email addresses you import via CSV or API into any list in the brand in future will not be imported if they appear in this list.

  • 🖐🏼 Set "non expiring" sending limits for brands!

    Previously, you were able to set monthly sending limits for each of your brands. With this update, you can also set email sending limits that does expire (does not reset monthly). This is good if you've always wanted to sell email credits to your clients that does not expire or reset every month.

  • ✉️ Email notifications on new signup!

    Get notified via email on new signups to any list! Instead of using Zapier to do this, it's now possible natively.

  • 📝 Subscriber notes!

    You can now add notes to each individual subscriber! Make notes about certain subscribers so that you can look them up in future to remind yourself of the note you made of them.

  • You can now set a prefix (eg. [Test]) in each brand settings for subject lines of all test emails sent
  • When importing CSVs, Sendy will now let you download a CSV export of email addresses that were skipped from the import process including their reasons.
  • Increased page load speed of subscribers list pages (viewing of individual lists)
  • Improved styling for standard subscription form
  • Improved design of the ‘Newsletter preview’ header in the ‘Define recipients’ page
  • Improved and reorganized list settings, main settings and brand settings page
  • You can now set custom URLs for ‘Already subscribed’, ‘Consent not given’ and ’Reconsent success’ pages in list settings
  • In the ‘Subscriber info’ modal window, you can now click anywhere outside the text field to save your changes in addition to hitting <Enter> on your keyboard.
  • 'Brands' and 'View all lists' pages now have pagination.
  • You can now conveniently visit a brand's settings by clicking the brand name at the top left of the screen
  • Lists in ‘View all lists’ and ‘Templates’ are now sorted by ‘last added’ instead of by ‘name’
  • When adding a new list in the ‘View all lists’ page, the same page will prompt you for the new list name instead of sending you to another page
  • Sendy will now redirect you to the subscribers page for the list after importing a CSV when importing using a cron job
  • Re-order, added colors and improved copy of Amazon SES quota description in the left sidebar
  • Optimized CSV exports from campaign reports
  • Shortened copy for ‘Create a new campaign’ to ‘New campaign’ in the left sidebar navigation
  • Added new icons to headers in brand and main settings page
  • Added support to debug SMTP sending issues by appending &display_errors at the end of the ‘Define recipients’ URL. Full error message will be displayed if there are any issues with sending emails via SMTP.
  • When Autoresponders are deleted, associated links will be deleted as well
  • Automatically highlight campaigns RSS feed URL when hovering over it
  • Don’t convert links to trackable links
  • Changed line endings of import-csv.php and update-segments.php to LF instead of CR
  • Removed __autoload from PHPMailerAutoload.php due to deprecation warning when using PHP 7.2+
  • Displays full error message when catching ‘fatal errors’
  • Returns actual MySQL error messages when saving campaign, autoresponder and template emails
  • Updated GeoLite2 database

  • Changed the new GeoLite2 implementation (responsible for geolocation data) for better compatibility with all servers as the previous ".phar" method may cause some issues with subscribe form signups and campaign 'opens' tracking on some servers.

  • Fixed saving list settings resulting in a blank page.

  • Optimizations to make ‘View all lists’ page load faster
  • Fixed ‘Failed reCAPTCHA test’ error being returned even if reCAPTCHA is not enabled (for Sendy's standard subscription forms)
  • Removed ability for brand users with access privilege of ‘viewing campaign reports only’ to delete campaign reports
  • Brand users will now be limited to certain settings according to their ‘privileges’ set by the main admin user. For instance, a brand user will not be able to edit ‘From name’ or ‘From email’ if the brand user is not granted ‘Campaign access’ privilege.


  • Sendy now supports Google’s reCAPTCHA to protect your subscription forms from spam bots. You can enable them in the brand settings. .

  • You can now pass in a new flag called silent when calling the ‘subscribe’ API to signup the user with ‘single opt-in’ even if the list is set as ‘double opt-in’.
  • Optimize creation of very large segments.
  • Sendy now uses GeoLite2 (instead of GeoLite) database for country detection (supported on PHP 5.4+, falls back to GeoLite if PHP version is older than that).
  • Fixed ‘unsubscribe’ API not able to unsubscribe email addresses from a list that’s set as ‘Double Opt-out’.
  • URLs displayed under ‘Link activity’ in campaign reports will be truncated if the length is over 100 characters (clicking on it will still direct you to the full original URL).
  • CSV exports of subscribers who clicked individual links in the campaign report now excludes users who unsubscribed, bounced or marked as spam.
  • Fixed Amazon SES verification emails unable to send when there is a trailing slash at the end of the APP_PATH set in `/includes/config.php`.
  • Fixed unable to export CSV of ‘unopens’ when campaign was sent to at least one segment.
  • Removed from header.


  • In addition to 'one click unsubscribe', you can now set the 'unsubscribe' behavior for a list to double opt-out (two click unsubscribe). When double opt-out is set, the recipient will need to click a confirmation link in the unsubscribe page to complete the unsubscribe process.

    You can set this new unsubscribe behavior in the list settings.

  • The standard subscription form now presents a date picker instead of a text field if it is a “Date” based custom field.
  • Fixed [currentmonth] tag displaying 'January' instead of 'October'
  • Subscribers imported via CSV or the ‘per line’ method will not update subscriber’s last activity timestamp
  • Fixed XSS on 'search all list' function (thanks Mohammad Abdullah)
  • Append /a to unsubscribe and web version links in web version of Autoresponder emails

  • This update fixes slight issues resulting from the security audit in v3.1.0:

    • Fixed inability to toggle HTML & WYSIWYG editor when editing Autoresponder emails
    • Fixed not able to delete and unsubscribe using the 'per line method'
    • Fixed web version link not showing when link tracking is disabled

  • Patch by Rob Henley to make subscriber list load faster (Thanks! 👍)
  • Trackable links and web version links will now show ‘Link no longer exists’ or ‘Web version no longer exists’ respectively if the campaign (and all its data) has been deleted
  • Updated GeoIP database
  • Fixed issue with adding subscribers using the “per line” method
  • Fixed issue with ‘Delete’ subscriber API
  • Added ‘IC','SX','CW','XK' to subscribe API
  • Changed for=“email” to for=“hp” for the honeypot field in subscribe form


  • Security audit by GUIA Brahim Fouad (big thanks for your efforts! 👍).
  • Also fixed vulnerabilities discovered by William Wright (Thanks! 👍)
  • Resubscribing right after unsubscribing from an unsubscribe link now keeps the GDPR status unchanged
  • Unsubscribe and reconsent pages will now return “Email does not exist” if the email address has been deleted from the list
  • Using a template to create a new campaign now appends the query string set in the brand settings
  • Verify email address format at the installation page
  • Make “Brand settings” words translatable
  • Added IC, SX, CW and XK to country detection
  • Fixed pagination bug with GDPR tab in subscribers list (thanks Kelly Footit)
  • Appended /a to the end of unsubscribe URL converted from [unsubscribe] tag in autoresponders (thanks Ian Y)
  • Fixed some PHP notices

  • The new ‘shortened’ unsubscribe, web version and re-consent links introduced from version 3.0.8 may not work reliably for some users. Hence, these links are now reverted to original in this quick update.


  • Updating data of existing subscribers with CSV import

    When importing a CSV, data of existing subscribers in the list will now be 'updated' instead of 'skipped'. For example if you want to update names or any custom fields of multiple subscribers in the list, you can import a CSV and Sendy will update any names or custom fields accordingly. Or if you want to tag existing subscribers with the 'GDPR' tag, you can import your CSV while selecting the checkbox "Apply GDPR tag to imported subscribers?".

  • Re-consent confirmation page text,'Marketing permission' and 'What to expect' strings can now be translated
  • Brand users can now edit GDPR and other miscellaneous settings
  • Show placeholder on what format to use for ‘Country’ in segmentation
  • Format GDPR number with ‘number_format’ so that commas are used for “thousands”
  • Added ‘EU’ country abbreviation to list of countries to verify for ‘subscribe’ API
  • Deletion of a brand now removes all associated segments, autoresponders and Zapier web hooks.
  • Fixed Autoresponder web version and unsubscribe links
  • Prevent brand users from accessing ‘new brand’ and ‘edit brand’ pages


  • New segmentation options!

    You can now create segments based on GDPR, Country and Referrer data! If you're sending re-permission campaigns and you want to send another campaign to remind your subscribers to opt-in, you can create a segment of your list that still do not have the GDPR tag (users who did not click the re-consent buton).

  • GDPR safe switch now separate for Campaigns & Autoresponders

    The ‘GDPR safe switch’ can now be set separately for ‘Campaigns’ and/or ‘Autoresponders’ in the brand settings. Which means you can now set whether you want future ‘Campaigns’ or ‘Autoresponders (or both) to send only to subscribers tagged with ‘GDPR’.

  • Links are now shorter

    All trackable links, web version, unsubscribe, re-subscribe, re-consent links are now significantly shorter and more secure.

    From this:

    To this:

  • Fixed subscribe API not returning Already subscribed if no gdpr parameter is passed into the call.
  • Changed compatibility checklist to reflect version 5.3 as the minimum required PHP version
  • Added ‘int’ type cast to a GET variable in the functions file (Hat tip GUIA Brahim Fouad)
  • Changed title tag of reconsent-success.php to ‘Your reconsent tag is working’


  • New GDPR features!

    This update introduces lots of new GDPR related features.

    The General Data Protection Regulation (GDPR) is a regulation in EU law on data protection and privacy for all individuals within the European Union. The GDPR regulation affects anyone in the world who collect and process the personal data of EU users. If you collect and process data of EU users, Sendy's GDPR features will be useful to you.

    The GDPR regulation kicks in on May 25, 2018.

  • GDPR friendly subscribe forms

    You now have an option to enable GDPR fields for your subscribe forms. This applies to both the ‘Ready-to-use subscribe form’ and the embeddable ‘Subscribe form HTML code’.

    In the same window where you retrieve the forms from a list, there is an option to enable GDPR fields. Some users collect data of EU users, some do not, so this is an option.

    The GDPR fields includes text areas for ‘Marketing permission’ and ‘What to expect’ so that you can inform users in the subscribe forms of what they are signing up for and what you’re going to do with the information they submit. Suggested language will be pre-populated in the text areas to make it easier for you to modify it to better suit your business.

    On either subscribe forms, subscribers will see these information including an unticked consent checkbox. They're required to check the ‘Consent’ checkbox in order to subscribe.

    Subscribers who have signed up in a GDPR compliant manner either through the ‘Ready-to-use subscribe form’ or the embeddable ‘Subscribe form HTML code’ will be tagged with a ‘GDPR’ label.

  • GDPR subscriber tagging

    If you are using the ‘subscribe’ API to signup users programmatically, there is a new parameter called gdpr where you can set it to true if you are signing up users in a GDPR compliant manner. This will tag the subscriber with a 'GDPR' label.

    If you're importing CSVs or using the 'Add name and email per line' method, you have an option to tag all imported subscribers with a 'GDPR' label.

  • Send re-permission campaigns

    You can now easily send re-permission campaigns to make your lists compliant with GDPR - without having to do anything complicated. A new tag named [reconsent] is now available for use with your email campaigns. This tag will convert into a re-consent link when your campaign is sent to your subscribers. When the re-consent link is clicked, the subscriber will be tagged with ‘GDPR’.

    The following is an example of how you can use the new [reconsent] tag in your email campaign:

    <a href="[reconsent]">Click here to continue receiving emails 
    				from us</a>

    All subscribers who clicked this link will be tagged with ‘GDPR’.

    In future, you can enable the ‘GDPR safe switch’ (see below) in your brand settings so that Campaigns and Autoresponders will only send to subscribers tagged with ‘GDPR’.

  • GDPR safe switch

    What can you do with subscribers who are tagged with a 'GDPR' label? In your brands settings, you can set Campaigns & Autoresponders to send to only subscribers tagged with 'GDPR' label. This will prevent you from accidentally sending emails to subscribers who did not signup to your list in a GDPR compliant manner.

    Also as seen in the screenshot above, you can set whether you want to see any GDPR options at all. If you don't store or process data of EU users, you can uncheck the GDPR options checkbox.

  • GDPR tab and data management

    In each subscriber list, a new tab named ‘GDPR’ (alongside existing tabs like Active, Unconfirmed, Unsubscribed etc) will appear if there are any subscribers tagged with a 'GDPR' label. You can filter or export CSV of subscribers in this new tab.

    CSV exports will also now include a new column named ‘GDPR’ reflecting ‘Yes’ or ‘No’ depending on whether the subscriber is tagged with ‘GDPR’

    When you delete a subscriber, you now have an option to delete the subscriber from ‘this list only’ or ‘ALL lists in the brand’. This will cater to the user's 'Right to erasure'.

  • Two new columns are added in the ‘View all lists’ page which shows the number of ‘Segments’ and ‘Autoresponders’ created for each list. Clicking on the number takes you straight to the ‘Segmentation’ or ‘Autoresponders’ page respectively for the list.
  • Subscribe API now uses filter_var instead of ip2long to verify IP address input to support both ipv4 and ipv6 IP addresses
  • Updated the design of the default double opt-in confirmation email
  • Improved cron job setup instructions
  • Brands page now shows an overview of ‘Brands’ when no brands are created
  • Any email addresses that are bounced in any lists or brands will not be able to re-subscribe via the ‘subscribe’ API


  • In addition to 'Campaigns' and 'Autoresponders, you can now use [Name,fallback=], [Email] or any custom fields as personalization tags in ‘Thank you’, ‘Double opt-in confirmation’ and ‘Goodbye’ emails set in your list settings.

    You can also use [unsubscribe] or <unsubscribe></unsubscribe> tags in your ‘Thank you’ email as well as [resubscribe] or <resubscribe></resubscribe> tags in your ‘Goodbye’ emails set in list settings.
  • You can now set the number of rows to display in the campaigns or reports page in each brand’s settings.
  • You can now set a default URL query string (eg. Google Analytics UTM parameters) in your brand settings. When you create a new campaign or autoresponder, the ‘Query string’ field will be automatically filled with this default string (which can be edited or removed if you wish).
  • Double opt-in confirmation email will be re-sent when an ‘unsubscribed’ user attempts to re-subscribe to a double opt-in list
  • Double opt-in confirmation emails will not be re-sent if one had already been sent within an hour ago
  • Subscription form will now show ‘You’re already subscribed’ when submitting an email that already exists in the list even if you have set a ‘Subscribe success page’ URL in the list settings
  • The Campaigns > Create API now supports passing in segment IDs to send your campaign to. It also supports passing in list and segment IDS to ‘exclude’ from your campaigns.
  • CSV exports from lists now includes subscription statuses like ‘Unsubscribed’, ‘Bounced’, ‘Marked as spam’ and ‘Unconfirmed’ for your data sorting needs
  • Sendy will now send a ‘Password reset link’ prior to resetting the password when using the ‘Forgot password’ function on the login page. Only upon clicking the ‘Password reset link’ in the email sent to the requester will the password be reset.
  • Shows error message with instructions if certain extensions are not installed causing Sendy not to load correctly
  • Added stylesheet to compatibility checklist for better visuals
  • Fixed potential conflict with ‘Wordfence’ Wordpress plugin
  • Changed copy for when there are 0 records to export from campaign report
  • Security improvements


  • Sendy now captures subscribers’ IP address, country, referrer data and opt-in method when signing up via Sendy’s subscription forms.

    When you use Sendy’s subscription form’s HTML code or the subscription URL, IP address, country, referrer URL of where the subscription form is hosted and the opt-in method will be captured. These data are useful as evidence of a user explicitly signing up and giving you permission to send them emails should any dispute arise in future. Not only is storage of these information valuable to everyone in general, it is also useful for those who’re getting ready for the new General Data Protection Regulation (GDPR). If you're using the 'subscribe' API, you can also pass in ipaddress, country and referrer data into the API call. These new data will show up in the subscriber's modal window as well as CSVs exported from the subscribers' page or the campaign report.
  • Sendy now takes advantage of Amazon SES's new Custom Verification Email Templates API. Previously, when initializing an Amazon SES verification process for any ‘From email’ address that have not been verified, Amazon sends you a verification email with their branding. Sendy now sends the verification email using a custom template without Amazon’s branding. If you use Sendy’s white label features for your clients, this enables brand users to use any ‘From email’ they want when logged in to their own account as verification emails are no longer branded with Amazon’s message and logo.
  • Sendy will now initiate the Amazon SES verification process for your ‘login email address’ when you’re at the ‘brands’ page. Just click the verification email you receive from Amazon to complete the verification. Having your login email address verified enables password reset emails to be sent to you successfully via Amazon SES. Also, the above new custom verification email templates feature uses your login email address to send verification emails, hence it has to be verified.
  • New option in brand settings to indicate if you’d like to receive ‘Campaign sent’ email notifications to your main account’s login email address when campaigns are sent from a brand. ‘Campaign sent’ email notifications will still be sent to the ‘From email’ address that’s used to send out the campaign irregardless of this setting.
  • Added rel="noreferrer" to all links in the web version of your email newsletter so that the web version’s URL cannot be picked up by analytics software when any of the links are clicked. More info here. Thanks Graham Cluley for the tip.
  • Fixed a possibility where brand users are unable to receive password reset emails when attempting to reset their password
  • Areas where absolute dates are displayed now contains the 'year'
  • Updated GeoIP database
  • Updated Google Authenticator URL for iOS in 2 Factor Authentication instructions as the previous URL is no longer valid
  • Added authentication for CSV import progress script
  • Added instructions to use a CSV with columns separated by commas and not semi-colons in the ‘Add subscribers’ page
  • Added instructions for case sensitivity when setting a 'From email' for a brand


  • You can now ‘Enable’ or ‘Disable’ Autoresponder emails
  • More than 10x increase in speed when segmenting lists based on ‘custom fields’ (hat tip Valdemar Markevic)
  • Fixed ‘year’ being saved as "one year before" when date is set as 'January 1st' in list segmentation
  • Deleting lists now removes its associated segments as well
  • Optimized performance for queries in Autoresponders
  • Improved Autoresponders navigation breadcrumb logic
  • Clicking on the ‘Save icon’ in the WYSIWYG editor in autoresponder emails now saves the edit while remaining on the editing page
  • When clicking on the ‘Save icon’ (not the ‘Save template’ button) in the WYSIWYG editor of templates, you’ll stay on the editing page instead of being redirected back to the templates listing page


  • More than 20x speed increase in subscriber ‘totals’ calculation in the ‘Define recipients’ page (the page where you select lists to send your campaign to)
  • Fixed segmentation condition converting certain characters into a unix timestamp
  • Added ‘Subscribers activity’ label to the subscriber’s activity chart in subscriber’s list. Also includes helpful info on what defines ‘Last activity’.
  • The ‘Save’ icon button in templates WYSIWYG editor now saves the template when clicked
  • Fixed constructor warnings in CSV parsing script when running on PHP 7+
  • Disable clicks to subscriber's list, name and email from the campaign report if access to lists and subscribers are restricted
  • Removed ability to process email addresses passed into the subscribe or unsubscribe link


  • Fixed ‘auto-resume’ marking a campaign as ‘Sent’ instead of resuming sending
  • Fixed ‘manual-resume’ not resuming campaign


  • ‘Date personalisation tags’ can now be used in URLs (inside ‘href’ tags) for both campaigns and autoresponders
  • ‘Day’ and ‘Month’ text for ‘Date personalisation tags’ are now translatable (eg. the words 'Monday' ... 'Sunday' and 'January' ... 'December' are now translatable)
  • Fixed percentage calculation in ‘View all lists’ page
  • Shows an error with instructional message when CSV export fails in campaign reports
  • Update a subscriber’s ‘Last activity’ timestamp when they opened or clicked a campaign or autoresponder as well as when they confirm a double opt-in subscription
  • If a cron job is setup for auto updating of segments, segments will not update if a campaign is currently sending in the brand
  • The phpinfo script used for troubleshooting purposes now requires a valid license key to load
  • Removed ‘ignore_opt_in’ flag in subscribe API


  • List Segmentation is here!

    Research shows sending emails to targeted segments not only improves open and click through rates, revenue can increase by more than 25%. Sendy now enables you to create dynamic segments for any list. Filter subscribers from any list based on conditions you define using default fields like ‘name’ and ‘email’ or any of your custom fields. Create multiple conditions and group them using ‘AND’ and ‘OR’ for each segment. Once you’ve created your segments, you can send targeted email campaigns to these segments in addition to lists. You can even choose segments to ‘exclude’ from your sends. Sendy just got really powerful!

  • ‘Exclude list’ feature!

    You can now select which list(s) you want to exclude from your email campaign. A good use case would be - say you want to send an email campaign to your ‘Prospects’ list. However, some subscribers from the ‘Customers’ list may exist in that list as well. Now you can exclude the ‘Customers’ list so that anyone from this list that may appear in the ‘Prospects’ list will not receive your email campaign.

  • More brand user privileges!

    You want to have full control of what your client can or cannot access, now you can. Set whether the brand user can access campaigns, templates, lists & subscribers or campaign reports.

  • The custom ‘Unsubscribe confirmation page’ URL in list settings now has a new variable %s that converts into a full ‘re-subscribe’ URL. For example if you set an ‘Unsubscribe confirmation page’ URL for your list like, you can include a ‘Re-subscribe’ link in your page that uses the resubscribe_url GET parameter’s value as the re-subscribe URL.
  • Implemented honeypot for subscription forms to prevent spambot signups
  • The 'totals' shown on screen when selecting multiple lists in the ‘Define recipients’ page are now calculated using a MySQL query
  • Changed scheduling calendar to a new and improved date picker
  • Links that starts with ‘ftp://' are now excluded from link tracking alongside ‘mailto://', ‘tel://' and ‘sms://'.
  • Show more helpful information when all types of autoresponders have been created
  • If a user signs up to a double opt in list with an email address that ‘Bounced’ or ‘Marked as spam’ and attempts to signup with the same email address again, the double opt-in confirmation email will not be re-sent. The same email address will show up as ‘Bounced’ or ‘Marked as spam’ instead of ‘Unconfirmed’ in the list.
  • Added checks for ‘simplexml’ extension in server compatibility checklist
  • Display instructional error message in-app when ‘simplexml’ is not installed on the server
  • Removed the word ‘remaining’ in front of ‘X recipients’ in define recipients page if user is not using Amazon SES to send email campaigns
  • Removed ‘ENGINE=InnoDB’ from ‘CREATE TABLE’ queries as some MySQL server does not support InnoDB

  • Prevent brand user from being able to edit other brands' settings
  • Escape apostrophes in country names that have apostrophes (eg. Cote d'Ivoire) for countries pie chart in the campaign report
  • Detects if ‘ONLY_FULL_GROUP_BY’ is present in ‘sql_mode’
  • Added helpful instructions when getting ‘SignatureDoesNotMatch’ error
  • Fixed some PHP notices

  • Auto focus on the first ‘Name’ field in the provided subscription form for every list
  • Monthly sending quota not resetting for some users have been fixed
  • ‘Used quota’ (when a monthly sending limit is set for a brand) will now be adjusted accordingly if a scheduled campaign is deleted or lists re-selected
  • Corrected personalization tag for ‘email’ displayed in the ‘Custom field’ page to [Email] instead of [Email,fallback=]

  • Added support to resize images in the editor by dragging handles in webkit browsers like Safari and Chrome (previously only supported in ‘non’ webkit browsers like Internet Explorer and Firefox
  • You can now pass the campaign's ‘Title’ into the ‘Create’ campaign API
  • Includes instructions to disable 'Grammarly' browser extension for the domain Sendy is installed on if Grammarly is installed in the browser. Grammarly browser extension inserts thousands of lines of code into the WYSIWYG editor causing many unexpected behavior.
  • Updated PHPMailer to the latest

  • You can now select a template when creating a new campaign
    (note: you must have at least one template stored in 'All templates' section to see this new drop down menu)

  • If the campaign’s title is set, it will be displayed at the ‘Define recipients’ page
  • Fixed query_string field’s width not adjusting to screen’s width
  • Updated some error messages to match updated instructions in Step 5 of the Get Started Guide
  • Fixed ‘Too few arguments to function PHPMailer::doCallback()’ error in the latest version of phpmailer class

  • Fixed HTML email not rendering caused by a fix in the previous version.

  • Fixed plain text version not using the content saved in the campaign after updating PHPMailer class in the previous version
  • Included latest security fixes in PHPMailer class

  • Updated PHPMailer class to the latest version while retaining functionalities developed uniquely for Sendy & Amazon SES
  • Removed ‘’ dependency for ‘campaigns RSS feed’
  • Removed ‘’ class as per PHPMailer security notice

  • Removed ability for brand users to delete campaigns if they only have ‘campaigns reports only’ access level
  • Patched PHPMailer class in Sendy in view of recently discovered vulnerability discovered by Polish security researcher Dawid Golunski on Dec 26, 2016. Sendy does not use the affected methods discovered in the report as Sendy uses Amazon SES API methods instead of sendmail or mail() functions to send emails. Though, the PHPMailer class has been patched nevertheless according to the latest version released by the authors of PHPMailer.
  • Added ‘List-Unsubscribe’ header when sending ‘test’ emails as well
  • Removed ‘X-Priority’ in email headers
  • Fixed ‘opens’ not tracking for some users on PHP 7
  • Fixed “PHP Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP” errors for Sendy installed on PHP 7
  • The words “Not set” in campaign report can now be translated


  • Added a list of ready to use “Zaps” in Settings. If you haven't heard, Sendy is now integrated with Zapier! Learn more here →
  • Clients have full access to all functionalities in their own brand accounts by default. Now you have a new option in brand settings to allow clients to ‘view campaign reports only’.
  • You can now enable or disable ‘opens tracking’ and/or ‘clicks tracking’ when creating/editing campaigns or autoresponders.
  • Each list now provides you with a 'ready-to-use' subscription form URL you can immediately use to collect sign ups to your lists:

    Click 'Subscribe form' at the top right of any list page to get the subscription form URL for that list:
  • Mouse over (instead of ‘click’) to highlight personalization tags when creating or editing campaigns or autoresponders.
  • Removed the word “Template:“ when deploying a template for a new campaign.

  • Sendy is now officially on Zapier! Anyone can now use Sendy on Zapier without using an invite link. Explore ready to use "Zaps" in the 'Third party resources & Integrations' page!
  • Some slight changes to data output for Zapier actions and triggers
  • Added new 'Delete subscriber' API method to delete a subscriber off a list (in addition to the existing 'unsubscribe' method)
  • Updated geolocation database for campaign reporting
  • Fixed %n not being converted in double opt-in confirmation page redirect URL

Version '2.1.1' was supposed to fix a couple of things but broke something else instead. This update should fix everything.

  • Fixed trackable links converting the original URL to lower case when redirecting
  • Fixed trackable links not redirecting for some users due to “Compilation failed: unmatched parentheses” error
  • Added an appropriate error message when user failed to select a brand when choosing a list while creating a Zapier trigger
  • Added link to API documentation in Settings page

  • Fixed blank 'unsubscribe' and 'double opt-in' page due to the last update


  • Sendy now works with Zapier!

    With Zapier support, this opens up a whole world of automation! You can now integrate Sendy with over 1,000 apps available in Zapier's directory. This also satisfies popular use-cases like the following:

    • Notify yourself via email when a new user subscribes to your list
    • Send an email to subscribe a user to a list
    • Unsubscribe a user from a list when subscribed to another (essentially moving the subscriber between lists)
    • Create a draft campaign ready to send when you publish a new post in your blog (RSS to Email)
    • Tweet automatically after your campaign is sent
    • And many more limited only by your imagination!


    As part of Zapier's process of being listed in their official app directory, Sendy is currently in "Invite-only" mode. That means you'd need to visit this "Invite Link" in order to use Sendy integration in your Zapier account.

    Sendy is now officially on Zapier! That means anyone can use Sendy on Zapier without requiring an invite link.

    Check out Sendy's page on Zapier →


  • Added new %n parameter for populating subscriber’s name in GET URLs of 'Subscribe success page' as well as 'Subscription confirmation page' in list settings.
  • Added ability to regenerate your API key in the main settings
  • Personalization fallback values now support accented characters (thanks to Rafael Trostli Costella)
  • Fixed trackable link may not redirect when URL in href is entered in all caps (hat tip: Zoli)

  • Fixed “Error communicating with Amazon SNS API: There was a problem executing this request.” for some users
  • Added step by step instructions on getting ‘OptInRequired’ error when fetching Amazon SES quota.
  • Emails no longer marked as bounced when Amazon SNS notification ‘bounceType’ is ‘Undetermined’

  • Removed bounces & complaints handling checks when sending campaigns as Sendy now automatically setup bounces & complaints handling
  • Fixed ‘Test send this campaign’ function showing ‘okok' message when sending test email to multiple email addresses separated by commas
  • Improved error message and exception handling when Sendy is setting up bounces & complaints handling


  • Added Two-factor authentication support to provide an additional layer of security when signing in to Sendy! You can optionally setup two-factor authentication in your main settings. Your clients will also have the option to setup two-factor authentication for their own accounts.
  • Sendy will now automatically send a verification request to Amazon SES to verify your ‘From‘ email address while you're at the ‘Define recipients‘ page if you did not verify the ‘From‘ email address. You no longer need to visit your Amazon SES console to verify your ‘From‘ email address.
  • Sendy will now automatically setup ‘bounces’ and ‘complaints’ handling for you.
  • Improved 'Forgot password' function.
  • Automatically populate the email text field in ‘Forgot password‘ modal window with email address entered in login form when clicking ‘Forgot password’.
  • Automatically focus on email field on login page
  • More precise error messages for failure to get Amazon SES quotas
  • Show actual error message returned by Amazon SES when using ‘Test send this campaign‘ function in ‘Define recipients’ page
  • A modal window will be displayed with troubleshooting instructions if the campaign is in ‘Preparing’ status for more than 5 minutes
  • Better and more precise error messages throughout the app


  • Amazon recently changed the email address formatting in their SNS notifications resulting in some inconsistencies in bounces and complaints handling, this update fixes this.
  • Added ‘Save’ button alongside ‘Save & next’ button so you can save your campaign at anytime and still continue editing
  • Added utf-8 charset hidden input field to PayPal payments redirection page to support accented characters
  • Fixed email not sent in user’s timezone in some cases
  • Fixed exporting CSV of ‘Unopens’ from campaign reports also including ‘unconfirmed’ subscribers


  • Emojis are now supported for any emails you send with Sendy!
    Note: Please set '$charset' to 'utf8mb4' in /includes/config.php in order for emojis to work. If you're installing a fresh copy of Sendy, you don't need to do anything.
  • Increased loading speed of ‘All campaigns’ view if you have a high volume of subscribers.
  • Increased character limit for links in the database.
  • Fixed an issue where subject line is blank when using accented characters for Sendy installations on PHP 7 and up.
  • Importing of CSV ‘without a cron job setup’ will now skip emails that are marked as ‘unsubscribed’ in other lists within the brand.
  • Special characters in subject lines no longer causes campaigns RSS feed to stop loading prematurely.
  • Changed the copy for ‘Outgoing connections blocked’ error.


  • Updated CKEditor to the latest 4.5.7
  • Fixed 'Outgoing connections blocked' error for Google Cloud users
  • Added CSS to force tracking image to load as 1 x 1 pixel
  • Fixed a slight glitch with the API where ‘You’re already subscribed.’ message doesn't return when it’s true.
  • Changed SMTP server timeout to 300 secs in phpmailer

  • Rolled back CKEditor to the last working version as the latest version of CKEditor has a bug preventing the WYSIWYG editor from loading.


  • You can now set file type restrictions for campaign or autoresponder attachments or even disable uploading of attachments altogether in each brand settings. The default allowed file types are “jpeg, jpg, gif, png, pdf and zip” but you can edit this list any way you like in brand settings.
  • If you’re importing subscribers (either CSV or per line) into a list that has its settings set to ‘Unsubscribe from ALL lists’, the import will skip any emails marked as ‘Unsubscribed’ in any other lists in the brand. This is such that when you create new lists in future and import subscribers into it, any emails already marked as ‘Unsubscribed’ in other lists within the brand will be skipped from the import. Emails that are ‘Marked as spam’ works the same way. Emails marked as ‘Bounced’ continues to work the same, records will be skipped if an email is marked as ‘Bounced’ in any list and in any brand.
  • Updated CKEditor to the latest version 4.5.6
  • Security enhancements


  • PHP 7 compatibility
  • Allows double opt-in confirmation email to be re-sent again if the user “re-subscribes” in ‘Unconfirmed’ status
  • Enable table sorting for ’All campaigns’ , ‘View all lists’, ‘Subscribers’ and ‘Campaign reports (clicks and countries data)’ pages.
  • When a subscriber marks an email as spam, it’ll be registered in all lists the email address exists in. Similarly, for any email that was already marked as spam in any list in a brand, future imports of the same email will be skipped.
  • Fixed the 'time' in ‘All campaigns’ page that may not display in the scheduled timezone


  • You can now pass query_string value into ‘campaigns/create’ API calls
  • Campaign report now omits Google Fonts API URLs from ‘clicks’ tracking data
  • Trim email before validating upon subscribe via API or subscribe form
  • Changed copy to no longer use ‘Production access’ as Amazon has changed the term to ‘SES Sending Limits’.
  • Fixed a bug where quota isn’t updated when scheduling emails while logged in as a ‘brand’ user
  • Fixed displaying of ‘Lists’ tables in iPhone 6 Plus
  • Fixed an issue where importing certain CSVs may result in the import getting stuck at a certain percentage
  • Fixed a situation where ‘Your campaign has been scheduled’ page isn’t showing after ‘brand’ user pays for a campaign
  • Fixed an issue where selected timezone isn’t respected when ‘brand’ user schedules an email after making payment


  • Optimized script for exporting ‘Unopens’ resulting in more than tenfold increase in export speed
  • Adding on to Sendy’s UI mobile friendliness, more pages are now mobile friendly:
    - Unsubscribe confirmation page
    - Subscription confirmation page
    - Double opt-in confirmation page
    - “Campaign now sending” page when your client sends a campaign after payment at PayPal
  • Fixed a bug where images with ‘all caps extension’ fails to upload via the WYSIWYG editor (Hat tip to Sean Gallagher)
  • Updated Sendy to reflect HTTPS version of where applicable


  • Sendy has been audited by Acunetix in this update for XSS and SQL injection vulnerabilities. All possible vulnerabilities have been fixed.
  • Added meta data to prevent your Sendy installation from being indexed by search engines so your Sendy installation remains private and hence more secure.
  • ‘List-unsubscribe’ header is now added to emails sent without using a cron job
  • Fixed some copy in list settings page
  • Some bug fixes


  • When appending query string (eg. Google Analytics query strings) to URLs in an email, Sendy now checks for existing query strings appended to the URL, if so, the query string you set in your campaign will be appended with & instead of ?
  • Used ‘https’ version of Google’s favicon retrieval endpoint
  • Security fixes


  • You can now store templates!

    Create and store templates for later use!

  • Search all lists!

    You can now search across ALL lists so that you can make unsubscribing, deletion or editing decisions more effectively.

  • Google Analytics tracking support!

    You can now add a query string when creating/editing a campaign so that it will be appended to all links in your email when you send out your campaign.

  • Upload custom logos for your brands!

    You can now upload logos for your brands! Your custom logos will be displayed alongside brand items on your brands page. This logo will also appear at the top bar (on the left) when your clients login to their accounts. If no brand icon is uploaded, icon image will fallback to using favicon of the brand's 'From email's domain.

  • Export CSV of recipients who did not open your email!

    You can now download a CSV of recipients who did not open your email newsletter from the campaign report for resending to recipients who did not open your email.

  • Set custom 'campaign titles' to your campaigns!

    You can now set titles to your campaigns to differentiate campaigns of similar (or same) subject lines for your personal reference. The custom title you set will appear in 'All campaigns' section and in campaign reports.

  • Updated CKEditor to the latest version 4.4.6
  • Added new fonts to WYSIWYG editor
  • New icons on reports page
  • Set a different font style for ‘Edit’ and ‘XX not delivered’ buttons that appears alongside campaign items
  • Improved text alignment with badges and labels
  • Changed favicon’s retrieval endpoint to Google's favicon service
  • More accurate 'opens' reporting for recipients who opened the same email newsletter from two or more different countries
  • Excludes telephone `tel:` & SMS `sms:` numbers from being converted into trackable links (just like `mailto:`)
  • Set PHP’s timezone to what's set in Sendy’s settings earlier in the autoresponders's script to prevent probability of emails not getting sent due to timezone discrepancies
  • Fixed a bug where double opt-in confirmation email is blank if custom confirmation email content is removed
  • Fixed a bug where ‘Used quota’ is reset to ‘0’ in December (related to date of reset between year end and the next year)
  • Fixed a bug where visiting ‘Settings’ while logged in as a ‘Brand’ may cause the user to be logged out immediately
  • Clearer instructions in ‘SMTP settings’ when creating or editing a brand
  • Remove whitespace from license key when verifying license to prevent curl from failing

  • Sendy now uses CKEditor! A much better and stable WYSIWYG editor, hope you like it.
  • New API for creating and sending campaigns! This opens up lots of possibilities.
  • Fixed a bug with web version link displaying a blank page in Autoresponder triggered emails when [webversion] tag is used instead of <webversion></webversion> tag.
  • Security enhancements

  • You can now pass 'Email' and 'ListID' data into your custom 'unsubscribe confirmation URL' using %e and %l tokens in your custom URL in list settings.
  • Automatically select encrypted listID when hovering over truncated listID in list view
  • Amazon SES's 'MessageID' is now stored in the database for every email sent to each subscriber
  • Emails are now flagged as spam according to matching 'MessageID' between SNS notification and recipient's record. This applies for both 'Campaigns' and 'Autoresponders'
  • Fixed a bug where 'bounces & complaints' aren't detected to be setup if 'From email' of the campaign differs from what's set in the 'From email' in brand settings
  • Don't include '[unsubscribe]' and '[webversion]' tag in campaign report's 'Link activity' when these tags are used in 'href' tags as 'unsubscribe' and 'web version clicks' are already tracked
  • Adds 'http://' to the original URL when redirecting a trackable link to the original URL if user forgets to add 'http://' to the URL in a href tag
  • Updated Redactor WYSIWYG editor to the latest version 9.2.6
  • Updated CA certificate to the latest version
  • Translation support for various strings missed out on previous versions
  • Detects and returns a more helpful error message if server is blocking outgoing connections
  • Changed 404 error message to include a link to official troubleshooting guide
  • Warns user if APP_PATH is not set in /includes/config.php when installing Sendy for the first time
  • Added troubleshooting link for database connection error when attempting to install Sendy for the first time
  • Added 'List-Unsubscribe' header (unsubscribe URL as value) to emails sent as 'campaigns' and 'autoresponders'
  • Changed email extraction method from 'mail source' JSON object in bounces and complaints handling script
  • Various security enhancements

  • Updated Redactor WYSIWYG editor to the latest version 9.2.5
  • WYSIWYG editor toolbar will now remain visible on screen when page is scrolled down for easier access to editing tools
  • Fixed campaigns RSS feed breaking when '&' is used in the subject line
  • Fixed updated brand name not reflecting in the top bar when editing a brand name while logged in as the brand user
  • Fixed current_quota not being updated when scheduling an email while logged in as the 'main' user
  • Fixed user getting logged out when clicking links in the left sidebar in Settings page when logged in as a brand user
  • Fixed slight opens percentage difference between overview page and report
  • Eliminate timezone warning in error_log when scheduled.php is executed
  • Fixed pointing to non existent jquery file
  • Security enhancements

  • Unintended spaces are removed when saving IAM credentials in Settings
  • Security enhancements

  • You can now adjust your sending rate (emails per second) in Settings
  • Save the last used test email in 'Test send this campaign' function
  • Sort 'Brands' drop down menu by alphabetical order
  • Used 'https' version of Google fonts CSS instead of 'http'


  • Sendy just got a new facelift
    Still the same Sendy you love but with an improved user interface. Many details have been tweaked to give Sendy a lighter and fresher look.
  • Set monthly limits for brands
    You can now optionally set a monthly sending limit for each brand! You can also specify which day of the month should the limit reset. All emails will count towards the limit, eg. opt-in confirmation emails, thank you emails, goodbye emails, autoresponder emails and of course, campaign emails.
  • New personalization tags for dates
    You can now use personalization tags for dates in both 'Campaigns' and 'Autoresponders'. You will see the new tags when creating or editing a campaign or autoresponder.
  • Updated Redactor to version 9.2.1 (with new plugins added)
    - New WYSIWYG editor appearance
    - Added option to change font sizes in WYSIWYG editor
    - Added option to change font family in WYSIWYG editor
    - Added drop down menu to for 'one click insert' of personalization tags
  • Unsubscribe and web version 'dummy placeholder links' in 'test emails' are now replaced with working placeholder links
  • Remove whitespace in search keyword for search function in lists
  • Improved CSV import script for large CSVs importing via a cron job
  • Personalization tags now works with colons and dashes in 'fallback=' value
  • Sort 'Brands' by alphabetical order
  • More descriptive copy for 'Export' button in lists depending on which tab user is on.
  • Updated Certificate Authority bundle to the latest version
  • Bug fixes and security improvements

  • Even more secure against SQL injection by logging user out when an exploitation attempt is detected
  • Information: Sendy is widely used by thousands around the world and we take security very seriously. Measures have already been taken to prevent SQL injection. Sendy has also been worked to guard against MITM attacks as well. If anyone claims to have exploited Sendy via SQL injection based on Sendy's online demo, any result is not an indication of vulnerability with the actual build of Sendy as the online demo does not use the same updated and secure code the actual build uses.

  • Fixed an issue with multi-threaded sending as a result of last update
  • Fixed an issue where the WYSIWYG editor may not appear

  • Optimized MySQL queries for counting number of subscribers in each list. Loading of 'View all list' section and 'Define recipients' page is now much faster (noticeable difference if you have a huge volume of subscribers)
  • Fixed emails not being sent on the old PHP version 5.2.17 for some users
  • Changed <label for="timezone"> to <label for="ses_endpoint"> for Amazon SES region drop down menu in Settings

  • Added support for the new Amazon SES US West (Oregon) region.
    If the physical location of your hosting server is in the west of US, it's recommended to use 'US West (Oregon)' as your Amazon SES region.
    For more information, please see Amazon's official announcement on the new 'US West (Oregon)' region.
  • All 3 Amazon SES regions are now supported, US East (N. Virginia), US West (Oregon) and EU (Ireland). You can select which region you want to use Amazon SES to send emails from in the main Settings.

  • Fixed a slight issue with getting sending quota when logging in as a brand


  • Added support for the new Amazon SES EU (Ireland) region.
    If the physical location of your hosting server is in Europe, it's recommended to use 'EU (Ireland)' as your Amazon SES region.
    For more information, please see Amazon's official announcement on the new 'EU (Ireland)' region.
  • Updated Redactor to 9.1.9
  • Auto selects subscriber form HTML code on click
  • When duplicating campaign, get 'From name', 'From email' and 'Reply to email' from 'Campaign' data rather than 'Brand' data
  • Prevents usage of the 'main login email address' as a brand login email address when creating or editing a brand
  • Fixed sending issue on PHP 5.4.19
  • $dbPort variable is now global
  • Added alt tag to email tracking image (for those who are particular about W3C markup validation)
  • More useful 'Unverified From Email' error message
  • Added instructional warning message in left sidebar if user has not requested Amazon for 'production access'

  • Fixed 'duplicate' and 'delete' buttons appearing twice in 'Sending' mode
  • Fixed blank double opt-in confirmation message when saving list settings without populating the confirmation message

  • Updated Redactor WYSIWYG editor to 9.1.4
  • Fixed issue with setting font and background colors in the WYSIWYG editor
  • Brand selection modal window will not show when duplicating a campaign while logged in as a brand user
  • Removed reference to Sendy's API URL in subscribe form HTML code modal window when logged in as brand user

  • WYSIWYG editor (instead of HTML editor) now displays by default when creating a new campaign or autoresponder
  • WYSIWYG editor no longer removes html, head and body tags
  • Updated Redactor to 9.1.1.
  • Use SSL when checking user's license and version
  • Fixed 'last_campaign' not updated when sending via SMTP
  • Include more information in error message if SES quotas displays zeros

  • Fixed a bug where bounces & complaints are registered but not shown in report if sending an email with attachments
  • Fixed a rare bug where total recipient count shows '0' in the campaign report for some users

  • Updated Redactor to version 9.0.4 which fixes a bug where "Ctrl/Cmd + v" is disabled as well as various other fixes
  • Handles a rare scenario where sending sending stops at 100% and is unable to finish for some reason

  • Trims whitespace of email when using "per line" method for mass delete and unsubscribe
  • Users on PHP version 5.3.0, 5.3.1 and 5.3.2 can now use openssl_encrypt and openssl_decrypt PHP functions
  • Changed displayed currency in 'Define recipients' page to what's selected as your PayPal currency
  • Fixed a bug where unsubscribe fails if the plain text unsubscribe tag, [unsubscribe] is placed inside a href tag, eg. <a href="[unsubscribe]">Unsubscribe</a>
  • Updated Redactor to version 9.0.3
  • Converted column type of two tables in campaigns table that stores list ids to "TEXT"

  • CSV exports now wraps values in quotes so that values with commas are supported
  • Added index to email column for faster CSV import speed
  • Campaign will be marked as complete if there are nothing left to send and the number of recipients sent is less than the total number of recipients to be sent due to any reason (eg. some subscribers were manually deleted before or during the sending process)
  • Included a new condition to fix a rare occurrence for users on PHP 5.2.17 where emails may fail to send
  • Eliminated some timezone warnings
  • Appended a period to the subscribe API error message,
    Invalid list ID for consistency with other error messages.

  • Fixed a bug in 1.1.7 where sending does not automatically resume


  • Campaigns RSS feed is now available for each brand (see top right in "All campaigns" page)

    Some ways to use the Campaigns RSS feed

    • Integrate your campaigns feed with your website or application anyway you like
    • Display an archive of your past campaigns on your website or application
    • Let your audience subscribe to your RSS feed so they'll get notified whenever you send a campaign. Good for users who prefers RSS over email (or even both)
    • Subscribe to your client's RSS feed (if you give access to your clients) to get notified when they send a new campaign
  • [webversion] and [unsubscribe] tags can now be used in the HTML version of your campaign or autoresponder. These tags will be converted into a raw web version or unsubscribe URL.
  • Tweaked and improved sending reliability
  • Webversion, unsubscribe and email tags as well as API key, license key and cron job commands can now be selected with one click (no need to click and drag to select text)
  • You can now include non alphanumeric characters (eg. commas) in your 'From name' (hat tip: Michael Gordon)
  • You can now have quotes in custom field values
  • "Thank you", "Good bye" and "Subscription confirmation" emails will now fallback to use SMTP if settings are available and if Amazon credentials are not set in Settings
  • Updated Font Awesome to 3.2.0
  • Subscribe API now returns "Invalid list ID" if an invalid list ID is passed in
  • Settings now checks if login email already exists in database when saving
  • Changing the "i" variable in the URL at the Define Recipients page will now redirect user back to their own brand when logged in as a 'brand' user.
  • Checking if 'From email' is verified when creating or editing a brand will only be done if AWS credentials exists in Settings
  • Added 'To name' to 'To' field when sending campaigns and autoresponders
  • Fixed a bug where autoresponders may not send to 2 or more emails sharing the same date value
  • Changed API key generation method on installation
  • Use "utf8" character set for newly created tables
  • Changed "x clicked" to "x unique clicks" in reports

  • Fixed a bug where subscriber's name and email cannot be edited in subscribers info card
  • Fixed a bug where emails cannot be sent when not using a cron job for sending newsletters

  • Fixed a bug in where 'rn' string is added to <textarea> fields after saving

  • Further enhanced security by escaping ALL inputs for ALL scripts (62 files in total) even if they are protected by authentication
  • Validate data POSTed by Amazon to bounces and complaints handling scripts before querying database
  • Fixed a bug where recipient count not aren't incrementing when using other SMTP to send campaigns instead of Amazon SES
  • Fixed a bug where brand owners aren't able to send emails when using languages other than English
  • 'Campaign sent' confirmation email now delivers to both the 'brand user' and 'main account user' as well if a cron job is not setup for sending/scheduling emails
  • Re-organized /includes/config.php file
  • Sendy sets database character set to utf8 by default. For users who's language requires other types of encoding to display text properly, eg. Chinese, Vietnamese, etc, add this line to /includes/config.php eg. $charset = 'utf16'.
  • Added support for including a line eg. $server_path = '/path/to/sendy/folder/' in /includes/config.php to fix rare issue with PHP 5.2.17 returning an empty value for $_SERVER['SCRIPT_FILENAME'] that affects importing of CSV via cron
  • Use ENT_QUOTES,"UTF-8" flag for htmlentities method


  • cURL operations now checks for validity of remote SSL certificates for enhanced security. A CA certificate bundle is also included in this build in case it is not installed on the server by default which will cause certificate validation to fail.
  • Escape user inputs for more scripts that are not protected by login authentication
  • 'Resume' button will be removed if cron is detected to be setup for sending as sending will automatically resume if sending time out
  • Your gravatar now appears beside the 'company name' at the top left
  • Updated favicon and AJAX loader gif for retina displays
  • Updated Redactor WYSIWYG editor to the latest version (with retina display and mobile support)
  • Changed WYSIWYG editor to 'iframe mode' so that your layout looks exactly like how it should
  • Switched to Font Awesome for icons (looks great on retina display, or not)
  • Added interface icons to some buttons without icons (for consistency)
  • All tables are now responsive (for your mobile viewing pleasure)
  • Installation page now checks for 'gettext' module
  • Converted more text to translatable strings that were previously missed out when translation support was introduced in 1.1.5
  • Set database charset to utf8 whenever a connection to the database is established
  • Apply 'htmlentities' method for displaying campaign titles
  • Check that 'From name' does not contain commas before saving as emails will not send with commas in the 'From name'.
  • Escape quotes in translated texts in form validation messages
  • Fixed failure to toggle WYSIWYG editor when using languages other than English

  • Use file_get_contents('php://input') if $HTTP_RAW_POST_DATA returns empty value in bounces.php and complaints.php on some servers
  • Checking of sending time outs will be stopped in case user clicks "Resume" while already having cron resume sending when sending time out which will eliminate possibilities of sending an email to a recipient more than once.

  • Found and fixed the root of the issue with emails containing attachments not being able to send if attachment size is more than 500+ kb.
  • Fixed AJAX progress script for campaigns failing when a campaign is 'Preparing to send'
  • Fixed subscription confirmation email body content being blank in some cases

  • ID encryption now handles openssl_encrypt not able to encrypt IDs, e.g.. if Sendy is accessed via "https"
  • Fixed include_once error when Sendy is used in older versions of PHP that may cause subscribe and unsubscribe not to work and newsletter preview in "Define recipients" page to return a 404 error
  • Fixed bug where campaign cannot be saved when using apostrophes in the subject title

  • Fixed a minor bug where campaigns does not "auto resume" when server times out.

  • Fixed a bug where recipients aren't able to unsubscribe on servers without support for 'openssl_encrypt'


  • Localization support. You can now translate Sendy into any language. Language can be set for the main account user or any brand account user. See how to translate Sendy.
  • You can now import CSVs via cron. With cron, there's no need for your browser window to be opened while importing. Sendy will also automatically resume import if your server timeout. This is especially useful when importing large CSVs as everything will be handled in the background.
  • Speed up loading of lists and subscribers
  • Shows progress of CSV import in realtime (when importing using cron job)
  • Progress of currently sending campaigns can now be viewed in realtime as well (you no longer need to refresh the campaigns page)
  • You can now mass unsubscribe users from a list
  • You can now print reports with header and sidebar removed. Some font colours have been changed for more legibility in the printed report.
  • 'Define recipients' page now checks if 'From email' is verified in your Amazon SES console. If 'From email' is not verified, an instructional message will be displayed and all sending buttons will be disabled
  • When creating or editing a brand, your 'From email' will now be checked to see if it's verified in your SES console. Instructional message will be displayed if the 'From email' is not verified.
  • Sendy now checks if bounces and complaints have been setup (and will remind you if they're not set up) before sending out your campaign. Checks will only be done once per 'From email' unless bounces or complaints have not been setup for the 'From email' in question.
  • You can now export CSVs of recipients who clicked a specific link in the report
  • Show which lists were being sent to in reports
  • 'Campaign sent' confirmation email will now be sent to both main account user and brand account user
  • Soft bounce status of any emails will now be reset if the next email sent to it was successful and did not soft bounce
  • Support for specifying a custom database port
  • All IDs are now encrypted with AES-256-CBC encryption method (used by the U.S. government to encrypt top secret documents) and hashed with your API key. This makes URLs of web versions, open tracking, link tracking, subscribes and unsubscribes even more secure.
  • Emails passed as GET variables in subscribe and unsubscribe URLs are now encrypted with AES-256-CBC encryption method and hashed with your API key as well
  • Escape user inputs for scripts that are not protected by login authentication
  • Uploads via WYSIWYG editor now includes authentication and checks for allowed file types (jpg, jpeg, png, gif)
  • Changed jQuery to version 1.9.1
  • If SES quota is unable to be retrieved, an error message will be displayed with a suggestion for the fix
  • Checks if any lists were selected when clicking the 'Schedule campaign now' button
  • Send "forgot password" email via Amazon SES if AWS credentials is set in Settings
  • Show error messages if login details are missing or invalid
  • Domain will now be checked right before the installation page is loaded when visiting the installation page
  • Displays a helpful instructional message when getting a 404 error after installation
  • Additionally check for mysqli, curl_exec and curl_multi_exec during installation
  • Fixed a bug where sending emails with an attachment of more than 500kb won't be received
  • If two campaigns are scheduled at the same time and date, they will now be sent out one after another
  • Various bug fixes and enhancements


  • Added support for attachments! You can now attach one or multiple attachments to your campaigns or autoresponders. Refer to supported attachment types appendix.
  • Added 'subscription status' API. Check if an email is subscribed, unsubscribed, unconfirmed, bounced, soft bounced or complained from a list.
  • Added 'active subscriber count' API. Get the total active subscriber count from any available list.
  • You can now edit double opt-in confirmation email subject and content (the email with the confirmation link)
  • Replaced original MySQL functions with MySQLi ahead of the latest PHP 5.5.x version (currently in alpha). mysql_* functions will be deprecated starting from PHP 5.5, this update uses mysqli_* functions, thus making Sendy future proof.
  • Edited the entire codebase to remove PHP warnings and notices as much as possible even though they don't affect functionality.
  • Throttle sending to the EXACT amount of microseconds needed.
  • Pagination in 'Recent campaigns' and 'Reports' sections
  • Save content when switching from HTML to WYSIWYG editor and vice versa (applies to both campaign and autoresponder email editors).
  • Redirect to previously attempted URL after login
  • Sending and scheduled buttons will be disabled for users logged in as brands when selecting a combination of list with more recipients than Amazon SES quota allows.
  • Removed tooltip when hovering over trash icon in subscriber list as it may cause flickering on small screens resulting in difficulty deleting a subscriber.
  • Better layout for database and license error messages.
  • When new update is available, the 'get updated' link in footer will include user's license so the license field will be pre-populated.
  • Clearer placeholder text for setting login email and password on installation page.
  • Support for dashes and question marks in custom field names.
  • Include a note in sidebar that says sending via your server is not recommended when no AWS credentials is available in settings.
  • Added an extra check before sending the 'campaign sent' confirmation email.
  • Fixed a small bug where 'Last 10 opened' in report shows two of the same recipients when there are exactly two recipients who currently opened the email.
  • Removed an extra IP address generated by some servers when using PHP's getenv() function.
  • Trimmed spaces in email when using line import to prevent duplicates from slipping through.
  • Set CURLOPT_SSL_VERIFYHOST and CURLOPT_SSL_VERIFYPEER to 0 to prevent sending failure when sending without using cron on some servers.
  • Check if function exists for geoip_country_name_by_name() and geoip_country_code_by_name().
  • Changed comment in .htaccess from 'Open tracker' to 'Web version'.

  • Removes large query string data after setting 'sent' as '1' in the queue for every email sent. This dramatically reduces database size and increases sending speed by 4x.


  • Changed queuing method. Each email record in the queue will be marked as sent when sent instead of deleting the email record. The entire queue for a particular campaign will only be deleted once all emails are sent. Also added a conditional statement to check if an email already exist in queue before adding. These measures are to doubly ensure no duplicates will be sent in all cases.
  • Re-adjusted multi-threading code so it does not rely on curl_multi_select(). Later versions of PHP like 5.3.18 loops multi-threading code until timeout as it always returns failure code instead of correct number of parallel connections.
  • Allow delivery fee and fee per recipient to have up to 3 decimal points instead of 2 so that a value of less than 1 cent can be used
  • Fixed a bug where send button is not enabled after being disabled when selecting one or more list that contains more subscribers than SES quota allows
  • Handles certificate error for all CURL operations that causes sending to fail on some servers
  • Handles plus signs in emails when unsubscribing and subscribing


  • Further improved multi-threading code
  • Now features 'automatic retry' when any email was not sent through for any reason.
  • 'http error code' and 'subscriber id' will be captured in the database for any reason Amazon SES was unable to deliver an email. Also available as a CSV download.
  • Removed timezone warnings when sending
  • Pause sending for 0.7 second after every burst of emails sent with multi-threading
  • Required PHP version is now 5.2 instead of 5.0 because of parallel curls
  • Even more robust CSV import. Improved handling of line endings, encoding, etc.
  • Added home screen icon for iOS devices
  • Improved layout of Sendy when viewed in mobile devices
  • You can now edit individual subscribers name, email and all available custom fields when viewing a subscriber card
  • Fixed subscriber card showing 'Subscribed' when the user is 'Unconfirmed'
  • If list is 'double opt-in' and user was previously subscribed, resubscribing will not mark their status back to 'unconfirmed'
  • Fixed a bug where a subscriber re-subscribes to a 'double opt-in' list from an unsubscribe link results in having their name removed
  • You can now change your client's login email when editing a brand
  • Email preview now displays via lightbox in campaign and autoresponder reports
  • Fix a bug where scheduled email title in black rollover tooltip displays list names repeatedly if there're more than one scheduled email

  • Fixed a bug where hard bounce wasn't registered after 3 soft bounces.
  • Tweaked a line of code in CSV import script that fails to check for duplicates in some situation

  • Fixed a problem where 'queue' table was not created in the database of some users for some reason resulting in emails not being sent.

  • Fixed a bug where a column responsible for storing SES send rate wasn't added to the respective table
  • Also removed a line in cron sending script that redundantly increases the 'currently sent' recipient count

  • Fixed a bug where the recipient count did not tally with Amazon SES


  • If you haven't checked out 1.1.0 released 3 days ago, view the 1.1.0 change log to see what's changed. Multi-threading and auto resume are now supported. Get ready for high speed sending! :) If you've already upgraded to 1.1.0, sorry for releasing an update so soon.

  • Optimized multi-threading code
  • Tweaked a variable to fix Amazon SES quota showing 'zeros' for some users
  • Removed (non critical) duplicate condition in mySQL query when importing CSVs
  • Apart from already checking for duplicates, Sendy now checks for invalid emails as well when importing via CSV or per line
  • Automatically set timezone of drop down menu in 'Define recipients' page to the timezone set in Settings so you don't have to keep selecting it each time you schedule an email
  • Subscribe form and API now returns Already subscribed. if email is already subscribed and 'active' in the list. You may want to adjust your existing code to handle this new output. If you're worried that the subscribe form and API previously don't check for duplicates, don't worry, it does. Just that it doesn't output Already subscribed. previously. Now it does!


  • Multi-threading
    Multiple emails are sent in parallel according to your SES send rate resulting in huge improvements to sending speed.
  • Auto resume
    Especially for BIG senders, sending will automatically resume even if your server times out. Just make sure cron is set up.
  • SMTP is now supported. Note that Sendy is built for Amazon SES, we built in SMTP so that there's an option. Bounces and complaints won't be registered if emails are sent using SMTP. The same goes for if emails are sent via your server (if AWS credentials is empty in Settings).
  • You can now set your timezone via Settings
  • Loading of lists is now faster. Query for counting of total subscribers, unsubscribes and bounces are now optimized. Users of huge lists will notice a big difference.
  • Subscriber search will now search through custom fields
  • Personalization tags are now supported in links.
  • 'a href' codes in HTML body does not need to be in a specific order for Sendy to detect it as a link.
    Eg. <a href="" style=""> and <a style="" href=""> both works
  • The 'schedule' button will now be disabled if the combined subscriber count of the selected lists exceeds SES daily limit
  • Fixed a pagination bug in 'Marked as spam' tab in subscribers where clicking to the next page does not load 'Marked as spam' subscribers
  • Fixed a bug where email is not displayed in subject line in autoresponder emails page when [Email] tag is used
  • Fixed a bug where saving fails when there are quotes in the subject line when editing a campaign
  • Fixed a bug where deleting a campaign fails as a result of quotes in the subject line
  • Various fixes & improvements


  • We are excited to announce - Autoresponders!

    You can now create autoresponders. There are 3 types of autoresponders you can create, namely, drip campaigns, emails that sends annually or on a specific date based on a date based custom field.

  • You can now personalize email subject with tags just like you would the email body (applies to campaign & autoresponder emails)
  • You can now send test emails to multiple recipients separated by comma
  • Soft bounces are now handled - If an email 'soft bounced' thrice, it'll be converted to a 'hard bounce' so that future emails will not be sent to them
  • If no AWS credentials is available in settings, campaign sending page will not check for SES quota as emails will be sent by the server
  • Re-designed 'campaign sent' confirmation email
  • Newsletter preview in campaign sending page is now forced to load a fresh copy (prevent loading from browser's cache)
  • CSV or line imports will now be scrubbed against previously marked as bounced emails. Emails that have been previously marked as bounced (no matter which list they belong to) will not be imported.
  • Improved retrieval of bounce/complaint data from SNS notification
  • Resume button's 'id' is now unique in a list of currently sending campaigns
  • More secure login
  • Fixed bug where sending a test email displays 'Your campaign is now sending'
  • Various fixes & improvements


  • Custom fields are now supported. This paves the way for list segmentation and auto responders which we're currently working on
  • Allow import of CSV with custom fields, adding of subscribers via subscribe form or API supports custom fields as well
  • Subscriber info card displays custom fields alongside name & email
  • CSV export includes custom fields if available
  • You can now add personalization tags in Plain Text & HTML versions when creating/editing a campaign (eg. name, email and custom fields personalization tags)
  • Webversion and unsubscribe tags now works in Plain Text version
  • Slashes are stripped in Plain text version field when editing a campaign
  • Added personalization tag reference when creating a campaign
  • Better instructions in CSV import page
  • Smarter duplicate checking and data cleaning when importing subscribers
  • Remove quotes (if values in CSV were wrapped in quotes)
  • Campaigns will now send via CRON if CRON has been set up. If CRON is not set up, a message below the sending button will recommend user to set it up.
  • If CRON is not set up, campaigns can still be sent
  • 'Schedule this campaign?' button will be hidden from your client if CRON is not set up
  • Total recipients will be displayed live as you select lists to send to on campaign sending page
  • If the total recipients you're trying to send exceeds your SES daily limit, the send button will be disabled
  • If your SES quota is 200 and you try to send a campaign, user will be prompted to request for production access
  • If sending campaign to multiple lists, Sendy will check for email duplicates between lists to prevent sending to a recipient more than once
  • Trim whitespace from email when unsubscribing even though unsubscribe links already have whitespace trimmed when sending out a campaign
  • Unsubscribing will not unsubscribe from all brands but will instead unsubscribe from all lists if "All lists" is selected under unsubscribe settings
  • Form validation across the app
  • Display missing dollar sign when editing a brand with the currency not set
  • Fixed "From email" from disappearing when saving a campaign while logging in as a client
  • Eliminate possibility of client changing URL to access reports or subscribers from other brands
  • Sendy now handles SNS subscription confirmation for bounces and complaints automatically, there's no need to click a link to confirm an SNS subscription
  • CSV export now omits the last extra empty column
  • Fixed scheduled emails not respecting timezone in some occasions
  • Many other fixes & enhancements


  • You can now export subscriber segments from a report! Eg. export CSV of subscribers who clicked, opened, unsubscribed, bounced, marked as spam or subscribers from any country
  • Sendy now handles complaints. When a user marks your email as spam, their email will be flagged so no future emails will be sent to them. To enable complaints, please complete Step 8 in the Get Started Guide.
  • Able to view (and filter) subscribers who marked your email as spam in subscriber lists (you can export them as well)
  • Editing of "From email" is now disabled for your clients to prevent them from changing it to another address that has not been verified at Amazon SES
  • Changed displayed currency in brand editing page to what's selected as your PayPal currency
  • Set brand's favicon URL to use https and changed default favicon image
  • Trimmed whitespace of emails in unsubscribe links so that unsubscribes won't break
  • Fixed "adding of subscribers per line" not checking for duplicates
  • Fixed bug with incorrect unsubscribe numbers/percentage in report when "unsubscribe from all lists" option is selected in list settings
  • "Last 10 opened" in reports now show unique subscribers no matter how many times they open
  • Tweaked timezone function for timezone drop down selection when scheduling campaigns
  • Decode special characters in links pulled from the database when redirecting users to the actual URL
  • Fixed scheduled emails not respecting timezone
  • CSV export now omits the last extra empty column


  • You can now duplicate campaigns from any brand to any brand
  • Added "Resume" button to resume sending of campaign if sending stopped for some reason (eg. due to server timeout especially on shared servers)
  • If you chose Double Opt-In as your List Type, you can now set a custom URL for the final confirmation page (after user clicks the confirmation link)
  • Subscribes & unsubscribe scripts (via form or API) now handles invalid email addresses
  • Installation now checks for existing table name conflicts with Sendy instead of checking for an empty database
  • Removed allow_url_fopen requirement


  • You can now set list settings for subscribes (double opt in, signup success URL, send email upon successful signup) and unsubscribes (option to unsubscribe from all list, unsubscribe confirmation URL, send email upon user unsubscribe)
  • Added filter tabs in subscriber pages, you can now filter subscribers by all, active, unconfirmed, unsubscribed and bounced
  • Ability to export subscribers as CSV according to their status (eg. all, active, unconfirmed, unsubscribed, bounced)
  • Added icons to sidebar menu
  • Added Amazon SES Quota sidebar to edit-brand.php, new-brand.php and settings.php
  • Unsubscribe from all lists by default (can be changed in the new list settings)
  • Installation file now checks for server compatibility
  • Remove attempt to turn allow_url_fopen on and turn errors off


  • You can now schedule emails to send at a later time!
  • Added subscribe form code in individual list pages
  • Clicking on individual user launches a modal window that shows opens and clicks history
  • Added subscribe & unsubscribe API based on HTTP POST
  • Added "Last 10 Opened" in reports
  • Check for new versions of Sendy every 24 hours


  • Added timeline graph to subscribers view so that you can see subscriptions over time
  • Users can create login password for brand owners, edit currency, delivery fee and cost per recipient
  • Enable individual brand owners to login with their account credentials, to manage their own subscribers and send newsletters at a fee set by you
  • Brand owners will be required to pay for campaign via PayPal before campaign is sent if you've set a delivery fee and cost per recipient
  • You can now set a PayPal account email address in Settings
  • Removed "on" when displaying date
  • More organized Settings page
  • Display API & license key in Settings
  • Exclude bounced emails from opens, clicks and unsubscribes percentage calculation
  • More helpful error message for database error
  • Your company name will now be displayed in login page (at top left)
  • Sendy will now check for new versions and display in footer if new versions are available
  • Display multi-select list by name ASC
  • Return error if user logs in with an empty email or password


  • Tweaked method of sending script running in the background thus improving email sending reliability


  • Prevent timeout when sending
  • htaccess fix for GoDaddy servers
  • Improved loading performance for report charts and graphs
  • Added WYSIWYG editor with option to turn it ON or OFF per campaign
  • Fixed some alignment problems with newsletter composing layout

How to update Sendy?

  1. Unzip the downloaded zip
  2. Transfer config.php from the /includes/ folder in your current Sendy installation to the /includes/ folder in the new build you've just unzipped
  3. Transfer any language files (except English) from your current Sendy installation to the /locale/ folder in the new build you've just unzipped
  4. Delete the /uploads/ folder from the new build in order to keep your current /uploads/ folder contents intact on your server
  5. Delete the .htaccess file from the new build if you've previously made any modifications to it on the server
  6. Upload all files from the new build into your Sendy installation directory replacing all files

Sendy license

By downloading and using Sendy, you agree to Sendy's End User License Agreement.

Join our newsletter

We send occasional emails with an opt-out link.
See our privacy policy.