What changed
- Duplicate
process_webhook_eventdedupe-key conflicts now return a successful webhook response instead of HTTP 503. - The original webhook event remains the source of truth; the duplicate request is logged as an idempotent duplicate rather than queued again.
- Regression coverage locks the
outbox_jobs_workspace_id_dedupe_key_keyduplicate path so future retries do not create a retry storm.
Why it matters
Meta redelivers webhook payloads after non-2xx responses. If Switchbord has already recorded the webhook event and already has the matching outbox job, a duplicate insert conflict should stop the retry loop, not extend it.