diff --git a/changelog.mdx b/changelog.mdx index c28fe9f..8826734 100644 --- a/changelog.mdx +++ b/changelog.mdx @@ -14,6 +14,38 @@ This page tracks releases of SenderKit's developer libraries — the documents. New entries land here as each library ships a version. + + ## `blockedReason` removed from the SDK type + + **`@senderkit/sdk@0.11.0` / `@senderkit/cli@0.6.4`** + + The [June 19 entry](#june-19-2026) below noted that `blockedReason` was retained on + the `Message` type but never populated by the customer API. As of this release the + property is removed from the type entirely — referencing `message.blockedReason` in + TypeScript is now a compile error rather than an always-`undefined` runtime value. + + Nothing else changes: `blocked` remains a valid `Message.status` value, and + `messages.list({ status: "blocked" })` / `--status blocked` / + `senderkit_messages_list` still accept it as a filter. If you already branch on + `status === "blocked"` you're unaffected; if you referenced `blockedReason` + anywhere, remove that reference. + + + + ## Inbound webhook retries are now deduplicated + + Sources that deliver to a SenderKit inbound hook endpoint — including the + [Supabase auth email hook](/guides/supabase-auth-emails) — retry a delivery + whenever they don't receive a prompt `2xx`, including after transient network + errors. Previously, a retried delivery could enqueue the underlying email a + second time, so a recipient occasionally received a duplicate confirmation, + magic-link, or recovery email. + + Retried deliveries of the same event are now recognized and deduplicated + automatically — a retry resolves without sending again. No configuration changes + are needed. + + ## Message preview in Logs @@ -47,6 +79,8 @@ This page tracks releases of SenderKit's developer libraries — the The `Message.blockedReason` property in the SDK type (`string | null | undefined`) is retained as an optional field but is never populated in customer API responses. + (Update: as of the [July 6, 2026 entry](#july-6-2026) above, the property has been + removed from the SDK type entirely.) The earlier June 17 changelog entry described `blockedReason` as containing human-readable detail (e.g. `"High-confidence phishing content detected"`) — that description was incorrect and has been superseded by this entry. diff --git a/guides/supabase-auth-emails.mdx b/guides/supabase-auth-emails.mdx index ecc0d56..2adf4e6 100644 --- a/guides/supabase-auth-emails.mdx +++ b/guides/supabase-auth-emails.mdx @@ -116,6 +116,8 @@ display OTP codes. triggering a retry storm. Only unexpected transient failures return 5xx. - **Unsupported actions are silently accepted.** Any `email_action_type` outside the six above returns `200` with no send. +- **Retries are deduplicated.** If Supabase retries a delivery (or a network blip + means it never sees SenderKit's response), the retry won't send the email again. - **One endpoint per mode.** The Integrations page creates a live-mode endpoint. To test before going live, use a `sk_test_` key connection with draft templates — sends are recorded but not dispatched to a provider.