Besides registered connectors, automations have built-in destination types. Each is a destination_config you set when defining the event, with {{source.*}} templates resolved from the changed record.

Messaging channels

Email, Slack, SMS, and Teams each have a dedicated handler because each speaks a different protocol. The tenant supplies the relevant credential (Slack bot token, Twilio account, Teams webhook URL, email sender) in their settings; if it's not configured the notification is silently skipped.

json
// notification.slack
{ "channel": "#new-records", "text": "{{source.name}} was created" }

// notification.email
{ "to": "ops@example.com", "subject": "New: {{source.name}}",
  "body": "<p>{{source.name}} was created.</p>", "format": "html" }

// notification.sms
{ "to": "+15551234567", "body": "{{source.name}} was created" }

// notification.teams
{ "text": "{{source.name}} was created", "title": "New Record", "theme_color": "0076D7" }

Direct webhook

external.webhook POSTs to a URL you set directly in the automation — no connector registration needed. Useful for Zapier catches and internal endpoints.

json
{ "url": "https://hooks.zapier.com/hooks/catch/...",
  "method": "POST", "headers": { "X-Custom": "value" } }

Write to the tenant's S3

external.s3 writes an object to the tenant's own bucket using the tenant's own AWS credentials. The bucket always comes from the stored credentials, so a tenant can only write to their own bucket.

json
{ "key_strategy": "formula", "key_template": "contacts/{{source.id}}.json",
  "content_type": "application/json", "output_format": "json", "include_fields_mode": "all" }

Test without real third parties

In non-production environments the messaging and connector handlers can be pointed at a simulator that records each call as a receipt — so integration tests can confirm delivery without hitting live APIs.