{"id":"6a1e360eb07a4c1534ca3221","title":"2026 05 31 Issue 127","path":"how-to/committee/release-notes/2026-05-31-issue-127","contentMarkdown":"# 31-May-2026 — persist scheduled-task history and fix Brevo daily-cap overflow release [ref #127](https://github.com/nbarrett/ngx-ramblers/issues/127)\n\n## [build 659](https://github.com/nbarrett/ngx-ramblers/actions/runs/26792597212) — [commit 0a6ef3f](https://github.com/nbarrett/ngx-ramblers/commit/0a6ef3fc8470d33da1c62127c0105a566577bd9d)\n\n_____\n\nFollow-on fixes to the Brevo daily-cap overflow release and scheduled-tasks\nadmin shipped in 6296d441.\n\n### Daily-cap queue and overflow release were failing\n- campaignQueueSummary set the campaign-completion endDate to end-of-today,\nwhich is in the future, so Brevo rejected the getEmailCampaigns call with\n\"End date should not be greater than current date\". This broke both the\nDaily-Cap Queue refresh and the overflow-release scheduled task (which calls\nreleasePendingCampaigns -> campaignQueueSummary). endDate is now \"now\".\n\n### NGX campaigns identified by stored id, not the Brevo tag\n- This account's Brevo plan rejects campaign tags (405), so createCampaign's\ntag-fallback strips the tag and campaigns come back untagged. The queue\nmatched NGX campaigns only by tag, so none were ever recognised and the\nrelease released nothing. createCampaign now records each created campaign id\nin the ngxBrevoCampaigns collection, and campaignQueueSummary matches on the\nstored id OR the tag (tag kept as a fallback). Plan-independent.\n\n### Scheduled-task execution history now survives restarts\n- Run history was held only in the in-memory task registry and was lost on\nevery server restart. Each run is now persisted to the scheduledTaskRuns\ncollection (capped at the most recent 20 per task) and reloaded when the task\nregisters at startup.\n\n### Scheduled-task failures surface the real error\n- The runner recorded only the SDK's generic \"HTTP request failed\"; it now\nextracts the Brevo HttpError body into the run message (shown in the run\nhistory Message column in the UI) and logs the full status, body and stack.\n\n### Stop logging the Brevo API key\n- brevo-config logged the full API key in plaintext on every config load; that\nline is removed.","contentHtml":"<h1>31-May-2026 — persist scheduled-task history and fix Brevo daily-cap overflow release <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/127\">ref #127</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/26792597212\">build 659</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/0a6ef3fc8470d33da1c62127c0105a566577bd9d\">commit 0a6ef3f</a></h2>\n<hr>\n<p>Follow-on fixes to the Brevo daily-cap overflow release and scheduled-tasks\nadmin shipped in 6296d441.</p>\n<h3>Daily-cap queue and overflow release were failing</h3>\n<ul>\n<li>campaignQueueSummary set the campaign-completion endDate to end-of-today,\nwhich is in the future, so Brevo rejected the getEmailCampaigns call with\n&quot;End date should not be greater than current date&quot;. This broke both the\nDaily-Cap Queue refresh and the overflow-release scheduled task (which calls\nreleasePendingCampaigns -&gt; campaignQueueSummary). endDate is now &quot;now&quot;.</li>\n</ul>\n<h3>NGX campaigns identified by stored id, not the Brevo tag</h3>\n<ul>\n<li>This account&#39;s Brevo plan rejects campaign tags (405), so createCampaign&#39;s\ntag-fallback strips the tag and campaigns come back untagged. The queue\nmatched NGX campaigns only by tag, so none were ever recognised and the\nrelease released nothing. createCampaign now records each created campaign id\nin the ngxBrevoCampaigns collection, and campaignQueueSummary matches on the\nstored id OR the tag (tag kept as a fallback). Plan-independent.</li>\n</ul>\n<h3>Scheduled-task execution history now survives restarts</h3>\n<ul>\n<li>Run history was held only in the in-memory task registry and was lost on\nevery server restart. Each run is now persisted to the scheduledTaskRuns\ncollection (capped at the most recent 20 per task) and reloaded when the task\nregisters at startup.</li>\n</ul>\n<h3>Scheduled-task failures surface the real error</h3>\n<ul>\n<li>The runner recorded only the SDK&#39;s generic &quot;HTTP request failed&quot;; it now\nextracts the Brevo HttpError body into the run message (shown in the run\nhistory Message column in the UI) and logs the full status, body and stack.</li>\n</ul>\n<h3>Stop logging the Brevo API key</h3>\n<ul>\n<li>brevo-config logged the full API key in plaintext on every config load; that\nline is removed.</li>\n</ul>\n"}