Webhook Trigger
Start workflows from service-specific webhook events
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
| Property | Value |
|---|---|
| Type | webhook |
| Category | Trigger |
Supported Providers
Zelaxy supports webhook triggers from the following services. Each provider has its own output schema — see the detailed sections below.
| Provider | Trigger ID | Auth Type | Description |
|---|---|---|---|
| Gmail | gmail_poller | OAuth | Triggers on new emails |
| Outlook | outlook_poller | OAuth | Triggers on new emails |
| Slack | slack_webhook | Signing Secret | Triggers on messages, mentions, reactions |
| GitHub | github_webhook | Webhook Secret | Triggers on push, PRs, issues |
| Telegram | telegram_webhook | Bot Token | Triggers on bot messages |
whatsapp_webhook | Verification Token | Triggers on incoming messages | |
| Stripe | stripe_webhook | — | Triggers on payments, subscriptions |
| Airtable | airtable_webhook | OAuth | Triggers on record changes |
| Microsoft Teams | microsoftteams_webhook | HMAC Secret | Triggers on messages and mentions |
| GitLab | gitlab_webhook | Secret Token | Triggers on pushes, merge requests, issues, pipelines |
| Typeform | typeform_webhook | Webhook Secret | Triggers on form submissions |
| Sentry | sentry_webhook | Client Secret | Triggers on issues, errors, alerts |
| Calendly | calendly_webhook | Signing Key | Triggers on bookings and cancellations |
| PagerDuty | pagerduty_webhook | Webhook Secret | Triggers on incident lifecycle events |
| Vercel | vercel_webhook | Webhook Secret | Triggers on deployments and project changes |
| Zoom | zoom_webhook | Secret Token | Triggers on meetings, participants, recordings |
| Clerk | clerk_webhook | Svix Signing Secret | Triggers on users, sessions, organizations |
| Cal.com | calcom_webhook | Webhook Secret | Triggers on bookings |
| Resend | resend_webhook | Svix Signing Secret | Triggers on email delivery events |
| Twilio SMS | twilio_webhook | Auth Token | Triggers on incoming SMS/MMS |
| Twilio Voice | twilio_voice_webhook | Auth Token | Triggers on incoming calls and call status |
| Attio | attio_webhook | — | Triggers on records, notes, tasks, and lists changing |
| Azure DevOps | azure_devops_webhook | — | Triggers on builds, work items, and pull requests |
| Gong | gong_webhook | Authorization token | Triggers on calls being processed and transcripts becoming ready |
| Greenhouse | greenhouse_webhook | Secret key | Triggers on candidates being hired, rejected, or changing stage |
| Ashby | ashby_webhook | Secret token | Triggers on applications submitted and candidates changing stage |
| incident.io | incidentio_webhook | Svix signing secret | Triggers on incidents being created, updated, or resolved |
| Rootly | rootly_webhook | Signing secret | Triggers on incidents being created, mitigated, or resolved |
| RevenueCat | revenuecat_webhook | Authorization header value | Triggers on purchases, renewals, cancellations, and expirations |
| Loops | loops_webhook | — | Triggers on email sent, delivered, opened, clicked, and bounced |
| Fathom | fathom_webhook | — | Triggers when a meeting recording, summary, or transcript is ready |
| Grain | grain_webhook | — | Triggers on recordings completing and highlights being created |
| Instantly | instantly_webhook | — | Triggers on campaign replies, opens, clicks, and bounces |
| lemlist | lemlist_webhook | — | Triggers on campaign replies, opens, clicks, and bounces |
| Linq | linq_webhook | — | Triggers on messages being delivered, failing, or replied to |
| Circleback | circleback_webhook | Authorization value | Triggers when a meeting completes and notes or action items are ready |
| EmailBison | emailbison_webhook | Authorization value | Triggers on replies received and sending accounts disconnecting |
| Sendblue | sendblue_webhook | — | Triggers on iMessage/SMS messages received or status changing |
| RSS | rss_poller | — (polled) | Triggers on new feed items |
| Google Forms | google_forms_webhook | Shared secret | Triggers on new form responses |
| IMAP | imap_poller | — (polled) | Triggers on new email, any provider |
| Jira Service Management | jira_service_management_webhook | Webhook secret | Triggers on request created/updated/commented |
| Generic | generic_webhook | — | Universal HTTP endpoint |
How It Works
- Activate the workflow — a unique webhook URL is generated
- Copy the URL and register it in the external service's webhook settings
- When the service sends an event, the workflow triggers
- 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}} - 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:
| Reference | Description |
|---|---|
{{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.) |
Signature verification
When you configure a signing secret for a supported provider, Zelaxy verifies every incoming delivery and rejects requests whose signature does not match (HTTP 401) — so a caller who merely knows the URL cannot fire the workflow. Verification is enforced for GitHub, Slack, Linear, Asana, GitLab, Typeform, Sentry, Calendly, PagerDuty, Vercel, Zoom, Clerk, Resend, Cal.com, Twilio, and the Atlassian/support integrations Jira, Confluence, Notion, Intercom, and Zendesk.
The scheme matches each provider's documented signing exactly — for example Intercom is HMAC-SHA1
over the body (sha1= in X-Hub-Signature), Notion and Jira/Confluence are HMAC-SHA256 hex
(sha256=), and Zendesk is base64 HMAC-SHA256 over timestamp + body with a 5-minute freshness
window. Notion's initial unsigned verification handshake is acknowledged automatically. Providers
with no documented signing scheme are intentionally left unverified rather than guessing a scheme
that would silently reject genuine deliveries — use the generic webhook's bearer token or IP
allowlist for those.
Gmail
Triggers when new emails are received in a connected Gmail account. Requires OAuth with Google.
Configuration
| Setting | Type | Description |
|---|---|---|
| Gmail Account | OAuth | Select connected Gmail account |
| Labels to Monitor | Multi-select | Gmail labels to watch (empty = all) |
| Label Filter Behavior | Select | INCLUDE or EXCLUDE selected labels |
| Mark as Read | Toggle | Mark processed emails as read |
| Include Raw Email Data | Toggle | Include full Gmail API response |
Outputs
| Output | Type | Description |
|---|---|---|
email.id | string | Gmail message ID |
email.threadId | string | Gmail thread ID |
email.subject | string | Email subject line |
email.from | string | Sender email address |
email.to | string | Recipient email address |
email.cc | string | CC recipients |
email.date | string | Email date (ISO format) |
email.bodyText | string | Plain text email body |
email.bodyHtml | string | HTML email body |
email.labels | string | Email labels array |
email.hasAttachments | boolean | Whether email has attachments |
email.attachments | json | Array of attachment info (filename, mimeType, size) |
timestamp | string | Event timestamp |
rawEmail | json | Complete 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
| Setting | Type | Description |
|---|---|---|
| Microsoft Account | OAuth | Select connected Microsoft account |
| Folders to Monitor | Multi-select | Outlook folders to watch (empty = all) |
| Folder Filter Behavior | Select | INCLUDE or EXCLUDE selected folders |
| Mark as Read | Toggle | Mark processed emails as read |
| Include Raw Email Data | Toggle | Include full MS Graph API response |
Outputs
| Output | Type | Description |
|---|---|---|
email.id | string | Outlook message ID |
email.conversationId | string | Outlook conversation ID |
email.subject | string | Email subject line |
email.from | string | Sender email address |
email.to | string | Recipient email address |
email.cc | string | CC recipients |
email.date | string | Email date (ISO format) |
email.bodyText | string | Plain text email body (preview) |
email.bodyHtml | string | HTML email body |
email.hasAttachments | boolean | Whether email has attachments |
email.isRead | boolean | Whether email is read |
email.folderId | string | Outlook folder ID |
email.messageId | string | Message ID for threading |
email.threadId | string | Thread ID for conversation threading |
timestamp | string | Event timestamp |
rawEmail | json | Complete 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
| Setting | Type | Description |
|---|---|---|
| Signing Secret | Password | Slack app signing secret for request validation |
Outputs
| Output | Type | Description |
|---|---|---|
event.event_type | string | Type of Slack event (e.g., app_mention, message) |
event.channel | string | Slack channel ID |
event.channel_name | string | Human-readable channel name |
event.user | string | User ID who triggered the event |
event.user_name | string | Username who triggered the event |
event.text | string | Message text content |
event.timestamp | string | Event timestamp |
event.team_id | string | Slack workspace/team ID |
event.event_id | string | Unique 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
| Setting | Type | Description |
|---|---|---|
| Content Type | Select | application/json or application/x-www-form-urlencoded |
| Webhook Secret | Password | Secret for signature validation (recommended) |
| SSL Verification | Select | enabled or disabled |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | Type of GitHub event (e.g., push, pull_request, issues) |
action | string | Action performed (e.g., opened, closed, synchronize) |
branch | string | Branch name extracted from ref |
ref | string | Git reference (e.g., refs/heads/main) |
before | string | SHA of the commit before the push |
after | string | SHA of the commit after the push |
created | boolean | Whether the push created the reference |
deleted | boolean | Whether the push deleted the reference |
forced | boolean | Whether the push was forced |
compare | string | URL to compare changes |
repository.name | string | Repository name |
repository.full_name | string | Full name (owner/repo) |
repository.html_url | string | Repository URL |
repository.private | boolean | Whether repository is private |
repository.default_branch | string | Default branch name |
repository.owner.login | string | Owner username |
repository.owner.avatar_url | string | Owner avatar URL |
sender.login | string | User who triggered the event |
sender.id | number | Sender user ID |
sender.avatar_url | string | Sender avatar URL |
pusher.name | string | Pusher name |
pusher.email | string | Pusher email |
commits | array | Array of commit objects |
commits[].id | string | Commit SHA |
commits[].message | string | Commit message |
commits[].author.name | string | Commit author name |
commits[].author.email | string | Commit author email |
commits[].added | array | Files added |
commits[].removed | array | Files removed |
commits[].modified | array | Files modified |
head_commit.id | string | Head commit SHA |
head_commit.message | string | Head commit message |
head_commit.timestamp | string | Head 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
| Setting | Type | Description |
|---|---|---|
| Bot Token | Password | Telegram bot token from BotFather |
Outputs
| Output | Type | Description |
|---|---|---|
message.update_id | number | Unique identifier for the update |
message.message_id | number | Unique message identifier |
message.from_id | number | User ID who sent the message |
message.from_username | string | Username of the sender |
message.from_first_name | string | First name of the sender |
message.from_last_name | string | Last name of the sender |
message.chat_id | number | Unique identifier for the chat |
message.chat_type | string | Type of chat (private, group, supergroup, channel) |
message.chat_title | string | Title of the chat (for groups/channels) |
message.text | string | Message text content |
message.date | number | Date sent (Unix timestamp) |
message.entities | string | Special 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}}
Triggers on incoming WhatsApp messages via the Business Platform. Requires a verification token.
Configuration
| Setting | Type | Description |
|---|---|---|
| Verification Token | Password | Token matching your WhatsApp Business Platform dashboard |
Outputs
| Output | Type | Description |
|---|---|---|
messageId | string | Unique message identifier |
from | string | Phone number of the sender |
phoneNumberId | string | WhatsApp Business phone number ID that received the message |
text | string | Message text content |
timestamp | string | Message timestamp |
raw | string | Complete 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
| Output | Type | Description |
|---|---|---|
id | string | Stripe event ID |
type | string | Event type (e.g., charge.succeeded, payment_intent.succeeded) |
created | string | Timestamp when event was created |
data | string | Event data containing the affected Stripe object |
object | string | The Stripe object type (e.g., charge, payment_intent) |
livemode | string | Whether event occurred in live mode |
apiVersion | string | API version used to render this event |
request | string | Info 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
| Setting | Type | Description |
|---|---|---|
| Base ID | Text | Airtable Base ID (e.g., appXXXXXXXXXXXXXX) |
| Table ID | Text | Table ID within the base (e.g., tblXXXXXXXXXXXXXX) |
| Include Full Record Data | Toggle | Receive complete record data, not just changes |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | Type of event (e.g., record.created, record.updated, record.deleted) |
base_id | string | Airtable base identifier |
table_id | string | Airtable table identifier |
record_id | string | Record identifier that was modified |
record_data | string | Complete record data (when Include Full Record Data is enabled) |
changed_fields | string | Fields that were changed in the record |
webhook_id | string | Unique webhook identifier |
timestamp | string | Event 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
| Setting | Type | Description |
|---|---|---|
| HMAC Secret | Password | Security token from Teams outgoing webhook setup |
Outputs
| Output | Type | Description |
|---|---|---|
type | string | Type of Teams message (e.g., message) |
id | string | Unique message identifier |
timestamp | string | Message timestamp |
localTimestamp | string | Local timestamp of the message |
serviceUrl | string | Microsoft Teams service URL |
channelId | string | Teams channel ID |
from_id | string | User ID who sent the message |
from_name | string | Username who sent the message |
conversation_id | string | Conversation/thread ID |
text | string | Message 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:
| Path | Type | Description |
|---|---|---|
webhook.data.payload | json | Complete HTTP request body |
webhook.data.payload.<field> | any | Any field from the request body |
webhook.data.headers | json | HTTP request headers |
webhook.data.method | string | HTTP method (POST, PUT, etc.) |
webhook.data.path | string | Webhook path identifier |
webhook.data.provider | string | Always "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"
GitLab
Triggers on GitLab events like pushes, merge requests, issues, pipelines, and comments. The secret token is verified on every delivery.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret Token | Password | Sent by GitLab in X-Gitlab-Token; mismatches are rejected (recommended) |
| SSL Verification | Select | enabled or disabled |
Outputs
| Output | Type | Description |
|---|---|---|
object_kind | string | Event kind (push, merge_request, issue, pipeline, note) |
event_type | string | Value of the X-Gitlab-Event header (e.g. Push Hook) |
event_name | string | Event name, generally matching object_kind |
action | string | Action performed (e.g. open, merge, close) |
branch | string | Branch name extracted from ref |
ref | string | Git reference (e.g. refs/heads/main) |
before | string | SHA before the push |
after | string | SHA after the push |
checkout_sha | string | SHA of the most recent commit on ref |
commit_message | string | Message of the first commit in the push |
commit_author | string | Author of the first commit in the push |
total_commits_count | number | Number of commits in the push |
commits | array | Commits included in the push |
title | string | Title of the merge request or issue |
state | string | State of the merge request or issue |
url | string | URL of the changed object |
object_attributes | object | Changed object for merge request, issue, pipeline, note events |
project_id | number | Project ID |
project_name | string | Project name |
project_path | string | Full project path (namespace/project) |
project_url | string | Project web URL |
user_id | number | ID of the user who triggered the event |
user_name | string | Display name of the user |
user_username | string | Username of the user |
user_email | string | Email of the user |
project | object | Full project object |
repository | object | Repository information |
Sample Payload (Push)
{
"object_kind": "push",
"event_name": "push",
"ref": "refs/heads/main",
"checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"user_name": "John Smith",
"user_username": "jsmith",
"project_id": 15,
"project": {
"name": "Diaspora", "path_with_namespace": "mike/diaspora",
"web_url": "http://example.com/mike/diaspora", "default_branch": "main"
},
"commits": [
{ "id": "da15608", "message": "fix: typos in readme", "author": { "name": "John Smith" } }
],
"total_commits_count": 1
}Usage Example
Reference in downstream blocks: {{Webhook 1.object_kind}}, {{Webhook 1.branch}}, {{Webhook 1.commit_message}}
Typeform
Triggers when a form receives a new submission. Requires a Typeform PRO or PRO+ account. The webhook secret is verified on every delivery.
Configuration
| Setting | Type | Description |
|---|---|---|
| Webhook Secret | Password | Validates the Typeform-Signature header (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event_id | string | Unique ID of the webhook event |
event_type | string | Always form_response for submissions |
form_id | string | ID of the submitted form |
form_title | string | Title of the submitted form |
token | string | Unique token identifying this response |
submitted_at | string | When the form was submitted |
landed_at | string | When the respondent landed on the form |
fields | object | Answers keyed by question title, with values unwrapped to plain values |
answers | array | Raw answers array as sent by Typeform |
answer_count | number | Number of questions answered |
hidden | object | Hidden field values (e.g. UTM parameters) |
definition | object | Form definition, including the questions asked |
variables | array | Typeform variables (score, price, custom) |
calculated | object | Calculated values (e.g. score) |
ending | object | Ending screen the respondent reached |
raw | object | Complete original webhook payload |
fields is the convenient one: Typeform's raw answers array keys each value by its answer
type and references questions by opaque field id. Zelaxy unwraps that for you, so
{{Webhook 1.fields.What is your email?}} just works.
Sample Payload
{
"event_id": "01HZ8X2Q9Y3M4N5P6R7S8T9V0W",
"event_type": "form_response",
"form_response": {
"form_id": "lT4Z3j",
"token": "a3a12ec67a1365927098a606107fac15",
"submitted_at": "2024-01-15T13:14:15Z",
"definition": {
"id": "lT4Z3j", "title": "Customer Feedback",
"fields": [{ "id": "DlXFaesGBpoF", "type": "email", "title": "What is your email?" }]
},
"answers": [
{ "type": "email", "email": "ada@example.com", "field": { "id": "DlXFaesGBpoF", "type": "email" } }
],
"hidden": {}
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.form_title}}, {{Webhook 1.fields.What is your email?}}, {{Webhook 1.answer_count}}
Sentry
Triggers on Sentry issues, error events, and alert rules. The client secret is verified on every delivery.
Configuration
| Setting | Type | Description |
|---|---|---|
| Client Secret | Password | From your Sentry internal integration; validates Sentry-Hook-Signature (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
action | string | Action that occurred (created, resolved, assigned, ignored) |
resource | string | Value of the Sentry-Hook-Resource header (issue, error, event_alert) |
issue_id | string | Issue ID |
issue_title | string | Issue title |
issue_url | string | Permalink to the issue in Sentry |
short_id | string | Short identifier (e.g. MY-PROJECT-1) |
culprit | string | Where the issue occurred |
level | string | Severity (error, warning, info, fatal) |
status | string | Issue status (unresolved, resolved, ignored) |
event_count | string | Number of times the issue occurred |
user_count | number | Number of users affected |
first_seen | string | When the issue was first seen |
last_seen | string | When the issue was last seen |
project_slug | string | Slug of the owning project |
error_id | string | Event ID (error events) |
error_message | string | Error message (error events) |
environment | string | Environment the event came from |
actor_name | string | Who or what triggered the event |
data | object | Full event payload as sent by Sentry |
raw | object | Complete original webhook payload |
Sample Payload (Issue Created)
{
"action": "created",
"data": {
"issue": {
"id": "1234567890", "shortId": "MY-PROJECT-1",
"title": "TypeError: Cannot read property 'id' of undefined",
"culprit": "app/routes/checkout in handler",
"status": "unresolved", "level": "error", "count": "3", "userCount": 2,
"permalink": "https://sentry.io/organizations/my-org/issues/1234567890/",
"project": { "slug": "my-project" }
}
},
"actor": { "type": "application", "id": "sentry", "name": "Sentry" }
}Usage Example
Reference in downstream blocks: {{Webhook 1.issue_title}}, {{Webhook 1.level}}, {{Webhook 1.issue_url}}
Calendly
Triggers when an invitee books or cancels a meeting, or submits a routing form. The signing key is verified on every delivery.
Calendly webhooks are created through its API, not the dashboard. You need a Personal Access
Token and a POST to https://api.calendly.com/webhook_subscriptions — the signing_key in
the response is what goes in the config field below.
Configuration
| Setting | Type | Description |
|---|---|---|
| Webhook Signing Key | Password | Returned when the subscription is created; validates Calendly-Webhook-Signature (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event | string | invitee.created, invitee.canceled, or routing_form_submission.created |
invitee_name | string | Invitee full name |
invitee_email | string | Invitee email address |
invitee_timezone | string | Invitee timezone |
invitee_status | string | Invitee status (active, canceled) |
invitee_uri | string | Calendly URI for the invitee |
reschedule_url | string | URL the invitee can use to reschedule |
cancel_url | string | URL the invitee can use to cancel |
rescheduled | boolean | Whether the booking was rescheduled |
event_name | string | Name of the scheduled event |
event_uri | string | Calendly URI for the scheduled event |
event_status | string | Scheduled event status |
start_time | string | Event start time |
end_time | string | Event end time |
location | object | Where the meeting takes place |
join_url | string | Conferencing join URL, when available |
cancellation | object | Cancellation details (invitee.canceled) |
cancel_reason | string | Reason given for the cancellation |
answers | object | Booking answers keyed by question text |
questions_and_answers | array | Raw booking questions and answers |
tracking | object | UTM and Salesforce tracking parameters |
payload | object | Full payload object as sent by Calendly |
raw | object | Complete original webhook payload |
Sample Payload (Invitee Created)
{
"event": "invitee.created",
"created_at": "2024-01-15T13:14:15.000000Z",
"payload": {
"email": "ada@example.com", "name": "Ada Lovelace",
"status": "active", "timezone": "America/New_York", "rescheduled": false,
"questions_and_answers": [
{ "question": "What would you like to discuss?", "answer": "Pricing", "position": 0 }
],
"scheduled_event": {
"name": "30 Minute Meeting", "status": "active",
"start_time": "2024-01-20T15:00:00.000000Z",
"end_time": "2024-01-20T15:30:00.000000Z",
"location": { "type": "google_conference", "join_url": "https://meet.google.com/abc-defg-hij" }
}
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.invitee_email}}, {{Webhook 1.start_time}}, {{Webhook 1.join_url}}
PagerDuty
Triggers on incident lifecycle events — triggered, acknowledged, escalated, reassigned, resolved. The webhook secret is verified on every delivery.
Configuration
| Setting | Type | Description |
|---|---|---|
| Webhook Secret | Password | Shown once when the subscription is created; validates X-PagerDuty-Signature (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. incident.triggered, incident.resolved |
event_id | string | Unique ID of the webhook event |
occurred_at | string | When the event occurred |
incident_id | string | Incident ID |
incident_number | number | Human-facing incident number |
title | string | Incident title |
status | string | Incident status (triggered, acknowledged, resolved) |
urgency | string | Incident urgency (high, low) |
priority | string | Incident priority, when set |
html_url | string | Link to the incident in PagerDuty |
created_at | string | When the incident was created |
service_id | string | ID of the affected service |
service_name | string | Name of the affected service |
escalation_policy | string | Escalation policy name, when present |
assignees | array | Users currently assigned |
assignee_names | array | Names of the assigned users |
agent_name | string | Who performed the action, when present |
incident | object | Full incident object as sent by PagerDuty |
raw | object | Complete original webhook payload |
PagerDuty sends more than one signature during a secret rotation. Zelaxy accepts the delivery if any of them matches, so rotating a secret does not drop events.
Sample Payload (Incident Triggered)
{
"event": {
"id": "01DPXQZG4Z3ZBQ0N2T0Q9W8XYZ",
"event_type": "incident.triggered",
"occurred_at": "2024-01-15T13:14:15.000Z",
"agent": { "summary": "Ada Lovelace" },
"data": {
"id": "PABCDEF", "number": 1234, "title": "Checkout API returning 500s",
"status": "triggered", "urgency": "high",
"html_url": "https://acme.pagerduty.com/incidents/PABCDEF",
"service": { "id": "PSVC123", "summary": "Checkout API" },
"assignees": [{ "id": "PXXXXXX", "summary": "Ada Lovelace" }]
}
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.title}}, {{Webhook 1.urgency}}, {{Webhook 1.assignee_names}}
Vercel
Triggers on deployment and project events. The webhook secret is verified on every delivery.
Configuration
| Setting | Type | Description |
|---|---|---|
| Webhook Secret | Password | Shown when the webhook is created; validates x-vercel-signature (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. deployment.created, deployment.ready, deployment.error |
event_id | string | Unique ID of the webhook event |
created_at | number | Event creation timestamp (epoch ms) |
region | string | Region the event came from |
deployment_id | string | Deployment ID |
deployment_url | string | Deployment URL |
deployment_name | string | Deployment name |
target | string | Deployment target (production, preview) |
inspector_url | string | Link to the deployment in Vercel |
project_id | string | Project ID |
project_name | string | Project name |
team_id | string | Team ID, when the project belongs to a team |
user_id | string | ID of the user who triggered the event |
git_branch | string | Branch the deployment was built from |
git_sha | string | Commit SHA the deployment was built from |
git_message | string | Commit message the deployment was built from |
payload | object | Full payload object as sent by Vercel |
raw | object | Complete original webhook payload |
git_branch, git_sha, and git_message resolve across GitHub, GitLab, and Bitbucket —
Vercel keys this metadata differently per git provider.
Sample Payload (Deployment Ready)
{
"id": "uev_1234567890abcdef",
"type": "deployment.ready",
"createdAt": 1705324455000,
"region": "iad1",
"payload": {
"team": { "id": "team_abc123" },
"project": { "id": "prj_abc123", "name": "zelaxy-web" },
"deployment": {
"id": "dpl_abc123", "name": "zelaxy-web",
"url": "zelaxy-web-abc123.vercel.app", "target": "production",
"meta": {
"githubCommitRef": "main",
"githubCommitSha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"githubCommitMessage": "fix: correct minor typos in readme"
}
}
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.deployment_url}}, {{Webhook 1.git_branch}}
Zoom
Triggers on Zoom meeting, participant, and recording events. The Secret Token is required — Zoom validates the endpoint by calling it before the webhook can be enabled.
Enter the Secret Token before clicking Validate in Zoom. Zoom's validation handshake calls your endpoint and expects a token-derived response; without the token configured, validation fails and the webhook cannot be turned on. Zelaxy answers this handshake automatically.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret Token | Password | From your Zoom app credentials; required for endpoint validation and delivery verification |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. meeting.started, meeting.ended, recording.completed |
event_ts | number | Event timestamp (epoch ms) |
account_id | string | Zoom account ID |
meeting_id | string | Meeting ID |
meeting_uuid | string | Meeting UUID (unique per occurrence) |
topic | string | Meeting topic |
host_id | string | Meeting host ID |
start_time | string | Meeting start time |
end_time | string | Meeting end time |
duration | number | Duration in minutes |
join_url | string | Meeting join URL |
participant_name | string | Participant name (participant events) |
participant_email | string | Participant email |
participant_id | string | Participant user ID |
join_time | string | When the participant joined |
leave_time | string | When the participant left |
recording_files | array | Recording files (recording.completed) |
share_url | string | Recording share URL |
object | object | Full object as sent by Zoom |
raw | object | Complete original payload |
Sample Payload (Meeting Started)
{
"event": "meeting.started",
"event_ts": 1705324455000,
"payload": {
"account_id": "abc123",
"object": {
"id": "81234567890", "uuid": "aBcDeFgHiJk==",
"topic": "Weekly Standup", "host_id": "xyz789",
"start_time": "2024-01-15T13:00:00Z", "duration": 30
}
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.topic}}, {{Webhook 1.participant_name}}
Clerk
Triggers on Clerk user, session, and organization events. Clerk signs deliveries with Svix.
Configuration
| Setting | Type | Description |
|---|---|---|
| Signing Secret | Password | From the Clerk webhook endpoint; starts with whsec_ (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. user.created, user.updated, session.created |
object_id | string | ID of the user, session, or organization |
email | string | Primary email address (user events) |
first_name | string | User first name |
last_name | string | User last name |
full_name | string | First and last name joined |
username | string | Username, when set |
image_url | string | User avatar URL |
user_id | string | Related user ID (session and membership events) |
organization | object | Organization (membership events) |
name | string | Organization name (organization events) |
slug | string | Organization slug |
created_at | number | Record creation timestamp |
updated_at | number | Record update timestamp |
data | object | Full data object as sent by Clerk |
raw | object | Complete original payload |
email resolves the account's primary address via primary_email_address_id, not simply the
first entry in email_addresses — those differ once a user adds a second address.
Sample Payload (User Created)
{
"type": "user.created",
"object": "event",
"data": {
"id": "user_2abc123",
"first_name": "Ada", "last_name": "Lovelace", "username": "ada",
"primary_email_address_id": "idn_2abc",
"email_addresses": [{ "id": "idn_2abc", "email_address": "ada@example.com" }],
"created_at": 1705324455000
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.email}}, {{Webhook 1.full_name}}
Cal.com
Triggers on Cal.com booking events — created, rescheduled, cancelled, and meeting ended.
Configuration
| Setting | Type | Description |
|---|---|---|
| Webhook Secret | Password | Set the same value in Cal.com; validates x-cal-signature-256 (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. BOOKING_CREATED, BOOKING_CANCELLED, BOOKING_RESCHEDULED |
booking_id | string | Booking ID |
uid | string | Booking UID |
title | string | Booking title |
event_type_name | string | Name of the booked event type |
start_time | string | Booking start time |
end_time | string | Booking end time |
organizer_name | string | Organizer name |
organizer_email | string | Organizer email |
attendee_name | string | Primary attendee name |
attendee_email | string | Primary attendee email |
attendee_timezone | string | Primary attendee timezone |
attendees | array | All attendees |
location | string | Booking location |
status | string | Booking status |
cancellation_reason | string | Reason given when cancelled |
meeting_url | string | Video meeting URL, when available |
answers | object | Booking answers, unwrapped to plain values |
responses | object | Raw responses object as sent by Cal.com |
raw | object | Complete original payload |
Cal.com wraps each booking answer as { label, value }. answers unwraps that for you, so
{{Webhook 1.answers.name}} gives the value directly; responses keeps the raw shape.
Sample Payload (Booking Created)
{
"triggerEvent": "BOOKING_CREATED",
"createdAt": "2024-01-15T13:14:15.000Z",
"payload": {
"bookingId": 123456, "uid": "abc123xyz",
"title": "30 Min Meeting between Ada and Alan",
"startTime": "2024-01-20T15:00:00Z", "endTime": "2024-01-20T15:30:00Z",
"status": "ACCEPTED",
"organizer": { "name": "Ada Lovelace", "email": "ada@example.com" },
"attendees": [{ "name": "Alan Turing", "email": "alan@example.com" }],
"responses": { "name": { "label": "your_name", "value": "Alan Turing" } }
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.title}}, {{Webhook 1.attendee_email}}, {{Webhook 1.answers.name}}
Resend
Triggers on Resend email delivery events. Resend signs deliveries with Svix.
Configuration
| Setting | Type | Description |
|---|---|---|
| Signing Secret | Password | From the Resend webhook; starts with whsec_ (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | email.sent, email.delivered, email.opened, email.clicked, email.bounced, email.complained |
created_at | string | When the event occurred |
email_id | string | ID of the email |
from | string | Sender address |
to | array | Recipient addresses |
to_email | string | First recipient, for convenience |
subject | string | Email subject |
click_link | string | Clicked URL (email.clicked) |
click_timestamp | string | When the link was clicked |
bounce_type | string | Bounce type (email.bounced) |
bounce_message | string | Bounce message |
failure_reason | string | Failure reason |
data | object | Full data object as sent by Resend |
raw | object | Complete original payload |
Sample Payload (Email Delivered)
{
"type": "email.delivered",
"created_at": "2024-01-15T13:14:15.000Z",
"data": {
"email_id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c",
"from": "noreply@zelaxy.in",
"to": ["ada@example.com"],
"subject": "Welcome to Zelaxy"
}
}Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.to_email}}, {{Webhook 1.subject}}
Twilio SMS
Triggers when your Twilio number receives an SMS or MMS.
Twilio is the one provider here that posts application/x-www-form-urlencoded fields rather than
JSON, and it does not sign the body — it signs the request URL plus the sorted parameters,
with HMAC SHA-1. Zelaxy handles both, including reconstructing the public URL when running
behind a proxy.
Configuration
| Setting | Type | Description |
|---|---|---|
| Auth Token | Password | Your Twilio account Auth Token; validates X-Twilio-Signature (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
from | string | Sender phone number (E.164) |
to | string | Your Twilio number that received the message |
body | string | Message text (also used as the workflow input) |
message_sid | string | Unique message identifier |
account_sid | string | Twilio account identifier |
message_status | string | Message status (e.g. received) |
num_media | number | Number of media attachments |
media | array | Attachments, each with url and content_type |
from_city | string | Sender city, when resolvable |
from_state | string | Sender state |
from_country | string | Sender country |
error_code | string | Error code, when Twilio reports one |
raw | object | All form fields exactly as Twilio sent them |
Twilio spreads MMS attachments across numbered fields (MediaUrl0, MediaContentType0,
MediaUrl1, …). Zelaxy collects them into the media array so you can loop over them.
Sample Payload
{
"MessageSid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"AccountSid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"From": "+15551234567",
"To": "+15559876543",
"Body": "Hello from Twilio",
"NumMedia": "0",
"FromCity": "SAN FRANCISCO",
"SmsStatus": "received"
}Usage Example
Reference in downstream blocks: {{Webhook 1.from}}, {{Webhook 1.body}}, {{Webhook 1.media}}
Twilio Voice
Triggers when your Twilio number receives a call, or when a call status or recording changes.
Twilio expects TwiML in response to script a call. Zelaxy acknowledges the webhook and starts your workflow, so use this to react to calls — log, notify, enrich — rather than to drive the call flow itself.
Configuration
| Setting | Type | Description |
|---|---|---|
| Auth Token | Password | Your Twilio account Auth Token; validates X-Twilio-Signature (recommended) |
Outputs
| Output | Type | Description |
|---|---|---|
from | string | Caller phone number (E.164) |
to | string | Your Twilio number that received the call |
call_sid | string | Unique call identifier |
account_sid | string | Twilio account identifier |
call_status | string | ringing, in-progress, completed, busy, failed, no-answer |
direction | string | Call direction (inbound, outbound-api) |
call_duration | string | Duration in seconds, when completed |
recording_url | string | Recording URL, for recording callbacks |
recording_sid | string | Recording identifier |
recording_duration | string | Recording duration in seconds |
from_city | string | Caller city, when resolvable |
raw | object | All form fields exactly as Twilio sent them |
Sample Payload
{
"CallSid": "CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"AccountSid": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"From": "+15551234567",
"To": "+15559876543",
"CallStatus": "ringing",
"Direction": "inbound"
}Usage Example
Reference in downstream blocks: {{Webhook 1.from}}, {{Webhook 1.call_status}}, {{Webhook 1.recording_url}}
Attio
Triggers on records, notes, tasks, and lists changing.
Attio batches events into one delivery. The top-level fields describe the first event; read events to handle them all.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | Event type (record.created, record.updated, note.created) |
webhook_id | string | Webhook subscription ID |
record_id | string | ID of the affected record |
object_id | string | Attio object ID |
actor_type | string | Who performed the change |
actor_id | string | Actor ID |
events | array | All events in the delivery |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.webhook_id}}, {{Webhook 1.record_id}}
Azure DevOps
Triggers on builds, work items, and pull requests.
Azure DevOps returns work item fields under dotted keys like System.Title. Zelaxy lifts those into work_item_title / work_item_state so you do not have to quote them.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. build.complete, workitem.created |
message | string | Event summary (also the workflow input) |
build_number | string | Build number |
build_result | string | succeeded, failed, canceled |
work_item_id | number | Work item ID |
work_item_title | string | Work item title |
work_item_state | string | Work item state |
pull_request_id | number | Pull request ID |
project | string | Project name |
resource | object | Full resource object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.message}}, {{Webhook 1.build_number}}
Gong
Triggers on calls being processed and transcripts becoming ready.
Gong does not sign the body — it sends whatever Authorization header you configure on the automation rule, and Zelaxy compares it in constant time.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Authorization token — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | Event type sent by the Gong rule |
call_id | string | Gong call ID |
call_title | string | Call title |
call_url | string | Link to the call |
started | string | When the call started |
duration | number | Duration in seconds |
participants | array | Call participants |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.call_id}}, {{Webhook 1.call_title}}
Greenhouse
Triggers on candidates being hired, rejected, or changing stage.
Greenhouse signs with the Signature: sha256 <hex> form — note the space, not an =.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Secret key — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. candidate_hired, candidate_stage_change |
candidate_id | number | Candidate ID |
candidate_name | string | Candidate full name |
candidate_email | string | Candidate primary email |
application_id | number | Application ID |
job_id | number | Job ID |
job_name | string | Job name |
stage | string | Current stage |
status | string | Application status |
payload | object | Full payload object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.candidate_id}}, {{Webhook 1.candidate_name}}
Ashby
Triggers on applications submitted and candidates changing stage.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Secret token — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. applicationSubmit, candidateStageChange |
candidate_id | string | Candidate ID |
candidate_name | string | Candidate name |
candidate_email | string | Candidate primary email |
application_id | string | Application ID |
job_title | string | Job title |
stage | string | Current interview stage |
status | string | Application status |
data | object | Full data object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.candidate_id}}, {{Webhook 1.candidate_name}}
incident.io
Triggers on incidents being created, updated, or resolved.
incident.io signs with Svix, the same scheme as Clerk and Resend. Zelaxy reads public_data, private_data, or data, whichever the event carries.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Svix signing secret — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. public_incident.incident_created_v2 |
incident_id | string | Incident ID |
incident_name | string | Incident name |
incident_status | string | Incident status |
severity | string | Incident severity |
summary | string | Incident summary |
permalink | string | Link to the incident |
reference | string | Reference (e.g. INC-123) |
created_at | string | When it was created |
data | object | Full event data |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.incident_id}}, {{Webhook 1.incident_name}}
Rootly
Triggers on incidents being created, mitigated, or resolved.
Rootly uses a JSON:API shape (data.attributes.*). Zelaxy flattens it so you reference incident_title rather than walking the envelope.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Signing secret — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. incident.created, incident.resolved |
incident_id | string | Incident ID |
incident_title | string | Incident title |
incident_status | string | Incident status |
severity | string | Incident severity |
summary | string | Incident summary |
url | string | Link to the incident |
created_at | string | When it was created |
data | object | Full data object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.incident_id}}, {{Webhook 1.incident_title}}
RevenueCat
Triggers on purchases, renewals, cancellations, and expirations.
RevenueCat does not sign the body — it sends the exact Authorization header value you configure. Check environment before acting: sandbox events look identical to production ones.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Authorization header value — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | INITIAL_PURCHASE, RENEWAL, CANCELLATION, EXPIRATION |
event_id | string | Unique event ID |
app_user_id | string | Your app user ID |
product_id | string | Product identifier |
entitlement_ids | array | Entitlements affected |
store | string | APP_STORE, PLAY_STORE, STRIPE |
environment | string | SANDBOX or PRODUCTION |
period_type | string | TRIAL, INTRO, NORMAL |
price | number | Price paid |
currency | string | Currency code |
expiration_at_ms | number | Expiry (epoch ms) |
purchased_at_ms | number | Purchase time (epoch ms) |
cancel_reason | string | Cancellation reason |
event | object | Full event object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.event_id}}, {{Webhook 1.app_user_id}}
Loops
Triggers on email sent, delivered, opened, clicked, and bounced.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | e.g. email.opened, email.clicked |
email | string | Recipient email |
contact_id | string | Loops contact ID |
campaign_id | string | Campaign ID |
campaign_name | string | Campaign name |
email_message_id | string | Message ID |
link_url | string | Clicked link |
timestamp | string | When it occurred |
data | object | Full data object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.email}}, {{Webhook 1.contact_id}}
Fathom
Triggers when a meeting recording, summary, or transcript is ready.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | Event type reported by Fathom |
meeting_id | string | Meeting ID |
meeting_title | string | Meeting title |
recording_url | string | Link to the recording |
share_url | string | Shareable link |
scheduled_start_time | string | Scheduled start |
summary | string | AI summary |
transcript | string | Transcript |
invitees | array | Meeting invitees |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.meeting_id}}, {{Webhook 1.meeting_title}}
Grain
Triggers on recordings completing and highlights being created.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | recording.completed, highlight.created |
recording_id | string | Recording ID |
recording_title | string | Recording title |
recording_url | string | Link to the recording |
highlight_id | string | Highlight ID |
highlight_text | string | Highlight text |
start_datetime | string | Recording start |
end_datetime | string | Recording end |
participants | array | Participants |
data | object | Full data object |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.recording_id}}, {{Webhook 1.recording_title}}
Instantly
Triggers on campaign replies, opens, clicks, and bounces.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | reply_received, email_opened, link_clicked |
campaign_id | string | Campaign ID |
campaign_name | string | Campaign name |
lead_email | string | Lead email |
lead_first_name | string | Lead first name |
lead_last_name | string | Lead last name |
lead_company | string | Lead company |
email_account | string | Sending account |
reply_text | string | Reply body |
reply_subject | string | Reply subject |
timestamp | string | When it occurred |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.campaign_id}}, {{Webhook 1.campaign_name}}
lemlist
Triggers on campaign replies, opens, clicks, and bounces.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | emailsReplied, emailsOpened, emailsClicked |
campaign_id | string | Campaign ID |
campaign_name | string | Campaign name |
lead_email | string | Lead email |
lead_first_name | string | Lead first name |
lead_company | string | Lead company |
sequence_step | number | Sequence step |
text | string | Reply text |
created_at | string | When it occurred |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.campaign_id}}, {{Webhook 1.campaign_name}}
Linq
Triggers on messages being delivered, failing, or replied to.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | message.delivered, message.failed, message.received |
message_id | string | Message ID |
status | string | Message status |
from | string | Sender |
to | string | Recipient |
body | string | Message body (also the workflow input) |
error_message | string | Error message |
timestamp | string | When it occurred |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.message_id}}, {{Webhook 1.status}}
Circleback
Triggers when a meeting completes and notes or action items are ready.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Authorization value — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | meeting.completed, meeting.notes.ready |
meeting_id | string | Meeting ID |
meeting_name | string | Meeting name |
meeting_url | string | Link to the meeting |
start_time | string | Meeting start |
end_time | string | Meeting end |
notes | string | Meeting notes |
action_items | array | Extracted action items |
attendees | array | Meeting attendees |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.meeting_id}}, {{Webhook 1.meeting_name}}
EmailBison
Triggers on replies received and sending accounts disconnecting.
Configuration
| Setting | Type | Description |
|---|---|---|
| Secret | Password | Authorization value — validated on every delivery |
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | reply_received, email_account_disconnected |
campaign_id | string | Campaign ID |
campaign_name | string | Campaign name |
lead_email | string | Lead email |
email_account | string | Sending account |
subject | string | Email subject |
reply_text | string | Reply body |
timestamp | string | When it occurred |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.campaign_id}}, {{Webhook 1.campaign_name}}
Sendblue
Triggers on iMessage/SMS messages received or status changing.
Sendblue does not send an explicit event name. Zelaxy derives event_type from is_outbound: inbound messages become message.received, outbound status callbacks become message.status_updated.
Configuration
This provider does not sign or authenticate its webhooks. Treat the webhook URL as the secret — it is unguessable, but anyone who has it can start your workflow. Use the provider's IP allowlist if it offers one.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | message.received or message.status_updated |
message_handle | string | Message handle |
from_number | string | Sender number |
to_number | string | Recipient number |
content | string | Message content (also the workflow input) |
status | string | Message status |
error_message | string | Error message |
is_outbound | boolean | Whether outbound |
media_url | string | Media URL |
date_sent | string | When sent |
raw | object | Complete original payload |
Usage Example
Reference in downstream blocks: {{Webhook 1.event_type}}, {{Webhook 1.message_handle}}, {{Webhook 1.from_number}}
RSS
Triggers once per new item published to an RSS or Atom feed.
RSS is polled, not pushed — it is the only trigger here with no webhook URL to register. You give Zelaxy a feed URL and it checks the feed for you.
Connecting a feed does not replay its history. The first poll records what is already published and triggers nothing; only items appearing afterwards start a run. Without that, adding a feed would immediately fire your workflow once for every post ever published.
Configuration
| Setting | Type | Description |
|---|---|---|
| Feed URL | Text | The RSS or Atom feed to watch (required) |
Outputs
| Output | Type | Description |
|---|---|---|
title | string | Item title (also the workflow input) |
link | string | Item link |
description | string | Item description or summary |
pub_date | string | Publication date as given by the feed |
item_id | string | Stable item identifier (guid, id, or link) |
feed_url | string | The feed the item came from |
item | object | The parsed item object |
raw | object | Complete payload as delivered by the poller |
How it behaves
- Runs once per new item, oldest first, so a burst of posts arrives in publication order.
- Items are identified by their
guid(falling back toid, then link, then title), so editing a title or link in place does not re-trigger. - At most 10 items fire per poll of a feed, so a feed that publishes a large backlog cannot flood your workflow.
- Recent item ids are remembered, so an item that briefly drops out of the feed window and comes back is not treated as new.
Sample Payload
{
"feedUrl": "https://example.com/feed.xml",
"item": {
"id": "https://example.com/posts/hello-world",
"title": "Hello world",
"link": "https://example.com/posts/hello-world",
"pubDate": "Mon, 15 Jan 2024 13:14:15 GMT",
"description": "Our first post."
}
}Usage Example
Reference in downstream blocks: {{RSS 1.title}}, {{RSS 1.link}}, {{RSS 1.description}}
Google Forms
Triggers when a form receives a new response.
Google Forms has no native webhooks. You connect it with a short Apps Script that runs on submit and posts to Zelaxy. The script is below — this is the one trigger that needs code on your side.
Configuration
| Setting | Type | Description |
|---|---|---|
| Shared Secret | Password | The script sends this as a Bearer token; mismatches are rejected (recommended) |
Setup
- Open your form, click the three-dot menu > Apps Script.
- Paste the script below, replacing
WEBHOOK_URLandSHARED_SECRETwith the values from the trigger. - In the Apps Script editor open Triggers (clock icon) > Add Trigger: function
onFormSubmit, event source From form, event type On form submit. - Authorise the script when prompted, then submit a test response.
function onFormSubmit(e) {
const WEBHOOK_URL = "<your webhook URL>";
const SHARED_SECRET = "<your shared secret>";
const formResponse = e.response;
const itemResponses = formResponse.getItemResponses();
const answers = {};
for (var i = 0; i < itemResponses.length; i++) {
answers[itemResponses[i].getItem().getTitle()] = itemResponses[i].getResponse();
}
const payload = {
provider: "google_forms",
formId: e.source.getId(),
responseId: formResponse.getId(),
createTime: formResponse.getTimestamp().toISOString(),
lastSubmittedTime: formResponse.getTimestamp().toISOString(),
answers: answers
};
UrlFetchApp.fetch(WEBHOOK_URL, {
method: "post",
contentType: "application/json",
headers: { "Authorization": "Bearer " + SHARED_SECRET },
payload: JSON.stringify(payload),
muteHttpExceptions: true
});
}Outputs
| Output | Type | Description |
|---|---|---|
form_id | string | Google Form ID |
response_id | string | Unique response identifier |
create_time | string | When the response was created |
last_submitted_time | string | When it was last submitted |
answers | object | Answers keyed by question title |
answer_count | number | Number of questions answered |
raw | object | Complete original payload |
answers is keyed by the question title, so a question titled "What is your email?" is
{{Webhook 1.answers.What is your email?}}. Renaming a question in the form changes the key.
Usage Example
Reference in downstream blocks: {{Webhook 1.form_id}}, {{Webhook 1.answers.What is your email?}}, {{Webhook 1.answer_count}}
IMAP
Triggers when a new email arrives in a mailbox. Works with any IMAP provider — Gmail, Outlook, Yahoo, Fastmail, or a self-hosted server.
Use an app password, not your account password. Gmail and Outlook refuse account passwords over IMAP once 2FA is enabled. Gmail: enable IMAP in Settings > Forwarding and POP/IMAP, then create one at myaccount.google.com/apppasswords.
IMAP is polled — there is no webhook URL. Zelaxy connects to your mailbox on a schedule. Connecting a mailbox does not replay existing mail: the first poll records where the mailbox is and triggers nothing.
Configuration
| Setting | Type | Description |
|---|---|---|
| IMAP Host | Text | e.g. imap.gmail.com, outlook.office365.com (required) |
| Port | Number | 993 for SSL/TLS, 143 for STARTTLS (required) |
| Use SSL/TLS | Switch | Leave on for 993 |
| Username | Text | Usually your full email address (required) |
| Password | Password | An app password (required) |
| Mailbox | Text | Folder to watch, defaults to INBOX |
| Mark as read | Switch | Mark each email read once it has started a run |
Outputs
| Output | Type | Description |
|---|---|---|
subject | string | Email subject (also the workflow input) |
from | string | Sender email address |
from_name | string | Sender display name |
to | array | Recipient addresses |
cc | array | CC addresses |
date | string | Email date in ISO format |
message_id | string | RFC Message-ID header |
uid | number | IMAP UID within the mailbox |
body_text | string | Plain text body, when available |
mailbox | string | Mailbox the email arrived in |
has_attachments | boolean | Whether the email has attachments |
raw | object | Complete payload as delivered by the poller |
How it behaves
- Runs once per new email, oldest first, capped at 25 per poll so a backlog cannot flood a workflow.
- Tracks position by IMAP UID. If the server changes
UIDVALIDITY— which invalidates every UID it ever issued — Zelaxy detects it, resyncs to the current end of the mailbox, and does not replay the mailbox. - If a workflow run fails to dispatch, the cursor is not advanced past it, so it is retried on the next poll rather than lost.
- Dropped connections and throttling are treated as normal and retried on the next poll.
Sample Payload
{
"mailbox": "INBOX",
"email": {
"uid": 1042,
"messageId": "<CAF=abc123@mail.example.com>",
"subject": "Invoice #4102",
"from": { "address": "billing@vendor.com", "name": "Vendor Billing" },
"to": ["ada@example.com"],
"date": "2024-01-15T13:14:15.000Z",
"hasAttachments": true
}
}Usage Example
Reference in downstream blocks: {{IMAP 1.subject}}, {{IMAP 1.from}}, {{IMAP 1.body_text}}
Jira Service Management
Triggers when a service desk request is created, updated, commented on, or resolved.
Configuration
| Setting | Type | Description |
|---|---|---|
| Webhook Secret | Password | Jira sends it as a Bearer token; mismatches are rejected (recommended) |
Setup
- In Jira, go to Settings > System > WebHooks and click Create a WebHook.
- Paste the Webhook URL into the URL field and the Webhook Secret into the Secret field.
- Tick the Issue events you want (created, updated, deleted) and Comment > created for comment events.
- Optionally add a JQL filter such as
project = SUPso only your service desk fires the workflow.
Outputs
| Output | Type | Description |
|---|---|---|
event_type | string | jira:issue_created, jira:issue_updated, comment_created |
issue_event_type | string | More specific name, e.g. issue_commented |
issue_key | string | Issue key, e.g. SUP-123 |
summary | string | Request summary (also the workflow input) |
description | string | Request description |
status | string | Current status name |
priority | string | Priority name |
request_type | string | Customer request type, when present |
reporter_name / reporter_email | string | Reporter |
assignee_name | string | Assignee |
project_key | string | Project key |
user_name | string | Who caused the event |
comment_body | string | Comment text (comment events) |
comment_author | string | Comment author |
comment_public | boolean | Whether the customer can see the comment |
changelog | object | What changed (update events) |
issue | object | Full issue object |
raw | object | Complete original payload |
comment_public reflects JSM's jsdPublic flag. Internal comments look identical to customer
replies in the payload apart from this field — check it before echoing a comment anywhere
customer-facing.
Usage Example
Reference in downstream blocks: {{Webhook 1.issue_key}}, {{Webhook 1.summary}}, {{Webhook 1.comment_body}}
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
| Provider | Convenient 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}} |
{{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}} |
| Generic | N/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: output → webhook → data → payload → data → provider_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 want | Reference |
|---|---|
| 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