Forums Feature Requests Thread

[New] Admin deep-dive (commerce/config): Broadcast is all-or-nothing: no scheduling, no audience segmentation, no test/preview send

Patrick Bass · Jun 6 · 11 · 1 Locked
[High Priority] [New Feature] [Deployed to Production]
🚀 OP Jun 6, 2026 8:34pm

Area: Admin deep-dive (commerce/config) (audit p15b) · Surface: /admin/broadcast (AdminConfigController@sendBroadcast) · Dimension: competitor-gap · Severity: major

Intercom, Zendesk, Circle, Skool and Mighty all let an operator target a segment (e.g. trial users, members inactive 30 days, a specific plan tier or group) and schedule the send for a future time, plus send a test to themselves first. Our broadcast blasts the entire member base the instant the button is pressed, with no way to reach 'lapsed members' (a segment the dashboard already computes at AdminDashboardController.php:92-100) or to schedule a Monday-morning announcement on Friday. The synchronous foreach also blocks the request while inserting one notification row per user, which will time out on large tenants.

Evidence

AdminConfigController::sendBroadcast (AdminConfigController.php:1130-1235) fans out to a fixed query 'WHERE u.role >= 2' — every registered user, immediately, synchronously in a foreach loop. No scheduled_at, no segment filter, no preview. grep 'scheduled_at|recipient_segment|send_at' across Controllers/Models returned no broadcast hits. showBroadcast (line 1110) renders a plain subject/body/send_email form.

Suggested fix. Add audience presets (all / by role / by plan tier / inactive-N-days / a named forum or group) reusing the lapsed-member SQL already in the dashboard, a scheduled_at datetime that a worker drains, and a 'Send test to me' button. Move the fan-out into the existing EmailQueue/worker pattern instead of the inline loop.

Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.


Patrick Bass
@mobieus

🚀 Jun 7, 2026 12:31pm

Shipped and deployed to production. Commit 34575952ac.

Broadcast scheduling: scheduled_broadcasts table, audience filter (All/Joined in last N days/Role >=), datetime-local Send at input, cancel panel, cron worker process-scheduled-broadcasts.php.

Closed as: deployed.


Patrick Bass
@mobieus

Log in or register to reply to this thread.