Skip to main content

Check out Port for yourself āžœĀ 

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.

Incident orchestration workflow
Beta feature

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:

Alternative integrations

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.

  1. Go to the builder page of your portal.

  2. Click on + Blueprint.

  3. Click on the {...} Edit JSON button.

  4. 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
    }
    }
    }
  5. Click Create to save the blueprint.

If you already have PagerDuty integration installed

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.

  1. Go to the builder page of your portal.

  2. Select the PagerDuty Incident blueprint.

  3. Click on the {...} Edit JSON button.

  4. Add the following properties under the properties schema:

    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​

  1. Create a Slack app and install it on a workspace.

  2. 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.
  3. Install the app in your Slack workspace.

  4. 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_TOKEN Port secret.

    Slack OAuth token screen

Set up Zoom meeting​

Create a Server-to-Server OAuth app.

  1. Go to Zoom Marketplace.

  2. Click Develop > Build App and select Server-to-Server OAuth.

  3. Fill in the app details and make note of:

    • Account ID.
    • Client ID.
    • Client Secret.
  4. Under Scopes, add:

    • meeting:write.
    • meeting:read.
    • (Optional) user:read.
    Zoom server-to-server OAuth setup

Set up Jira API access​

  1. Log in to your Jira instance.

  2. Generate an API token:

Add Port secrets​

To add secrets to your portal:

  1. Click ... in the top right corner of your Port application.

  2. Click Credentials.

  3. Click the Secrets tab.

  4. 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:
      echo -n "your-email@domain.com:your-api-token" | base64
      Replace your-email@domain.com with your Jira email and your-api-token with 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.

  1. Go to the workflows page of your portal.

  2. Click + Workflow.

  3. In the dialog, add a short description and click Build with AI.

    Create new workflow dialog
  4. 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 changes

    The AI will generate the workflow structure. Click Review changes to inspect it, then click Apply to load it into the editor.

  5. Review the generated workflow and replace placeholder values with your actual values (see Configure the workflow below).

  6. 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_critical and create_jira_ticket_medium nodes:
    • 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 }}.

Configure Slack

  • In the create_slack_channel_critical, create_slack_channel_medium, and send_low_priority_notification nodes:
    • Set the authorization header to Bearer {{ .secrets.SLACK_BOT_TOKEN }}.
    • Update the low-priority channel name if needed.

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​

  1. Create a new PagerDuty incident and verify it is added to the entity page.

  2. Confirm that the workflow is triggered and that the appropriate path is taken.

Verify workflow runs​

  1. Open the workflow run from the Audit log page and confirm each node completed successfully.

  2. Check the node outputs for Slack, Zoom, and Jira responses.

Verify incident updates​

  1. Go to your Port catalog and find the incident entity.

  2. Check that the incident has been updated with:

    • Slack channel ID.
    • Zoom meeting link (if applicable).
    • Jira tracking ticket URL.
  3. Verify the links are functional and accessible.

    Incident entity with orchestration fields

Verify Slack notifications​

  1. Go to your Slack workspace.

  2. Verify that:

    • A new channel was created with the incident identifier.
    • Notification messages were posted to the channel.
    • The channel contains relevant incident information.
    Slack incident notification message