Download latest version (v188.8.131.52)
If your license was purchased before July 31, 2018, use the form on the right to upgrade your license to version v4.x before you can download v184.108.40.206.
Upgrade to version 4.x for only $29
If your license was purchased or upgraded before July 31, 2018, enter your license key above to purchase an upgrade for your license so that you can download v220.127.116.11.
How to update Sendy?
- 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
💄 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_errorsat 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
use.fontawesome.comlinks to trackable links
- Changed line endings of import-csv.php and update-segments.php to
__autoloadfrom 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
silentwhen 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 http://html5shim.googlecode.com/svn/trunk/html5.js 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.
[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)
/ato 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
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)
/ato 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
Referrerdata! 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
GDPRtag (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.
https://website.com/sendy/unsubscribe/ Ppz8vWj7SEGkNPNdwpEV/GGD2HE9RdxDGwGSFsr5f/ tGZWW2nqU9cedja6aKsA
subscribeAPI not returning
Already subscribedif no
gdprparameter 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
gdprwhere you can set it to
trueif 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
ip2longto 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
[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></unsubscribe>tags in your ‘Thank you’ email as well as
<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
Campaigns > CreateAPI 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’
opt-in methodwhen 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
referrerdata 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.
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
%sthat converts into a full ‘re-subscribe’ URL. For example if you set an ‘Unsubscribe confirmation page’ URL for your list like
http://domain.com/unsubscribed/?resubscribe_url=%s, you can include a ‘Re-subscribe’ link in your page that uses the
resubscribe_urlGET 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 ‘class.html2text.inc’ dependency for ‘campaigns RSS feed’
- Removed ‘class.html2text.inc’ 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
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
%nnot 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.
- Added new
%nparameter 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.phpin 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_stringvalue 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 ten fold 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 sendy.co 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
- 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
- Security enhancements
- You can now pass 'Email' and 'ListID' data into your custom 'unsubscribe confirmation URL' using
%ltokens 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 jquery.min.map 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
<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
- 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.
- 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 IDfor 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
[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 18.104.22.168 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
$HTTP_RAW_POST_DATAreturns 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"
include_onceerror 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!
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.
<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
- Unzip the downloaded zip
/includes/folder in your current Sendy installation to the
/includes/folder in the new build you've just unzipped
- Transfer any language files (except English) from your current Sendy installation to the
/locale/folder in the new build you've just unzipped
- Delete the
/uploads/folder from the new build in order to keep your current
/uploads/folder contents intact on your server
- Delete the
.htaccessfile from the new build if you've previously made any modifications to it on the server
- Upload all files from the new build into your Sendy installation directory replacing all files
By downloading and using Sendy, you agree to Sendy's End User License Agreement.