Repository navigation
fix(sending): explain domain verification and fix the feedback test status - #191
Conversation
…tatus Follow-up to #190, from setting up SES feedback in production. - An unverified From domain (domain_verification_required) now auto-pauses a sequence with the sending_blocked reason, names the domain, and emails the owners once, instead of failing five times and pausing as "several emails in a row failed to send". - The 50/90/100% warnings and the ESP notice cover domain verification as well as feedback, listing exactly what is left to do. - The feedback dialog reloads the connection after a passing Test, so it shows Healthy. A manual Test no longer sets "Last event"; it shows when it was tested instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review Summary: ✅ CompletedThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0be1651ff8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| for (const esp of esps) { | ||
| const domain = fromDomain(esp.fromEmail); | ||
| if (domain && !verifiedDomains.has(domain)) domains.add(domain); |
There was a problem hiding this comment.
Include organization-owned ESPs in domain reminders
When an organization sends only through a shared organization-owned ESP, its config has no teamId, so it is absent from esps and this loop never checks its From domain. notifyFeedbackMilestones then sees no unmet requirements and skips the 50/90/100% warning, even though assertSendingEligibility checks that ESP’s domain and will block sending at the threshold. Include organization-owned ESPs when building the domain reminders.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Fixed in 8b1baea. The reminders now also check the From domains of the organization's active organization-owned ESPs, so an organization sending only through a shared ESP gets the 50/90/100% warnings for an unverified domain. A new test covers it. Shared ESPs stay off the feedback list in these reminders, because the feedback gate is checked per sending team; that's tracked separately.
|
The Test-setting-lastReceivedAt fix is the sharp one — a manual test masquerading as a real event corrupts exactly the signal the dialog exists to show, and it's the same class of bug as the two blockers sharing one message. Naming the domain in the pause email is the right call; a paused sequence that doesn't name the blocker is a support ticket waiting to happen. One thing I'd check in the retry path: the five-attempt budget before auto-pause — does it distinguish a domain-verification failure from a transient SES failure? An unverified domain will never succeed on retry, so five attempts just burn the budget and delay the pause email that actually tells the owner what to fix. A deterministic failure wants to pause on first sight, with the retry budget kept for the failures that might clear. Is the domain-verification block recorded as its own sending_blocked reason per domain, so re-verifying unpauses only the sequences blocked on that domain and not everything paused for other reasons? |
…nders Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, @Robertpaschal.
|
|
Thanks for the detailed reply. The per-domain pause on first failure, with the domain stored for a later auto-resume, is exactly the kind of plumbing rootmail is built around: per-message delivery state, bounce and complaint handling, and suppression lists for SES senders. It's in invite-only beta (8 seats, bring your own SES or Mailgun): https://rootmail.io/beta — happy for you to try it against Sendlit's SES path if useful, and happy to keep this thread technical either way. |
Follow-up to #190, from setting up SES feedback for a team in production.
Problems
domain_verification_required). In a sequence this failed before the send, so after five attempts the sequence paused with "several emails in a row failed to send", which doesn't tell the owners what to fix.Changes
domain_verification_requiredis now a stop the team has to fix. The sequence auto-pauses with thesending_blockedreason, records the domain, and emails the owners once ("its From domain mail.example.com isn't verified… Verify the domain in Organizations → Sending domains"). The dashboard banner shows the same message.lastReceivedAt; only real webhook events do. The dialog shows "Tested: …" until a real event arrives.domain_countto the reminder event and the PostHog allowlist.There are no API contract changes, so
openapi.jsonis unchanged.Testing
lastReceivedAt, and a real event does set it.process-ongoing-sequencetracking-link tests fail on my machine because of local tracking-host settings (HTTP instead of HTTPS). They fail onmainlocally too and pass in CI.🤖 Generated with Claude Code