Skip to main content

Overview

The Settings page allows you to configure notification channels for sending alerts to external systems. You can set up webhooks to integrate with tools like Slack, Microsoft Teams, or any custom HTTP endpoint.

Webhook Channels

Send notifications to Slack, Teams, or custom endpoints

Custom Payloads

Define custom JSON templates with dynamic variables

Authentication

Support for Bearer tokens, API keys, and Basic Auth

Test & Validate

Test channels before using them in production

Webhook Channels

Webhook channels allow you to send HTTP requests to external systems when incidents occur. Each channel can be configured with its own URL, authentication, and payload template.

Channel List View

The Settings page displays all configured webhook channels as cards:
ElementDescription
NameChannel identifier
DescriptionPurpose of the channel
URLTarget webhook endpoint
MethodHTTP method (GET, POST, PUT, PATCH)
StatusActive or Inactive toggle
Default BadgeIndicates default channel for this type
Inactive channels appear with reduced opacity. You can toggle status without deleting the channel.

Creating a Webhook Channel

1

Open Create Dialog

Click the Add Webhook button in the page header
2

Enter Basic Info

  • Name — Descriptive channel name (required)
  • Description — Explain what this channel does
3

Configure Webhook URL

Enter the target URL for the webhook (e.g., Slack incoming webhook URL)
4

Select HTTP Method

Choose the HTTP method:
  • POST — Most common for webhooks
  • PUT — For update operations
  • PATCH — For partial updates
  • GET — For simple notifications
5

Configure Authentication

Select authentication type and provide credentials if needed
6

Set Timeout

Configure request timeout in seconds (default: 30)
7

Create Payload Template

Define the JSON payload with template variables
8

Save Channel

Click Create to save the channel

Authentication Types

Configure how EasyContact authenticates with your webhook endpoint.
No authentication required. Use for public webhooks like Slack incoming webhooks.
Authentication: None
Authentication credentials are stored securely but are never displayed after saving. You’ll need to re-enter them when editing.

Payload Templates

Payload templates define the JSON body sent to your webhook. Use template variables to include dynamic incident data.

Template Editor Features

  • Syntax highlighting for JSON
  • Real-time validation shows errors immediately
  • Format button to auto-format valid JSON
  • Copy button to copy template to clipboard
  • Variable reference panel with all available placeholders

Available Variables

VariableDescription
{{incident.id}}Unique incident identifier
{{incident.incidentNumber}}Human-readable incident number
{{incident.title}}Incident title
{{incident.description}}Incident description
{{incident.status}}Current status (open, acknowledged, resolved)
{{incident.severity}}Severity level
{{incident.priority}}Priority (P1-P5)
{{incident.host}}Affected hostname
{{incident.hostIp}}Host IP address
{{incident.service}}Service name
{{incident.environment}}Environment (production, staging, etc.)
{{incident.region}}Geographic region
{{incident.sourceType}}Integration source type
{{incident.triggeredAt}}When the incident was triggered
{{incident.acknowledgedAt}}When acknowledged (if applicable)
{{incident.currentLevel}}Current escalation level
{{incident.alertCount}}Number of alerts in incident
{{incident.tags}}All tags as object
{{incident.tags.customer}}Specific tag value
{{incident.tags.environment}}Environment tag
{{incident.tags.team}}Team tag

Pre-built Templates

Use these templates as starting points for common integrations.
{
  "attachments": [
    {
      "color": "{{incident.severity == 'critical' ? '#FF0000' : '#FFA500'}}",
      "title": "{{incident.title}}",
      "title_link": "https://app.easycontact.ai/incidents/{{incident.id}}",
      "text": "{{incident.description}}",
      "fields": [
        {
          "title": "Severity",
          "value": "{{incident.severity}}",
          "short": true
        },
        {
          "title": "Host",
          "value": "{{incident.host}}",
          "short": true
        },
        {
          "title": "Service",
          "value": "{{incident.service}}",
          "short": true
        },
        {
          "title": "Environment",
          "value": "{{incident.environment}}",
          "short": true
        },
        {
          "title": "Assignee",
          "value": "{{target.name}}",
          "short": true
        },
        {
          "title": "Customer",
          "value": "{{incident.tags.customer}}",
          "short": true
        }
      ],
      "footer": "EasyContact",
      "ts": "{{incident.triggeredAt}}"
    }
  ]
}
For Slack, use the incoming webhook URL from your Slack app. No authentication is needed as the token is embedded in the URL.
{
  "@type": "MessageCard",
  "@context": "http://schema.org/extensions",
  "themeColor": "{{incident.severity == 'critical' ? 'FF0000' : 'FFA500'}}",
  "summary": "{{incident.title}}",
  "sections": [
    {
      "activityTitle": "{{incident.title}}",
      "facts": [
        {
          "name": "Severity",
          "value": "{{incident.severity}}"
        },
        {
          "name": "Host",
          "value": "{{incident.host}}"
        },
        {
          "name": "Service",
          "value": "{{incident.service}}"
        },
        {
          "name": "Environment",
          "value": "{{incident.environment}}"
        },
        {
          "name": "Status",
          "value": "{{incident.status}}"
        }
      ],
      "text": "{{incident.description}}"
    }
  ],
  "potentialAction": [
    {
      "@type": "OpenUri",
      "name": "View Incident",
      "targets": [
        {
          "os": "default",
          "uri": "https://app.easycontact.ai/incidents/{{incident.id}}"
        }
      ]
    }
  ]
}
For Teams, use the incoming webhook URL from your Teams channel connector.
{
  "event": "incident.triggered",
  "incident": {
    "id": "{{incident.id}}",
    "number": "{{incident.incidentNumber}}",
    "title": "{{incident.title}}",
    "description": "{{incident.description}}",
    "severity": "{{incident.severity}}",
    "priority": "{{incident.priority}}",
    "status": "{{incident.status}}",
    "host": "{{incident.host}}",
    "service": "{{incident.service}}",
    "environment": "{{incident.environment}}",
    "triggeredAt": "{{incident.triggeredAt}}",
    "url": "https://app.easycontact.ai/incidents/{{incident.id}}"
  },
  "assignee": {
    "name": "{{target.name}}",
    "email": "{{target.email}}"
  },
  "tags": "{{incident.tags}}"
}
{
  "routing_key": "<YOUR_PAGERDUTY_ROUTING_KEY>",
  "event_action": "trigger",
  "dedup_key": "{{incident.id}}",
  "payload": {
    "summary": "{{incident.title}}",
    "severity": "{{incident.severity}}",
    "source": "{{incident.host}}",
    "component": "{{incident.service}}",
    "group": "{{incident.environment}}",
    "custom_details": {
      "description": "{{incident.description}}",
      "priority": "{{incident.priority}}",
      "incident_url": "https://app.easycontact.ai/incidents/{{incident.id}}"
    }
  }
}

Testing Channels

Before using a channel in production, test it to verify the configuration is correct.

How to Test

  1. Click the three-dot menu (⋮) on a channel card
  2. Select Test
  3. In the test dialog, click Send Test
  4. Review the results

Test Results

FieldDescription
StatusSuccess (green) or Failed (red)
MessageResponse message or error description
Response CodeHTTP status code (200, 201, etc.)
DurationRequest time in milliseconds
A successful test means the webhook endpoint is reachable and accepted the request. Check your target system to verify the message was received correctly.

Default Channel

You can mark one webhook channel as the default for each channel type. The default channel is used when:
  • No specific channel is configured in escalation policy levels
  • Webhooks are selected but no specific channel is specified

Setting Default Channel

  1. Open the channel edit dialog
  2. Toggle Set as Default to on
  3. Save changes
Only one channel per type can be the default. Setting a new default automatically removes the default status from the previous channel.

Managing Channels

Editing Channels

  1. Click the three-dot menu (⋮) on a channel
  2. Select Edit
  3. Modify settings as needed
  4. Click Update to save

Toggling Active Status

Use the switch on each channel card to quickly enable or disable:
  • Active — Channel is used for notifications
  • Inactive — Channel is skipped (useful for maintenance or testing)
Inactive channels remain configured but don’t receive notifications. Use this instead of deleting when you might need the channel again.

Deleting Channels

  1. Click the three-dot menu
  2. Select Delete
  3. Confirm deletion
Deleted channels cannot be recovered. Any escalation policy levels using this channel will need to be reconfigured.

Common Integrations

Setup:
  1. Create an Incoming Webhook in Slack App settings
  2. Copy the webhook URL
  3. Create channel with URL and Slack template
  4. No authentication needed (token in URL)
URL Format: Slack incoming webhook URL from your app settings
Setup:
  1. Add Incoming Webhook connector to your Teams channel
  2. Copy the webhook URL
  3. Create channel with URL and Teams template
  4. No authentication needed (token in URL)
URL Format: Teams incoming webhook URL from your channel connector
Setup:
  1. Create a Webhook in Discord channel settings
  2. Copy the webhook URL
  3. Create channel with URL
  4. Use Discord-compatible JSON payload
Template:
{
  "content": "**{{incident.title}}**\n{{incident.description}}",
  "embeds": [
    {
      "title": "Incident Details",
      "color": 16711680,
      "fields": [
        {"name": "Severity", "value": "{{incident.severity}}", "inline": true},
        {"name": "Host", "value": "{{incident.host}}", "inline": true}
      ]
    }
  ]
}
Setup:
  1. Determine your API endpoint URL
  2. Configure authentication (Bearer, API Key, or Basic)
  3. Create payload template matching your API schema
  4. Set appropriate timeout
Example with Bearer Auth:
SettingValue
URLhttps://api.example.com/webhooks/alerts
MethodPOST
AuthBearer Token
Token<YOUR_API_TOKEN>

Best Practices

Name channels clearly to indicate their purpose: “Slack - Engineering Alerts”, “Teams - On-Call Channel”, “CRM - Customer Incidents”
Always test new channels and template changes before relying on them for critical alerts.
Default timeout is 30 seconds. Reduce for time-sensitive notifications or increase for slow endpoints.
Set a reliable, always-available channel as default to ensure notifications are never lost.
Always include incident ID, title, severity, and a link back to EasyContact in your templates.
Use the default filter for optional fields: {{incident.host|default("Unknown")}}
Rotate API keys and tokens periodically. Use dedicated service accounts for webhook integrations.

Troubleshooting

  1. Verify the webhook URL is correct and accessible
  2. Check authentication credentials
  3. Ensure the payload template is valid JSON
  4. Try the request manually with curl to diagnose
  5. Check if the endpoint has IP restrictions
  1. Verify channel is Active
  2. Check that the channel is selected in escalation policy levels
  3. Ensure the escalation policy is active and assigned
  4. Review incident logs for delivery errors
  1. Validate JSON syntax in the editor
  2. Check variable names match exactly (case-sensitive)
  3. Ensure filters are applied correctly
  4. Test with a minimal template first
  1. Verify credentials are entered correctly
  2. Check token hasn’t expired
  3. Ensure auth type matches endpoint requirements
  4. Verify the endpoint expects the header format used
  1. Increase timeout value
  2. Check if endpoint is slow or overloaded
  3. Verify network connectivity
  4. Consider using async webhook if available
  1. Verify webhook URL is correct
  2. Check channel/team permissions
  3. Ensure webhook hasn’t been revoked
  4. Verify payload matches expected format

Quick Reference

Authentication Types

TypeHeader FormatUse Case
None(no header)Slack, Teams incoming webhooks
BearerAuthorization: Bearer {token}OAuth APIs, modern REST APIs
API KeyX-API-Key: {key}Simple API authentication
BasicAuthorization: Basic {base64}Legacy systems, basic auth APIs

HTTP Methods

MethodUse Case
POSTCreating new records, most webhooks
PUTReplacing existing records
PATCHPartial updates
GETSimple notifications without body

Common Template Variables

VariableExample Value
{{incident.id}}abc123-def456
{{incident.title}}High CPU on web-01
{{incident.severity}}critical
{{incident.host}}web-server-01
{{incident.service}}api-gateway
{{target.name}}John Doe
{{tenant.slug}}acme-corp