Code that works, without extra workers.
Your code has to complete no matter what. LLM outages, API timeouts, server restarts, traffic spikes. Inngest lets you make every function durable without leaving your codebase.
The problem
Your pipelines will fail.Then what?
The best queues are good at one thing: making sure a job gets picked up. For workflows with API calls or human-in-the-loop pauses, you need to make sure your code can run, sleep, wait, and retry as needed.
- Without Inngest: Noisy neighbor problems. With Inngest: Isolated workloads.
- Without Inngest: Hand-rolled rate limiting. With Inngest: Built-in rate limiting.
- Without Inngest: Priority queue sprawl. With Inngest: Unified priority control.
- Without Inngest: Wasted compute. With Inngest: Zero wasted compute.
- Without Inngest: Impossible cancellation. With Inngest: Real-time cancellation.
Primitives
Write durability directly into code.
Steps—or units of work—run once, cache their result, and retry independently on failure. Write normal code, wrap functions in steps, and Inngest does the rest.
Control flow through every event.
Left to a queue, work piles up, noisy tenants starve others, and APIs get hammered. Flow control is how you stay in control as volume grows.
- Concurrency — Solve noisy neighbors
- RateLimit — Control flow
- Idempotency — Collapse event bursts
- Priority — Express execution order
Observabilityby default.
To guarantee completion, Inngest tracks the state of every step. That state is the trace — every timing, input, output, and retry, captured from day one with no extra instrumentation.

Any code, any runtime.
Workflows, agents, endpoints. API calls, webhooks, cron. Edge, serverless, traditional. Same primitives, same guarantees, no matter what or where you run. Wrap functions in steps to make any code durable by default.
await step.run(“fetch-data”, async () => { return await db.query(...) })
@inngest.create_function(...) async def handler(ctx): data = await ctx.step.run(“fetch”, fetch)
step.Run(ctx, “fetch-data”, func(ctx) (any, error){ return db.Query(...) })
Why modern teams use Inngest for durable execution
Frictionless setup —for humans and agents.
Inngest pushes work to your code over HTTP. Deploy to whatever you're already running. Our integration with Stripe's Agent Provisioning Protocol also provides a zero-touch setup option: no key copying, no manual configuration, no billing review.
Terminal - Human Setup
$ npx inngest-cli@latest dev ✓ Agent requests access via APP ✓ Connected to your functions ✓ Traces available at localhost:8288 No cluster. No workers. No config.
Stripe APP - Agent Provisioning
Agent requests access via APPINITIATED 0mx Credentials provisioned automaticallyGRANTED 120ms Functions registered, ready to runLIVE 340ms No key copying. No billing review. No manual config.
Local-first development.
One command — npx inngest-cli dev — and you have a full execution environment running locally. No mocking, no stubs, no connecting to a remote service to test your workflow. Ship with confidence because what you ran locally is what runs in prod.
Last login: Fri Apr 24 15:20:51 on ttys04 john@JohnnoMacBook-Pro ~ % cd workspace/demo-inngest john@JohnnoMacBook-Pro demo-inngest % npx inngest-cli dev
What teams are
building on Inngest.
Real users, real use cases.
Stop building infrastructure around your infrastructure.
Add durability to any function in minutes. Works with your existing code, wherever it runs.










