MailWizard for Bicrypto

The campaign email addon that lives inside the platform — drag-and-drop templates, reusable blocks, and campaigns sent to your own users by an hourly job on your own mail transport.

4 min readUpdated 3 August 2026mailwizard, email, campaigns, templates

MailWizard turns the platform's admin panel into a small bulk-email desk. You design an email in a drag-and-drop editor, pick recipients out of your own user list, and a background job sends the campaign at a rate you set. Everything runs inside your install and goes out over the same mail transport the platform already uses for password resets and KYC notices.

It is deliberately small. Knowing what it is not before you plan a campaign saves an unpleasant discovery half-way through one.

What it requires

MailWizard requires Bicrypto core and nothing else. No Ecosystem, no ScyllaDB, no extra service. What it does depend on is a working outbound mail configuration — the APP_EMAILER transport in .env. If password-reset emails do not arrive on your install, no campaign will either.

See Server requirements for the platform itself and Environment variables for the mail settings.

What it does

Templates

A drag-and-drop email builder. Design an email, export it as HTML, or import HTML you already have.

Blocks

Save one row of an email — a header, a footer, a signature — and drop it into any template afterwards.

Campaigns

A subject line, a template, a recipient list and a send rate. Start it and the send job works through the list.

Recipients come from the platform's own user table, picked one at a time in a browse dialog. There is no separate subscriber database, no import, and no list that exists apart from a campaign.

What it does not do

None of the following exists in the product, at any version. Marketing copy elsewhere — including the addon's own store listing and the platform's mega-menu description — mentions several of them. The code does not.

Not present What that means in practice
Open and click tracking No pixel, no link rewriting, no open or click rate anywhere. A finished campaign reports how many emails were handed to the mail server, not how many were read
Bounce and complaint handling Nothing reads a bounce mailbox or a provider webhook. A hard bounce looks the same as a temporary outage
Scheduling There is no send-at date or time. A campaign starts when you set it to Active, and the next hourly run picks it up
Segments, lists, tags The audience is whatever you tick in the recipient picker, stored on the campaign itself
Merge tags and personalisation The template's HTML is sent verbatim. %FIRSTNAME% stays %FIRSTNAME% in the delivered email
Per-campaign sender The From address and name come from .env and are the same for every campaign and every platform email
Unsubscribe links Campaign email does not pass through the platform's notification templating, so no unsubscribe URL is inserted and no notification preference is consulted
Automation, workflows, A/B testing Not implemented. There is one campaign type: send this email to these people

The unsubscribe gap is the one with legal weight. If you send marketing email in a jurisdiction that requires an opt-out, you must put the link into your template by hand, and you must honour it by hand — see Deliverability and compliance.

How a campaign actually sends

The whole sending mechanism is one hourly cron job.

  1. The job wakes once an hourprocessMailwizardCampaigns, registered under the mailwizard category at /admin/system/cron.

  2. It selects every campaign whose status is ACTIVE — nothing else is looked at. A campaign in any other state is invisible to it.

  3. For each one it walks the recipient list and sends to at most speed addresses, then stops and leaves the rest pending for the next hour.

  4. Each send is a direct call to your mail transport — not the platform's email queue. A recipient becomes SENT or FAILED on the spot.

  5. When no recipient is left pending, the campaign flips to COMPLETED.

So speed is an emails-per-hour budget, and it is the only throttle there is. 1,000 recipients at speed 10 is 100 hours — a bit over four days. The campaign form now shows that estimate; older builds did not, which is how people started week-long sends by accident.

The recipient ceiling

The recipient list is validated as a 10,000-character JSON string. Recipients ticked in the picker carry their whole user profile, so in practice a campaign saved from the admin screens holds roughly 15 recipients before saving is refused with "Targets must be no more than 10000 characters long."

This applies to editing as well as creating: an existing campaign holding a long list cannot be saved at all, not even to fix a typo in its name. Split a large audience across several campaigns, or write the list through the API endpoint that has no cap — both are covered in Building and sending a campaign.

Where it lives

Everything is under Admin → Extensions → Business Tools → Email Marketing, which lands on /admin/mailwizard/campaign. There are three screens — Campaigns, Templates, Blocks — and no user-facing pages at all. Your customers never see MailWizard; they only receive its email.

Start here

Install and enable

Activate the addon, seed its permissions, and prove the send job runs.

Building a campaign

Recipients, send rate, the lifecycle, and how to retry only what failed.

How sending works

The hourly job, the transport, failure handling and deliverability.

Troubleshooting

A campaign that says Active and sends nothing, and the eight reasons why.