Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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.
</Note>

<Update label="July 6, 2026" description="v0.11.0 — `Message.blockedReason` removed from the SDK type" tags={["SDK", "CLI"]}>
## `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.
</Update>

<Update label="July 6, 2026" description="Inbound hooks: retried deliveries no longer send duplicate emails" tags={["Integration"]}>
## 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.
</Update>

<Update label="June 26, 2026" description="Logs: preview the rendered content of any message" tags={["Dashboard"]}>
## Message preview in Logs

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 2 additions & 0 deletions guides/supabase-auth-emails.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down