- Changed the field icons for campaigns, contacts and mailing lists (#509).
- Fixed the calculation of the pending recipient count for scheduled sendouts (#505).
- Fixed a bug in which pending sendouts did not have a status colour assigned (#507).
- Fixed a bug in which duplicating campaigns was not resetting the new campaign’s stats.
- The “from names and emails” setting now accepts environment variables (#503).
- Fixed the campaign status label on sendout preview pages.
- Fixed a bug in which the “delete draft” menu item could appear twice when editing a draft contact.
- Fixed the mailing lists view for draft contacts.
- Fixed the calculation of pending recipients to not include drafts.
- Fixed the sendout status colour indicators on sendout preview pages.
- Fixed the sendout status label on sendout preview pages.
- Improved French and German translations (#499).
- Added status colours to the “Status” column in element index pages.
- Campaign now requires Craft CMS 5.2.0 or later.
- Improved the status colours of element types.
- Improved the French translation (#493).
- Improved the German translation.
- Renamed the “Draft” sendout status to “Unsent”.
- Fixed a bug in which changing the subscription status of a draft contact multiple times before saving could fail (#494).
- Fixed status icons for draft campaigns and contacts.
- Fixed some styling issues.
- Contact avatars are no longer fetched from Gravatar. Instead, a user profile photo is used, if one exists, falling back to an SVG with a coloured gradient and initial.
- IP addresses are now logged in failed webhook requests from Postmark.
- Improved the number formatting of counts on element index pages.
- Updated the table attributes for all element types.
- Fixed the displayed contact count on segment index pages (#484).
- Fixed the missing draft status icons in sendouts.
- Added the ability to create campaign types without public URLs.
- Updated status colours to match those used in the control panel UI.
- Added the ability to segment contacts by campaign activity with a “never opened” operator (#482).
- At most one campaign activity rule can now be added to the contact condition in a segment.
- Added the ability to enforce spam prevention on front-end forms using Cloudflare Turnstile (#447).
- Added the
resave/campaigns
,resave/contacts
andresave/mailing-lists
console commands (#481).
- Fixed a bug in which contact subscriptions were failing when the referrer URL was longer than 255 characters (#473).
- Fixed a bug in which non-admin users without permissions to edit segments were not seeing content (#472).
- Fixed a bug in which the content for elements in non-primary sites was not migrated after upgrading from Campaign 2 (#470).
- Fixed the PHPDoc type for relation field values.
- Changed the order of fetched mailing lists to be more deterministic.
- Fixed the syntax used in one-click unsubscribe headers.
- Added one-click unsubscribe headers to sent emails (#467).
- Added a new one-click unsubscribe controller action.
- Added an
addOneClickUnsubscribeHeaders
config setting that determines whether one-click unsubscribe headers should be added to emails, defaulting totrue
.
{warning} “Legacy” and “Template” segments are no longer available will be deleted in this update. They should be replaced with regular segments before updating, or they will be lost.
- Added compatibility with Craft 5.
- Removed the “Legacy” and “Template” segment types. Use regular segments instead.
- Removed the
memoryLimit
config setting. - Removed the
memoryThreshold
config setting. - Removed the
timeLimit
config setting. - Removed the
timeThreshold
config setting. - Removed the
segmentType
property and function from the segment element query. - Removed the
SegmentHelper
class. - Removed the
SendoutHelper
class. - Removed the
Campaign::maxPowerLieutenant
method. - Removed the
SendoutElement::getPendingRecipients()
method. UseCampaign::$plugin->sendouts->getPendingRecipients()
instead. - Removed the
SendoutElement::getPendingRecipientCount()
method. UseCampaign::$plugin->sendouts->getPendingRecipientCount()
instead.