Back to Blog
March 5, 2026 1 min read

Webhook Processing: Never Process Inline

Deep Dive
Depth: ●●○○○
Share:

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.

Related Projects