March 5, 2026 1 min read
Webhook Processing: Never Process Inline
Deep Dive
Depth: ●●○○○
Store → Enqueue → Process. How I built async webhook handling with Inngest that returns 200 in <1s with per-step retry.
The Problem
Square expects 200 within 10s. Processing payment.completed involves 5-7 external API calls. Timeout → retry → duplicate processing.
The Architecture
Receive + HMAC verify → idempotency check → store raw event → enqueue to Inngest → return 200 (<1s). Inngest processes asynchronously with per-step retry. Non-fatal try* side effects never block the core status write.