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.
// 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.
{ "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.
{ "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.