docs/adr/0006-async-webhook-ack-is-redis-durable.md
The async webhook endpoint returns 200 (with x-webhook-id) as soon as the job is enqueued to Redis — no Postgres row exists until a worker picks the job up. This keeps webhook ingest at Redis latency and lets ingestion survive a Postgres failover (flow resolution is served from a Redis cache), at the cost that a Redis dataset loss silently drops acknowledged webhooks inside the persistence window. We accept that trade-off and mitigate it with Redis persistence (AOF everysec → ≤1s exposure) rather than a durable-ACK write.
200 would make the ACK durable, but puts Postgres on the ingest hot path — every webhook pays a write, ingest throughput becomes bounded by Postgres, and webhook acceptance goes down whenever Postgres does. Sync webhooks already behave this way; async exists to avoid it.redis.conf, documented in docs/install/guarantees/disaster-recovery.mdx.x-webhook-id returned to the sender is not a durable receipt; it is only traceable once a worker starts the run.