ZelaxyDocs
Triggers
Trigger

Webhook Trigger

Start workflows from service-specific webhook events

Webhook Trigger

The Webhook trigger provides a dedicated URL that receives HTTP POST requests from external services. When a request arrives, the workflow starts automatically with the webhook payload as input.

Overview

PropertyValue
Typewebhook
CategoryTrigger

Supported Providers

Zelaxy supports webhook triggers from the following services. Each provider has its own output schema — see the detailed sections below.

ProviderTrigger IDAuth TypeDescription
Gmailgmail_pollerOAuthTriggers on new emails
Outlookoutlook_pollerOAuthTriggers on new emails
Slackslack_webhookSigning SecretTriggers on messages, mentions, reactions
GitHubgithub_webhookWebhook SecretTriggers on push, PRs, issues
Telegramtelegram_webhookBot TokenTriggers on bot messages
WhatsAppwhatsapp_webhookVerification TokenTriggers on incoming messages
Stripestripe_webhookTriggers on payments, subscriptions
Airtableairtable_webhookOAuthTriggers on record changes
Microsoft Teamsmicrosoftteams_webhookHMAC SecretTriggers on messages and mentions
Genericgeneric_webhookUniversal HTTP endpoint

How It Works

  1. Activate the workflow — a unique webhook URL is generated
  2. Copy the URL and register it in the external service's webhook settings
  3. When the service sends an event, the workflow triggers
  4. Service-specific webhooks (Slack, GitHub, Telegram, etc.) flatten event data to convenient top-level properties — e.g., {{Webhook 1.event.text}}, {{Webhook 1.message.text}}
  5. Generic webhooks store the raw request body under webhook.data.payload — access fields via {{Webhook 1.webhook.data.payload.fieldName}}

Block name normalization: Block names are case-insensitive and spaces are removed. {{Webhook 1.field}}, {{webhook1.field}}, and {{WEBHOOK1.field}} all resolve to the same block.

Universal Raw Data Access (All Providers)

Every webhook trigger (regardless of provider) also stores the complete raw HTTP request under webhook.data. This provides a fallback when you need fields not covered by the provider-specific outputs:

ReferenceDescription
{{Webhook 1.webhook.data.payload}}Complete raw HTTP body
{{Webhook 1.webhook.data.payload.nested.field}}Any field from the raw body
{{Webhook 1.webhook.data.headers}}HTTP request headers
{{Webhook 1.webhook.data.method}}HTTP method (POST, etc.)

Gmail

Triggers when new emails are received in a connected Gmail account. Requires OAuth with Google.

Configuration

SettingTypeDescription
Gmail AccountOAuthSelect connected Gmail account
Labels to MonitorMulti-selectGmail labels to watch (empty = all)
Label Filter BehaviorSelectINCLUDE or EXCLUDE selected labels
Mark as ReadToggleMark processed emails as read
Include Raw Email DataToggleInclude full Gmail API response

Outputs

OutputTypeDescription
email.idstringGmail message ID
email.threadIdstringGmail thread ID
email.subjectstringEmail subject line
email.fromstringSender email address
email.tostringRecipient email address
email.ccstringCC recipients
email.datestringEmail date (ISO format)
email.bodyTextstringPlain text email body
email.bodyHtmlstringHTML email body
email.labelsstringEmail labels array
email.hasAttachmentsbooleanWhether email has attachments
email.attachmentsjsonArray of attachment info (filename, mimeType, size)
timestampstringEvent timestamp
rawEmailjsonComplete raw Gmail API response (if enabled)

Sample Payload

{
  "email": {
    "id": "18e0ffabd5b5a0f4",
    "threadId": "18e0ffabd5b5a0f4",
    "subject": "Monthly Report - April 2025",
    "from": "sender@example.com",
    "to": "recipient@example.com",
    "cc": "team@example.com",
    "date": "2025-05-10T10:15:23.000Z",
    "bodyText": "Hello,\n\nPlease find attached the monthly report.\n\nBest regards",
    "bodyHtml": "<div><p>Hello,</p><p>Please find attached the monthly report.</p></div>",
    "labels": ["INBOX", "IMPORTANT"],
    "hasAttachments": true,
    "attachments": [
      { "filename": "report-april-2025.pdf", "mimeType": "application/pdf", "size": 2048576 }
    ]
  },
  "timestamp": "2025-05-10T10:15:30.123Z"
}

Usage Example

Reference in downstream blocks: {{Webhook 1.email.subject}}, {{Webhook 1.email.from}}, {{Webhook 1.email.bodyText}}


Outlook

Triggers when new emails are received in a connected Outlook/Microsoft 365 account. Requires OAuth with Microsoft.

Configuration

SettingTypeDescription
Microsoft AccountOAuthSelect connected Microsoft account
Folders to MonitorMulti-selectOutlook folders to watch (empty = all)
Folder Filter BehaviorSelectINCLUDE or EXCLUDE selected folders
Mark as ReadToggleMark processed emails as read
Include Raw Email DataToggleInclude full MS Graph API response

Outputs

OutputTypeDescription
email.idstringOutlook message ID
email.conversationIdstringOutlook conversation ID
email.subjectstringEmail subject line
email.fromstringSender email address
email.tostringRecipient email address
email.ccstringCC recipients
email.datestringEmail date (ISO format)
email.bodyTextstringPlain text email body (preview)
email.bodyHtmlstringHTML email body
email.hasAttachmentsbooleanWhether email has attachments
email.isReadbooleanWhether email is read
email.folderIdstringOutlook folder ID
email.messageIdstringMessage ID for threading
email.threadIdstringThread ID for conversation threading
timestampstringEvent timestamp
rawEmailjsonComplete raw MS Graph API response (if enabled)

Sample Payload

{
  "email": {
    "id": "AAMkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjLWVkM2VhY2YzYTcwZg...",
    "conversationId": "AAQkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjLWVkM2VhY2YzYTcwZg...",
    "subject": "Quarterly Business Review - Q1 2025",
    "from": "manager@company.com",
    "to": "team@company.com",
    "cc": "stakeholders@company.com",
    "date": "2025-05-10T14:30:00Z",
    "bodyText": "Hi Team,\n\nPlease find attached the Q1 2025 business review...",
    "bodyHtml": "<div><p>Hi Team,</p><p>Please find attached the Q1 review...</p></div>",
    "hasAttachments": true,
    "isRead": false,
    "folderId": "AQMkADg1OWUyZjg4LWJkNGYtNDFhYy04OGVjAC4AAAJzE3bU",
    "messageId": "AAMkADg1OWUyZjg4...",
    "threadId": "AAQkADg1OWUyZjg4..."
  },
  "timestamp": "2025-05-10T14:30:15.123Z"
}

Usage Example

Reference in downstream blocks: {{Webhook 1.email.subject}}, {{Webhook 1.email.from}}, {{Webhook 1.email.isRead}}


Slack

Triggers on Slack events like app mentions, messages, and reactions. Requires a Slack app signing secret.

Configuration

SettingTypeDescription
Signing SecretPasswordSlack app signing secret for request validation

Outputs

OutputTypeDescription
event.event_typestringType of Slack event (e.g., app_mention, message)
event.channelstringSlack channel ID
event.channel_namestringHuman-readable channel name
event.userstringUser ID who triggered the event
event.user_namestringUsername who triggered the event
event.textstringMessage text content
event.timestampstringEvent timestamp
event.team_idstringSlack workspace/team ID
event.event_idstringUnique event identifier

Sample Payload

{
  "type": "event_callback",
  "event": {
    "type": "app_mention",
    "channel": "C0123456789",
    "user": "U0123456789",
    "text": "<@U0BOTUSER123> Hello from Slack!",
    "ts": "1234567890.123456",
    "channel_type": "channel"
  },
  "team_id": "T0123456789",
  "event_id": "Ev0123456789",
  "event_time": 1234567890
}

Usage Example

Reference in downstream blocks: {{Webhook 1.event.text}}, {{Webhook 1.event.user_name}}, {{Webhook 1.event.channel_name}}


GitHub

Triggers on GitHub events like push, pull requests, issues, and more. Supports webhook secret for signature verification.

Configuration

SettingTypeDescription
Content TypeSelectapplication/json or application/x-www-form-urlencoded
Webhook SecretPasswordSecret for signature validation (recommended)
SSL VerificationSelectenabled or disabled

Outputs

OutputTypeDescription
event_typestringType of GitHub event (e.g., push, pull_request, issues)
actionstringAction performed (e.g., opened, closed, synchronize)
branchstringBranch name extracted from ref
refstringGit reference (e.g., refs/heads/main)
beforestringSHA of the commit before the push
afterstringSHA of the commit after the push
createdbooleanWhether the push created the reference
deletedbooleanWhether the push deleted the reference
forcedbooleanWhether the push was forced
comparestringURL to compare changes
repository.namestringRepository name
repository.full_namestringFull name (owner/repo)
repository.html_urlstringRepository URL
repository.privatebooleanWhether repository is private
repository.default_branchstringDefault branch name
repository.owner.loginstringOwner username
repository.owner.avatar_urlstringOwner avatar URL
sender.loginstringUser who triggered the event
sender.idnumberSender user ID
sender.avatar_urlstringSender avatar URL
pusher.namestringPusher name
pusher.emailstringPusher email
commitsarrayArray of commit objects
commits[].idstringCommit SHA
commits[].messagestringCommit message
commits[].author.namestringCommit author name
commits[].author.emailstringCommit author email
commits[].addedarrayFiles added
commits[].removedarrayFiles removed
commits[].modifiedarrayFiles modified
head_commit.idstringHead commit SHA
head_commit.messagestringHead commit message
head_commit.timestampstringHead commit timestamp

Sample Payload (Pull Request)

{
  "action": "opened",
  "number": 1,
  "pull_request": {
    "id": 1, "number": 1, "state": "open", "title": "Update README",
    "user": { "login": "octocat", "id": 1 },
    "body": "This is a simple change to pull into main.",
    "head": { "ref": "feature-branch", "sha": "abc123" },
    "base": { "ref": "main", "sha": "def456" }
  },
  "repository": {
    "id": 35129377, "name": "public-repo", "full_name": "octocat/public-repo",
    "owner": { "login": "octocat", "id": 6752317 }
  },
  "sender": { "login": "octocat", "id": 6752317 }
}

Usage Example

Reference in downstream blocks: {{Webhook 1.action}}, {{Webhook 1.repository.full_name}}, {{Webhook 1.sender.login}}


Telegram

Triggers on messages sent to a Telegram bot. Requires a bot token from BotFather.

Configuration

SettingTypeDescription
Bot TokenPasswordTelegram bot token from BotFather

Outputs

OutputTypeDescription
message.update_idnumberUnique identifier for the update
message.message_idnumberUnique message identifier
message.from_idnumberUser ID who sent the message
message.from_usernamestringUsername of the sender
message.from_first_namestringFirst name of the sender
message.from_last_namestringLast name of the sender
message.chat_idnumberUnique identifier for the chat
message.chat_typestringType of chat (private, group, supergroup, channel)
message.chat_titlestringTitle of the chat (for groups/channels)
message.textstringMessage text content
message.datenumberDate sent (Unix timestamp)
message.entitiesstringSpecial entities (mentions, hashtags, etc.) as JSON

Sample Payload

{
  "update_id": 123456789,
  "message": {
    "message_id": 123,
    "from": {
      "id": 987654321, "is_bot": false, "first_name": "John",
      "last_name": "Doe", "username": "johndoe"
    },
    "chat": {
      "id": 987654321, "first_name": "John", "last_name": "Doe",
      "username": "johndoe", "type": "private"
    },
    "date": 1234567890,
    "text": "Hello from Telegram!"
  }
}

Usage Example

Reference in downstream blocks: {{Webhook 1.message.text}}, {{Webhook 1.message.from_username}}, {{Webhook 1.message.chat_id}}


WhatsApp

Triggers on incoming WhatsApp messages via the Business Platform. Requires a verification token.

Configuration

SettingTypeDescription
Verification TokenPasswordToken matching your WhatsApp Business Platform dashboard

Outputs

OutputTypeDescription
messageIdstringUnique message identifier
fromstringPhone number of the sender
phoneNumberIdstringWhatsApp Business phone number ID that received the message
textstringMessage text content
timestampstringMessage timestamp
rawstringComplete raw message object as JSON string

Sample Payload

{
  "object": "whatsapp_business_account",
  "entry": [{
    "id": "1234567890123456",
    "changes": [{
      "value": {
        "messaging_product": "whatsapp",
        "metadata": {
          "display_phone_number": "15551234567",
          "phone_number_id": "1234567890123456"
        },
        "contacts": [{ "profile": { "name": "John Doe" }, "wa_id": "15555551234" }],
        "messages": [{
          "from": "15555551234",
          "id": "wamid.HBgNMTU1NTU1NTEyMzQVAgASGBQz...",
          "timestamp": "1234567890",
          "text": { "body": "Hello from WhatsApp!" },
          "type": "text"
        }]
      },
      "field": "messages"
    }]
  }]
}

Usage Example

Reference in downstream blocks: {{Webhook 1.text}}, {{Webhook 1.from}}, {{Webhook 1.messageId}}


Stripe

Triggers on Stripe events like successful payments, subscription changes, and more. Events are selected in the Stripe dashboard.

Configuration

No additional configuration needed — configure event types in your Stripe dashboard.

Outputs

OutputTypeDescription
idstringStripe event ID
typestringEvent type (e.g., charge.succeeded, payment_intent.succeeded)
createdstringTimestamp when event was created
datastringEvent data containing the affected Stripe object
objectstringThe Stripe object type (e.g., charge, payment_intent)
livemodestringWhether event occurred in live mode
apiVersionstringAPI version used to render this event
requeststringInfo about the request that triggered this event

Sample Payload

{
  "id": "evt_1234567890",
  "type": "charge.succeeded",
  "created": 1641234567,
  "data": {
    "object": {
      "id": "ch_1234567890", "object": "charge", "amount": 2500,
      "currency": "usd", "description": "Sample charge", "paid": true,
      "status": "succeeded", "customer": "cus_1234567890",
      "receipt_email": "customer@example.com"
    }
  },
  "object": "event",
  "livemode": false,
  "api_version": "2020-08-27",
  "request": { "id": "req_1234567890", "idempotency_key": null }
}

Usage Example

Reference in downstream blocks: {{Webhook 1.type}}, {{Webhook 1.data}}, {{Webhook 1.id}}


Airtable

Triggers on Airtable record changes (create, update, delete). Requires OAuth with Airtable.

Configuration

SettingTypeDescription
Base IDTextAirtable Base ID (e.g., appXXXXXXXXXXXXXX)
Table IDTextTable ID within the base (e.g., tblXXXXXXXXXXXXXX)
Include Full Record DataToggleReceive complete record data, not just changes

Outputs

OutputTypeDescription
event_typestringType of event (e.g., record.created, record.updated, record.deleted)
base_idstringAirtable base identifier
table_idstringAirtable table identifier
record_idstringRecord identifier that was modified
record_datastringComplete record data (when Include Full Record Data is enabled)
changed_fieldsstringFields that were changed in the record
webhook_idstringUnique webhook identifier
timestampstringEvent timestamp

Sample Payload

{
  "webhook": { "id": "achAbCdEfGhIjKlMn" },
  "timestamp": "2023-01-01T00:00:00.000Z",
  "base": { "id": "appXXXXXXXXXXXXXX" },
  "table": { "id": "tblXXXXXXXXXXXXXX" },
  "changedTablesById": {
    "tblXXXXXXXXXXXXXX": {
      "changedRecordsById": {
        "recXXXXXXXXXXXXXX": {
          "current": {
            "id": "recXXXXXXXXXXXXXX",
            "fields": { "Name": "Sample Record", "Status": "Active" }
          },
          "previous": {
            "id": "recXXXXXXXXXXXXXX",
            "fields": { "Name": "Sample Record", "Status": "Inactive" }
          }
        }
      }
    }
  }
}

Usage Example

Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.record_id}}, {{Webhook 1.record_data}}


Microsoft Teams

Triggers on Microsoft Teams events like messages and mentions via an outgoing webhook.

Configuration

SettingTypeDescription
HMAC SecretPasswordSecurity token from Teams outgoing webhook setup

Outputs

OutputTypeDescription
typestringType of Teams message (e.g., message)
idstringUnique message identifier
timestampstringMessage timestamp
localTimestampstringLocal timestamp of the message
serviceUrlstringMicrosoft Teams service URL
channelIdstringTeams channel ID
from_idstringUser ID who sent the message
from_namestringUsername who sent the message
conversation_idstringConversation/thread ID
textstringMessage text content

Sample Payload

{
  "type": "message",
  "id": "1234567890",
  "timestamp": "2023-01-01T00:00:00.000Z",
  "localTimestamp": "2023-01-01T00:00:00.000Z",
  "serviceUrl": "https://smba.trafficmanager.net/amer/",
  "channelId": "msteams",
  "from": { "id": "29:1234567890abcdef", "name": "John Doe" },
  "conversation": { "id": "19:meeting_abcdef@thread.v2" },
  "text": "Hello Zelaxy Bot!"
}

Usage Example

Reference in downstream blocks: {{Webhook 1.text}}, {{Webhook 1.from_name}}, {{Webhook 1.conversation_id}}


Generic Webhook

Universal HTTP endpoint that accepts requests from any source. No provider-specific validation.

See the dedicated Generic Webhook page for full details, including comprehensive data access examples.

Outputs

For generic webhooks, the raw HTTP request is stored under the webhook.data namespace:

PathTypeDescription
webhook.data.payloadjsonComplete HTTP request body
webhook.data.payload.<field>anyAny field from the request body
webhook.data.headersjsonHTTP request headers
webhook.data.methodstringHTTP method (POST, PUT, etc.)
webhook.data.pathstringWebhook path identifier
webhook.data.providerstringAlways "generic"

Usage Example

If the external service sends:

{
  "event": "message.received",
  "data": {
    "provider_message_id": "msg_abc123",
    "content": "Hello world"
  }
}

Reference in downstream blocks:

  • {{Webhook 1.webhook.data.payload}} — full body
  • {{Webhook 1.webhook.data.payload.event}}"message.received"
  • {{Webhook 1.webhook.data.payload.data.provider_message_id}}"msg_abc123"
  • {{Webhook 1.webhook.data.payload.data.content}}"Hello world"
  • {{Webhook 1.webhook.data.headers}} — request headers
  • {{Webhook 1.webhook.data.method}}"POST"

Data Access Reference

Variable Syntax

All webhook data is accessed using the {{BlockName.path.to.field}} template syntax inside any connected downstream block (Agent, Function, API, Condition, etc.).

{{Webhook 1.path.to.field}}
  • Block name = the label on the canvas (default: Webhook 1)
  • Path = dot-separated property path into the block output
  • Block names are normalized: case-insensitive, spaces removed (Webhook 1 = webhook1)

Provider-Specific vs Raw Data Access

ProviderConvenient Access (Flattened)Raw Access (Always Available)
Gmail{{Webhook 1.email.subject}}{{Webhook 1.webhook.data.payload}}
Outlook{{Webhook 1.email.subject}}{{Webhook 1.webhook.data.payload}}
Slack{{Webhook 1.event.text}}{{Webhook 1.webhook.data.payload}}
GitHub{{Webhook 1.action}}{{Webhook 1.webhook.data.payload}}
Telegram{{Webhook 1.message.text}}{{Webhook 1.webhook.data.payload}}
WhatsApp{{Webhook 1.whatsapp.data.text}}{{Webhook 1.webhook.data.payload}}
Stripe{{Webhook 1.type}}{{Webhook 1.webhook.data.payload}}
Microsoft Teams{{Webhook 1.text}}{{Webhook 1.webhook.data.payload}}
GenericN/A — use raw access{{Webhook 1.webhook.data.payload.field}}

Nested Field Access

Use dots to traverse nested objects:

{{Webhook 1.webhook.data.payload.data.provider_message_id}}

This resolves the path: outputwebhookdatapayloaddataprovider_message_id

Array Access

Use bracket notation to access array elements:

{{Webhook 1.webhook.data.payload.items[0].name}}

Common Generic Webhook Patterns

What you wantReference
Full HTTP body{{Webhook 1.webhook.data.payload}}
Top-level body field{{Webhook 1.webhook.data.payload.fieldName}}
Nested body field{{Webhook 1.webhook.data.payload.parent.child}}
Array element{{Webhook 1.webhook.data.payload.items[0]}}
HTTP headers{{Webhook 1.webhook.data.headers}}
HTTP method{{Webhook 1.webhook.data.method}}

Security

  • Always set a webhook secret — validates that requests come from the actual service
  • HTTPS only — all webhook URLs use HTTPS
  • Signature verification — Zelaxy validates webhook signatures automatically for supported providers

Tips

  • Each workflow has a unique URL — don't share it publicly
  • Test with curl: curl -X POST https://your-webhook-url -H "Content-Type: application/json" -d '{"test": true}'
  • Retry handling — some services retry failed webhooks; ensure your workflow is idempotent