0.18.0 (2026-10-28)
Features
- Add throttle for transactional emails and workflows (f228961)
- api: let headless senders point List-Unsubscribe at their own one-click link (50be3c9)
- let headless senders point List-Unsubscribe at their own one-click link (d5c5f89)
- Verify SES configuration sets on startup (2f3cb50)
Bug Fixes
- api: encode non-ASCII headers and attachment filenames (ea3e7ae)
- api: encode non-ASCII headers and attachment filenames (de90dae)
- api: honour data-plunk-one-click for headless sends only (6f9cebf)
- api: verify request origin on session-authenticated routes (00177cc)
- api: verify request origin on session-authenticated routes (6eacbfc)
- Cancel workflow executions and scheduled campaigns when a project is disabled (cf2d384)
- contacts: honour the status filter in select-all bulk actions (0fe3b07)
- contacts: honour the status filter in select-all bulk actions (d794c5a)
- Correctly end job if last step of workflow is delay (18f18c1)
- landing: Remove inbound attachment and threading claims (beac2e3)
- mcp: page through campaigns and templates with page/pageSize (e720913)
- mcp: page through campaigns and templates with page/pageSize (28e0aa4)
- mcp: read the bare array GET /segments returns in plunk_list_segments (3de3369)
- mcp: read the bare array GET /segments returns in plunk_list_segments (674c2f5)
- Only accept SNS messages from topics in our own AWS account (4c84f64)
- segments: filter by segment membership without loading members (5848c60)
- segments: filter by segment membership without loading members (d44788f)
- segments: scope referenced segments to the project (ce58df5)
- templates: only accept filters that keep the unsubscribe URL intact (6f2508c)
- templates: recognise spaced unsubscribe placeholders in the headless warning (3e7ee20)
- templates: recognise spaced unsubscribe variables in the headless warning (dd2c6c0)
- webhooks: ignore opens SES marks as automated (3c1af34)
- webhooks: ignore opens SES marks as automated (032b868), closes #531
- web: refetch project data once the active project is known (537d5a4)
- web: refetch project data once the active project is known (b7e1265)
- web: start from an empty cache after signing out (1097f0c)
- workflows: keep cancelled executions from resuming (189b907)
- workflows: keep cancelled executions from resuming (7792d6b)
- workflows: mark only the step that failed (2c11c81)
- workflows: mark only the step that failed (ee8db3f)
- workflows: resume a waiting step once (d0f5471)
- workflows: resume a waiting step once (9c333bb)
- workflows: treat a zero wait timeout as no limit (0ab8bf9)
- workflows: treat a zero wait timeout as no limit (006cc4c)
Performance Improvements
- contacts: serve the contact field list from Redis (627f7e9)
- contacts: serve the contact field list from Redis (af0007f)
Code Refactoring
- web: correct comments around the active project choice (df2f38b)
Documentation
- Add open tracking and workflow improvements to the changelog (1fe84b5)
- document data-plunk-one-click for sender-hosted one-click unsubscribe (77e85b8)
- tracking: explain how automatic opens are left out (9805c18), closes #531
- workflows: say what cancelling an execution stops (cf264fa)
- workflows: suggest the email event names workflows receive (bf6a6ef)
- workflows: suggest the email event names workflows receive (2eac0dd)