{"id":"6a32c5a9231c7a5aa0239f4c","title":"2026 06 17 Build 701","path":"how-to/committee/release-notes/2026-06-17-build-701","contentMarkdown":"# 17-Jun-2026 — post-send workflow actions and server-side member bulk delete [#278](https://github.com/nbarrett/ngx-ramblers/issues/278)\n\n## [build 701](https://github.com/nbarrett/ngx-ramblers/actions/runs/27701786446) — [commit 9317e9c](https://github.com/nbarrett/ngx-ramblers/commit/9317e9ca807c00991fc2f92fad02251f62077e76)\n\n_____\n\nLets an email type act on its recipients after the send: an \"Expired\nMembership\" style workflow can disable (untick Approved Group Member) or\npermanently delete the members it has just emailed, and the bulk-delete path\nnow runs as a single server-side cascade. The composer warns clearly before\nsuch a send. Continues the email work in [#278](https://github.com/nbarrett/ngx-ramblers/issues/278).\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/27154aac-32c1-470c-a879-d0a29cf84cbb.jpeg)\n\n*When an email type will disable its recipients, one alert gathers the workflow warning and the step validation in a single box, with one Dismiss button.*\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/cd4cd157-f8d8-402b-9b73-3495c814cbec.png)\n\n*When an email type will delete its recipients, one alert gathers the workflow warning and the step validation in a single box, with one Dismiss button.*\n\n\n\n## What's new\n\n- Email types can carry post-send actions. After a successful batch send the\nemailed members are disabled (groupMember set to false) or bulk-deleted,\naccording to the notification config's postSendActions.\n- The composer shows one consolidated alert when the chosen email type will\ndisable or delete its recipients, with the count of affected members and a\nDismiss button. On the Recipients step the \"Before you can continue\"\nvalidation and any already-sent notice share that same alert instead of\nstacking as separate boxes.\n- Per-recipient send results carry a short note (\"Removed from group\",\n\"Deleted from database\", \"Password reset link generated\") so the Send step\nshows what happened to each member.\n- Member bulk delete (from Member Admin and from a delete-workflow send) now\nruns server-side as one cascade, replacing the client-side loop.\n\n## How it behaves\n\n- Post-send actions run only after the send completes and only on members who\nwere actually emailed. DISABLE_GROUP_MEMBER clears groupMember;\nBULK_DELETE_GROUP_MEMBER deletes the members and records the deletion.\n- The deletes/disables warning sits at the top of the composer and persists\nacross steps; it is dismissible. The Recipients-step blockers join the same\nbox while on that step.\n\n## Technical changes\n\n- New server controller member-bulk-delete.bulkDeleteMembersCascade: deletes\nthe members, writes deletedMember audit rows (deletedBy, membershipNumber),\nremoves their mailListAudit rows and any orphaned audit rows, and returns\nper-id deletion responses plus counts. Exposed at POST member/bulk-delete.\n- Client MemberService.bulkDelete posts member ids to that route; the\nmember-admin bulk delete uses it and the standalone client-side\nMemberBulkDeleteService is removed.\n- batch-transactional-send: applyPostSendActions (disable or cascade-delete\nemailed members) and annotateWorkflowActionNotes (per-recipient note) run\nafter recording the sends; BatchSendProgressEntry gains a note field.\n- email-composer: the post-send warning and the recipients validation render\nas a single email-composer-validation-summary, and the warning uses the\nstandard Dismiss button rather than a corner close icon.\n","contentHtml":"<h1>17-Jun-2026 — post-send workflow actions and server-side member bulk delete <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/278\">#278</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/27701786446\">build 701</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/9317e9ca807c00991fc2f92fad02251f62077e76\">commit 9317e9c</a></h2>\n<hr>\n<p>Lets an email type act on its recipients after the send: an &quot;Expired\nMembership&quot; style workflow can disable (untick Approved Group Member) or\npermanently delete the members it has just emailed, and the bulk-delete path\nnow runs as a single server-side cascade. The composer warns clearly before\nsuch a send. Continues the email work in <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/278\">#278</a>.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/27154aac-32c1-470c-a879-d0a29cf84cbb.jpeg\" alt=\"\"></p>\n<p><em>When an email type will disable its recipients, one alert gathers the workflow warning and the step validation in a single box, with one Dismiss button.</em></p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/cd4cd157-f8d8-402b-9b73-3495c814cbec.png\" alt=\"\"></p>\n<p><em>When an email type will delete its recipients, one alert gathers the workflow warning and the step validation in a single box, with one Dismiss button.</em></p>\n<h2>What&#39;s new</h2>\n<ul>\n<li>Email types can carry post-send actions. After a successful batch send the\nemailed members are disabled (groupMember set to false) or bulk-deleted,\naccording to the notification config&#39;s postSendActions.</li>\n<li>The composer shows one consolidated alert when the chosen email type will\ndisable or delete its recipients, with the count of affected members and a\nDismiss button. On the Recipients step the &quot;Before you can continue&quot;\nvalidation and any already-sent notice share that same alert instead of\nstacking as separate boxes.</li>\n<li>Per-recipient send results carry a short note (&quot;Removed from group&quot;,\n&quot;Deleted from database&quot;, &quot;Password reset link generated&quot;) so the Send step\nshows what happened to each member.</li>\n<li>Member bulk delete (from Member Admin and from a delete-workflow send) now\nruns server-side as one cascade, replacing the client-side loop.</li>\n</ul>\n<h2>How it behaves</h2>\n<ul>\n<li>Post-send actions run only after the send completes and only on members who\nwere actually emailed. DISABLE_GROUP_MEMBER clears groupMember;\nBULK_DELETE_GROUP_MEMBER deletes the members and records the deletion.</li>\n<li>The deletes/disables warning sits at the top of the composer and persists\nacross steps; it is dismissible. The Recipients-step blockers join the same\nbox while on that step.</li>\n</ul>\n<h2>Technical changes</h2>\n<ul>\n<li>New server controller member-bulk-delete.bulkDeleteMembersCascade: deletes\nthe members, writes deletedMember audit rows (deletedBy, membershipNumber),\nremoves their mailListAudit rows and any orphaned audit rows, and returns\nper-id deletion responses plus counts. Exposed at POST member/bulk-delete.</li>\n<li>Client MemberService.bulkDelete posts member ids to that route; the\nmember-admin bulk delete uses it and the standalone client-side\nMemberBulkDeleteService is removed.</li>\n<li>batch-transactional-send: applyPostSendActions (disable or cascade-delete\nemailed members) and annotateWorkflowActionNotes (per-recipient note) run\nafter recording the sends; BatchSendProgressEntry gains a note field.</li>\n<li>email-composer: the post-send warning and the recipients validation render\nas a single email-composer-validation-summary, and the warning uses the\nstandard Dismiss button rather than a corner close icon.</li>\n</ul>\n"}