Deployment Failure to Incident Management
This use case demonstrates how to route Vercel deployment webhooks through status-based filters to trigger incident management workflows—PagerDuty alerts, Slack #ops notifications, and Linear issue creation—each with severity-aware transforms and deployment ID deduplication.
Architecture
flowchart LR
Vercel[Vercel Deployment Webhooks] --> Source[Hookbase Source]
Source --> Filter{Status Filter}
Filter -->|error/failure| R1[Route: PagerDuty]
Filter -->|error/failure| R2[Route: Slack #ops]
Filter -->|error/failure| R3[Route: Linear]
R1 --> |Transform: Severity Mapping| D1[PagerDuty Incidents API]
R2 --> |Transform: Block Kit| D2[Slack #ops Channel]
R3 --> |Transform: Issue Format| D3[Linear Issue API]Flow:
- Vercel sends deployment webhooks to Hookbase source endpoint
- Source verifies Vercel webhook signature
- Filter evaluates deployment status for
errororfailurestates - Three routes process the failed deployment event in parallel
- Transforms map deployment data to each destination's format with severity context
- Deduplication prevents duplicate incidents from Vercel retries
Step 1: Create the Source
Create a Vercel source with webhook signature verification:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/sources \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel Deployments",
"slug": "vercel-deployments",
"description": "Vercel deployment status webhooks",
"verificationConfig": {
"type": "hmac",
"secret": "your_vercel_webhook_secret",
"algorithm": "sha256",
"headerName": "x-vercel-signature",
"encoding": "hex"
}
}'Response:
{
"data": {
"id": "src_vercel01",
"name": "Vercel Deployments",
"slug": "vercel-deployments",
"url": "https://api.hookbase.app/ingest/your-org/vercel-deployments",
"verificationConfig": {
"type": "hmac",
"algorithm": "sha256"
},
"createdAt": "2026-03-07T10:00:00Z"
}
}TIP
Configure this URL in your Vercel project under Settings → Webhooks → Add Webhook. Select the deployment.error and deployment.ready event types, or subscribe to all deployment events and let Hookbase filters handle the routing.
Step 2: Create Destinations
Create three destinations for PagerDuty, Slack, and Linear:
PagerDuty Incident Destination
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/destinations \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "PagerDuty Incidents",
"type": "http",
"config": {
"url": "https://events.pagerduty.com/v2/enqueue",
"method": "POST",
"headers": {
"Content-Type": "application/json"
}
},
"retryConfig": {
"maxAttempts": 5,
"backoffMultiplier": 2,
"initialInterval": 1000
}
}'TIP
PagerDuty Events API v2 uses a routing key in the payload body rather than an Authorization header. The transform in Step 4 includes this key in the request body.
Slack #ops Destination
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/destinations \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Slack #ops",
"type": "slack",
"config": {
"url": "https://hooks.slack.com/services/YOUR/OPS/WEBHOOK"
},
"retryConfig": {
"maxAttempts": 3,
"backoffMultiplier": 2,
"initialInterval": 500
}
}'Linear Issue Destination
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/destinations \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Linear Issues",
"type": "http",
"config": {
"url": "https://api.linear.app/graphql",
"method": "POST",
"headers": {
"Authorization": "Bearer YOUR_LINEAR_API_KEY",
"Content-Type": "application/json"
}
},
"retryConfig": {
"maxAttempts": 3,
"backoffMultiplier": 2,
"initialInterval": 1000
}
}'Step 3: Create Routes with Filters
Deployment Failure Filter
Create a shared filter that matches deployment errors and failures. All three routes reference this filter:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/filters \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Deployment Failures",
"conditions": [
{
"field": "type",
"operator": "in",
"value": ["deployment.error", "deployment.failed"]
},
{
"field": "payload.deployment.state",
"operator": "in",
"value": ["ERROR", "CANCELED", "FAILED"]
}
],
"logic": "OR"
}'TIP
Using OR logic means the filter triggers on either the Vercel event type or the deployment state field. This catches both explicit error events and deployments that transition to a failed state.
PagerDuty Route
Route deployment failures to PagerDuty for on-call alerting:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/routes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel → PagerDuty",
"sourceId": "src_vercel01",
"destinationId": "dst_pagerduty01",
"filterId": "flt_deplyfail01",
"transformId": "tfm_pagerduty01",
"enabled": true,
"priority": 1
}'Slack #ops Route
Notify the operations channel of deployment failures:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/routes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel → Slack #ops",
"sourceId": "src_vercel01",
"destinationId": "dst_slackops01",
"filterId": "flt_deplyfail01",
"transformId": "tfm_slackops01",
"enabled": true,
"priority": 2
}'Linear Issue Route
Auto-create a tracking issue for every deployment failure:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/routes \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel → Linear Issue",
"sourceId": "src_vercel01",
"destinationId": "dst_linear01",
"filterId": "flt_deplyfail01",
"transformId": "tfm_linear01",
"enabled": true,
"priority": 3
}'Production Deployment Filter (Optional)
If you only want to trigger incidents for production deployments, create a stricter filter:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/filters \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Production Deployment Failures",
"conditions": [
{
"field": "payload.deployment.target",
"operator": "eq",
"value": "production"
},
{
"field": "payload.deployment.state",
"operator": "in",
"value": ["ERROR", "CANCELED", "FAILED"]
}
],
"logic": "AND"
}'Step 4: Add Transforms
PagerDuty Transform
Map deployment failure data to PagerDuty Events API v2 format with severity mapping:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/transforms \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel → PagerDuty Incident",
"type": "jsonata",
"config": {
"expression": "(\n $deployment := payload.deployment;\n $project := payload.name ? payload.name : $deployment.name;\n $target := $deployment.target ? $deployment.target : \"preview\";\n $severity := $target = \"production\" ? \"critical\" : \"warning\";\n $state := $deployment.state ? $deployment.state : \"ERROR\";\n {\n \"routing_key\": \"YOUR_PAGERDUTY_INTEGRATION_KEY\",\n \"event_action\": \"trigger\",\n \"dedup_key\": \"vercel-deploy-\" & $deployment.id,\n \"payload\": {\n \"summary\": \"Deployment failed: \" & $project & \" (\" & $target & \")\",\n \"source\": \"hookbase-vercel\",\n \"severity\": $severity,\n \"component\": $project,\n \"group\": $target,\n \"class\": \"deployment_failure\",\n \"custom_details\": {\n \"deployment_id\": $deployment.id,\n \"deployment_url\": $deployment.url,\n \"project\": $project,\n \"target\": $target,\n \"state\": $state,\n \"creator\": $deployment.creator.email,\n \"git_branch\": $deployment.meta.githubCommitRef,\n \"git_sha\": $deployment.meta.githubCommitSha,\n \"commit_message\": $deployment.meta.githubCommitMessage,\n \"error_message\": $deployment.errorMessage\n }\n },\n \"links\": [\n {\n \"href\": \"https://vercel.com/\" & payload.teamId & \"/\" & $project & \"/\" & $deployment.id,\n \"text\": \"View Deployment in Vercel\"\n }\n ]\n }\n)"
}
}'Example Output:
{
"routing_key": "YOUR_PAGERDUTY_INTEGRATION_KEY",
"event_action": "trigger",
"dedup_key": "vercel-deploy-dpl_abc123xyz",
"payload": {
"summary": "Deployment failed: my-app (production)",
"source": "hookbase-vercel",
"severity": "critical",
"component": "my-app",
"group": "production",
"class": "deployment_failure",
"custom_details": {
"deployment_id": "dpl_abc123xyz",
"deployment_url": "https://my-app-abc123.vercel.app",
"project": "my-app",
"target": "production",
"state": "ERROR",
"creator": "[email protected]",
"git_branch": "main",
"git_sha": "a1b2c3d4e5f6",
"commit_message": "feat: add new checkout flow",
"error_message": "Build failed: Module not found"
}
},
"links": [
{
"href": "https://vercel.com/your-team/my-app/dpl_abc123xyz",
"text": "View Deployment in Vercel"
}
]
}TIP
The dedup_key field uses the Vercel deployment ID so that PagerDuty groups retries of the same failure into a single incident rather than creating duplicates.
Slack #ops Transform
Format deployment failure as a rich Slack Block Kit message with severity-coded colors:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/transforms \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel → Slack #ops Blocks",
"type": "jsonata",
"config": {
"expression": "(\n $deployment := payload.deployment;\n $project := payload.name ? payload.name : $deployment.name;\n $target := $deployment.target ? $deployment.target : \"preview\";\n $isProd := $target = \"production\";\n $color := $isProd ? \"#dc2626\" : \"#f59e0b\";\n $emoji := $isProd ? \":rotating_light:\" : \":warning:\";\n $branch := $deployment.meta.githubCommitRef ? $deployment.meta.githubCommitRef : \"unknown\";\n $sha := $deployment.meta.githubCommitSha ? $substring($deployment.meta.githubCommitSha, 0, 7) : \"unknown\";\n $commitMsg := $deployment.meta.githubCommitMessage ? $deployment.meta.githubCommitMessage : \"No commit message\";\n $errorMsg := $deployment.errorMessage ? $deployment.errorMessage : \"No error details available\";\n $deployUrl := \"https://vercel.com/\" & payload.teamId & \"/\" & $project & \"/\" & $deployment.id;\n {\n \"attachments\": [\n {\n \"color\": $color,\n \"blocks\": [\n {\n \"type\": \"header\",\n \"text\": {\n \"type\": \"plain_text\",\n \"text\": $emoji & \" Deployment Failed: \" & $project\n }\n },\n {\n \"type\": \"section\",\n \"fields\": [\n {\n \"type\": \"mrkdwn\",\n \"text\": \"*Environment:*\\n\" & $uppercase($target)\n },\n {\n \"type\": \"mrkdwn\",\n \"text\": \"*Branch:*\\n`\" & $branch & \"`\"\n },\n {\n \"type\": \"mrkdwn\",\n \"text\": \"*Commit:*\\n`\" & $sha & \"` \" & $commitMsg\n },\n {\n \"type\": \"mrkdwn\",\n \"text\": \"*Triggered by:*\\n\" & $deployment.creator.email\n }\n ]\n },\n {\n \"type\": \"section\",\n \"text\": {\n \"type\": \"mrkdwn\",\n \"text\": \"*Error:*\\n```\" & $errorMsg & \"```\"\n }\n },\n {\n \"type\": \"actions\",\n \"elements\": [\n {\n \"type\": \"button\",\n \"text\": {\n \"type\": \"plain_text\",\n \"text\": \"View Deployment\"\n },\n \"url\": $deployUrl,\n \"style\": \"danger\"\n },\n {\n \"type\": \"button\",\n \"text\": {\n \"type\": \"plain_text\",\n \"text\": \"View Build Logs\"\n },\n \"url\": $deployUrl & \"/logs\"\n }\n ]\n },\n {\n \"type\": \"context\",\n \"elements\": [\n {\n \"type\": \"mrkdwn\",\n \"text\": \"Deployment ID: \" & $deployment.id & \" | Routed via Hookbase\"\n }\n ]\n }\n ]\n }\n ]\n }\n)"
}
}'Example Output (Slack Message):
{
"attachments": [
{
"color": "#dc2626",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": ":rotating_light: Deployment Failed: my-app"
}
},
{
"type": "section",
"fields": [
{
"type": "mrkdwn",
"text": "*Environment:*\nPRODUCTION"
},
{
"type": "mrkdwn",
"text": "*Branch:*\n`main`"
},
{
"type": "mrkdwn",
"text": "*Commit:*\n`a1b2c3d` feat: add new checkout flow"
},
{
"type": "mrkdwn",
"text": "*Triggered by:*\n[email protected]"
}
]
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Error:*\n```Build failed: Module not found```"
}
},
{
"type": "actions",
"elements": [
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Deployment"
},
"url": "https://vercel.com/your-team/my-app/dpl_abc123xyz",
"style": "danger"
},
{
"type": "button",
"text": {
"type": "plain_text",
"text": "View Build Logs"
},
"url": "https://vercel.com/your-team/my-app/dpl_abc123xyz/logs"
}
]
},
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": "Deployment ID: dpl_abc123xyz | Routed via Hookbase"
}
]
}
]
}
]
}Linear Issue Transform
Create a Linear issue via GraphQL mutation with deployment failure details:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/transforms \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel → Linear Issue",
"type": "jsonata",
"config": {
"expression": "(\n $deployment := payload.deployment;\n $project := payload.name ? payload.name : $deployment.name;\n $target := $deployment.target ? $deployment.target : \"preview\";\n $isProd := $target = \"production\";\n $priority := $isProd ? 1 : 3;\n $branch := $deployment.meta.githubCommitRef ? $deployment.meta.githubCommitRef : \"unknown\";\n $sha := $deployment.meta.githubCommitSha ? $substring($deployment.meta.githubCommitSha, 0, 7) : \"unknown\";\n $commitMsg := $deployment.meta.githubCommitMessage ? $deployment.meta.githubCommitMessage : \"No commit message\";\n $errorMsg := $deployment.errorMessage ? $deployment.errorMessage : \"No error details available\";\n $deployUrl := \"https://vercel.com/\" & payload.teamId & \"/\" & $project & \"/\" & $deployment.id;\n $description := \"## Deployment Failure\\n\\n\" &\n \"**Project:** \" & $project & \"\\n\" &\n \"**Environment:** \" & $uppercase($target) & \"\\n\" &\n \"**Branch:** `\" & $branch & \"`\\n\" &\n \"**Commit:** `\" & $sha & \"` \" & $commitMsg & \"\\n\" &\n \"**Triggered by:** \" & $deployment.creator.email & \"\\n\\n\" &\n \"### Error\\n\\n```\\n\" & $errorMsg & \"\\n```\\n\\n\" &\n \"### Links\\n\\n\" &\n \"- [View Deployment](\" & $deployUrl & \")\\n\" &\n \"- [Build Logs](\" & $deployUrl & \"/logs)\\n\\n\" &\n \"---\\n\" &\n \"*Auto-created by Hookbase from Vercel webhook `\" & $deployment.id & \"`*\";\n {\n \"query\": \"mutation IssueCreate($input: IssueCreateInput!) { issueCreate(input: $input) { success issue { id identifier url } } }\",\n \"variables\": {\n \"input\": {\n \"teamId\": \"YOUR_LINEAR_TEAM_ID\",\n \"title\": \"[Deploy Failure] \" & $project & \" (\" & $target & \") - \" & $sha,\n \"description\": $description,\n \"priority\": $priority,\n \"labelIds\": [\"YOUR_INCIDENT_LABEL_ID\"],\n \"metadata\": {\n \"deploymentId\": $deployment.id,\n \"source\": \"hookbase-vercel\"\n }\n }\n }\n }\n)"
}
}'Example Output:
{
"query": "mutation IssueCreate($input: IssueCreateInput!) { issueCreate(input: $input) { success issue { id identifier url } } }",
"variables": {
"input": {
"teamId": "YOUR_LINEAR_TEAM_ID",
"title": "[Deploy Failure] my-app (production) - a1b2c3d",
"description": "## Deployment Failure\n\n**Project:** my-app\n**Environment:** PRODUCTION\n**Branch:** `main`\n**Commit:** `a1b2c3d` feat: add new checkout flow\n**Triggered by:** [email protected]\n\n### Error\n\n```\nBuild failed: Module not found\n```\n\n### Links\n\n- [View Deployment](https://vercel.com/your-team/my-app/dpl_abc123xyz)\n- [Build Logs](https://vercel.com/your-team/my-app/dpl_abc123xyz/logs)\n\n---\n*Auto-created by Hookbase from Vercel webhook `dpl_abc123xyz`*",
"priority": 1,
"labelIds": ["YOUR_INCIDENT_LABEL_ID"],
"metadata": {
"deploymentId": "dpl_abc123xyz",
"source": "hookbase-vercel"
}
}
}
}TIP
Linear priority values: 0 = No priority, 1 = Urgent, 2 = High, 3 = Medium, 4 = Low. The transform maps production failures to Urgent and preview failures to Medium.
Step 5: Test the Pipeline
Send a test Vercel deployment failure payload to verify routing:
curl -X POST https://api.hookbase.app/ingest/your-org/vercel-deployments \
-H "Content-Type: application/json" \
-H "x-vercel-signature: test_signature_value" \
-d '{
"type": "deployment.error",
"teamId": "your-team",
"name": "my-app",
"payload": {
"deployment": {
"id": "dpl_test_abc123",
"name": "my-app",
"url": "https://my-app-abc123.vercel.app",
"target": "production",
"state": "ERROR",
"errorMessage": "Build failed: Module not found: Cannot find module @/components/Checkout",
"creator": {
"email": "[email protected]",
"uid": "usr_test123"
},
"meta": {
"githubCommitRef": "main",
"githubCommitSha": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0",
"githubCommitMessage": "feat: add new checkout flow",
"githubCommitOrg": "your-org",
"githubCommitRepo": "my-app"
},
"createdAt": 1709798400000
}
}
}'Verify Deliveries:
curl https://api.hookbase.app/api/organizations/{orgId}/deliveries?limit=10 \
-H "Authorization: Bearer YOUR_TOKEN"You should see 3 deliveries created from the single failed deployment event:
- Delivery to PagerDuty with Events API v2 incident format and
criticalseverity - Delivery to Slack #ops with Block Kit message and red severity indicator
- Delivery to Linear with GraphQL mutation creating an Urgent priority issue
Verify a Successful Deployment Is Filtered Out:
curl -X POST https://api.hookbase.app/ingest/your-org/vercel-deployments \
-H "Content-Type: application/json" \
-H "x-vercel-signature: test_signature_value" \
-d '{
"type": "deployment.ready",
"teamId": "your-team",
"name": "my-app",
"payload": {
"deployment": {
"id": "dpl_test_success456",
"name": "my-app",
"url": "https://my-app-success456.vercel.app",
"target": "production",
"state": "READY",
"creator": {
"email": "[email protected]",
"uid": "usr_test123"
},
"meta": {
"githubCommitRef": "main",
"githubCommitSha": "b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1",
"githubCommitMessage": "fix: resolve checkout module import"
},
"createdAt": 1709802000000
}
}
}'This successful deployment should produce zero deliveries since the filter only matches ERROR, CANCELED, and FAILED states.
Inspect Individual Delivery Details
Check the transform output for a specific delivery to verify severity mapping:
curl https://api.hookbase.app/api/organizations/{orgId}/deliveries/{deliveryId} \
-H "Authorization: Bearer YOUR_TOKEN"Response:
{
"data": {
"id": "dlv_pd001",
"routeId": "rte_pagerduty01",
"eventId": "evt_vercel001",
"destinationId": "dst_pagerduty01",
"status": "delivered",
"statusCode": 202,
"attempts": 1,
"requestBody": {
"routing_key": "YOUR_PAGERDUTY_INTEGRATION_KEY",
"event_action": "trigger",
"dedup_key": "vercel-deploy-dpl_test_abc123",
"payload": {
"summary": "Deployment failed: my-app (production)",
"severity": "critical"
}
},
"deliveredAt": "2026-03-07T10:00:01Z",
"createdAt": "2026-03-07T10:00:00Z"
}
}Confirm that:
- PagerDuty delivery has
severity: "critical"for production targets - Slack delivery uses the red color code
#dc2626for production failures - Linear delivery has
priority: 1(Urgent) for production failures
Production Considerations
1. Enable Deduplication by Deployment ID
Prevent duplicate incidents when Vercel retries the same webhook:
curl -X PATCH https://api.hookbase.app/api/organizations/{orgId}/sources/src_vercel01 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"deduplicationConfig": {
"enabled": true,
"keyPath": "payload.deployment.id",
"windowSeconds": 86400
}
}'TIP
Using payload.deployment.id as the dedup key ensures that even if Vercel sends the same deployment failure event multiple times, only one PagerDuty incident, one Slack message, and one Linear issue are created per failed deployment.
2. Configure Circuit Breakers
Protect PagerDuty and Linear from overload during cascading deployment failures (e.g., a broken shared dependency triggering failures across multiple projects):
curl -X PATCH https://api.hookbase.app/api/organizations/{orgId}/destinations/dst_pagerduty01 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"circuitBreakerConfig": {
"enabled": true,
"failureThreshold": 15,
"windowSeconds": 60,
"resetTimeoutSeconds": 300
}
}'curl -X PATCH https://api.hookbase.app/api/organizations/{orgId}/destinations/dst_linear01 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"circuitBreakerConfig": {
"enabled": true,
"failureThreshold": 10,
"windowSeconds": 60,
"resetTimeoutSeconds": 300
}
}'3. Set Up Notification Channels
Get alerted when the incident routing pipeline itself has delivery failures:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/notification-channels \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Incident Pipeline Alerts",
"type": "slack",
"config": {
"url": "https://hooks.slack.com/services/YOUR/ALERT/URL"
},
"events": ["delivery.failed", "destination.circuit_breaker.opened"],
"filters": {
"destinationIds": ["dst_pagerduty01", "dst_slackops01", "dst_linear01"]
}
}'4. Set Up Failover for PagerDuty
Ensure critical incident alerts reach on-call engineers even if PagerDuty is unreachable:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/destinations \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "PagerDuty Fallback (Email)",
"type": "http",
"config": {
"url": "https://events.pagerduty.com/integration/YOUR_BACKUP_KEY/enqueue",
"method": "POST",
"headers": {
"Content-Type": "application/json"
}
}
}'curl -X PATCH https://api.hookbase.app/api/organizations/{orgId}/routes/rte_pagerduty01 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"failoverConfig": {
"enabled": true,
"destinationId": "dst_pdfallback01",
"triggerAfterAttempts": 3
}
}'5. Use Scoped API Keys
Create a scoped API key restricted to webhook ingestion:
curl -X POST https://api.hookbase.app/api/organizations/{orgId}/api-keys \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Vercel Webhook Ingestion",
"scopes": ["events:create"],
"sourceIds": ["src_vercel01"],
"expiresAt": "2027-03-07T00:00:00Z"
}'Use the returned API key in your Vercel webhook configuration instead of your user token.
Related Guides
- Vercel Integration - Provider-specific setup and signature verification
- Transforms - JSONata syntax and advanced examples
- Filters - Complex routing logic and conditions
- Deduplication - Prevent duplicate event processing
- Failover - Ensure critical events are delivered
- Circuit Breaker - Protect downstream services
- Notification Channels - Configure delivery alerts
See Also
- Vercel Integration — Vercel webhook setup
- GitHub Integration — GitHub deployment events
- Notification Channels — Alert configuration
- Circuit Breaker — Automatic incident protection