08-Aug-2026 — persist Brevo deny events as local email blocks ref #354

build 818commit b05a667


What's new

When Brevo reports spam, a complaint, or an unsubscribe for a member, NGX now records that as a local email block and clears their mailing-list ticks, so the member admin view and outbound suppression match what Brevo will actually deliver. The first time that happens, consent writeback uses the same shared helper as the Team Emails work. Domain models and admin UI also use deny/denied language for channel suppression, with Brevo SDK field names mapped only at the API boundary.

Mail Settings → Blocks now lists every contact Brevo has globally denied for email, not only the transactional blocklist. Rows are enriched from campaign and transactional history so admins see the real reason, campaign subject, sender role, and event time - the same story as the member Brevo activity timeline. Existing denied contacts are backfilled via migration where audit rows exist, and on the next Blocks sync or unsubscribes cron for the rest.

On a campaign report, drilling into a stat (for example hard bounces) updates the URL so that view can be shared or bookmarked, and matched problem subscribers link through to their member admin record.

At a glance