Problem/Motivation

Alpha2 has synthetic HTTP and isolated upgrade coverage. Earlier live-provider evidence predates this release, and optional reconciliation uses a fake HTTP client. Stable acceptance needs a reproducible upgrade and provider verification of the released package.

Proposed resolution

Use a disposable staging installation and a dedicated Postmark test server or approved test stream. Document generic steps and sanitized evidence so other sites can reproduce them. Consumer deployment remains in the consuming site's own tracker.

Acceptance criteria

  • Install the Drupal.org archive through Composer, record its version/checksum, and exercise both a fresh install and an alpha1 upgrade with interrupted/resumed update batches.
  • Verify settings, enabled/disabled suppression, legacy data, permission boundaries and successful cache rebuild after updates.
  • Exercise Delivery, Bounce, SpamComplaint and SubscriptionChange through the real provider using controlled test recipients or provider-supported test mechanisms; identify any fixture-only cases honestly.
  • Verify duplicate and delayed events, Basic Auth, source matching, credential rotation and provider-visible failure/retry behavior without publishing credentials or recipient data.
  • Exercise the optional reconciliation read path against a dedicated provider source, confirm preview/apply behavior and that no provider data changes.
  • Record provider webhook verification status and operational recovery steps for paused delivery; link public evidence from docs/integration-verification.md.

Scope and dependencies

Stable-release acceptance task under #3621224: Complete the 1.0.0 stable release verification gates. Builds on #3621137: Expand integration coverage to routing, mail transport, forms and Drush; the completed original issue remains fixed.

References

Comments

jmcerda created an issue. See original summary.

  • jmcerda committed 90c55c45 on 1.x
    Issue #3621227: Guard published-package cleanup paths and missing...

  • jmcerda committed d4bd5a2e on 1.x
    Issue #3621227: Require Composer dist installs for published-package...

  • jmcerda committed 2b0c882d on 1.x
    Issue #3621227: Fail closed if the published-package HTTP server is not...

  • jmcerda committed 3f015ab2 on 1.x
    Issue #3621227: Verify the Drupal.org archive through Composer
    
    Install...
jmcerda’s picture

Partial on 1.x. The Drupal.org 1.0.0-alpha2 archive is verified through Composer, including an alpha1-to-alpha2 file replacement. Live Postmark webhook acceptance is still outstanding; no dedicated test-server token is available and production is not used. Remaining evidence is recorded in docs/published-package-verification.md. This issue stays Active until that provider evidence exists.

  • 3ef06eb8 committed on 1.x
    Issue #3621227: Record live sandbox Postmark webhook acceptance (#30)...

  • jmcerda committed 927b2cb6 on 1.x
    Issue #3621227: Say HttpAuth is for the receiver
    
    The create-webhook...

  • jmcerda committed eed75175 on 1.x
    Issue #3621227: Call Verify a JSON body field
    
    Say the Postmark create-...

  • jmcerda committed fbd04178 on 1.x
    Issue #3621227: Spell out suppression dump query parameters
    
    Clarify 401...

  • jmcerda committed f2e186a8 on 1.x
    Issue #3621227: Record live sandbox Postmark webhook acceptance
    
    Replace...
jmcerda’s picture

Assigned: Unassigned » jmcerda
Status: Active » Fixed

Live provider evidence is recorded on 1.x-dev against a dedicated Postmark sandbox server (DeliveryType Sandbox). Production was not used.

Published package (already recorded): Drupal.org 1.0.0-alpha2 zip SHA-1 e31e9f67b554cdaf35d04549d955310c0d1d3c30; alpha1 SHA-1 df706da9dfc7fcaa3de161776dd8391e27ac655e.

Webhook: POST /webhooks with JSON body field "Verify": true. HttpAuth username postmark so Postmark authenticates to the Drupal receiver. POST /webhooks/{id}/verify: Delivery, Bounce, SpamComplaint and SubscriptionChange all StatusCode 200; trigger statuses verified.

Events (real server ID, time_basis provider):
- Delivery: sandbox POST /email from a confirmed sender signature. MessageID prefix d5cffe2a-c5b.
- Bounce: POST /email to hardbounce@bounce-testing.postmarkapp.com. MessageID prefix 0e56e774-b6e.
- SubscriptionChange: hard-bounce suppression plus POST /message-streams/outbound/suppressions (manual).
- SpamComplaint: provider verify test tool only. Fake-bounce addresses do not support SpamComplaint; sandbox never delivers to a real inbox.

Auth: unauthenticated POST 401 with WWW-Authenticate. Current and previous secrets 200. Wrong password 401, zero rows stored. Duplicate MessageID posted twice: both 200, one stored row.

Source allowlist locked to the real server ID returned 403 on Postmark verify payloads (dummy ServerID 23/1234) and blocked webhook save (error 1364). Verify succeeded with the allowlist unset.

Provider-visible 401: with an incorrect Drupal secret, verify returned Success false, all four StatusCode 401, triggers unverified. Restoring the secret and verifying again returned all four 200 and verified. Postmark does not retry 401 (permanent 4xx). Recovery is restore credentials and re-verify.

Reconciliation: GET-only. GET /server matched. Unfiltered suppression dump 3 rows. Dated dump fromdate=2026-09-07&todate=2026-09-07 returned 0 despite CreatedAt 2026-09-07. drush reconcile-preview reported provider_writes false and local_suppression_changed false. Apply was not run.

Health JSON reported the secret configured and intake counters without recipient labels. The temporary webhook configuration was removed after the run.

Sanitized write-up: docs/published-package-verification.md on 1.x (https://git.drupalcode.org/project/postmark_webhooks/-/blob/1.x/docs/pub...), linked from docs/integration-verification.md. Merge 3ef06eb8.

sender@example.org is not a Sender Signature (error 400). @example.com recipients were inactive on this stream (error 406). @example.org accepted sandbox Delivery.

This issue is Fixed on 1.x-dev. Tagging 1.0.0 is not part of this issue.

Now that this issue is closed, review the contribution record.

As a contributor, attribute any organization that helped you, or if you volunteered your own time.

Maintainers, credit people who helped resolve this issue.