Builtin

Core triggers available in every Floww installation. No additional setup required.

import { getProvider } from "floww";

Webhook Trigger

Purpose: Handle HTTP requests at custom endpoints Use cases: API webhooks, form submissions, service integrations, external callbacks

builtin.triggers.onWebhook({
  handler: (ctx, event) => {
    // Process the incoming request
    return { success: true };
  },
  path: '/my-endpoint'
})

Configuration

  • path - Endpoint path (becomes /webhooks{path})
  • method - HTTP method (GET, POST, PUT, DELETE, PATCH) - default: POST
  • validation - Optional function to validate requests before processing

HTTP Methods

  • GET - Status checks, simple triggers
  • POST - Most webhooks, data submission
  • PUT/PATCH - Update operations
  • DELETE - Deletion callbacks

Validation

Secure your endpoints with validation:

builtin.triggers.onWebhook({
  validation: (event) => event.headers['x-api-key'] === process.env.API_KEY,
  handler: (ctx, event) => {
    // Only runs if validation passes
  }
})

Event Data

  • event.body - Request body (parsed JSON)
  • event.headers - HTTP headers
  • event.query - Query parameters
  • event.method - HTTP method
  • event.path - Request path

Type Safety

interface MyPayload {
  action: string;
  data: { id: string; name: string; };
}

builtin.triggers.onWebhook<MyPayload>({
  handler: (ctx, event) => {
    // event.body is typed as MyPayload
    console.log(event.body.action, event.body.data.name);
  }
})

Cron Trigger

Purpose: Execute code on schedules Use cases: Cleanup tasks, reports, data synchronization, monitoring, backups

builtin.triggers.onCron({
  expression: "0 9 * * 1-5", // 9 AM on weekdays
  handler: (ctx, event) => {
    // Run scheduled task
  }
})

Cron Expressions

Format: second minute hour day month dayOfWeek (second is optional)

Common patterns:

  • "*/30 * * * * *" - Every 30 seconds
  • "0 */15 * * *" - Every 15 minutes
  • "0 0 2 * *" - Daily at 2 AM
  • "0 0 9 * 1-5" - Weekdays at 9 AM
  • "0 0 12 1 *" - Monthly on 1st at noon

Event Data

  • event.timestamp - When the job triggered
  • event.expression - The cron expression used

Error Handling

Webhook Errors

Return appropriate HTTP status codes:

builtin.triggers.onWebhook({
  handler: async (ctx, event) => {
    try {
      return await processData(event.body);
    } catch (error) {
      if (error.code === 'VALIDATION_ERROR') {
        throw new WebhookError(400, 'Invalid data');
      }
      throw new WebhookError(500, 'Processing failed');
    }
  }
})

Cron Errors

Handle failures gracefully to avoid breaking schedules:

builtin.triggers.onCron({
  expression: "0 0 * * *",
  handler: async (ctx, event) => {
    try {
      await criticalTask();
    } catch (error) {
      ctx.logger.error('Task failed', { error });
      await sendAlert(error.message);
      // Don't re-throw to keep cron running
    }
  }
})