Inngest mit Claude Code: Background Jobs und Workflows 2026
Inngest ist die moderne Alternative zu BullMQ und Celery — keine Queue-Infrastruktur, automatische Retries, Step-Functions und Observability. Claude Code generiert vollstaendige Inngest-Workflows fuer Next.js und Node.js.
Setup und erste Function
FunctionInngest in Next.js integrieren
# Prompt: "Erstelle Inngest-Setup fuer Background Email-Sending"
npm install inngest
// inngest/client.ts
import { Inngest } from "inngest";
export const inngest = new Inngest({ id: "my-saas-app" });
// inngest/functions/send-welcome-email.ts
export const sendWelcomeEmail = inngest.createFunction(
{
id: "send-welcome-email",
retries: 3, // Automatische Retries bei Fehler
},
{ event: "user/signed-up" }, // Trigger-Event
async ({ event, step }) => {
// step.run = automatisch gecached und idempotent
const user = await step.run("fetch-user", async () => {
return db.user.findUnique({ where: { id: event.data.userId } });
});
await step.run("send-email", async () => {
await resend.emails.send({
from: "noreply@myapp.com",
to: user.email,
subject: `Willkommen bei MyApp, ${user.name}!`,
html: renderWelcomeEmail(user),
});
});
return { userId: user.id, emailSent: true };
}
);
// app/api/inngest/route.ts — Webhook-Endpoint
import { serve } from "inngest/next";
export const { GET, POST, PUT } = serve({
client: inngest,
functions: [sendWelcomeEmail, processPayment, dailyReport],
});
Inngest-Vorteil: Keine Redis/Bull-Infrastruktur noetig — Inngest Cloud uebernimmt Queue, Retries und Observability. Lokal:
npx inngest-cli dev startet einen lokalen Server.Step-Functions: Komplexe Workflows
StepsMulti-Step Workflows mit Wait und Sleep
# Prompt: "Onboarding-Workflow: Email-Serie ueber 7 Tage"
export const onboardingWorkflow = inngest.createFunction(
{ id: "user-onboarding-sequence" },
{ event: "user/signed-up" },
async ({ event, step }) => {
const { userId, email } = event.data;
// Sofort: Welcome Email
await step.run("welcome-email", () => sendEmail(email, "welcome"));
// 1 Tag warten
await step.sleep("wait-day-1", "1d");
// Nach 1 Tag: Check ob User sich eingeloggt hat
const hasLoggedIn = await step.run("check-login", async () => {
return db.user.findFirst({ where: { id: userId, lastLoginAt: { not: null } } });
});
if (!hasLoggedIn) {
await step.run("nudge-email", () => sendEmail(email, "nudge"));
}
// Auf externen Event warten (max 7 Tage)
const profileCompleted = await step.waitForEvent(
"wait-profile",
{ event: "user/profile-completed", match: "data.userId", timeout: "7d" }
);
if (profileCompleted) {
await step.run("congrats-email", () => sendEmail(email, "profile-complete"));
} else {
await step.run("reminder-email", () => sendEmail(email, "complete-profile"));
}
}
);
Scheduled Jobs und Events triggern
ScheduledCron-Jobs und Event-Trigger
# Scheduled Job: Taeglich um 9 Uhr UTC
export const dailyDigest = inngest.createFunction(
{ id: "daily-digest" },
{ cron: "0 9 * * *" }, // Standard Cron-Syntax
async ({ step }) => {
const users = await step.run("fetch-active-users", () =>
db.user.findMany({ where: { notificationsEnabled: true } })
);
// Fan-out: fuer jeden User parallel
await step.run("send-digests", async () => {
await Promise.all(
users.map(user => inngest.send({ name: "digest/requested", data: { userId: user.id } }))
);
});
}
);
// Event von Route Handler triggern:
export async function POST(req: Request) {
const { email } = await req.json();
const user = await createUser(email);
// Inngest-Event senden → loest alle Subscriber aus
await inngest.send({
name: "user/signed-up",
data: { userId: user.id, email: user.email },
});
return Response.json({ user });
}
Retry-Verhalten: Jeder
step.run-Block wird einzeln gecached. Bei Retry startet Inngest beim fehlgeschlagenen Step — nicht von vorn. Datenbankschreibvorgaenge in frueheren Steps werden nicht wiederholt.Background Jobs im Kurs
Im Claude Code Mastery Kurs: vollstaendiges Inngest-Modul mit Function-Design, Step-Patterns, Scheduled Jobs, Fan-out-Patterns und Observability — inkl. Migration von BullMQ zu Inngest.
14 Tage kostenlos testen →