{
  "name": "Lumeor | Employee onboarding",
  "nodes": [
    {
      "parameters": {
        "content": "## Employee onboarding (DocuSign, BambooHR, Google Sheets, Asana, Claude, Slack)\n\n**What it does**\nWhen an offer letter envelope is completed in DocuSign, this workflow reads the new hire's details from the envelope's custom fields, creates the employee in BambooHR, adds a row to an onboarding tracker sheet, and creates a dated checklist in Asana: paperwork chasers, Form I-9 Section 1 by day one and Section 2 within three business days for employees, accounts, equipment timed for remote shipping, buddy assignment and 30/60/90-day check-ins. Claude drafts a first-week plan from the role and the manager's notes, and the draft is posted for the manager to edit before the new hire sees it.\n\n**Setup**\n1. Credentials: HTTP Basic Auth (for the webhook), BambooHR API, Google Sheets, Anthropic (API key), Asana, Slack.\n2. In DocuSign, add text custom fields to the offer template: first_name, last_name, job_title, department, manager_email, start_date (YYYY-MM-DD), worker_type (employee, contractor or intern), work_location, manager_notes. Create a Connect configuration for \"Envelope Completed\" in JSON format with custom fields included and Basic Authentication, pointing at this webhook's production URL.\n3. Create a sheet tab named Hires with headers: envelope_id, bamboohr_id, first_name, last_name, job_title, department, manager_email, start_date, worker_type, work_location, status, created_at. Replace REPLACE_WITH_SHEET_ID.\n4. Fill OWNERS and MANAGERS in *Fan out checklist*. Replace REPLACE_WITH_ASANA_WORKSPACE_ID, REPLACE_WITH_ASANA_ONBOARDING_PROJECT_ID, REPLACE_WITH_SLACK_HR_CHANNEL_ID and REPLACE_WITH_SLACK_EXCEPTIONS_CHANNEL_ID.\n\n**Notes**\n- Personal data stays in BambooHR. Only role, department, dates and manager notes go to the model.\n- Model: claude-opus-5-5 with structured outputs. claude-haiku-5-5 is a cheaper option for high-volume, simple classification.\n- Due dates skip weekends but not company holidays. A person must examine I-9 documents; the workflow only reminds.\n\nTemplate by Lumeor Studio, https://www.lumeor.studio/guides/automate-employee-onboarding/",
        "height": 860,
        "width": 560,
        "color": 5
      },
      "id": "2be45a03-a190-418e-bc97-3def81c0bcfa",
      "name": "About this template",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -760,
        0
      ]
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "docusign-offer-signed",
        "authentication": "basicAuth",
        "responseMode": "onReceived",
        "options": {}
      },
      "id": "a2b157f9-f373-4a84-9a98-292dfdf9c33c",
      "name": "DocuSign envelope completed",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        300
      ],
      "webhookId": "6a598375-7328-4571-bb7d-68f1bd533e63",
      "credentials": {
        "httpBasicAuth": {
          "id": "",
          "name": "DocuSign Connect basic auth"
        }
      }
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Reads a DocuSign Connect \"envelope-completed\" event (JSON format) for a signed\n// offer letter. New-hire details travel as envelope text custom fields, set by\n// the offer template. Throwing sends the item to the exceptions path.\nconst REQUIRED = ['first_name', 'last_name', 'job_title', 'department', 'manager_email', 'start_date', 'worker_type', 'work_location'];\nconst WORKER_TYPES = ['employee', 'contractor', 'intern'];\n\nconst addBusinessDays = (d, n) => { let x = d; let left = Math.abs(n); const step = n < 0 ? -1 : 1; while (left > 0) { x = x.plus({ days: step }); if (x.weekday <= 5) left--; } return x; };\n\nconst out = [];\nfor (const item of $input.all()) {\n  const body = item.json.body || {};\n  if (body.event && body.event !== 'envelope-completed') continue; // other envelope events are ignored\n  const data = body.data || {};\n  const summary = data.envelopeSummary || {};\n  const fields = {};\n  for (const f of ((summary.customFields || {}).textCustomFields || [])) fields[String(f.name).toLowerCase()] = String(f.value || '').trim();\n\n  const missing = REQUIRED.filter((k) => !fields[k]);\n  if (missing.length) throw new Error(`Envelope ${data.envelopeId}: missing custom fields ${missing.join(', ')}`);\n  const worker = fields.worker_type.toLowerCase();\n  if (!WORKER_TYPES.includes(worker)) throw new Error(`Envelope ${data.envelopeId}: unknown worker_type \"${fields.worker_type}\"`);\n  const start = DateTime.fromISO(fields.start_date);\n  if (!start.isValid) throw new Error(`Envelope ${data.envelopeId}: start_date \"${fields.start_date}\" is not YYYY-MM-DD`);\n\n  const remote = /remote/i.test(fields.work_location);\n  const d = (dt) => dt.toISODate();\n  const hire = `${fields.first_name} ${fields.last_name.charAt(0)}.`;\n  const tasks = [\n    { owner: 'hr', name: `Confirm HRIS onboarding packet sent: ${hire}`, due: d(addBusinessDays(start, -10)) },\n    { owner: 'hr', name: `Chase incomplete paperwork (5 days out): ${hire}`, due: d(addBusinessDays(start, -5)) },\n    { owner: 'hr', name: `Chase incomplete paperwork (2 days out): ${hire}`, due: d(addBusinessDays(start, -2)) },\n    { owner: 'it', name: `Create accounts from the role access table: ${hire} (${fields.job_title})`, due: d(addBusinessDays(start, -3)) },\n    { owner: 'it', name: `${remote ? 'Ship' : 'Set up'} laptop and equipment: ${hire}`, due: d(addBusinessDays(start, remote ? -7 : -2)) },\n    { owner: 'manager', name: `Assign an onboarding buddy: ${hire}`, due: d(addBusinessDays(start, -5)) },\n    { owner: 'manager', name: `Review and approve the first-week plan draft: ${hire}`, due: d(addBusinessDays(start, -3)) },\n    { owner: 'hr', name: `30-day check-in survey: ${hire}`, due: d(start.plus({ days: 30 })) },\n    { owner: 'hr', name: `60-day check-in survey: ${hire}`, due: d(start.plus({ days: 60 })) },\n    { owner: 'hr', name: `90-day check-in survey: ${hire}`, due: d(start.plus({ days: 90 })) },\n  ];\n  if (worker === 'contractor') {\n    tasks.push({ owner: 'hr', name: `Collect W-9 and signed contractor agreement: ${hire}`, due: d(addBusinessDays(start, -5)) });\n  } else {\n    tasks.push({ owner: 'hr', name: `New hire completes Form I-9 Section 1 by first day: ${hire}`, due: d(start) });\n    tasks.push({ owner: 'hr', name: `Complete Form I-9 Section 2 (examine documents in person or by an approved method): ${hire}`, due: d(addBusinessDays(start, 3)) });\n  }\n\n  out.push({ json: {\n    envelope_id: data.envelopeId,\n    first_name: fields.first_name,\n    last_name: fields.last_name,\n    job_title: fields.job_title,\n    department: fields.department,\n    manager_email: fields.manager_email.toLowerCase(),\n    start_date: d(start),\n    worker_type: worker,\n    work_location: fields.work_location,\n    manager_notes: fields.manager_notes || '',\n    tasks,\n    context_line: `Onboarding for ${hire}, ${fields.job_title}, starting ${d(start)}`,\n  } });\n}\nreturn out;\n"
      },
      "id": "b7909e56-165d-49c6-8ad0-c88b822ed8af",
      "name": "Parse offer envelope",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        220,
        300
      ],
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "resource": "employee",
        "operation": "create",
        "synced": false,
        "firstName": "={{ $json.first_name }}",
        "lastName": "={{ $json.last_name }}",
        "additionalFields": {
          "hireDate": "={{ $json.start_date }}"
        }
      },
      "id": "2a5a6720-f015-463d-962f-0d0079336f79",
      "name": "Create employee in BambooHR",
      "type": "n8n-nodes-base.bambooHr",
      "typeVersion": 1,
      "position": [
        440,
        300
      ],
      "credentials": {
        "bambooHrApi": {
          "id": "",
          "name": "BambooHR account"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "mode": "manual",
        "assignments": {
          "assignments": [
            {
              "id": "32b51062-3bfc-4f9a-aaec-d69950412640",
              "name": "envelope_id",
              "value": "={{ $('Parse offer envelope').item.json.envelope_id }}",
              "type": "string"
            },
            {
              "id": "7581ffe2-3750-48a0-a8f0-a893fa2fa782",
              "name": "bamboohr_id",
              "value": "={{ $json.id }}",
              "type": "string"
            },
            {
              "id": "94336f39-ad62-443b-b411-912c2e9007c1",
              "name": "first_name",
              "value": "={{ $('Parse offer envelope').item.json.first_name }}",
              "type": "string"
            },
            {
              "id": "bfd26346-05d8-4760-ac3c-41721bb1a386",
              "name": "last_name",
              "value": "={{ $('Parse offer envelope').item.json.last_name }}",
              "type": "string"
            },
            {
              "id": "5f6c547a-f19a-48c1-b4bf-7aadac6859d8",
              "name": "job_title",
              "value": "={{ $('Parse offer envelope').item.json.job_title }}",
              "type": "string"
            },
            {
              "id": "a65137f4-b9c2-443b-854a-b1938c3e63be",
              "name": "department",
              "value": "={{ $('Parse offer envelope').item.json.department }}",
              "type": "string"
            },
            {
              "id": "e95ed25f-eaf6-41ed-a781-753e134048eb",
              "name": "manager_email",
              "value": "={{ $('Parse offer envelope').item.json.manager_email }}",
              "type": "string"
            },
            {
              "id": "4f9decff-3684-4d0e-b90b-086b21f19718",
              "name": "start_date",
              "value": "={{ $('Parse offer envelope').item.json.start_date }}",
              "type": "string"
            },
            {
              "id": "7ea12874-c0f7-443f-8e7f-f97aa269cad5",
              "name": "worker_type",
              "value": "={{ $('Parse offer envelope').item.json.worker_type }}",
              "type": "string"
            },
            {
              "id": "c93e4abd-b4dc-4e60-9e4f-55b149ec9869",
              "name": "work_location",
              "value": "={{ $('Parse offer envelope').item.json.work_location }}",
              "type": "string"
            },
            {
              "id": "9a143181-86f0-448b-80e7-ba896f3489f1",
              "name": "status",
              "value": "checklist_created",
              "type": "string"
            },
            {
              "id": "a3da41ad-6762-4058-a4fc-a92cf10661f1",
              "name": "created_at",
              "value": "={{ $now.toISO() }}",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": false,
        "options": {}
      },
      "id": "c3272049-231c-4687-84cd-467a0dc61314",
      "name": "Shape hire record",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        660,
        300
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "REPLACE_WITH_SHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Hires",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {}
      },
      "id": "89a25a17-c718-47cb-b222-615f29cb4301",
      "name": "Add to onboarding tracker",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [
        880,
        300
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "",
          "name": "Google Sheets account"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// One Asana task per checklist step. Map owners to Asana user IDs (gid).\nconst OWNERS = {\n  hr: 'REPLACE_WITH_ASANA_HR_USER_GID',\n  it: 'REPLACE_WITH_ASANA_IT_USER_GID',\n};\nconst MANAGERS = { // manager email -> Asana user gid\n  'replace_with_manager@yourcompany.com': 'REPLACE_WITH_ASANA_MANAGER_GID',\n};\n\nconst hire = $('Parse offer envelope').first().json;\nreturn hire.tasks.map((t) => ({ json: {\n  name: t.name,\n  due_on: t.due,\n  assignee: t.owner === 'manager' ? MANAGERS[hire.manager_email] || null : OWNERS[t.owner] || null,\n  notes: `Onboarding checklist step (${t.owner.toUpperCase()}).\\nRole: ${hire.job_title}, ${hire.department}\\nStart date: ${hire.start_date}\\nManager: ${hire.manager_email}\\nHire record: onboarding tracker, envelope ${hire.envelope_id}`,\n} }));\n"
      },
      "id": "4500da01-d569-443f-bdd8-11bea78c6cea",
      "name": "Fan out checklist",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1100,
        140
      ]
    },
    {
      "parameters": {
        "resource": "task",
        "operation": "create",
        "workspace": "REPLACE_WITH_ASANA_WORKSPACE_ID",
        "name": "={{ $json.name }}",
        "otherProperties": {
          "assignee": "={{ $json.assignee }}",
          "due_on": "={{ $json.due_on }}",
          "notes": "={{ $json.notes }}",
          "projects": [
            "REPLACE_WITH_ASANA_ONBOARDING_PROJECT_ID"
          ]
        }
      },
      "id": "2dc9c60c-f5ef-4498-b52c-03ba5f70c4f5",
      "name": "Create checklist task",
      "type": "n8n-nodes-base.asana",
      "typeVersion": 1,
      "position": [
        1320,
        140
      ],
      "credentials": {
        "asanaApi": {
          "id": "",
          "name": "Asana account"
        }
      },
      "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 practical first-week plan for a new hire at a small or mid-sized US company. The manager will edit it before the new hire sees it. Base it only on the role, department, work location, worker type and manager notes you are given. Include setup and paperwork time on day one, meetings with the manager and buddy, and one small real piece of work by the end of the week. Do not invent names of people, tools or projects; write placeholders like [buddy] or [team tool] instead, and list what the manager should fill in.\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": {{ JSON.stringify('Role: ' + $('Parse offer envelope').item.json.job_title + '\\nDepartment: ' + $('Parse offer envelope').item.json.department + '\\nWorker type: ' + $('Parse offer envelope').item.json.worker_type + '\\nWork location: ' + $('Parse offer envelope').item.json.work_location + '\\nStart date: ' + $('Parse offer envelope').item.json.start_date + '\\nManager notes: ' + ($('Parse offer envelope').item.json.manager_notes || 'none')) }}\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          \"days\",\n          \"first_month_goals\",\n          \"questions_for_manager\"\n        ],\n        \"properties\": {\n          \"days\": {\n            \"type\": \"array\",\n            \"description\": \"Exactly five entries, Day 1 to Day 5.\",\n            \"items\": {\n              \"type\": \"object\",\n              \"additionalProperties\": false,\n              \"required\": [\n                \"day\",\n                \"focus\",\n                \"activities\"\n              ],\n              \"properties\": {\n                \"day\": {\n                  \"type\": \"string\"\n                },\n                \"focus\": {\n                  \"type\": \"string\"\n                },\n                \"activities\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"first_month_goals\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"questions_for_manager\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Gaps the manager should fill before sharing.\"\n          }\n        }\n      }\n    }\n  }\n}",
        "options": {
          "timeout": 180000
        }
      },
      "id": "a9b378ad-cf81-4fc6-ba88-f7c63bbfd3bf",
      "name": "Draft first-week plan with Claude",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1100,
        340
      ],
      "credentials": {
        "anthropicApi": {
          "id": "",
          "name": "Anthropic account"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Parses Claude's first-week plan draft. The draft always goes to the manager for\n// edits before the new hire sees it.\nconst hire = $('Parse offer envelope').first().json;\nconst res = $input.first().json;\nconst fail = (reason) => [{ json: { ok: false, reason, context_line: hire.context_line } }];\n\nif (res.stop_reason === 'refusal') return fail('Claude declined to draft the plan (stop_reason refusal)');\nif (res.stop_reason === 'max_tokens') return fail('Plan draft was 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) return fail('Claude response has no text block');\nlet d;\ntry { d = JSON.parse(block.text); } catch (e) { return fail('Could not parse plan draft: ' + e.message); }\nif (!Array.isArray(d.days) || d.days.length !== 5) return fail('Plan draft does not cover five days');\n\nconst plan_text = [\n  `*DRAFT first-week plan for review* (not yet shared with the new hire)`,\n  `Role: ${hire.job_title}, ${hire.department} | Start: ${hire.start_date} | Manager: ${hire.manager_email}`,\n  '',\n  ...d.days.map((day) => `*${day.day}: ${day.focus}*\\n${day.activities.map((a) => `- ${a}`).join('\\n')}`),\n  '',\n  `*First-month goals*\\n${d.first_month_goals.map((g) => `- ${g}`).join('\\n')}`,\n  d.questions_for_manager.length ? `\\n*Questions for the manager*\\n${d.questions_for_manager.map((q) => `- ${q}`).join('\\n')}` : '',\n  '',\n  `${hire.tasks.length} dated checklist tasks were created in Asana.`,\n].join('\\n');\nreturn [{ json: { ok: true, plan_text } }];\n"
      },
      "id": "dd9c231d-a32f-4415-ae2d-a9c2b5462636",
      "name": "Parse plan draft",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1320,
        340
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose",
            "version": 2
          },
          "conditions": [
            {
              "id": "01a910a5-b237-412f-86a8-ce2ef114dac3",
              "leftValue": "={{ $json.ok }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "looseTypeValidation": true,
        "options": {}
      },
      "id": "f0eb85e5-89f3-48b9-9391-cade162c1d99",
      "name": "Plan OK?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1540,
        340
      ]
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "REPLACE_WITH_SLACK_HR_CHANNEL_ID",
          "mode": "id"
        },
        "messageType": "text",
        "text": "={{ $json.plan_text }}",
        "otherOptions": {
          "includeLinkToWorkflow": false
        }
      },
      "id": "e225007b-df01-4a42-a388-beb4a93b7372",
      "name": "Post draft for manager review",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        1760,
        280
      ],
      "credentials": {
        "slackApi": {
          "id": "",
          "name": "Slack account"
        }
      }
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "post",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "value": "REPLACE_WITH_SLACK_EXCEPTIONS_CHANNEL_ID",
          "mode": "id"
        },
        "messageType": "text",
        "text": "=:warning: *Employee onboarding* 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": "7110bbff-9ead-4015-932d-464fc11d47da",
      "name": "Post exception to Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.3,
      "position": [
        1100,
        620
      ],
      "credentials": {
        "slackApi": {
          "id": "",
          "name": "Slack account"
        }
      }
    }
  ],
  "connections": {
    "DocuSign envelope completed": {
      "main": [
        [
          {
            "node": "Parse offer envelope",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse offer envelope": {
      "main": [
        [
          {
            "node": "Create employee in BambooHR",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create employee in BambooHR": {
      "main": [
        [
          {
            "node": "Shape hire record",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Shape hire record": {
      "main": [
        [
          {
            "node": "Add to onboarding tracker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add to onboarding tracker": {
      "main": [
        [
          {
            "node": "Fan out checklist",
            "type": "main",
            "index": 0
          },
          {
            "node": "Draft first-week plan with Claude",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fan out checklist": {
      "main": [
        [
          {
            "node": "Create checklist task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create checklist task": {
      "main": [
        [],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Draft first-week plan with Claude": {
      "main": [
        [
          {
            "node": "Parse plan draft",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse plan draft": {
      "main": [
        [
          {
            "node": "Plan OK?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Plan OK?": {
      "main": [
        [
          {
            "node": "Post draft for manager review",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post exception to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}
