Orchestrate incident response with workflows
When incidents occur, engineers waste critical minutes manually coordinating response logistics instead of fixing the actual problem. They need to create dedicated Slack channels, set up Zoom meetings for war rooms, create tracking tickets in Jira, and notify the right people while gathering context about affected services.
This guide shows you how to build a workflow-driven incident response system in Port. A single incident trigger kicks off a workflow that creates Slack channels, Zoom meetings, Jira tickets, and notifications, then updates the incident entity based on severity.
Port workflows are currently in closed beta. Workflows may undergo breaking changes and occasional downtime without prior notice.
Common use casesā
- Eliminate manual coordination delays by automating incident setup tasks.
- Ensure consistent incident response with standardized communication channels and tracking.
- Scale incident management across teams without requiring every engineer to know all setup steps.
- Accelerate time to resolution by removing logistics overhead during high-stress situations.
Prerequisitesā
This guide assumes the following:
- You have a Port account and have completed the onboarding process.
- You have access to one of Port's incident management integrations (we will use PagerDuty in this guide).
- You have access to a Slack developer account with permissions to create apps.
- You have access to a Zoom developer account with permissions to create Server-to-Server OAuth apps.
- You have access to a Jira instance with API access.
While this guide uses PagerDuty for incident management, you can adapt it for other incident management tools like FireHydrant, Incident.io, or Opsgenie. The same principles apply regardless of the incident source.
Set up data modelā
We will configure the necessary blueprint to support the incident orchestration workflow.
Create PagerDuty incident blueprintā
The incident blueprint will store incident data from your incident management tool and track orchestration results.
-
Go to the builder page of your portal.
-
Click on
+ Blueprint. -
Click on the
{...} Edit JSONbutton. -
Copy and paste the following JSON configuration.
PagerDuty Incident blueprint (click to expand)
{
"identifier": "pagerdutyIncident",
"description": "This blueprint represents a PagerDuty incident in our software catalog",
"title": "PagerDuty Incident",
"icon": "pagerduty",
"schema": {
"properties": {
"status": {
"icon": "DefaultProperty",
"title": "Incident Status",
"type": "string",
"enum": [
"triggered",
"annotated",
"acknowledged",
"reassigned",
"escalated",
"reopened",
"resolved",
"escalated to human"
],
"enumColors": {
"triggered": "red",
"annotated": "blue",
"acknowledged": "yellow",
"reassigned": "blue",
"escalated": "yellow",
"reopened": "red",
"resolved": "green",
"escalated to human": "bronze"
}
},
"url": {
"type": "string",
"format": "url",
"title": "Incident URL"
},
"urgency": {
"title": "Incident Urgency",
"type": "string",
"enum": [
"high",
"low"
],
"enumColors": {
"high": "red",
"low": "green"
}
},
"priority": {
"title": "Priority",
"type": "string"
},
"severity": {
"type": "string",
"title": "Severity",
"enum": [
"Critical",
"High",
"Medium",
"Low"
],
"enumColors": {
"Critical": "red",
"High": "red",
"Medium": "yellow",
"Low": "lime"
}
},
"description": {
"type": "string",
"title": "Description"
},
"assignees": {
"title": "Assignees",
"type": "array",
"items": {
"type": "string",
"format": "user"
}
},
"escalation_policy": {
"type": "string",
"title": "Escalation Policy"
},
"created_at": {
"title": "Created At",
"type": "string",
"format": "date-time"
},
"updated_at": {
"title": "Updated At",
"type": "string",
"format": "date-time"
},
"resolved_at": {
"title": "Incident Resolution Time",
"type": "string",
"format": "date-time",
"description": "The timestamp when the incident was resolved"
},
"recovery_time": {
"title": "Time to Recovery",
"type": "number",
"description": "The time (in minutes) between the incident being triggered and resolved"
},
"triggered_by": {
"type": "string",
"title": "Triggered By"
},
"slack_channel": {
"type": "string",
"title": "Slack Channel",
"description": "The Slack channel created for this incident",
"icon": "Slack"
},
"zoom_meeting_link": {
"type": "string",
"title": "Zoom Meeting Link",
"description": "The Zoom meeting link for the war room",
"icon": "Team",
"format": "url"
},
"jira_tracking_ticket": {
"type": "string",
"title": "Jira Tracking Ticket",
"icon": "Jira",
"format": "url",
"description": "The Jira ticket created to track this incident"
}
},
"required": []
},
"mirrorProperties": {},
"calculationProperties": {},
"relations": {
"pagerdutyService": {
"title": "PagerDuty Service",
"target": "pagerdutyService",
"required": false,
"many": false
}
}
} -
Click Create to save the blueprint.
Port's PagerDuty integration creates a pagerdutyIncident blueprint by default. You can extend this existing blueprint by adding the following properties to enable orchestration tracking.
-
Go to the builder page of your portal.
-
Select the
PagerDuty Incidentblueprint. -
Click on the
{...} Edit JSONbutton. -
Add the following properties under the
propertiesschema:PagerDuty Incident blueprint extended properties (click to expand)
"slack_channel": {
"type": "string",
"title": "Slack Channel",
"description": "The Slack channel created for this incident"
},
"zoom_meeting_link": {
"type": "string",
"format": "url",
"title": "Zoom Meeting Link",
"description": "The Zoom meeting link for the war room"
},
"jira_tracking_ticket": {
"type": "string",
"format": "url",
"title": "Jira Tracking Ticket",
"description": "The Jira ticket created to track this incident"
}
The rest of this guide will reference pagerdutyIncident as the blueprint identifier.
Set up external toolsā
We need to configure integrations with Slack, Zoom, and Jira to enable the orchestration actions.
Set up Slack appā
-
Create a Slack app and install it on a workspace.
-
Add the following permissions to the Slack app.
Required scopes for channel creation:
channels:manage.groups:write.im:write.mpim:write.
Required scopes for messaging:
chat:write.chat:write.public.
-
Navigate back to the OAuth & Permissions page. You will see an access token under OAuth Tokens for Your Workspace that you will use in the
SLACK_BOT_TOKENPort secret.
Set up Zoom meetingā
Create a Server-to-Server OAuth app.
-
Go to Zoom Marketplace.
-
Click Develop > Build App and select Server-to-Server OAuth.
-
Fill in the app details and make note of:
- Account ID.
- Client ID.
- Client Secret.
-
Under Scopes, add:
meeting:write.meeting:read.- (Optional)
user:read.
Set up Jira API accessā
-
Log in to your Jira instance.
-
Generate an API token:
- Go to Atlassian Account Settings.
- Click Create API token.
- Copy the generated token (you will need this for the Port secret).
Add Port secretsā
To add secrets to your portal:
-
Click ... in the top right corner of your Port application.
-
Click Credentials.
-
Click the
Secretstab. -
Click + Secret and add the following secrets:
SLACK_BOT_TOKEN- Your Slack bot token from the OAuth & Permissions page.ZOOM_ACCOUNT_ID- Your Zoom account ID.ZOOM_CLIENT_ID- Your Zoom client ID.ZOOM_CLIENT_SECRET- Your Zoom client secret.JIRA_AUTH- Base64 encoded string of your Jira credentials. Generate this by running:Replaceecho -n "your-email@domain.com:your-api-token" | base64your-email@domain.comwith your Jira email andyour-api-tokenwith your Jira API token.
Build the workflowā
We will build the workflow using the workflow editor and the AI assistant to generate the initial structure. You can also skip the AI assistant and paste the workflow template directly.
-
Go to the workflows page of your portal.
-
Click + Workflow.
-
In the dialog, add a short description and click Build with AI.
-
Describe the workflow to the AI in the text area and paste the following prompt.
Workflow prompt (click to expand)
Create an automated incident orchestration workflow that triggers when a PagerDuty incident is created. The workflow should:
Trigger:
- Activate on ENTITY_CREATED event for pagerdutyIncident blueprint.
- Extract incident details: ID, URL, title, status, urgency, priority, description, and related service.
Severity-based routing:
- Use a condition node to evaluate incident severity based on priority (P1-P4) and urgency or severity values.
- Route to three different paths: Critical or High, Medium, and Low priority.
For critical or high priority incidents:
1. Create a dedicated Slack channel named after the incident ID (lowercase).
2. Get Zoom OAuth access token using server-to-server authentication.
3. Create a Zoom meeting with the incident title as topic, 60-minute duration, mute on entry, allow join before host.
4. Create a Jira bug ticket in project "<SET YOUR PROJECT>" with:
- Summary: incident title.
- Description: incident details, priority, urgency, status, PagerDuty URL, Slack channel, and Zoom link.
- Labels: "port-workflow", "incident".
5. Send a Slack notification to the incident channel with:
- Incident header.
- Incident details (title, priority, urgency, status).
- Links to Slack channel, Jira ticket, PagerDuty, Zoom meeting, and Port entity.
- Call to action to join immediately.
6. Update the incident entity with slack_channel, zoom_meeting_link, and jira_tracking_ticket properties.
For medium priority incidents:
1. Create a dedicated Slack channel named after the incident ID (lowercase).
2. Create a Jira bug ticket with incident details and Slack channel reference.
3. Send a Slack notification to the incident channel with:
- Incident header.
- Incident details and links to Slack, Jira, PagerDuty, and Port.
- Request to review and coordinate.
4. Update the incident entity with slack_channel and jira_tracking_ticket properties.
For low priority incidents:
1. Send a simple Slack notification to #isaac-test channel with:
- Low priority incident header.
- Basic incident details and PagerDuty link.
- Note that no immediate action is required.Review changesThe AI will generate the workflow structure. Click Review changes to inspect it, then click Apply to load it into the editor.
-
Review the generated workflow and replace placeholder values with your actual values (see Configure the workflow below).
-
Click Publish in the top right corner of the editor. If you encounter validation errors, refer to the troubleshooting page.
Workflow templateā
Use this template if you prefer to paste JSON directly into the workflow editor.
Incident orchestration workflow template (click to expand)
{
"identifier": "incident_orchestration_workflow",
"title": "Automated Incident Orchestration",
"icon": "Alert",
"description": "Automatically orchestrates incident response by creating Slack channels, Zoom meetings, Jira tickets, and notifications based on incident severity. Updates the incident entity with all created resources in a single bulk update.",
"allowAnyoneToViewRuns": true,
"nodes": [
{
"identifier": "create_jira_ticket_critical",
"title": "Create Jira Tracking Ticket",
"icon": "Jira",
"description": "Creates Jira bug ticket for critical/high incidents",
"config": {
"type": "WEBHOOK",
"url": "<YOUR_JIRA_ORGANIZATION_URL>/rest/api/3/issue",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Basic {{ .secrets.JIRA_AUTH }}"
},
"body": {
"fields": {
"labels": [
"port-workflow",
"incident"
],
"project": {
"key": "<YOUR_JIRA_PROJECT>"
},
"summary": "{{.outputs.trigger.incident_title}}",
"issuetype": {
"name": "Bug"
},
"description": {
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"text": "Incident Details\n\n- Priority: {{ .outputs.trigger.incident_priority }}\n- Urgency: {{ .outputs.trigger.incident_urgency }}\n- Status: {{ .outputs.trigger.incident_status }}\n- PagerDuty URL: {{ .outputs.trigger.incident_url }}\n\nDescription:\n{{ .outputs.trigger.incident_description }}\n\nResponse Resources:\n- Slack Channel: {{ .outputs.create_slack_channel_critical.slack_channel_name }}\n- Zoom Meeting: {{.outputs.create_zoom_meeting_critical.zomm_meeting_link}}",
"type": "text"
}
]
}
],
"version": 1
}
}
}
},
"variables": {
"jira_ticket_url": "https://{{ (.response.data.self | capture(\"https://(?<domain>[^/]+)\") ).domain }}/browse/{{ .response.data.key }}"
}
},
{
"identifier": "create_jira_ticket_medium",
"title": "Create Jira Tracking Ticket",
"icon": "Jira",
"description": "Creates Jira bug ticket for medium priority incidents",
"config": {
"type": "WEBHOOK",
"url": "<YOUR_JIRA_ORGANIZATION_URL>/rest/api/3/issue",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Basic {{ .secrets.JIRA_AUTH }}"
},
"body": {
"fields": {
"labels": [
"port-workflow",
"incident"
],
"project": {
"key": "<YOUR_JIRA_PROJECT>"
},
"summary": "{{.outputs.trigger.incident_title}}",
"issuetype": {
"name": "Bug"
},
"description": {
"type": "doc",
"content": [
{
"type": "paragraph",
"content": [
{
"text": "Incident Details\n\n- Priority: {{ .outputs.trigger.incident_priority }}\n- Urgency: {{ .outputs.trigger.incident_urgency }}\n- Status: {{ .outputs.trigger.incident_status }}\n- PagerDuty URL: {{ .outputs.trigger.incident_url }}\n\nDescription:\n{{ .outputs.trigger.incident_description }}\n\nResponse Resources:\n- Slack Channel: {{ .outputs.create_slack_channel_medium.slack_channel_name }}",
"type": "text"
}
]
}
],
"version": 1
}
}
}
},
"variables": {
"jira_ticket_url": "https://{{ (.response.data.self | capture(\"https://(?<domain>[^/]+)\") ).domain }}/browse/{{ .response.data.key }}"
}
},
{
"identifier": "create_slack_channel_critical",
"title": "Create Incident Slack Channel (C)",
"icon": "Slack",
"description": "Creates dedicated Slack channel for critical/high incidents",
"config": {
"type": "WEBHOOK",
"url": "https://slack.com/api/conversations.create",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{ .secrets.SLACK_BOT_TOKEN }}"
},
"body": {
"name": "{{ .outputs.trigger.incident_id | ascii_downcase }}",
"is_private": false
}
},
"variables": {
"slack_channel_name": "#{{ .response.data.channel.name }}"
}
},
{
"identifier": "create_slack_channel_medium",
"title": "Create Incident Slack Channel (M)",
"icon": "Slack",
"description": "Creates dedicated Slack channel for medium priority incidents",
"config": {
"type": "WEBHOOK",
"url": "https://slack.com/api/conversations.create",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{ .secrets.SLACK_BOT_TOKEN }}"
},
"body": {
"name": "{{ .outputs.trigger.incident_id | ascii_downcase }}",
"is_private": false
}
},
"variables": {
"slack_channel_name": "#{{ .response.data.channel.name }}"
}
},
{
"identifier": "create_zoom_meeting_critical",
"title": "Create War Room Meeting",
"icon": "Team",
"description": "Set up a Zoom meeting for the war room after obtaining access token",
"config": {
"type": "WEBHOOK",
"url": "https://api.zoom.us/v2/users/me/meetings",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{ .outputs.get_zoom_meeting_access_token.zoom_access_token }}"
},
"body": {
"type": 2,
"topic": "{{ .outputs.trigger.incident_title }}",
"duration": 60,
"settings": {
"mute_upon_entry": true,
"join_before_host": true
},
"timezone": "UTC",
"start_time": "{{ now | todateiso8601 }}"
}
},
"variables": {
"zoom_meeting_url": "{{ .response.data.join_url }}"
}
},
{
"identifier": "determine_severity",
"title": "Determine Severity Level",
"icon": null,
"description": "Evaluates priority and urgency to determine response level",
"config": {
"type": "CONDITION",
"options": [
{
"identifier": "critical_high",
"title": "Critical/High Priority",
"expression": "(.outputs.trigger.incident_priority == \"P1\" or .outputs.trigger.incident_priority == \"P2\" or .outputs.trigger.incident_urgency == \"Critical\" or .outputs.trigger.incident_urgency == \"High\" or .outputs.trigger.incident_urgency == \"high\")"
},
{
"identifier": "medium",
"title": "Medium Priority",
"expression": "(.outputs.trigger.incident_priority == \"P3\" or .outputs.trigger.incident_urgency == \"Medium\" or .outputs.trigger.incident_urgency == \"medium\")"
},
{
"identifier": "low",
"title": "Low Priority",
"expression": "(.outputs.trigger.incident_priority == \"P4\" or .outputs.trigger.incident_urgency == \"Low\" or .outputs.trigger.incident_urgency == \"low\")"
}
]
},
"variables": {}
},
{
"identifier": "get_zoom_meeting_access_token",
"title": "Get Zoom Acces Token",
"icon": "Key",
"description": "Set up a Zoom meeting for the war room by first obtaining access token and then proceeding to call the create zoom meeting link",
"config": {
"type": "WEBHOOK",
"url": "https://zoom.us/oauth/token",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "Basic {{ .secrets.ZOOM_CLIENT_ID + \":\" + .secrets.ZOOM_CLIENT_SECRET | @base64 }}"
},
"body": {
"account_id": "{{ .secrets.ZOOM_ACCOUNT_ID }}",
"grant_type": "account_credentials"
}
},
"variables": {
"zoom_access_token": "{{ .response.data.access_token }}"
}
},
{
"identifier": "notify_teams_critical",
"title": "Notify Teams (Critical/High)",
"icon": "Slack",
"description": "Sends comprehensive Slack notification for critical/high incidents",
"config": {
"type": "WEBHOOK",
"url": "https://slack.com/api/chat.postMessage",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json; charset=utf-8",
"Authorization": "Bearer {{ .secrets.SLACK_BOT_TOKEN }}"
},
"body": {
"blocks": [
{
"text": "šØ *INCIDENT ALERT* šØ\n\n*Incident:* {{ .outputs.trigger.incident_title }}\n*Priority:* `{{ .outputs.trigger.incident_priority }}` | *Urgency:* `{{ .outputs.trigger.incident_urgency }}`\n*Status:* {{ .outputs.trigger.incident_status }}\n\nš *Response Resources Created:*\n⢠Slack Channel: {{ .outputs.create_slack_channel_critical.slack_channel_name }} \n⢠Jira Ticket: <{{ .outputs.create_jira_ticket_critical.jira_ticket_url }}|View ticket in Jira>\n⢠PagerDuty: <{{ .outputs.trigger.incident_url }}|View incident in PagerDuty>\n⢠Zoom meeting: <{{ .outputs.create_zoom_meeting_critical.zoom_meeting_url}}|Join Zoom>\n\n <{{.outputs.trigger.incident_url}}|View incident in Port>ā” *Action Required:* Join the Slack channel and Zoom meeting immediately!",
"type": "markdown"
}
],
"channel": "{{ .outputs.create_slack_channel_critical.slack_channel_name }}"
}
},
"variables": {}
},
{
"identifier": "notify_teams_low",
"title": "Notify Teams (Low)",
"icon": "Slack",
"description": "Sends simple Slack notification for low priority incidents",
"config": {
"type": "WEBHOOK",
"url": "https://slack.com/api/chat.postMessage",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json; charset=utf-8",
"Authorization": "Bearer {{ .secrets.SLACK_BOT_TOKEN }}"
},
"body": {
"blocks": [
{
"text": "ā¹ļø *Low Priority Incident*\n\n*Incident:* {{ .outputs.trigger.incident_title }}\n*Priority:* `{{ .outputs.trigger.incident_priority }}` | *Urgency:* `{{ .outputs.trigger.incident_urgency }}`\n*Status:* {{ .outputs.trigger.incident_status }}\n\nš <{{ .outputs.trigger.incident_url }}|View incident in Port>\n\nš No immediate action required. Monitor as needed.",
"type": "markdown"
}
],
"channel": "#isaac-test"
}
},
"variables": {}
},
{
"identifier": "notify_teams_medium",
"title": "Notify Teams (Medium)",
"icon": "Slack",
"description": "Sends Slack notification for medium priority incidents",
"config": {
"type": "WEBHOOK",
"url": "https://slack.com/api/chat.postMessage",
"agent": false,
"synchronized": true,
"method": "POST",
"headers": {
"Content-Type": "application/json; charset=utf-8",
"Authorization": "Bearer {{ .secrets.SLACK_BOT_TOKEN }}"
},
"body": {
"blocks": [
{
"text": "ā ļø *Incident Alert*\n\n*Incident:* {{ .outputs.trigger.incident_title }}\n*Priority:* `{{ .outputs.trigger.incident_priority }}` | *Urgency:* `{{ .outputs.trigger.incident_urgency }}`\n*Status:* {{ .outputs.trigger.incident_status }}\n\nš *Response Resources Created:*\n⢠Slack Channel: {{ .outputs.create_slack_channel_medium.slack_channel_name }} \n⢠Jira Ticket: <{{ .outputs.create_jira_ticket_medium.jira_ticket_url }}|View in Jira>\n⢠PagerDuty: <{{ .outputs.trigger.incident_url }}|View in PagerDuty>\n\n:link: <{{.outputs.trigger.incident_url}}|View incident in Port>š Please review and coordinate in the Slack channel.",
"type": "markdown"
}
],
"channel": "{{ .outputs.create_slack_channel_medium.slack_channel_name }}"
}
},
"variables": {}
},
{
"identifier": "trigger",
"title": "Incident Created",
"icon": null,
"description": "Triggers when a PagerDuty incident is created",
"config": {
"type": "EVENT_TRIGGER",
"event": {
"type": "ENTITY_CREATED",
"blueprintIdentifier": "pagerdutyIncident"
}
},
"variables": {
"service_id": "{{ .diff.after.relations.pagerdutyService }}",
"incident_id": "{{ .diff.after.identifier }}",
"incident_url": "{{ .diff.after.properties.url }}",
"incident_title": "{{ .diff.after.title }}",
"incident_status": "{{ .diff.after.properties.status }}",
"incident_urgency": "{{ .diff.after.properties.urgency }}",
"incident_priority": "{{ .diff.after.properties.priority }}",
"incident_description": "{{ .diff.after.properties.description }}"
}
},
{
"identifier": "update_incident_critical",
"title": "Update Incident (All Resources)",
"icon": null,
"description": "Bulk updates the incident entity with Slack, Zoom, and Jira URLs",
"config": {
"type": "UPSERT_ENTITY",
"blueprintIdentifier": "pagerdutyIncident",
"mapping": {
"identifier": "{{ .outputs.trigger.incident_id }}",
"properties": {
"slack_channel": "{{ .outputs.create_slack_channel_critical.slack_channel_name // .outputs.create_slack_channel_medium.slack_channel_name}}",
"zoom_meeting_link": "{{ .outputs.create_zoom_meeting_critical.zoom_meeting_url }}",
"jira_tracking_ticket": "{{ .outputs.create_jira_ticket_critical.jira_ticket_url // .outputs.create_jira_ticket_medium.jira_ticket_url }}"
}
}
},
"variables": {}
}
],
"connections": [
{
"description": "Analyze incident severity",
"sourceIdentifier": "trigger",
"targetIdentifier": "determine_severity"
},
{
"description": "Critical/High ā Create Slack channel",
"sourceIdentifier": "determine_severity",
"targetIdentifier": "create_slack_channel_critical",
"sourceOptionIdentifier": "critical_high"
},
{
"description": "Then get Zoom API acces token",
"sourceIdentifier": "create_slack_channel_critical",
"targetIdentifier": "get_zoom_meeting_access_token"
},
{
"description": "Then create Zoom meeting",
"sourceIdentifier": "get_zoom_meeting_access_token",
"targetIdentifier": "create_zoom_meeting_critical"
},
{
"description": "Then create Jira ticket",
"sourceIdentifier": "create_zoom_meeting_critical",
"targetIdentifier": "create_jira_ticket_critical"
},
{
"description": "Then notify teams",
"sourceIdentifier": "create_jira_ticket_critical",
"targetIdentifier": "notify_teams_critical"
},
{
"description": "Finally Bulk update incident with all resources",
"sourceIdentifier": "notify_teams_critical",
"targetIdentifier": "update_incident_critical"
},
{
"description": "Medium ā Create Slack channel",
"sourceIdentifier": "determine_severity",
"targetIdentifier": "create_slack_channel_medium",
"sourceOptionIdentifier": "medium"
},
{
"description": "Then create Jira ticket",
"sourceIdentifier": "create_slack_channel_medium",
"targetIdentifier": "create_jira_ticket_medium"
},
{
"description": "Then notify team",
"sourceIdentifier": "create_jira_ticket_medium",
"targetIdentifier": "notify_teams_medium"
},
{
"description": "Finally update incident with Slack & Jira",
"sourceIdentifier": "notify_teams_medium",
"targetIdentifier": "update_incident_critical"
},
{
"description": "Low ā Notify only",
"sourceIdentifier": "determine_severity",
"targetIdentifier": "notify_teams_low",
"sourceOptionIdentifier": "low"
}
]
}
Configure the workflowā
After publishing, replace placeholder values in the workflow nodes.
Specify Jira project key
- In the
create_jira_ticket_criticalandcreate_jira_ticket_mediumnodes:- Replace
<YOUR_JIRA_ORGANIZATION_URL>in the webhook URL with your Jira organization URL (e.g.,example.atlassian.net). - Set the
<YOUR_JIRA_PROJECT>value to your Jira project key. - Ensure that the Jira authorization header is set to
Basic {{ .secrets.JIRA_AUTH }}.
- Replace
Configure Slack
- In the
create_slack_channel_critical,create_slack_channel_medium, andsend_low_priority_notificationnodes:- Set the authorization header to
Bearer {{ .secrets.SLACK_BOT_TOKEN }}. - Update the low-priority channel name if needed.
- Set the authorization header to
Configure Zoom
In the get_zoom_meeting_access_token node, set the authorization header to Basic {{ .secrets.ZOOM_CLIENT_ID + ":" + .secrets.ZOOM_CLIENT_SECRET | @base64 }}.
Test the workflowā
Create a test incidentā
-
Create a new PagerDuty incident and verify it is added to the entity page.
-
Confirm that the workflow is triggered and that the appropriate path is taken.
Verify workflow runsā
-
Open the workflow run from the Audit log page and confirm each node completed successfully.
-
Check the node outputs for Slack, Zoom, and Jira responses.
Verify incident updatesā
-
Go to your Port catalog and find the incident entity.
-
Check that the incident has been updated with:
- Slack channel ID.
- Zoom meeting link (if applicable).
- Jira tracking ticket URL.
-
Verify the links are functional and accessible.
Verify Slack notificationsā
-
Go to your Slack workspace.
-
Verify that:
- A new channel was created with the incident identifier.
- Notification messages were posted to the channel.
- The channel contains relevant incident information.