
Pull requestsis:pr is:merged base:main
Serve hosted static frontends through explicit HTTPS Pages origin mappings
#1137 merged Nov 3
Scope GET /v1/unibox to a campaign_id or contact_id (org-verified, 404 outside the workspace) traced through campaign sends by Message-ID, In-Reply-To, thread root and Gmail thread handle, return each row's campaign_id, accept since/until as YYYY-MM-DD (until keeps the whole UTC day) or RFC 3339 and refuse anything else with 400 invalid_filter, and document address, direction, the new filters and dates in the unibox reference, openapi.json, error codes and both CLIs
#1136 merged Nov 3
Emit campaign.completed, inbox.reply_received, email_account.disconnected/error/synced, automation.run and bulk_operation.* webhooks from their control-plane sources, deprecate the five catalog events nothing can deliver, hide them from pickers, and add a source-scan test that every catalog event is emitted or deprecated
#1135 merged Nov 3
Record the step A/B arm each contact was sent on campaign_contact_progress (migration 000338), report contact-based per-step arm stats with last-step attribution and a Bonferroni-corrected two-proportion z-test winner in GET /campaigns/:id/ab-analysis, implement ab_testing.auto_promote_winner as an audited consumer loop, and show per-arm results, winner and promotion in the step editor and Settings > Sending
#1134 merged Nov 3
Lift the reply-gated cold ceiling once warmup is stopped (not paused) by reading warmup_stopped_at in ColdRampStateForAccounts through one ColdRampState.CeilingApplies gate shared by the scheduler, send plan, projection and mailbox status notice, correct the Stop comments, let an explicit batch warmup Off win over per-row warmup columns in mailbox import with a three-way warmup choice in the import dialog, and document both in the campaigns, warmup and mailbox import guides
#1133 merged Nov 3
Decide bounce suppression from the DSN status code and server reply through a shared dsn.Blame rule so mailbox-full, policy, reputation and system bounces keep the address and lead while address-invalid ones suppress, carry the per-recipient status and diagnostic in inbound bounce reasons, reuse the rule in emailverify, and add an optional TYPESAFE_ENDPOINT
#1131 merged Nov 3
Treat a reply that is only an opt-out command (STOP, remove, unsubscribe) as an opt-out, add opt-in stop_all_campaigns_on_reply holding a replying contact in their other campaigns, and add skip_active_in_other_campaigns to CSV import, bulk add and segment add-to-campaign with dashboard controls and docs
#1130 merged Nov 3
All checks passed
Go CI
Web CI
Migrations
Rust CI
Elixir CI
In the open
- 01
Open by default
The whole platform is on GitHub under Apache 2.0: sending, warmup pools, health thresholds and abuse checks. If you want to know why a mailbox was paused, you can read the code that paused it.
- 02
Built in public
The changelog is public and dated, and every entry maps to a merged change. We don’t invent metrics or pretend to be bigger than we are.






