{"id":"6a0c2c55e106e39a0269fb4e","title":"2026 05 19","path":"how-to/committee/release-notes/2026-05-19","contentMarkdown":"# 19-May-2026 — recipient send history and single-member mode [ref: #275](https://github.com/nbarrett/ngx-ramblers/issues/275)\n\n## [build 649](https://github.com/nbarrett/ngx-ramblers/actions/runs/26087507109) — [commit f9744c2](https://github.com/nbarrett/ngx-ramblers/commit/f9744c2603ba788063e6a3554a085c26798c063d)\n\n_____\n\n## In plain English\n\nWhen you send one of the automatic emails - for example the membership expiry warning - the composer remembers who has already been sent that same email and leaves them out, so re-running a send only reaches people who have not had it yet. Nobody is dropped silently: the composer tells you how many were left out, lets you see exactly who, and lets you send to them again if you really mean to.\n\n### Members already sent are left out\n\nIn this example the membership expiry warning is being sent to everyone with an email address. Six members had already received it on 13 June, so they are left out automatically and the recipient count is 354 rather than the full 360. A notice explains how many were excluded and when, and **Show who** lists exactly which members they are and the date each was last sent it. With the box left unticked, the email only reaches people who have not already had it.\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/ddc0458e-cf45-4f4b-98f5-5b98a66325e7.jpeg)\n\n*With Re-send unticked, members who already received this email are left out - the notice and Show who list name them, and the count is 354 of 360.*\n\n### Send to them again if you mean to\n\nIf you deliberately want the already-sent members included - for example you have revised the email and want everyone to get the new version - tick **Re-send to members already sent this email**. They are added back, the notice changes to say they are being re-sent, and the count returns to the full 360.\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/8d4cdcab-326b-40e9-bb74-67a8b4582a56.jpeg)\n\n*With Re-send ticked, the six already-sent members are added back in and the count returns to 360.*\n\n### When an email type deletes its recipients\n\nA few email types are set up to remove members after the email goes out - for example a final membership-expiry email that clears lapsed members from the database. When you choose one of these, the composer shows a clear warning at both the Recipients and Send steps, so it can never happen by accident. The Send step spells out exactly how many members will be permanently removed, and that it cannot be undone:\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/14556d7e-51a6-426e-94ba-81a788cb5deb.jpeg)\n\n*The Send step names the exact number of members that will be permanently removed - here 360 - and warns that it cannot be undone.*\n\n## The technical detail\n\nFollow-up work on the email composer for #275.\n\n## Recipient send history and de-duplication\n\n- New `memberEmailSends` collection records every successful member\nsend, tagged with the notification config used, exposed through a new\n`/api/database/member-email-sends` endpoint.\n\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/fd89da9c-0f70-48b7-92c6-3845b313d166.jpeg)\n\n- The recipient picker no longer auto-selects members who have already\nreceived the selected email type. They stay selectable and are\nlabelled with the date they were last sent it, so an admin can still\nre-pick them deliberately. This applies to every email type, not only\n\"Welcome to The Group\".\n\n## Single-member mode\n\n- Opening the composer from a member's \"Send email\" action now shows a\ndedicated single-member panel naming the recipient, instead of the\nrecipient-mode and pre-filter controls that do not apply to a\none-person send. A \"choose recipients\" link reopens the full picker,\nand \"Start a new email\" clears the mode.\n\n## Recipient selection\n\n- \"Missing from bulk load\" selection compares each member's last\nbulk-load date against the email type's months-in-past, so a 2-month\nwarning config and a 3-month expiry config select different members.\n- The admin composer reads members through a new admin-only\n`privilegedFields()` set (adding membershipNumber, memberStatus,\nmemberTerm and updatedDate) rather than widening the fields served to\nevery authenticated member.\n- The recipient-mode and \"Choose members from\" radios are hidden unless\nthe \"All with email\" pre-filter is active, removing clutter from\nconfig-driven sends.\n- The \"Recipients chosen\" summary now sits below the member list.\n\n## Bulk deletion safety\n\n- When the selected email type is configured to delete its recipients,\nthe Recipients and Send steps show a clear warning naming how many\nmembers will be permanently removed.\n\n## Composer fixes and UI\n\n- The branded/unbranded toggle no longer leaves the email-type section\nempty.\n- The unbranded sender-role alert shows the selected role's description.\n- Fixed a crash when articleBlocks was undefined.\n- Forwarded-email paste appends to the body instead of replacing it.\n- The collapsed \"group members\" fieldset shows a hint, and \"Recipients\nfor this send\" is collapsible.\n- Recipient badges distinguish \"Already saved\" from \"Will be saved for\nre-use\".\n- \"Send email\" on the member-admin row menu opens the composer with that\nmember pre-selected.\n- \"Select All As Me\" now sets the sign-off to the chosen role only,\nrather than every committee role the user holds.\n- Events show a divider between them by default, matching the divider\nbetween articles, with even spacing either side.\n- The placeholder title for an event awaiting details shows the event\ntype in title case.\n- Button hierarchy: solid yellow is reserved for wizard navigation;\nutility buttons use a new quiet style.","contentHtml":"<h1>19-May-2026 — recipient send history and single-member mode <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/275\">ref: #275</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/26087507109\">build 649</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/f9744c2603ba788063e6a3554a085c26798c063d\">commit f9744c2</a></h2>\n<hr>\n<h2>In plain English</h2>\n<p>When you send one of the automatic emails - for example the membership expiry warning - the composer remembers who has already been sent that same email and leaves them out, so re-running a send only reaches people who have not had it yet. Nobody is dropped silently: the composer tells you how many were left out, lets you see exactly who, and lets you send to them again if you really mean to.</p>\n<h3>Members already sent are left out</h3>\n<p>In this example the membership expiry warning is being sent to everyone with an email address. Six members had already received it on 13 June, so they are left out automatically and the recipient count is 354 rather than the full 360. A notice explains how many were excluded and when, and <strong>Show who</strong> lists exactly which members they are and the date each was last sent it. With the box left unticked, the email only reaches people who have not already had it.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/ddc0458e-cf45-4f4b-98f5-5b98a66325e7.jpeg\" alt=\"\"></p>\n<p><em>With Re-send unticked, members who already received this email are left out - the notice and Show who list name them, and the count is 354 of 360.</em></p>\n<h3>Send to them again if you mean to</h3>\n<p>If you deliberately want the already-sent members included - for example you have revised the email and want everyone to get the new version - tick <strong>Re-send to members already sent this email</strong>. They are added back, the notice changes to say they are being re-sent, and the count returns to the full 360.</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/8d4cdcab-326b-40e9-bb74-67a8b4582a56.jpeg\" alt=\"\"></p>\n<p><em>With Re-send ticked, the six already-sent members are added back in and the count returns to 360.</em></p>\n<h3>When an email type deletes its recipients</h3>\n<p>A few email types are set up to remove members after the email goes out - for example a final membership-expiry email that clears lapsed members from the database. When you choose one of these, the composer shows a clear warning at both the Recipients and Send steps, so it can never happen by accident. The Send step spells out exactly how many members will be permanently removed, and that it cannot be undone:</p>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/14556d7e-51a6-426e-94ba-81a788cb5deb.jpeg\" alt=\"\"></p>\n<p><em>The Send step names the exact number of members that will be permanently removed - here 360 - and warns that it cannot be undone.</em></p>\n<h2>The technical detail</h2>\n<p>Follow-up work on the email composer for #275.</p>\n<h2>Recipient send history and de-duplication</h2>\n<ul>\n<li>New <code>memberEmailSends</code> collection records every successful member\nsend, tagged with the notification config used, exposed through a new\n<code>/api/database/member-email-sends</code> endpoint.</li>\n</ul>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/fd89da9c-0f70-48b7-92c6-3845b313d166.jpeg\" alt=\"\"></p>\n<ul>\n<li>The recipient picker no longer auto-selects members who have already\nreceived the selected email type. They stay selectable and are\nlabelled with the date they were last sent it, so an admin can still\nre-pick them deliberately. This applies to every email type, not only\n&quot;Welcome to The Group&quot;.</li>\n</ul>\n<h2>Single-member mode</h2>\n<ul>\n<li>Opening the composer from a member&#39;s &quot;Send email&quot; action now shows a\ndedicated single-member panel naming the recipient, instead of the\nrecipient-mode and pre-filter controls that do not apply to a\none-person send. A &quot;choose recipients&quot; link reopens the full picker,\nand &quot;Start a new email&quot; clears the mode.</li>\n</ul>\n<h2>Recipient selection</h2>\n<ul>\n<li>&quot;Missing from bulk load&quot; selection compares each member&#39;s last\nbulk-load date against the email type&#39;s months-in-past, so a 2-month\nwarning config and a 3-month expiry config select different members.</li>\n<li>The admin composer reads members through a new admin-only\n<code>privilegedFields()</code> set (adding membershipNumber, memberStatus,\nmemberTerm and updatedDate) rather than widening the fields served to\nevery authenticated member.</li>\n<li>The recipient-mode and &quot;Choose members from&quot; radios are hidden unless\nthe &quot;All with email&quot; pre-filter is active, removing clutter from\nconfig-driven sends.</li>\n<li>The &quot;Recipients chosen&quot; summary now sits below the member list.</li>\n</ul>\n<h2>Bulk deletion safety</h2>\n<ul>\n<li>When the selected email type is configured to delete its recipients,\nthe Recipients and Send steps show a clear warning naming how many\nmembers will be permanently removed.</li>\n</ul>\n<h2>Composer fixes and UI</h2>\n<ul>\n<li>The branded/unbranded toggle no longer leaves the email-type section\nempty.</li>\n<li>The unbranded sender-role alert shows the selected role&#39;s description.</li>\n<li>Fixed a crash when articleBlocks was undefined.</li>\n<li>Forwarded-email paste appends to the body instead of replacing it.</li>\n<li>The collapsed &quot;group members&quot; fieldset shows a hint, and &quot;Recipients\nfor this send&quot; is collapsible.</li>\n<li>Recipient badges distinguish &quot;Already saved&quot; from &quot;Will be saved for\nre-use&quot;.</li>\n<li>&quot;Send email&quot; on the member-admin row menu opens the composer with that\nmember pre-selected.</li>\n<li>&quot;Select All As Me&quot; now sets the sign-off to the chosen role only,\nrather than every committee role the user holds.</li>\n<li>Events show a divider between them by default, matching the divider\nbetween articles, with even spacing either side.</li>\n<li>The placeholder title for an event awaiting details shows the event\ntype in title case.</li>\n<li>Button hierarchy: solid yellow is reserved for wizard navigation;\nutility buttons use a new quiet style.</li>\n</ul>\n"}