Durable inbound webhook fact: a verified provider callback has been received,
normalized, and queued for async processing. One ingress row per accepted
callback; duplicate provider retries with the same (adapter_module, provider_event_id) collapse to the existing row via the partial unique index.
Ingress rows are NOT a payload archive. They store explainability-first fields only — adapter identity, correlation keys, normalized status, processing state, and (when applicable) an ignored reason. Raw provider bodies and headers stay out of this surface by design.
Replay protection: the partial unique index on
(adapter_module, provider_event_id) WHERE provider_event_id IS NOT NULL
collapses duplicate provider retries that expose a stable event id.
Adapters without a stable event id get best-effort dedup only.
Summary
Types
@type t() :: %Chimeway.Webhooks.Ingress{ __meta__: term(), adapter_module: term(), delivery_id: term(), id: term(), ignored_reason: term(), ingress_state: term(), inserted_at: term(), normalized_status: term(), processed_at: term(), provider_event_id: term(), provider_message_id: term(), updated_at: term() }