Events in Trigger.dev
Events are the primary way to trigger jobs in the Trigger.dev integration. This guide explains how to send events, handle them, and implement best practices for event-driven architecture.
Event Structure
Events in Trigger.dev have two main components:
- Event Name: A string identifier for the event (e.g.,
user.created
)
- Payload: The data associated with the event (e.g., user information)
Sending Events
The @repo/trigger
package provides a helper function for sending events:
import { sendEvent } from "@repo/trigger";
// Send an event with a payload
await sendEvent("user.created", {
email: "user@example.com",
name: "John Doe",
userId: "123456"
});
Error Handling
The sendEvent
function includes built-in error handling:
try {
await sendEvent("payment.processed", {
amount: 100,
currency: "USD"
});
console.log("Payment event sent successfully");
} catch (error) {
console.error("Failed to send payment event:", error);
// Handle the error appropriately
}
API Integration
The API app includes a route handler that allows external systems to send events:
// POST /trigger
export async function POST(req: NextRequest) {
try {
const body = await req.json();
if (!body || !body.event) {
return new Response(JSON.stringify({ error: "Missing required fields" }), {
status: 400,
headers: { "Content-Type": "application/json" }
});
}
const { event, payload } = body;
const result = await sendEvent(event, payload);
return new Response(JSON.stringify({
success: true,
message: `Event ${event} sent to Trigger.dev`,
result
}), {
status: 200,
headers: { "Content-Type": "application/json" }
});
} catch (error) {
// Error handling
}
}
Event Naming Conventions
It’s recommended to use a consistent naming convention for events:
- Use dot notation to organize events hierarchically
- Start with the entity, followed by the action
- Use lowercase letters and avoid special characters
Examples:
user.created
user.updated
payment.succeeded
email.sent
document.shared
Type Safety
For better type safety, define interfaces for your event payloads:
// Define event payload types
interface UserCreatedPayload {
email: string;
name?: string;
userId: string;
}
interface PaymentProcessedPayload {
amount: number;
currency: string;
customerId: string;
}
// Use with sendEvent
await sendEvent<UserCreatedPayload>("user.created", {
email: "user@example.com",
name: "John Doe",
userId: "123456"
});
Event Patterns
Event Broadcasting
Send the same event to multiple consumers:
// This event can trigger multiple jobs
await sendEvent("user.created", userData);
Event Chaining
One job can trigger another job by sending an event:
export const processUploadJob = client.defineJob({
id: "process-upload",
name: "Process Upload",
version: "1.0.0",
trigger: eventTrigger({
name: "file.uploaded",
}),
run: async (payload, io) => {
// Process the file
await io.logger.info(`Processing file: ${payload.filename}`);
// Trigger the next job in the chain
await sendEvent("file.processed", {
fileId: payload.fileId,
processingResult: "success"
});
return { success: true };
},
});
Delayed Events
You can schedule events to be sent in the future:
import { client } from "@repo/trigger";
// Schedule an event for the future
await client.sendEvent({
name: "reminder.send",
payload: {
userId: "123",
message: "Don't forget your appointment"
},
delay: {
hours: 24 // Send this event 24 hours from now
}
});
Testing Events
For testing, you can send events directly to the API endpoint:
curl -X POST http://localhost:3002/trigger \
-H "Content-Type: application/json" \
-d '{
"event": "test.event",
"payload": {
"message": "This is a test event"
}
}'
Monitoring Events
The Trigger.dev dashboard provides tools for monitoring events:
- Event history
- Success and failure rates
- Event payloads
- Related job runs
For more information, visit the Trigger.dev documentation.