{
  "name": "Lumeor | Employee offboarding",
  "nodes": [
    {
      "parameters": {
        "content": "## Employee offboarding (HR request, Google Workspace, Jira, Claude)\n\n**What it does**\nHR submits a departure from a restricted form (or a BambooHR webhook). The workflow validates it and sets the access cutoff: end of the last day for voluntary departures, the exact time HR gives for involuntary ones. Right away, Claude drafts a handoff checklist from work metadata and emails it to the manager. At the cutoff, the workflow suspends the Google Workspace account, signs out all sessions, transfers Drive files to the manager, opens a Jira ticket listing every app outside Google sign-in for IT to revoke, and writes an audit row.\n\n**Setup**\n1. Run n8n self-hosted for this workflow: it holds admin credentials.\n2. Credentials: Header Auth (for the webhook), Google Workspace Admin OAuth2 (turn on custom scopes and add https://www.googleapis.com/auth/admin.directory.user.security and https://www.googleapis.com/auth/admin.datatransfer to the defaults), Anthropic (API key), Gmail, Jira Software Cloud, Google Sheets, Slack.\n3. Replace REPLACE_WITH_DRIVE_APPLICATION_ID with the Drive and Docs application ID from the Data Transfer API's applications list.\n4. Create an Audit tab with headers: logged_at, employee_id, name, work_email, departure_type, last_day, cutoff_at, google_suspended, sessions_signed_out, drive_transfer_id, drive_transfer_status, apps_for_it. Replace REPLACE_WITH_SHEET_ID.\n5. Replace REPLACE_WITH_JIRA_PROJECT_ID, REPLACE_WITH_JIRA_ISSUE_TYPE_ID and REPLACE_WITH_SLACK_EXCEPTIONS_CHANNEL_ID. List your non-SSO apps in DEFAULT_APPS (*Validate and schedule cutoff*).\n6. Test on a dummy user with access to everything before the first real departure.\n\n**Notes**\n- The handoff draft reads only work metadata HR or the manager supplies, never private messages.\n- Model: claude-opus-5-5 with structured outputs. claude-haiku-5-5 is a cheaper option for high-volume, simple classification.\n- Suspension is not deletion. Delete accounts later, after data is confirmed transferred.\n\nTemplate by Lumeor Studio, https://www.lumeor.studio/guides/automate-employee-offboarding/",
        "height": 940,
        "width": 560,
        "color": 5
      },
      "id": "4488d4e9-7b9b-4673-a437-054e5f474710",
      "name": "About this template",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -760,
        0
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "hr-offboarding",
        "authentication": "headerAuth",
        "responseMode": "onReceived",
        "options": {}
      },
      "id": "8a747d48-2578-4fbb-a8c9-eec7574f0b28",
      "name": "HR offboarding request",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        300
      ],
      "webhookId": "d145a538-4dfc-4fc1-b175-d1036696c5fe",
      "credentials": {
        "httpHeaderAuth": {
          "id": "",
          "name": "Offboarding webhook header"
        }
      }
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Accepts a restricted HR form post or a BambooHR webhook, validates it and sets\n// the access cutoff. Throwing sends the item to the exceptions path.\nconst TZ = 'America/New_York';\nconst VOLUNTARY_CUTOFF_HOUR = 18; // end of the last day, local time\n// Field names when the request comes from a BambooHR webhook (\"post fields\").\nconst BAMBOO_FIELDS = { work_email: 'Work Email', last_day: 'Termination Date', manager_email: 'Supervisor email', name: 'Full Name', job_title: 'Job Title', department: 'Department' };\n// Apps on the access record that are NOT behind Google sign-in. IT revokes these from the ticket.\nconst DEFAULT_APPS = ['Slack', 'GitHub', 'CRM', 'Password manager', 'Payroll and HRIS (as employee)'];\n\nconst out = [];\nfor (const item of $input.all()) {\n  const body = item.json.body || {};\n  let r;\n  if (Array.isArray(body.employees)) { // BambooHR webhook\n    const e = body.employees[0] || {};\n    const f = e.fields || {};\n    r = { employee_id: e.id, departure_type: 'voluntary', apps: DEFAULT_APPS };\n    for (const [k, label] of Object.entries(BAMBOO_FIELDS)) r[k] = f[label] && typeof f[label] === 'object' ? f[label].value : f[label];\n  } else { // HR form\n    r = { ...body, apps: Array.isArray(body.apps) && body.apps.length ? body.apps : DEFAULT_APPS };\n  }\n\n  const missing = ['work_email', 'manager_email', 'last_day', 'name'].filter((k) => !r[k]);\n  if (missing.length) throw new Error(`Offboarding request missing ${missing.join(', ')}`);\n  const type = String(r.departure_type || 'voluntary').toLowerCase();\n  if (!['voluntary', 'involuntary'].includes(type)) throw new Error(`Unknown departure_type \"${r.departure_type}\"`);\n\n  let cutoff;\n  if (type === 'involuntary') {\n    if (!r.cutoff_at) throw new Error('Involuntary departures need an exact cutoff_at time (ISO 8601)');\n    cutoff = DateTime.fromISO(r.cutoff_at, { zone: TZ });\n  } else {\n    cutoff = DateTime.fromISO(String(r.last_day).slice(0, 10), { zone: TZ }).set({ hour: VOLUNTARY_CUTOFF_HOUR });\n  }\n  if (!cutoff.isValid) throw new Error(`Cannot read the cutoff date for ${r.name}`);\n  const now = $now.setZone(TZ);\n  if (cutoff < now.minus({ days: 2 })) throw new Error(`Cutoff ${cutoff.toISO()} is more than two days in the past. Check the dates before suspending.`);\n  if (cutoff < now) cutoff = now.plus({ minutes: 1 }); // late entry: cut off right away\n\n  out.push({ json: {\n    employee_id: r.employee_id || '',\n    name: r.name,\n    work_email: String(r.work_email).toLowerCase(),\n    manager_email: String(r.manager_email).toLowerCase(),\n    job_title: r.job_title || '',\n    department: r.department || '',\n    last_day: String(r.last_day).slice(0, 10),\n    departure_type: type,\n    cutoff_at: cutoff.toISO(),\n    apps: r.apps,\n    open_work: r.open_work || '', // optional: open tickets, owned docs, recurring meetings (work metadata only)\n    context_line: `Offboarding ${r.name} (${type}), cutoff ${cutoff.toFormat('ccc LLL d, h:mm a ZZZZ')}`,\n  } });\n}\nreturn out;\n"
      },
      "id": "c07fde80-d658-4d44-881b-5747a945d28f",
      "name": "Validate and schedule cutoff",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        300
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.anthropic.com/v1/messages",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "anthropicApi",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "specifyBody": "json",
        "jsonBody": "={\n  \"model\": \"claude-opus-5-5\",\n  \"max_tokens\": 3000,\n  \"system\": \"You draft a handoff checklist for a manager whose team member is leaving. Use only the role, department, apps and open work you are given. Group items by area, suggest an owner by role (not by name), list files or accounts to check before access ends, and ask the manager about anything missing. Do not comment on the reason for leaving or on the person. Keep it practical and short.\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": {{ JSON.stringify('Role: ' + $json.job_title + '\\nDepartment: ' + $json.department + '\\nLast day: ' + $json.last_day + '\\nApps on access record: ' + $json.apps.join(', ') + '\\nOpen work supplied by HR or the manager:\\n' + ($json.open_work || 'none supplied')) }}\n    }\n  ],\n  \"output_config\": {\n    \"effort\": \"medium\",\n    \"format\": {\n      \"type\": \"json_schema\",\n      \"schema\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"required\": [\n          \"handoff_items\",\n          \"documents_to_check\",\n          \"questions_for_manager\"\n        ],\n        \"properties\": {\n          \"handoff_items\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"required\": [\n                \"area\",\n                \"item\",\n                \"suggested_owner_role\"\n              ],\n              \"properties\": {\n                \"area\": {\n                  \"type\": \"string\"\n                },\n                \"item\": {\n                  \"type\": \"string\"\n                },\n                \"suggested_owner_role\": {\n                  \"type\": \"string\"\n                }\n              }\n            }\n          },\n          \"documents_to_check\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"questions_for_manager\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        }\n      }\n    }\n  }\n}",
        "options": {
          "timeout": 180000
        }
      },
      "id": "eb07066a-68d6-4104-8c30-c1a61dc93481",
      "name": "Draft handoff checklist with Claude",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        440,
        100
      ],
      "credentials": {
        "anthropicApi": {
          "id": "",
          "name": "Anthropic account"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Turns Claude's draft into an email for the manager. Throwing sends the item to\n// the exceptions path; the access cutoff branch runs regardless.\nconst req = $('Validate and schedule cutoff').first().json;\nconst res = $input.first().json;\nif (res.stop_reason === 'refusal') throw new Error(`Handoff draft for ${req.name}: Claude declined (stop_reason refusal)`);\nif (res.stop_reason === 'max_tokens') throw new Error(`Handoff draft for ${req.name}: output cut off (stop_reason max_tokens)`);\n// Opus 5.5 always thinks, so a thinking block can come first: find the text block.\nconst block = (res.content || []).find((b) => b.type === 'text');\nif (!block) throw new Error(`Handoff draft for ${req.name}: Claude response has no text block`);\nlet d;\ntry { d = JSON.parse(block.text); } catch (e) { throw new Error(`Handoff draft for ${req.name}: unparsable output (${e.message})`); }\n\nconst body = [\n  `This is a draft handoff checklist for ${req.name} (${req.job_title}), whose last day is ${req.last_day}. Please review it with them before then, correct anything wrong, and assign owners.`,\n  '',\n  'Work to hand over:',\n  ...d.handoff_items.map((h) => `- [${h.area}] ${h.item} (suggested owner: ${h.suggested_owner_role})`),\n  '',\n  'Files and accounts to check before access ends:',\n  ...d.documents_to_check.map((x) => `- ${x}`),\n  '',\n  'Questions for you:',\n  ...d.questions_for_manager.map((q) => `- ${q}`),\n  '',\n  `Google Drive files transfer to you automatically at the access cutoff (${req.cutoff_at}).`,\n].join('\\n');\nreturn [{ json: { ...req, handoff_email: body } }];\n"
      },
      "id": "13cf4fbd-22b3-46d2-ace6-52969aacda97",
      "name": "Parse handoff draft",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        660,
        100
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "send",
        "sendTo": "={{ $json.manager_email }}",
        "subject": "=Handoff checklist draft: {{ $json.name }}, last day {{ $json.last_day }}",
        "emailType": "text",
        "message": "={{ $json.handoff_email }}",
        "options": {
          "appendAttribution": false
        }
      },
      "id": "f819b56c-c7f7-4c5d-8fa8-d08213226bb5",
      "name": "Email draft to manager",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        880,
        100
      ],
      "credentials": {
        "gmailOAuth2": {
          "id": "",
          "name": "Gmail account"
        }
      }
    },
    {
      "parameters": {
        "resume": "specificTime",
        "dateTime": "={{ $json.cutoff_at }}"
      },
      "id": "480a93e0-ceb6-4064-9e7c-c5ae36c74b6e",
      "name": "Wait until cutoff",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        440,
        340
      ],
      "webhookId": "4e078014-2478-4913-9e13-59b14270db87"
    },
    {
      "parameters": {
        "resource": "user",
        "operation": "update",
        "userId": {
          "__rl": true,
          "value": "={{ $('Validate and schedule cutoff').first().json.work_email }}",
          "mode": "userEmail"
        },
        "updateFields": {
          "suspendUi": true
        }
      },
      "id": "3f17f534-f18c-45b0-affc-c94f55d35390",
      "name": "Suspend Google account",
      "type": "n8n-nodes-base.gSuiteAdmin",
      "typeVersion": 1,
      "position": [
        660,
        340
      ],
      "credentials": {
        "gSuiteAdminOAuth2Api": {
          "id": "",
          "name": "Google Workspace Admin"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://admin.googleapis.com/admin/directory/v1/users/{{ encodeURIComponent($('Validate and schedule cutoff').first().json.work_email) }}/signOut",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "gSuiteAdminOAuth2Api",
        "options": {}
      },
      "id": "966090e1-c81a-491d-9708-82c650957ccb",
      "name": "Sign out all sessions",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        880,
        340
      ],
      "credentials": {
        "gSuiteAdminOAuth2Api": {
          "id": "",
          "name": "Google Workspace Admin"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "resource": "user",
        "operation": "get",
        "userId": {
          "__rl": true,
          "value": "={{ $('Validate and schedule cutoff').first().json.manager_email }}",
          "mode": "userEmail"
        },
        "output": "simplified",
        "projection": "basic"
      },
      "id": "92d5dd08-638d-4cba-b79d-e1c20c21f690",
      "name": "Get manager account",
      "type": "n8n-nodes-base.gSuiteAdmin",
      "typeVersion": 1,
      "position": [
        1100,
        340
      ],
      "credentials": {
        "gSuiteAdminOAuth2Api": {
          "id": "",
          "name": "Google Workspace Admin"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://admin.googleapis.com/admin/datatransfer/v1/transfers",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "gSuiteAdminOAuth2Api",
        "sendBody": true,
        "contentType": "json",
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ oldOwnerUserId: $('Suspend Google account').first().json.id, newOwnerUserId: $json.id, applicationDataTransfers: [{ applicationId: 'REPLACE_WITH_DRIVE_APPLICATION_ID', applicationTransferParams: [{ key: 'PRIVACY_LEVEL', value: ['PRIVATE', 'SHARED'] }] }] }) }}",
        "options": {}
      },
      "id": "77c0c453-ae35-4f0e-8bb5-88340087dcb8",
      "name": "Transfer Drive files to manager",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1320,
        340
      ],
      "credentials": {
        "gSuiteAdminOAuth2Api": {
          "id": "",
          "name": "Google Workspace Admin"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Builds the IT ticket for apps outside Google sign-in and the audit row.\nconst req = $('Validate and schedule cutoff').first().json;\nconst transfer = $input.first().json;\nconst suspended = $('Suspend Google account').first().json;\nconst now = $now.toISO();\nconst description = [\n  `${req.name} (${req.work_email}) left on ${req.last_day} (${req.departure_type}).`,\n  `Google Workspace: suspended and signed out at ${now}. Drive transfer to ${req.manager_email}: ${transfer.overallTransferStatusCode || 'requested'} (transfer ID ${transfer.id || 'n/a'}).`,\n  '',\n  'Remove access in each app below, revoke personal API tokens and OAuth grants, and rotate any shared passwords this person knew:',\n  ...req.apps.map((a) => `- [ ] ${a}`),\n  '',\n  `- [ ] Equipment: recover laptop and devices${req.departure_type === 'involuntary' ? ' (involuntary: coordinate with HR)' : ''}. Send a prepaid return kit to remote employees and log the tracking number on the asset.`,\n  '- [ ] Notify payroll and the benefits administrator of the final dates.',\n].join('\\n');\nreturn [{ json: {\n  // audit row columns\n  logged_at: now,\n  employee_id: req.employee_id,\n  name: req.name,\n  work_email: req.work_email,\n  departure_type: req.departure_type,\n  last_day: req.last_day,\n  cutoff_at: req.cutoff_at,\n  google_suspended: suspended.suspended === true ? 'yes' : 'check',\n  sessions_signed_out: 'yes',\n  drive_transfer_id: transfer.id || '',\n  drive_transfer_status: transfer.overallTransferStatusCode || '',\n  apps_for_it: req.apps.join(', '),\n  // for the IT ticket\n  ticket_summary: `Offboarding: remove remaining app access for ${req.name} (last day ${req.last_day})`,\n  ticket_description: description,\n} }];\n"
      },
      "id": "c96f45b4-8543-4e2d-b7f3-9f58cffa9db7",
      "name": "Build IT ticket and audit row",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1540,
        340
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "REPLACE_WITH_SHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Audit",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {
          "handlingExtraData": "ignoreIt"
        }
      },
      "id": "d41dfcd0-9e61-4c34-a651-3cd7e0407aae",
      "name": "Append audit log",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        1760,
        340
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "",
          "name": "Google Sheets account"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "jiraVersion": "cloud",
        "resource": "issue",
        "operation": "create",
        "project": {
          "__rl": true,
          "value": "REPLACE_WITH_JIRA_PROJECT_ID",
          "mode": "id"
        },
        "issueType": {
          "__rl": true,
          "value": "REPLACE_WITH_JIRA_ISSUE_TYPE_ID",
          "mode": "id"
        },
        "summary": "={{ $('Build IT ticket and audit row').item.json.ticket_summary }}",
        "additionalFields": {
          "description": "={{ $('Build IT ticket and audit row').item.json.ticket_description }}"
        }
      },
      "id": "dba82298-66bf-4c58-bc82-e319821cde60",
      "name": "Create IT ticket in Jira",
      "type": "n8n-nodes-base.jira",
      "typeVersion": 1,
      "position": [
        1980,
        340
      ],
      "credentials": {
        "jiraSoftwareCloudApi": {
          "id": "",
          "name": "Jira Cloud account"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "REPLACE_WITH_SLACK_EXCEPTIONS_CHANNEL_ID",
          "mode": "id"
        },
        "messageType": "text",
        "text": "=:warning: *Employee offboarding (check access manually)* needs attention\n{{ $json.reason || ($json.error ? ($json.error.message || JSON.stringify($json.error)) : 'Unknown error') }}\n{{ $json.context_line || '' }}\nExecution: {{ $execution.id }}",
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "id": "bfaa2ef7-4ab8-42cd-a1be-ea7f12c00295",
      "name": "Post exception to Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        1100,
        620
      ],
      "credentials": {
        "slackApi": {
          "id": "",
          "name": "Slack account"
        }
      }
    }
  ],
  "connections": {
    "HR offboarding request": {
      "main": [
        [
          {
            "node": "Validate and schedule cutoff",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate and schedule cutoff": {
      "main": [
        [
          {
            "node": "Draft handoff checklist with Claude",
            "type": "main",
            "index": 0
          },
          {
            "node": "Wait until cutoff",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Draft handoff checklist with Claude": {
      "main": [
        [
          {
            "node": "Parse handoff draft",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse handoff draft": {
      "main": [
        [
          {
            "node": "Email draft to manager",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait until cutoff": {
      "main": [
        [
          {
            "node": "Suspend Google account",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Suspend Google account": {
      "main": [
        [
          {
            "node": "Sign out all sessions",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sign out all sessions": {
      "main": [
        [
          {
            "node": "Get manager account",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get manager account": {
      "main": [
        [
          {
            "node": "Transfer Drive files to manager",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transfer Drive files to manager": {
      "main": [
        [
          {
            "node": "Build IT ticket and audit row",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build IT ticket and audit row": {
      "main": [
        [
          {
            "node": "Append audit log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append audit log": {
      "main": [
        [
          {
            "node": "Create IT ticket in Jira",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create IT ticket in Jira": {
      "main": [
        [],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}
