Skip to content

Events

Events wire lifecycle triggers to functions. After a model is created, updated, or deleted, the associated function is automatically called.

json
{
  "name": "UserCreated",
  "trigger": "onUserCreated",
  "function": "SendWelcomeEmail"
}

Trigger naming convention

Triggers follow the pattern on<Model><Action>:

TriggerFires when…
onUserCreatedA User is POSTed
onArticleDeletedAn Article is DELETEd
onOrderUpdatedAn Order is PUT or PATCHed

Generated output

Events are wired directly into the generated API route handlers. For example, with the UserCreated event above, the POST /api/users route becomes:

Drizzle

ts
import { SendWelcomeEmail as sendWelcomeEmailEvent } from '../../lib/functions/SendWelcomeEmail';
import { db } from '../../lib/db';
import { users } from '../../drizzle/schema';

export async function POST(_req: NextRequest) {
  const body = await _req.json();
  const data = await db
    .insert(users)
    .values({ email: body.email, name: body.name })
    .returning()
    .then((r) => r[0]);
  await sendWelcomeEmailEvent({ ...data }); // ← event wired here
  return NextResponse.json(data, { status: 201 });
}

Prisma

ts
import { SendWelcomeEmail as sendWelcomeEmailEvent } from '../../lib/functions/SendWelcomeEmail';

export async function POST(_req: NextRequest) {
  const body = await _req.json();
  const data = await prisma.user.create({
    data: { email: body.email, name: body.name },
  });
  await sendWelcomeEmailEvent({ ...data }); // ← event wired here
  return NextResponse.json(data, { status: 201 });
}

No extra event dispatcher file is needed — events are inlined at the call site.

Released under the Elastic License 2.0.