π§ Quillrush Newsletter Studio for Sendy turns your WordPress dashboard into a full-blown newsletter creation studio for the Sendy + Amazon SES stack. Drag your latest posts into a beautiful responsive HTML email, pick the Sendy lists/segments to ship to, and send via your self-hosted Sendy installation, which forwards every message through Amazon SES. No HTML coding. No external SaaS. No paid tier.
β οΈ Requires a self-hosted Sendy install backed by Amazon SES. This plugin is the WordPress front-end β it does not replace Sendy or SES. If you donβt have Sendy + SES set up yet, see sendy.co and aws.amazon.com/ses.
β¨ Headline features
- π¨ Visual newsletter builder β drag posts in, see the rendered email update live.
- π¨ Two newsletter formats per campaign β The Roundup (subscriber-facing) and The Insider Brief (editorial pitch for media & partners).
- π Auto-fetched Sendy lists & segments β pulled live via the Sendy API, shown as checkboxes with active subscriber counts. Cached 10 minutes; one-click refresh.
- π§ Remembers your last selection β the lists you sent to last time are pre-checked next time.
- π Infinite-scroll post search β AJAX-loads posts in batches of 10 as you scroll.
- πΌοΈ Smart hero image β uses your uploaded banner if present, otherwise falls back to the first postβs featured image.
- π± Mobile-first responsive layout β 2 columns on desktop, single column on mobile (< 600px), auto-height cards.
- π
Three send modes β Save as Draft in Sendy, Send Immediately, or Schedule for a future date/time.
- π Timezone-aware scheduling β uses your WordPress timezone; shows current server time + zone next to the picker.
- β»οΈ Auto-recovery for overdue campaigns β if WP-Cron didnβt fire on time, overdue scheduled campaigns are auto-sent on next admin page-load.
- π οΈ Retry on failure β failed sends show the exact Sendy error + a one-click Retry Send button.
- βοΈ Optional cron trigger β after each send, optionally hit
scheduled.php?i=BRAND_ID on your Sendy host so queued campaigns process without a server cron.
- βοΈ Custom footer block β extra text/HTML above the footer in a highlighted box. Supports anchor tags + auto
nl2br.
- π Social footer icons β Instagram, LinkedIn, X (Twitter), YouTube.
- ποΈ Campaign history β every campaign stored as a
qrnss_campaign custom-post-type entry with Status / Scheduled For / Error columns.
- π WordPress-native security β nonces on every action,
manage_options capability checks, wp_safe_redirect() for all redirects.
π¨ The two newsletter formats
ποΈ The Roundup β visual hero + 2-column story grid for your subscribers. Uses the βCustom Footer Textβ highlighted box.
βοΈ The Insider Brief β personal greeting, lead paragraph, centered hero with featured image, βWhat Else Weβre Seeingβ 2-column grid, βWhy this mattersβ callout, βFor Media & Collaborationsβ CTA block, and a centered About Us block. Built for media pitches & partner updates. All copy editable from Settings β The Insider Brief β Template Texts.
Pick the format per-campaign on the Create Newsletter page (Design Settings β Newsletter Format). Header and dark footer (logo, social, copyright, unsubscribe) are shared across both formats.
π Full settings reference
π Sendy Connection Settings
- Sendy Installation URL β base URL of your Sendy install (e.g.
https://sendy.yourdomain.com/).
- API Key β from Sendy β Settings β Your API Key.
- Brand ID (Optional) β from Sendy β Settings β Your Brand β ID. Required by some Sendy versions and used for auto-fetching lists.
- Default From Name β pre-filled into every new campaign.
- Default From Email β pre-filled into every new campaign.
- Auto-Trigger Cron β checkbox. After sending, hit
<sendy-url>/scheduled.php?i=BRAND_ID so queued campaigns process without a system cron.
- Show Article Excerpt β checkbox. Insert a 20-word excerpt between the post title and the βRead Moreβ button.
π¨ Footer & Social Settings
- Footer Logo URL β logo shown in the dark footer band.
- Copyright Text β footer copyright line.
{year} is replaced with the current year.
- Custom Footer Text β textarea, HTML allowed. Shown in a highlighted box above the footer in The Roundup. Newlines β
<br> automatically.
- βRead More Articlesβ Link β optional link below the post grid.
- Instagram URL / LinkedIn URL / X (Twitter) URL / YouTube URL β social icons in footer.
βοΈ The Insider Brief β Template Texts (used only by The Insider Brief format)
- Greeting β e.g.
Hi [First Name],
- Intro Paragraph β lead paragraph above the hero story (HTML allowed).
- Hero Section Label β small label above the hero (e.g.
Hero Story).
- Grid Section Heading β e.g.
π What Else We're Seeing
- βWhy This Mattersβ Heading + Body
- Collaboration Heading + Body β e.g.
π© For Media & Collaborations + CTA bullets and contact info (HTML allowed).
- About Us Heading + Body β centered About block above the footer.
π
Send modes
- πΎ Save as Draft in Sendy β POSTs to
create-campaign.php with send_campaign=0. Campaign appears in your Sendy dashboard as a draft. WP logs status: draft.
- π Send Immediately β POSTs to
create-campaign.php with send_campaign=1. Sendy queues + dispatches via SES. WP logs status: sent. If Auto-Trigger Cron is on, also hits scheduled.php?i=BRAND_ID.
- β° Schedule β stored as a
qrnss_campaign post with status scheduled. WordPress registers a one-off wp_schedule_single_event for the chosen datetime. When the event fires, the plugin sends via Sendy. Datetime picker is timezone-aware and uses your WP timezone setting.
π Failure handling
Failed sends never silently disappear:
- β Red admin notice at the top of the Campaigns screen.
- π Exact Sendy error in the Error column.
- π One-click Retry Send button (CSRF-nonced).
- β»οΈ Auto-recovery β overdue scheduled campaigns automatically send on next admin page-load.
ποΈ Campaign history (CPT)
Every campaign is stored as a qrnss_campaign custom-post-type entry. Admin columns:
- Title β subject line.
- Status β
draft (grey), scheduled (yellow), sent (green), failed (red).
- Scheduled For β datetime if scheduled.
- Error β Sendy error message if the send failed.
π Sendy API endpoints used
All requests go straight to your own self-hosted Sendy installation at the URL you set in Settings. The plugin never talks to any third-party SaaS β Sendy itself fans out to Amazon SES from your host.
api/lists/get-lists.php β fetch lists for the Create Newsletter screen (cached 10 min). Sends: api_key, brand_id.
api/subscribers/active-subscriber-count.php β per-list subscriber counts. Sends: api_key, list_id.
api/campaigns/create.php β Save as Draft, Send Immediately, scheduled fire. Sends: api_key, from_name, from_email, reply_to, title, subject, html_text, plain_text, list_ids, brand_id, send_campaign.
scheduled.php (your Sendy host) β only when Auto-Trigger Cron is ticked. Sends: i=BRAND_ID query param.
π Requirements
- WordPress 5.8 or higher (tested up to 7.0).
- PHP 7.4 or higher.
- A reasonably recent self-hosted Sendy installation.
- Amazon SES configured inside Sendy (out of scope for this plugin).