Repository navigation
v0.28.0
MillionSend v0.28.0 dates every complaint by the day its email was sent, as SES dates its own complaint rate (#214).
Until now a complaint counted on the day it arrived, but it was divided by that day's sends. Recipients often report mail days later, so a late complaint about an earlier campaign could land on a quiet day. When it did:
- the Metrics card read "0.00% · 1 of 0";
- the 7-day rate read far above the rate of the mail it was about;
- a team sending cleanly could be warned, have its broadcasts slowed or, at worst, be paused.
There is one database migration; see "Upgrading a self-hosted instance".
Complaint rates (#214)
These apply to self-hosted instances too.
- Dated by send day. A complaint counts on the UTC day its email was sent. That covers the sending guardrail (warning and pause), the account score,
GET /deliverability, the Metrics page and the console. Hard bounces keep the day they arrive. - The pause acts on fresh mail. Thresholds and windows are unchanged.
- The pause (today and yesterday, UTC) now weighs complaints about those two days' mail.
- The 7-day warning weighs complaints about the last seven days' mail.
- A late complaint about older mail no longer starts or extends a pause.
- The regional breaker counts the same way. Its 24-hour window and its 7-day estimate count complaints about mail sent in the window, as its per-team holds already did.
- Free plan. A complaint counts in the shared Free record its email was sent under, even if the team has changed plan since.
- Wording.
- The banners, the
sending_pausedrefusal (API403, SMTP451), the warning and paused emails, and the console say "on mail sent over the last N days". - The paused banner now says "Sending is paused", since a pause refuses every send, not only broadcasts.
- The banners, the
Metrics page (#214)
- No rate without sends. On the hard-bounce and complaint cards, a day with no sends shows its count with no rate, such as "1 complaint · nothing sent to inboxes that report spam", instead of "0.00% · 1 of 0".
- Still arriving. Complaints keep coming for days after a send. So the complaint card draws its newest three days with sends lighter and marks them "complaints still arriving".
- The main chart stays a timeline. Its Complained line still counts complaints on the day they arrive, and its tooltip now says "by arrival date".
Upgrading a self-hosted instance
This release has a database migration, unlike v0.27.0.
- Upgrade:
docker compose pull, thendocker compose run --rm --no-deps millionsend migrate, thendocker compose up -d. On Kubernetes, upgrade with--version 0.28.0. The migration also runs on start if you skip the separate step. It only reads the last 31 days of complaints, so it is quick even on a large instance. - Migration
0066moves each complaint recorded in the last 31 days from the day it arrived to its email's send day.- A team's total stays the same and a complaint only moves earlier, so a team's standing can only improve.
- A complaint keeps its day if its stored payload was already stripped or its email already purged.
- The shared Free records are not moved. Their older entries age out of the 7-day window within a week.
- Rolling back to v0.27.0 needs no extra step. v0.27.0 ignores the new event field, and moved complaints stay on their send day.
- MX on a separate host (
deploy/mx/docker-compose.yml): nothing it does changes in this release. To keep it on the app's version, setMILLIONSEND_TAG=0.28.0there once the app runs this release, then pull and restart it.
Coming from v0.26.x? Also read the v0.27.0 notes for its content-monitor change. It has no migrations and no configuration changes.
Coming from v0.24.x or earlier? Read the v0.25.0 notes first. That release adds migrations 0063–0065; run them before up -d with docker compose run --rm --no-deps millionsend migrate.