{"id":"698c985b9aacab0271750a14","title":"2026 02 10","path":"how-to/committee/release-notes/2026-02-10","contentMarkdown":"# 10-Feb-2026 — Mail,cloudflare and Mail: 2 features [#82](https://github.com/nbarrett/ngx-ramblers/issues/82)\n\n## [build 477](https://github.com/nbarrett/ngx-ramblers/actions/runs/21909461813) — [commit a8e656d](https://github.com/nbarrett/ngx-ramblers/commit/a8e656d79fb90ea76a08d36daa546e7dd4c3d4d3)\n\n_____\n\nAdd automatic sending domain authentication that registers domains on\nBrevo, provisions DKIM and verification TXT records via Cloudflare DNS,\nand triggers Brevo domain verification. All operations are idempotent.\n\n### **mail**: Brevo email deliverability, template management, and sender workflow ([#82](https://github.com/nbarrett/ngx-ramblers/issues/82))\n\n# #82 — Brevo Email Deliverability, Template Management, and Sender Workflow\n## Email signoff and merge field rendering fixes\n- Fixed mail merge and sign-off rendering failures caused by Brevo's Froala editor silently reformatting merge field placeholders from `{{params.X.Y}}` to `{{ params.X.Y }}` (with spaces), which broke exact string matching during template substitution.\n- Added `sanitiseBrevoTemplate()` pipeline that strips Froala editor attributes (`fr-original-style`, `fr-original-class`, `contenteditable`, `data-placeholder`, zero-width spaces), collapses nested placeholder spans, and normalises merge field spacing before substitution.\n- Fixed `signoffNames()` returning undefined when notification directive is not available — now returns empty string.\n## Brevo template baseline and sync\n- Added clean, responsive local HTML email template baselines for core notification and account emails (forgot-password, membership-expiry, membership-expiry-warning, password-reset, ramblers-campaign, website-and-login-details, welcome-to-the-group).\n- Templates use proper MSO conditionals, responsive media queries, and clean merge field placeholders.\n- Local templates serve as seed sources for new environments — Brevo remains the authoritative editor for day-to-day template changes.\n- Added reusable local template path and reader utilities to centralise template file handling.\n## Brevo template push, diff, and snapshot\n- Added push-default-template endpoint to overwrite Brevo template content from local HTML files.\n- Added template-diff endpoint to compare Brevo template content against local baselines.\n- Added backend snapshot route to pull templates from Brevo into local baselines.\n- Added template seeding support so environment setup and Brevo template population are aligned.\n## Brevo template editor and diff UX\n- Replaced single Brevo edit button with dropdown offering Rich Text and HTML/Setup editor links.\n- Added colour-coded badge indicating whether the Brevo template matches the local default.\n## Notification configuration validation\n- Email configuration dropdown now shows issue count per config so administrators can quickly identify configs needing attention.\n- Warning banner on selected config lists all detected issues.\n- Brevo template and banner image selects highlight red when empty.\n- Sender and reply-to role selects validate against actual committee roles with inline error display.\n- Sign-off roles are individually validated with per-role warnings.\n## Send Emails UX improvements\n- Improved member selection grouping with visible group counts in the Send Emails flow.\n- Added Select All As Me in Sender, Replies and Sign-off to quickly set Sender, Reply To, and Sign-off roles to the logged-in user context.\n- Improved role resolution for Select All As Me, including better handling of vacant roles and safer fallback role selection.\n- Added defaults for missing member selection config values to avoid undefined month values.\n- Improved grouped member badge styling and readability in member dropdown headers.\n- Updated Brevo button and dropdown behaviour in mail settings for clearer interaction and state display.\n## Automatic template seeding for new environments\n- Added migration that seeds local templates into Brevo for new environments, checking each template individually by name before creating.\n- After seeding, automatically matches template IDs to notification configs by subject text (welcome-to-the-group maps to \"Welcome to The Group\", website-and-login-details maps to password reset and login configs, fully-automated-text-body is the default for all remaining configs).\n- Eliminates the need to manually link template IDs to email configurations after environment setup.\n## Environment setup and deployment\n- Added environment setup option to populate Brevo templates, defaulted to true when a Brevo API key is present.\n- Kept this capability aligned for local development setup workflows while remaining safe for non-local environments.\n- Backfilled existing data via migration so older configs behave consistently with new defaults.","contentHtml":"<h1>10-Feb-2026 — Mail,cloudflare and Mail: 2 features <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/82\">#82</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/21909461813\">build 477</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/a8e656d79fb90ea76a08d36daa546e7dd4c3d4d3\">commit a8e656d</a></h2>\n<hr>\n<p>Add automatic sending domain authentication that registers domains on\nBrevo, provisions DKIM and verification TXT records via Cloudflare DNS,\nand triggers Brevo domain verification. All operations are idempotent.</p>\n<h3><strong>mail</strong>: Brevo email deliverability, template management, and sender workflow (<a href=\"https://github.com/nbarrett/ngx-ramblers/issues/82\">#82</a>)</h3>\n<h1>#82 — Brevo Email Deliverability, Template Management, and Sender Workflow</h1>\n<h2>Email signoff and merge field rendering fixes</h2>\n<ul>\n<li>Fixed mail merge and sign-off rendering failures caused by Brevo&#39;s Froala editor silently reformatting merge field placeholders from <code>{{params.X.Y}}</code> to <code>{{ params.X.Y }}</code> (with spaces), which broke exact string matching during template substitution.</li>\n<li>Added <code>sanitiseBrevoTemplate()</code> pipeline that strips Froala editor attributes (<code>fr-original-style</code>, <code>fr-original-class</code>, <code>contenteditable</code>, <code>data-placeholder</code>, zero-width spaces), collapses nested placeholder spans, and normalises merge field spacing before substitution.</li>\n<li>Fixed <code>signoffNames()</code> returning undefined when notification directive is not available — now returns empty string.</li>\n</ul>\n<h2>Brevo template baseline and sync</h2>\n<ul>\n<li>Added clean, responsive local HTML email template baselines for core notification and account emails (forgot-password, membership-expiry, membership-expiry-warning, password-reset, ramblers-campaign, website-and-login-details, welcome-to-the-group).</li>\n<li>Templates use proper MSO conditionals, responsive media queries, and clean merge field placeholders.</li>\n<li>Local templates serve as seed sources for new environments — Brevo remains the authoritative editor for day-to-day template changes.</li>\n<li>Added reusable local template path and reader utilities to centralise template file handling.</li>\n</ul>\n<h2>Brevo template push, diff, and snapshot</h2>\n<ul>\n<li>Added push-default-template endpoint to overwrite Brevo template content from local HTML files.</li>\n<li>Added template-diff endpoint to compare Brevo template content against local baselines.</li>\n<li>Added backend snapshot route to pull templates from Brevo into local baselines.</li>\n<li>Added template seeding support so environment setup and Brevo template population are aligned.</li>\n</ul>\n<h2>Brevo template editor and diff UX</h2>\n<ul>\n<li>Replaced single Brevo edit button with dropdown offering Rich Text and HTML/Setup editor links.</li>\n<li>Added colour-coded badge indicating whether the Brevo template matches the local default.</li>\n</ul>\n<h2>Notification configuration validation</h2>\n<ul>\n<li>Email configuration dropdown now shows issue count per config so administrators can quickly identify configs needing attention.</li>\n<li>Warning banner on selected config lists all detected issues.</li>\n<li>Brevo template and banner image selects highlight red when empty.</li>\n<li>Sender and reply-to role selects validate against actual committee roles with inline error display.</li>\n<li>Sign-off roles are individually validated with per-role warnings.</li>\n</ul>\n<h2>Send Emails UX improvements</h2>\n<ul>\n<li>Improved member selection grouping with visible group counts in the Send Emails flow.</li>\n<li>Added Select All As Me in Sender, Replies and Sign-off to quickly set Sender, Reply To, and Sign-off roles to the logged-in user context.</li>\n<li>Improved role resolution for Select All As Me, including better handling of vacant roles and safer fallback role selection.</li>\n<li>Added defaults for missing member selection config values to avoid undefined month values.</li>\n<li>Improved grouped member badge styling and readability in member dropdown headers.</li>\n<li>Updated Brevo button and dropdown behaviour in mail settings for clearer interaction and state display.</li>\n</ul>\n<h2>Automatic template seeding for new environments</h2>\n<ul>\n<li>Added migration that seeds local templates into Brevo for new environments, checking each template individually by name before creating.</li>\n<li>After seeding, automatically matches template IDs to notification configs by subject text (welcome-to-the-group maps to &quot;Welcome to The Group&quot;, website-and-login-details maps to password reset and login configs, fully-automated-text-body is the default for all remaining configs).</li>\n<li>Eliminates the need to manually link template IDs to email configurations after environment setup.</li>\n</ul>\n<h2>Environment setup and deployment</h2>\n<ul>\n<li>Added environment setup option to populate Brevo templates, defaulted to true when a Brevo API key is present.</li>\n<li>Kept this capability aligned for local development setup workflows while remaining safe for non-local environments.</li>\n<li>Backfilled existing data via migration so older configs behave consistently with new defaults.</li>\n</ul>\n"}