# 17-Jun-2026 — post-send workflow actions and server-side member bulk delete [#278](https://github.com/nbarrett/ngx-ramblers/issues/278)

## [build 701](https://github.com/nbarrett/ngx-ramblers/actions/runs/27701786446) — [commit 9317e9c](https://github.com/nbarrett/ngx-ramblers/commit/9317e9ca807c00991fc2f92fad02251f62077e76)

_____

Lets an email type act on its recipients after the send: an "Expired
Membership" style workflow can disable (untick Approved Group Member) or
permanently delete the members it has just emailed, and the bulk-delete path
now runs as a single server-side cascade. The composer warns clearly before
such a send. Continues the email work in [#278](https://github.com/nbarrett/ngx-ramblers/issues/278).

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/27154aac-32c1-470c-a879-d0a29cf84cbb.jpeg)

*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.*

![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/cd4cd157-f8d8-402b-9b73-3495c814cbec.png)

*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.*



## What's new

- Email types can carry post-send actions. After a successful batch send the
emailed members are disabled (groupMember set to false) or bulk-deleted,
according to the notification config's postSendActions.
- The composer shows one consolidated alert when the chosen email type will
disable or delete its recipients, with the count of affected members and a
Dismiss button. On the Recipients step the "Before you can continue"
validation and any already-sent notice share that same alert instead of
stacking as separate boxes.
- Per-recipient send results carry a short note ("Removed from group",
"Deleted from database", "Password reset link generated") so the Send step
shows what happened to each member.
- Member bulk delete (from Member Admin and from a delete-workflow send) now
runs server-side as one cascade, replacing the client-side loop.

## How it behaves

- Post-send actions run only after the send completes and only on members who
were actually emailed. DISABLE_GROUP_MEMBER clears groupMember;
BULK_DELETE_GROUP_MEMBER deletes the members and records the deletion.
- The deletes/disables warning sits at the top of the composer and persists
across steps; it is dismissible. The Recipients-step blockers join the same
box while on that step.

## Technical changes

- New server controller member-bulk-delete.bulkDeleteMembersCascade: deletes
the members, writes deletedMember audit rows (deletedBy, membershipNumber),
removes their mailListAudit rows and any orphaned audit rows, and returns
per-id deletion responses plus counts. Exposed at POST member/bulk-delete.
- Client MemberService.bulkDelete posts member ids to that route; the
member-admin bulk delete uses it and the standalone client-side
MemberBulkDeleteService is removed.
- batch-transactional-send: applyPostSendActions (disable or cascade-delete
emailed members) and annotateWorkflowActionNotes (per-recipient note) run
after recording the sends; BatchSendProgressEntry gains a note field.
- email-composer: the post-send warning and the recipients validation render
as a single email-composer-validation-summary, and the warning uses the
standard Dismiss button rather than a corner close icon.
