This workflow corresponds to n8n.io template #11610 — we link there as the canonical source.
This workflow follows the Jira → Slack recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "incidentLifecycle01",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Incident Lifecycle Management with Port",
"tags": [],
"nodes": [
{
"id": "incident-trigger",
"name": "On PagerDuty Incident",
"type": "n8n-nodes-base.webhook",
"position": [
-1400,
240
],
"parameters": {
"path": "pagerduty/incident",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 1
},
{
"id": "check-event-type",
"name": "Check Event Type",
"type": "n8n-nodes-base.switch",
"position": [
-1160,
240
],
"parameters": {
"rules": {
"rules": [
{
"value": "incident.triggered",
"output": 0,
"value2": "={{ $json.body.event.event_type }}",
"operation": "equals"
},
{
"value": "incident.resolved",
"output": 1,
"value2": "={{ $json.body.event.event_type }}",
"operation": "equals"
}
]
},
"fallbackOutput": 2
},
"typeVersion": 2
},
{
"id": "extract-context-triggered",
"name": "Extract Context (New Incident)",
"type": "CUSTOM.portIo",
"position": [
-880,
120
],
"parameters": {
"model": "gpt-5",
"labels": "{\n \"source\": \"n8n-workflow\",\n \"use_case\": \"incident-context-enrichment\"\n }",
"prompt": "=A PagerDuty incident has been triggered.\n\nIncident Details:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('On PagerDuty Incident').item.json.body.event.data.service.name }}\n- Urgency: {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n- Created At: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n\nQuery the Port catalog for comprehensive context about this incident.\n\nRetrieve:\n1. Affected service details (tier, criticality, SLA)\n2. Service owners and current on-call engineers\n3. Recent deployments (last 48 hours)\n4. Related pull requests or configuration changes\n5. Dependencies and upstream/downstream services\n6. Known vulnerabilities or ongoing issues\n7. Runbook URLs and monitoring dashboards\n8. Past similar incidents and resolution patterns\n9. Team's Slack channel\n\nOutput as JSON:\n{\n \"service_name\": \"\",\n \"service_tier\": \"tier1|tier2|tier3\",\n \"sla_minutes\": 0,\n \"owners\": [],\n \"on_call_engineers\": [],\n \"slack_channel\": \"\",\n \"recent_deployments\": [],\n \"recent_changes\": [],\n \"dependencies\": [],\n \"runbook_url\": \"\",\n \"dashboard_url\": \"\",\n \"past_incidents_summary\": \"\",\n \"known_issues\": [],\n \"jira_project_key\": \"\"\n}\n\nRules:\n- Only include data that exists in Port\n- Use empty strings/arrays if not found",
"agentIdentifier": "context_retriever_agent"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "parse-context-triggered",
"name": "Parse Context (New Incident)",
"type": "CUSTOM.portIo",
"position": [
-640,
120
],
"parameters": {
"operation": "getInvocation",
"invocationId": "={{ $json.invocationIdentifier }}"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "assess-severity",
"name": "Assess Severity",
"type": "n8n-nodes-base.openAi",
"position": [
-400,
120
],
"parameters": {
"model": "gpt-4o-mini",
"prompt": {
"messages": [
{
"content": "=You are an incident management expert. Assess this incident and determine if immediate escalation is needed.\n\nIncident:\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('On PagerDuty Incident').item.json.body.event.data.service.name }}\n- Urgency: {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n\nContext from Port:\n{{ $json.result.message }}\n\nConsider:\n1. Is this a production service?\n2. Were there recent deployments that could be related?\n3. Are there known issues affecting this service?\n4. What is the SLA requirement?\n\nProvide your response as JSON:\n{\n \"severity_assessment\": \"critical|high|medium|low\",\n \"needs_escalation\": true or false,\n \"escalation_reason\": \"reason if needs_escalation is true\",\n \"likely_cause\": \"brief assessment of likely cause\",\n \"recommended_actions\": [\"action 1\", \"action 2\", \"action 3\"],\n \"investigation_checklist\": [\"check 1\", \"check 2\", \"check 3\"]\n}\n\nReturn ONLY the JSON object."
}
]
},
"options": {},
"resource": "chat",
"requestOptions": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "check-needs-escalation",
"name": "Needs Escalation?",
"type": "n8n-nodes-base.if",
"position": [
-160,
120
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.message.content.parseJson().needs_escalation }}",
"value2": "={{ true }}"
}
]
}
},
"typeVersion": 1
},
{
"id": "notify-team",
"name": "Notify Team Channel",
"type": "n8n-nodes-base.slack",
"position": [
80,
40
],
"parameters": {
"text": "=:rotating_light: *INCIDENT ALERT*\n\n*{{ $('On PagerDuty Incident').item.json.body.event.data.title }}*\n\n*Service:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_name }} ({{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_tier }})\n*Urgency:* {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n*Severity Assessment:* {{ $('Assess Severity').item.json.message.content.parseJson().severity_assessment }}\n\n*On-Call:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().on_call_engineers.join(', ') || 'Check PagerDuty' }}\n\n*Likely Cause:*\n{{ $('Assess Severity').item.json.message.content.parseJson().likely_cause }}\n\n*Recommended Actions:*\n{{ $('Assess Severity').item.json.message.content.parseJson().recommended_actions.map((a, i) => (i+1) + '. ' + a).join('\\n') }}\n\n*Recent Changes:*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().recent_deployments.slice(0,3).map(d => '- ' + d).join('\\n') || 'None in last 48h' }}\n\n*Resources:*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().runbook_url ? '<' + $('Parse Context (New Incident)').item.json.result.message.parseJson().runbook_url + '|Runbook>' : '' }} {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().dashboard_url ? '| <' + $('Parse Context (New Incident)').item.json.result.message.parseJson().dashboard_url + '|Dashboard>' : '' }}\n\n:pagerduty: <{{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}|View in PagerDuty>",
"channel": "={{ $('Parse Context (New Incident)').item.json.result.message.parseJson().slack_channel || '#incidents' }}",
"attachments": [],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "escalate-leadership",
"name": "Escalate to Leadership",
"type": "n8n-nodes-base.slack",
"position": [
80,
-120
],
"parameters": {
"text": "=:rotating_light::rotating_light: *INCIDENT ESCALATION*\n\n*{{ $('On PagerDuty Incident').item.json.body.event.data.title }}*\n\n*Service:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_name }} ({{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_tier }})\n*Escalation Reason:* {{ $('Assess Severity').item.json.message.content.parseJson().escalation_reason }}\n\n*Team Channel:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().slack_channel || '#incidents' }}\n*On-Call:* {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().on_call_engineers.join(', ') || 'Check PagerDuty' }}\n\n:pagerduty: <{{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}|View in PagerDuty>\n\n_Response team has been notified._",
"channel": "#leadership-alerts",
"attachments": [],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "create-jira-incident",
"name": "Create Jira Incident Ticket",
"type": "n8n-nodes-base.jira",
"position": [
320,
120
],
"parameters": {
"project": {
"__rl": true,
"mode": "id",
"value": "={{ $('Parse Context (New Incident)').item.json.result.message.parseJson().jira_project_key || 'INC' }}"
},
"summary": "=[INC] {{ $('On PagerDuty Incident').item.json.body.event.data.title }}",
"resource": "issue",
"issueType": {
"__rl": true,
"mode": "name",
"value": "Bug"
},
"additionalFields": {
"labels": [
"incident",
"pagerduty",
"auto-generated"
],
"priority": {
"__rl": true,
"mode": "name",
"value": "={{ $('Assess Severity').item.json.message.content.parseJson().severity_assessment === 'critical' ? 'Highest' : ($('Assess Severity').item.json.message.content.parseJson().severity_assessment === 'high' ? 'High' : 'Medium') }}"
},
"description": "=*Incident Details*\n- PagerDuty ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- PagerDuty URL: {{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}\n- Created: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n- Urgency: {{ $('On PagerDuty Incident').item.json.body.event.data.urgency }}\n\n*Service Context*\n- Service: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_name }}\n- Tier: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().service_tier }}\n- On-Call: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().on_call_engineers.join(', ') }}\n- Owners: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().owners.join(', ') }}\n\n*AI Assessment*\n- Severity: {{ $('Assess Severity').item.json.message.content.parseJson().severity_assessment }}\n- Likely Cause: {{ $('Assess Severity').item.json.message.content.parseJson().likely_cause }}\n\n*Investigation Checklist*\n{{ $('Assess Severity').item.json.message.content.parseJson().investigation_checklist.map(c => '- [ ] ' + c).join('\\n') }}\n\n*Recommended Actions*\n{{ $('Assess Severity').item.json.message.content.parseJson().recommended_actions.map((a, i) => (i+1) + '. ' + a).join('\\n') }}\n\n*Recent Changes*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().recent_deployments.map(d => '- ' + d).join('\\n') || 'None' }}\n\n*Resources*\n- Runbook: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().runbook_url || 'N/A' }}\n- Dashboard: {{ $('Parse Context (New Incident)').item.json.result.message.parseJson().dashboard_url || 'N/A' }}\n\n*Past Incidents*\n{{ $('Parse Context (New Incident)').item.json.result.message.parseJson().past_incidents_summary || 'No similar incidents found' }}\n\n---\n_Auto-generated by n8n + Port incident workflow_"
}
},
"credentials": {
"jiraSoftwareCloudApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "notify-jira-created",
"name": "Notify Jira Created",
"type": "n8n-nodes-base.slack",
"position": [
560,
120
],
"parameters": {
"text": "=:jira: *Incident Ticket Created*\n\n{{ $json.key }}\n\nTrack investigation and resolution in Jira.",
"channel": "={{ $('Parse Context (New Incident)').item.json.result.message.parseJson().slack_channel || '#incidents' }}",
"attachments": [],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "extract-context-resolved",
"name": "Extract Context (Resolved)",
"type": "CUSTOM.portIo",
"position": [
-880,
360
],
"parameters": {
"model": "gpt-5",
"labels": "{\n \"source\": \"n8n-workflow\",\n \"use_case\": \"incident-resolution-context\"\n }",
"prompt": "=A PagerDuty incident has been resolved.\n\nIncident Details:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('On PagerDuty Incident').item.json.body.event.data.service.name }}\n- Created At: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n- Resolved At: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at || new Date().toISOString() }}\n\nQuery the Port catalog for post-incident context.\n\nRetrieve:\n1. Service details and owners\n2. Team's Slack channel\n3. Changes made during the incident window\n4. Confluence/Notion space for post-mortems\n5. Calendar integration details for scheduling\n\nCalculate incident_duration_minutes from created_at to resolved_at.\n\nOutput as JSON:\n{\n \"service_name\": \"\",\n \"owners\": [],\n \"slack_channel\": \"\",\n \"confluence_space\": \"\",\n \"calendar_id\": \"\",\n \"incident_duration_minutes\": 0,\n \"changes_during_incident\": [],\n \"stakeholders_to_invite\": []\n}\n\nOnly include data that exists in Port.",
"agentIdentifier": "context_retriever_agent"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "parse-context-resolved",
"name": "Parse Context (Resolved)",
"type": "CUSTOM.portIo",
"position": [
-640,
360
],
"parameters": {
"operation": "getInvocation",
"invocationId": "={{ $json.invocationIdentifier }}"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "generate-postmortem",
"name": "Generate Post-Mortem Template",
"type": "n8n-nodes-base.openAi",
"position": [
-400,
360
],
"parameters": {
"model": "gpt-4o-mini",
"prompt": {
"messages": [
{
"content": "=Create a post-mortem document template for this resolved incident.\n\nIncident:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $json.result.message.parseJson().service_name }}\n- Duration: {{ $json.result.message.parseJson().incident_duration_minutes }} minutes\n- Created: {{ $('On PagerDuty Incident').item.json.body.event.data.created_at }}\n- Resolved: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at }}\n\nContext:\n{{ $json.result.message }}\n\nCreate a structured post-mortem template as JSON:\n{\n \"title\": \"Post-Mortem: [incident title]\",\n \"summary\": \"Brief 2-3 sentence summary\",\n \"timeline\": [\n {\"time\": \"HH:MM\", \"event\": \"Incident detected\"},\n {\"time\": \"HH:MM\", \"event\": \"Response initiated\"},\n {\"time\": \"HH:MM\", \"event\": \"Root cause identified\"},\n {\"time\": \"HH:MM\", \"event\": \"Resolution applied\"},\n {\"time\": \"HH:MM\", \"event\": \"Incident resolved\"}\n ],\n \"impact\": \"Description of customer/business impact\",\n \"root_cause_analysis\": \"[To be filled during post-mortem meeting]\",\n \"action_items\": [\n {\"action\": \"Suggested action 1\", \"owner\": \"TBD\", \"due_date\": \"TBD\"},\n {\"action\": \"Suggested action 2\", \"owner\": \"TBD\", \"due_date\": \"TBD\"}\n ],\n \"lessons_learned\": \"[To be filled during post-mortem meeting]\",\n \"meeting_attendees\": []\n}\n\nReturn ONLY the JSON object."
}
]
},
"options": {},
"resource": "chat",
"requestOptions": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "schedule-postmortem",
"name": "Schedule Post-Mortem via Port",
"type": "CUSTOM.portIo",
"position": [
-160,
360
],
"parameters": {
"model": "gpt-5",
"labels": "{\n \"source\": \"n8n-workflow\",\n \"use_case\": \"post-mortem-scheduling\"\n }",
"prompt": "=An incident has been resolved and needs a post-mortem meeting scheduled.\n\nIncident Details:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Title: {{ $('On PagerDuty Incident').item.json.body.event.data.title }}\n- Service: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().service_name }}\n- Duration: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes }} minutes\n- Resolved At: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at }}\n\nStakeholders to invite:\n{{ $('Parse Context (Resolved)').item.json.result.message.parseJson().stakeholders_to_invite.join(', ') || $('Parse Context (Resolved)').item.json.result.message.parseJson().owners.join(', ') }}\n\nPost-Mortem Template:\n{{ $('Generate Post-Mortem Template').item.json.message.content }}\n\nYour tasks:\n1. Create a post-mortem document (in Confluence/Notion if available) with the template content\n2. Schedule a post-mortem meeting for 2-3 business days from now\n3. Invite relevant stakeholders (service owners, on-call engineers who responded)\n4. Include the incident details and post-mortem document link in the meeting invite\n\nRespond with JSON:\n{\n \"document_created\": true or false,\n \"document_url\": \"URL if created\",\n \"meeting_scheduled\": true or false,\n \"meeting_time\": \"ISO timestamp\",\n \"attendees_invited\": [],\n \"status\": \"success|partial|failed\",\n \"message\": \"Summary of actions taken\"\n}",
"agentIdentifier": "post_mortem_scheduler_agent"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "parse-schedule-response",
"name": "Parse Schedule Response",
"type": "CUSTOM.portIo",
"position": [
80,
360
],
"parameters": {
"operation": "getInvocation",
"invocationId": "={{ $json.invocationIdentifier }}"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "notify-resolved",
"name": "Notify Incident Resolved",
"type": "n8n-nodes-base.slack",
"position": [
320,
360
],
"parameters": {
"text": "=:white_check_mark: *INCIDENT RESOLVED*\n\n*{{ $('On PagerDuty Incident').item.json.body.event.data.title }}*\n\n*Service:* {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().service_name }}\n*Duration:* {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes }} minutes\n*MTTR:* {{ Math.floor($('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes / 60) }}h {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes % 60 }}m\n\n*Post-Mortem:*\n{{ $json.result.message.parseJson().document_url ? '<' + $json.result.message.parseJson().document_url + '|View Document>' : 'Document creation pending' }}\n\n*Post-Mortem Meeting:*\n{{ $json.result.message.parseJson().meeting_scheduled ? 'Scheduled for ' + $json.result.message.parseJson().meeting_time : 'Scheduling in progress' }}\n{{ $json.result.message.parseJson().attendees_invited.length > 0 ? 'Attendees: ' + $json.result.message.parseJson().attendees_invited.join(', ') : '' }}\n\n{{ $json.result.message.parseJson().message }}\n\n:pagerduty: <{{ $('On PagerDuty Incident').item.json.body.event.data.html_url }}|View in PagerDuty>",
"channel": "={{ $('Parse Context (Resolved)').item.json.result.message.parseJson().slack_channel || '#incidents' }}",
"attachments": [],
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "log-mttr-port",
"name": "Log MTTR to Port",
"type": "CUSTOM.portIo",
"position": [
320,
520
],
"parameters": {
"model": "gpt-5",
"labels": "{\n \"source\": \"n8n-workflow\",\n \"use_case\": \"metrics-logging\"\n }",
"prompt": "=Log the incident resolution metrics to Port.\n\nIncident:\n- ID: {{ $('On PagerDuty Incident').item.json.body.event.data.id }}\n- Service: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().service_name }}\n- MTTR: {{ $('Parse Context (Resolved)').item.json.result.message.parseJson().incident_duration_minutes }} minutes\n- Resolved At: {{ $('On PagerDuty Incident').item.json.body.event.data.resolved_at }}\n\nUpdate the service entity in Port with:\n1. Latest incident MTTR\n2. Increment incident count\n3. Update last incident timestamp\n\nRespond with JSON:\n{\n \"metrics_logged\": true or false,\n \"service_updated\": \"\",\n \"message\": \"\"\n}",
"agentIdentifier": "metrics_logger_agent"
},
"credentials": {
"portIoApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "sticky-main",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1680,
-120
],
"parameters": {
"color": 7,
"width": 520,
"height": 800,
"content": "## Incident Lifecycle Management with Port\n\nComplete incident workflow from detection through resolution to post-mortem, with full organizational context from Port's catalog.\n\n### How it works\n\n**On Incident Triggered:**\n1. Receive PagerDuty webhook\n2. Query Port for service context, on-call, recent changes\n3. AI assesses severity and recommends actions\n4. Route notifications based on severity\n5. Create Jira ticket with context\n\n**On Incident Resolved:**\n1. Calculate MTTR\n2. Generate post-mortem template\n3. Port AI Agent schedules post-mortem meeting\n4. Create post-mortem document\n5. Notify team with resolution summary\n6. Log MTTR metrics to Port\n\n### Setup\n- [ ] Register for free at [Port.io](https://www.port.io)\n- [ ] Configure Port with services, on-call, and deployment history\n- [ ] Set up Port AI agents for post-mortem scheduling\n- [ ] Connect PagerDuty webhook for incident events\n- [ ] Configure Jira project for incidents\n- [ ] Set up Slack channels for alerts\n- [ ] Add OpenAI credentials\n- [ ] Test with a sample incident"
},
"typeVersion": 1
},
{
"id": "sticky-triggered",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-920,
-120
],
"parameters": {
"color": 4,
"width": 840,
"height": 320,
"content": "## Incident Triggered Flow\n\nPort context enrichment + AI severity assessment + intelligent routing + Jira creation"
},
"typeVersion": 1
},
{
"id": "sticky-resolved",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-920,
280
],
"parameters": {
"color": 3,
"width": 560,
"height": 360,
"content": "## Incident Resolved Flow\n\nMTTR calculation + Post-mortem generation + Port AI Agent schedules meeting + Document creation + Metrics logging"
},
"typeVersion": 1
},
{
"id": "sticky-port-agent",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-200,
200
],
"parameters": {
"color": 6,
"width": 320,
"height": 240,
"content": "## Port AI Agent\n\nSchedules post-mortem meeting:\n- Creates document\n- Invites stakeholders\n- Sets appropriate time\n- Links to incident"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "incident-lifecycle-v2",
"connections": {
"Assess Severity": {
"main": [
[
{
"node": "Needs Escalation?",
"type": "main",
"index": 0
}
]
]
},
"Check Event Type": {
"main": [
[
{
"node": "Extract Context (New Incident)",
"type": "main",
"index": 0
}
],
[
{
"node": "Extract Context (Resolved)",
"type": "main",
"index": 0
}
]
]
},
"Needs Escalation?": {
"main": [
[
{
"node": "Notify Team Channel",
"type": "main",
"index": 0
},
{
"node": "Escalate to Leadership",
"type": "main",
"index": 0
}
],
[
{
"node": "Notify Team Channel",
"type": "main",
"index": 0
}
]
]
},
"Notify Team Channel": {
"main": [
[
{
"node": "Create Jira Incident Ticket",
"type": "main",
"index": 0
}
]
]
},
"On PagerDuty Incident": {
"main": [
[
{
"node": "Check Event Type",
"type": "main",
"index": 0
}
]
]
},
"Escalate to Leadership": {
"main": [
[
{
"node": "Create Jira Incident Ticket",
"type": "main",
"index": 0
}
]
]
},
"Parse Schedule Response": {
"main": [
[
{
"node": "Notify Incident Resolved",
"type": "main",
"index": 0
},
{
"node": "Log MTTR to Port",
"type": "main",
"index": 0
}
]
]
},
"Parse Context (Resolved)": {
"main": [
[
{
"node": "Generate Post-Mortem Template",
"type": "main",
"index": 0
}
]
]
},
"Extract Context (Resolved)": {
"main": [
[
{
"node": "Parse Context (Resolved)",
"type": "main",
"index": 0
}
]
]
},
"Create Jira Incident Ticket": {
"main": [
[
{
"node": "Notify Jira Created",
"type": "main",
"index": 0
}
]
]
},
"Parse Context (New Incident)": {
"main": [
[
{
"node": "Assess Severity",
"type": "main",
"index": 0
}
]
]
},
"Generate Post-Mortem Template": {
"main": [
[
{
"node": "Schedule Post-Mortem via Port",
"type": "main",
"index": 0
}
]
]
},
"Schedule Post-Mortem via Port": {
"main": [
[
{
"node": "Parse Schedule Response",
"type": "main",
"index": 0
}
]
]
},
"Extract Context (New Incident)": {
"main": [
[
{
"node": "Parse Context (New Incident)",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
jiraSoftwareCloudApiopenAiApiportIoApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Complete incident workflow from detection through resolution to post-mortem, with full organizational context from Port's catalog. This template handles both incident triggered and resolved events from PagerDuty, automatically creating Jira tickets with context, notifying teams…
Source: https://n8n.io/workflows/11610/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Complete security workflow from vulnerability detection to automated remediation, with severity-based routing and full organizational context from Port's catalog. This template provides end-to-end lif
Eliminate the manual chaos of HR and legal document management. This workflow automates the transition from a raw document upload to a structured, audit-ready archive by combining UploadToURL for inst
Automatically detect and escalate Product UAT critical bugs using AI, create Jira issues, notify engineering teams, and close the feedback loop with testers.
This workflow collects customer feedback from a webhook, validates the incoming data, analyzes the sentiment using OpenAI and creates Jira tasks for negative or feature-request feedback. It also gener
Webhook → Jira “Bug Suspicion” → Slack QA Escalation. Uses openAi, jira, slack. Webhook trigger; 12 nodes.