Opionions and Experiences on Sendy (Newsletter-Tool)?

Recommended Posts

Hi Guys

We are looking for an alternative to MailChimp for managing Newsletters, Subscribers, Campaigns, Lists etc... While searching for a new Tool I discovered Sendy. It looks like a decent Webapp/Newsletter-Tool to manage Newsletters, Lists, Subscribers, Campaigns etc... The Mails are sended with Amazon SES and it is way cheaper than Mailchimp. And it is also a self hosted Tool. 

Has someone some Experience and Opinions on Sendy in general and also in combination with ProcessWire (Module, Integration etc...)?

Do you also know other Solutions / Alternatives rather than Mailchimp?




Kind regards

  • Like 1

Share this post

Link to post
Share on other sites

Newsletter-Tools... the reason why I prefer Mailchimp, CampaignMonitor, and similar solutions:

I don't have to invest in servers, several IP addresses and maintenance.
I don't have to take care of blacklists, spam-prevention-configurations, routings and all that technical stuff.

Mailchimp & Co. do this for me. They want my money and they want me to be happy with their service.

Self-hosted solutions never worked for me, the companies I worked for, clients and most people I know who do newsletter-marketing.

Just my opinion. It may work really well for you.

  • Like 1

Share this post

Link to post
Share on other sites

I use the thunderbird email client with some plugins. Keeps everything in da house. My isp allows me to send out 1 email per second. More than enough for most small businesses.

Share this post

Link to post
Share on other sites

The module source is below.

Example usage: a checkbox on a contact form (using Form Builder) for the user to subscribe. 

It's used on https://ricardo-vargas.com/contact/


A method on _hooks.php. If you don't use Form Builder, use this code on your form page.

$forms->addHookBefore('FormBuilderProcessor::emailForm', function($event) {

    $processor = $event->object;

    if ($processor->formName == 'contact-form') {
        $formData = $event->arguments(1);

        $contact_name = $event->sanitizer->text($formData['contact_name']);
        $contact_name = substr($contact_name, 0, 30); // limit length further
        $contact_name = $event->sanitizer->emailHeader($contact_name);

        $contact_email = $event->sanitizer->text($formData['contact_email']);
        $contact_email = $event->sanitizer->emailHeader($contact_email);

        $processor->emailFrom = $contact_email; //reply to
        $processor->emailSubject = 'Message from '.$contact_name;

        $form = $event->object->getInputfieldsForm();
        $subscribe = $form->get('receive_updates');
        $list_id = $form->get('sendy_list_id')->attr('value');

        // check to see if they subscribed
        if ($subscribe->attr('checked')) {
            $success_url = '/contact';
            // $fail_url = '/contact?error=1';

            $ProcessSendyAPI = wire('modules')->getModule('ProcessSendyAPI');
            $ProcessSendyAPI->subscribeInSendy($contact_name, $contact_email, $list_id, $success_url);




<?php namespace ProcessWire;

class ProcessSendyAPI extends WireData implements Module, ConfigurableModule

    public static function getModuleInfo()
        return array(
            'title' => __('Process Sendy API'),
            'summary' => __('Handle API calls to a Sendy installation'),
            'author' => 'Sérgio Jardim',
            'version' => '001',
            'singular' => true,
            'autoload' => false,
            'icon' => 'envelope'

     * Data as used by the get/set functions
    protected $data = array();

     * Default configuration for module
    static public function getDefaultData() {

        return array(
            "sendy_api_key"          => '',
            "sendy_installation_url" => 'http://www.example.com/sendy'

     * Populate the default config data
    public function __construct() {
       foreach(self::getDefaultData() as $key => $value) {
               $this->$key = $value;

    public static function getModuleConfigInputfields(array $data)
        $data = array_merge(self::getDefaultData(), $data);

        $wrapper = new InputfieldWrapper();

        $f = wire('modules')->get('InputfieldText');
        $f->attr('name', 'sendy_api_key');
        $f->label = __('Sendy API Key', __FILE__);
        $f->description = __('Further instructions at  https://sendy.co/api', __FILE__);
        $f->notes = __('Get your key at http://your_sendy_installation/settings.', __FILE__);
         $f->value = $data['sendy_api_key'];

        $f = wire('modules')->get('InputfieldURL');
        $f->attr('name', 'sendy_installation_url');
        $f->label = __('Sendy instalation URL', __FILE__);
        $f->description = __('Your Sendy installation URL without a trailing slash', __FILE__);
        $f->notes = 'http://www.example.com/sendy';
        $f->value = $data['sendy_installation_url'];

        return $wrapper;

     * [subscribeUserOrGuest description]
     * @param  [type] $name        [description]
     * @param  [type] $email       [description]
     * @param  [type] $list_id     [description]
     * @param  [type] $success_url [description]
     * @param  [type] $fail_url    [description]
     * @return [type]              [description]
    public function subscribeInSendy($name, $email, $list_id, $success_url = null, $fail_url = null)
        $api_key = $this->data['sendy_api_key'];
        $sendy_url = $this->data['sendy_installation_url'];

        $postdata = http_build_query(
            'name' => $name,
            'email' => $email,
            'list' => $list_id,
            'boolean' => 'true' //set this to "true" so that you'll get a plain text response
        $opts = array('http' => array('method'  => 'POST', 'header'  => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata));
        $context  = stream_context_create($opts);
        $result = file_get_contents($sendy_url.'/subscribe', false, $context);

        //check result and redirect
        if($result) {
            $this->wire('log')->save("newsletter", 'A new user subscribed to the site mailing list: '.$email);
            if($success_url) {
                header("Location: $success_url");
        } else {
            $this->wire('log')->save("error", 'Error occurred on subscribing '.$email);
            if($fail_url) {
                header("Location: $fail_url");



  • Like 4

Share this post

Link to post
Share on other sites
1 hour ago, Nukro said:

Has someone some Experience and Opinions on Sendy in general and also in combination with ProcessWire (Module, Integration etc...)?

Sendy is great if your budget is small AND you need to send emails to a lot of people (10k+). Mailchimp is incredible, but the price for small business is not so good, especially when a dollar is almost 4 times your currency (Brazilian Real) 🙂

Just keep an eye on your AWS SES reputation dashboard, for complain and bounce rates.

  • Like 3

Share this post

Link to post
Share on other sites

We have a customer using Sendy for about 6 months now, no problems, about 100k+ newsletters sent.

Agree with @Sergio, keep an eye on SES dashboard as it's feedback is not visible in Sendy.

We integrated it with Processwire, in as much as we built simple pages(form) where end user adds images and text for a newsletter. This then gets sent to Sendy as HTML Email and a Campaign all ready to go. 

The concept was to simplify and shield user from complexities of making HTML EMails. We used the Zurb Foundation as the base templates for the HTML EMail code. With Processwire we then merge template and end user form input and send to Sendy via it's API.

The calculator on the Sendy.co web site is correct. The AWS SES cost to date for the 100k+ mails is about $USD 10.  The clients savings from previous provider for same qty of mailings is approx. $USD 1,000.

For a small business this really is significant. Actually, to any business.

However, companies like Mailchimp and others are providing a good service, pre built templates, email designs, wizards, security etc... which you are going to have to do yourself to some extent if you go the Sendy route.






  • Like 5

Share this post

Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By flod
      I'm working on a newsletter solution with WireMailSMTP and this Newsletter Tutorial.
      I only changed the lines 73 to 83 in newsletter.php, but there's a strange issue with the $subscribers array:
      $testMode = isset($_POST['test_email']) ? true : false; if ($testMode) { $subscribers = wire('input')->post('test_email'); if (strpos($subscribers, ',') !== false) { $subscribers = explode(',', $subscribers); } } else { $subscribers = $pages->find('template=subscriber'); $subscribers = $subscribers->explode('email'); } if (is_array($subscribers)) { $subscribers = array_map('trim', $subscribers); } $mail = wireMail(); $mail->sendSingle(true)->to('test@domain.de')->bcc($subscribers); $mail->from('xxx@domain.de'); $mail->subject($newsletter->title); $mail->bodyHTML($html); $numSent = $mail->send(); echo json_encode(count($subscribers)); $this->halt(); The email is sent to test@domain.de but not to bcc $subscribers. Errorlog: PHP Notice: Unknown: Invalid mailbox list: <> (errflg=3) in Unknown on line 0 I'm grateful for any advice.
    • By abdus
      A client of mine was asking for a solution to send newsletter mails to a list of subscribers. I looked around for a module, but couldn't find any. Then I saw a screenshot on this blog post about UIKit update, and decided to recreate it. Huge thanks to @ryan for the inspiration.
      The module uses regular pages for building HTML content. These pages can be used to create a fallback link in emails (i.e. "Use this link if you can't view email properly"). During render it injects $page->mailerMode, which can be used to change page output between text and HTML, or to show a simplified, email only HTML output.
      Main screen is just a list of items.

      Create page:

      Module configuration page:

      During installation, module creates a page under admin for storing items similar to FieldtypeRepeater.

      It also creates some fields for storing mail info

      More testing Sending in batches (with a script that runs in background and real-time progress log) Plans:
      Integration with Mailchimp (for subscriber lists) Automation (as a separate module for creating email content pages) I'm hoping to complete and release the module in the following days. I think these features should be enough for the beginning, but I'm open to suggestions.
    • By clsource
      I'm Just wondering if the Newsletter system is made in Processwire
      or they use other solutions. like mailchimp.
      I think should be a fun project making a newsletter system, that powers the processwire newsletter.
      Using systems like
      making a newsletter app becomes more straightfoward I think.

    • By vxda
      Hi guys, im searching for an easy to use solution of a newsletter for a PW.
      Preferably create pages as email addresses thru API for users.
      I dunno what would be easyer for me, (im not php magician) use some api ? or is there any other easy solutuion?
      If api then which one. and how to integrade it with PW so it will use my user base.