Problem/Motivation
SubscriptionChange is currently stored without the fields needed to interpret it, and the suppression helper does not evaluate it. Unsubscribe/manual suppression and reactivation therefore have no explicit state model.
Evidence and scope
Reviewed 1.0.0-alpha1, source commit 02fd9d36af5237e712cecb7155d79725f7824880. Location: src/Controller/PostmarkWebhookController.php:89.
Provider documentation: https://postmarkapp.com/developer/webhooks/subscription-change-webhook . It describes stream-scoped changes and SuppressSending, including events without MessageID. Current code ignores those state fields.
Proposed resolution
Parse a minimal set of SubscriptionChange fields and apply explicit, ordered transitions. Distinguish hard-bounce recovery from complaint or recipient opt-out; never treat any reactivation as blanket permission to erase consent restrictions. Build on source scope and durable state.
Acceptance criteria
Fixtures cover suppress/reactivate, missing MessageID, out-of-order events and each supported reason. Specify precedence and retain minimal audit evidence without storing raw payloads.
Comments
Comment #2
jmcerdaImplemented validated SubscriptionChange transitions, null MessageID support, minimal transition fields and a repeatable upgrade. Newer same-source reactivation releases only older hard-bounce/address-invalid evidence; complaint, unsubscribe and manual/recipient suppression remain protected. Equal timestamps retain the block, and durable release markers prevent delayed older events from undoing recovery after retention. The full PostgreSQL suite passes on Drupal 10 and 11 (57 tests each), including transition ordering, source boundaries and legacy upgrade. The change is under review; integration and release remain pending.
Comment #5
jmcerdaIntegrated into the 1.x development branch and included in 1.0.0-alpha2. The release tag and branch are mirrored to Drupalcode. The six-job Drupal 10/11 and Mailer Plus integration matrix passes. See the release notes for database updates and retained-history limitations. This records module publication; site deployment is a separate operation.