MailWizard for Bicrypto 6.1.0

30 July 2026

This release has upgrade notes. Read them before updating — they describe behaviour changes that need your attention.

CRITICAL FIXESCAMPAIGNSTEMPLATESSECURITYPRIVACYBREAKINGSENDINGAPPEARANCE

MailWizard v6.1.0

Release Date: July 30, 2026 Tags: CRITICAL FIXES, CAMPAIGNS, TEMPLATES, SECURITY, PRIVACY, BREAKING, SENDING, APPEARANCE

Overview

Version 6.1.0 fixes a create flow that discarded the two things it was given. Designing an email and saving it stored an empty body; building a campaign and choosing recipients stored no recipients. Both reported success, so a campaign could be activated and then quietly deliver nothing — or deliver an empty email to everybody.

It also fixes a sending limit that only ever counted successful sends. With the mail provider down nothing counted, so one send run walked the whole recipient list, marked every address failed and closed the campaign as Completed — and a Completed campaign has all four controls greyed out, so there was no way back.

One change to plan for before you update: campaign recipient lists are now size-checked when they are saved, and a large one is refused. Read Upgrade Notes first if you run campaigns with more than a couple of dozen recipients — it affects editing an existing campaign as well as creating a new one.

Requires Core v6.5.8 or later. No database migration.

Update Instructions

pnpm updator

Then restart the backend so the campaign cron picks up the new build.

After updating, check any template you created with the visual editor. If its body was saved empty by the old create flow, open it and save again — editing a template always persisted content correctly, so one save repairs it.


Upgrade Notes

A campaign with a large recipient list can no longer be saved

Recipient lists are now size-checked, and the limit is 10,000 characters of stored recipient data. Over that, saving fails with "Targets must be no more than 10000 characters long." and the campaign is neither created nor updated. There was no limit before.

  • How many recipients that is: it depends on how they were added, because each recipient is stored with the profile details the picker handed over. At best it is about 50. Recipients ticked one at a time in the Add Targets browse list carry their full profile — role, verification flags, sign-in dates — at roughly 650 characters each, so those lists are refused at around 15 recipients.
  • Applies to editing too: the campaign editor re-sends the entire recipient list on every save, so an existing campaign that already holds a long list can no longer be saved at all — not even to correct a typo in its name. The recipients already stored keep sending; only saving is blocked.

Changed

  • Changed editing a campaign to apply the same speed and template rules as creating one. A sending speed below 1, or one that is not a whole number, is refused with a message saying so, and a template that has since been deleted is reported as not found. Editing previously checked nothing at all, so an edit could reintroduce exactly what creation refuses — and a speed of 0 leaves a campaign Active and sending nothing forever. Saving an edit can therefore now fail where it used to succeed; only these values are affected, and a normal edit saves as before.
  • Changed MailWizard's admin screens to follow the site theme. The campaign list, campaign detail, recipient picker and template screens were drawn with fixed colours that ignored the active theme and your site's own palette, so this is a visible change on every one of them.
    • Progress bars: the track behind the bar was a fixed light grey and stayed light in dark mode — a pale band across a dark campaign list. Both the campaign-list and campaign-detail bars now follow the theme, and the fill uses your site's primary colour instead of a fixed purple.
    • Status badges: a Paused campaign now shows an amber badge instead of a grey one, and a Stopped campaign a grey badge instead of a red one. Stopping is a deliberate operator action, not a failure, and red overstated it; amber for Paused is what every other paused thing in the platform uses. Pending, Active, Completed and Cancelled are unchanged.
    • Template links: the link to a campaign's template was fixed purple; it now uses the primary colour.
    • Activate and Pause buttons: fixed green and amber, now the platform's success and warning colours, so they match the buttons everywhere else in the admin.
    • Borders, row hovers and secondary text: across the recipient picker, recipient cards and the template screens, all now theme colours rather than a fixed grey pair.

Fixed

The visual editor's design was thrown away on save

An operator built an email, clicked save, saw "Template created successfully", and got an empty template. Every campaign using it delivered an empty email to every recipient.

  • Fixed so that the design and its content are saved. They remain optional, because creating a placeholder and designing it afterwards is a real way to work — an empty template is now only the result of designing nothing.

Creating a campaign discarded its recipient list

The campaign was stored with no recipients. It was skipped on every send run, and reopening it showed an empty recipient list — the operator's entire selection gone, after a success message. The campaign looked identical to a working one.

  • Fixed so that recipients are checked and stored at creation. Editing a campaign always saved them correctly, which is why saving a second time appeared to "fix" it.

A mail provider outage burned through the entire recipient list in one run

The sending-speed limit counted successful sends, not attempts. So when the mail provider was down nothing counted and the limit did not apply at all: a single send run walked the whole recipient list, marked every address Failed, and then set the campaign to Completed. Nothing anywhere retries a failed recipient, and a Completed campaign has Start, Pause, Stop and Cancel all disabled — so the operator could not reset it from the interface. One outage really did destroy the list.

  • Fixed so that the speed limit counts attempts. An outage now costs at most one run's worth of recipients, and everyone it did not reach stays Pending for the next run.
  • New — sending stops for the rest of the run after five failures in a row: a dead or rate-limiting mail provider is no longer handed the whole audience one address at a time. Bad addresses are scattered through a list; five consecutive failures are a provider that is down or throttling you, and continuing only converts pending recipients into failed ones. The recipients that run never reached stay Pending, the next run picks up where it stopped once the provider is back, and the sending log records why the run stopped, so the outage is visible rather than silent.

Creating a campaign or template led to a broken page

After creating a campaign the admin was redirected to a page that did not exist.

  • Fixed so that creating a campaign, a template or an import now lands on the record that was just created.

A finished campaign displayed 0% progress

After every email had gone out, the campaign list showed a 0% progress bar, the campaign page showed 0 completed and all recipients pending, and every recipient was badged "Pending". An operator reading that would reasonably conclude sending was broken and re-run a completed campaign.

  • Two vocabularies had been confused. A campaign moves through Pending / Active / Paused / Stopped / Completed / Cancelled; a recipient only ever moves Pending → Sent or Pending → Failed. The screens were counting a recipient state that does not exist, and the recipient filter offered five campaign states that could never match.
  • Fixed so that progress is accurate, and it now reports delivered and failed separately — "100% done, a third of it failed" is not a successful campaign, and a single percentage hid that.

One malformed campaign stopped sending for every campaign

A platform-wide sending outage from a single bad campaign, repeating on every run.

  • Fixed so that recipient lists are checked everywhere they are saved, and a bad one already stored no longer takes the whole run down — that campaign is paused, with the reason logged, and the rest continue.

Any logged-in user could list the operator's email templates

One admin screen required only a sign-in, with no permission attached — so any ordinary customer could read the list of your email templates. It was the only screen in the addon missing that check. It now requires the same permission as the full template list.

The campaign list leaked recipient addresses in demo mode

The campaign detail screen masked recipient emails; the campaign list showed them in full. Since the list is the first screen anyone opens, demo mode exposed exactly the data it exists to hide. Both now mask identically, and both still report the same recipient count so the progress column stays truthful.

Further fixes

  • Fixed stopping a campaign, which could fail with an error, or — worst — report success while leaving the campaign active and still sending. Stopping now always stops it.
  • Fixed a campaign with no recipients reporting itself Completed. A campaign saved with zero recipients was flipped to Completed on its first send run without sending anything, leaving it indistinguishable in the list from one that had genuinely delivered. An empty list is now stored as no recipients, logged as such, and the campaign is left in the state the operator put it in.
  • Fixed form mistakes not saying what is wrong. A blank template name or campaign subject produced "Internal Server Error"; required fields are now checked up front, with messages that name the field.
  • Fixed a campaign being created with a sending speed below 1, which would leave it active and sending nothing forever, or pointing at a template that does not exist.
  • Fixed bulk actions accepting an empty selection, which reported "0 campaigns deleted successfully" for an action that did nothing. They now refuse it.
  • Removed two dead controls that could only ever fail. Nothing in the interface used them.
  • Fixed recipients with no email address being handed to the mailer. They are marked as failed with an explanation instead.
  • Fixed the Design heading in the template list, which read a bare lowercase "design" in every language, because it asked for a label that did not exist and fell back to printing the label's own name. It now reads "Design", in the operator's language.