Background
#60229 introduced HMAC signing of email tracking codes (ph_id). It ships fail-open for a safe rollout:
parseEmailTrackingCode still accepts unsigned codes, so webhooks/pixels for emails already in inboxes keep working.
generateEmailTrackingCode emits unsigned if ENCRYPTION_SALT_KEYS is not configured, so sends never break.
Both are deliberate for rollout. This issue tracks tightening them once signing has fully rolled out.
When to act
Watch email_tracking_code_format_total{format="unsigned"}. Once it drops to ~0 (all in-flight unsigned links have aged out / expired), it's safe to enforce.
Tasks
Related
Background
#60229 introduced HMAC signing of email tracking codes (
ph_id). It ships fail-open for a safe rollout:parseEmailTrackingCodestill accepts unsigned codes, so webhooks/pixels for emails already in inboxes keep working.generateEmailTrackingCodeemits unsigned ifENCRYPTION_SALT_KEYSis not configured, so sends never break.Both are deliberate for rollout. This issue tracks tightening them once signing has fully rolled out.
When to act
Watch
email_tracking_code_format_total{format="unsigned"}. Once it drops to ~0 (all in-flight unsigned links have aged out / expired), it's safe to enforce.Tasks
parseEmailTrackingCode— require the<payload>.<signature>form and a valid signature.generateEmailTrackingCode(tracking-code.ts, theif (keys.length === 0)branch) — throw or alert instead of silently emitting unsigned, so a misconfigured/emptyENCRYPTION_SALT_KEYSis caught loudly rather than degrading silently.Related
TopicArn); related area but a different axis (inbound webhook authenticity vs outbound signing enforcement)