AutomationFlowsData & Sheets › Kindwork Client Onboarding - Enterprise Edition

Kindwork Client Onboarding - Enterprise Edition

Kindwork Client Onboarding - Enterprise Edition. Uses slack, googleDrive, notion, sendGrid. Webhook trigger; 25 nodes.

Webhook trigger★★★★☆ complexity25 nodesSlackGoogle DriveNotionSendGridGoogle SheetsError Trigger
Data & Sheets Trigger: Webhook Nodes: 25 Complexity: ★★★★☆ Added:

This workflow follows the Error Trigger → Google Sheets 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 →

Download .json
{
  "name": "Kindwork Client Onboarding - Enterprise Edition",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "kindwork-stripe-webhook",
        "responseMode": "onReceived",
        "options": {}
      },
      "id": "webhook-trigger",
      "name": "Stripe Payment Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        250,
        500
      ]
    },
    {
      "parameters": {
        "jsCode": "// Parse and validate Stripe webhook data\nconst stripeData = $input.item.json;\nconst eventType = stripeData.type;\n\n// Validate it's a payment success event\nif (!['payment_intent.succeeded', 'charge.succeeded'].includes(eventType)) {\n  return {\n    error: true,\n    message: `Unexpected event type: ${eventType}`,\n    skip_workflow: true\n  };\n}\n\nconst paymentObject = stripeData.data?.object || {};\n\n// Extract customer data\nconst customerEmail = paymentObject.receipt_email || \n                      paymentObject.billing_details?.email || \n                      paymentObject.customer_email || '';\n\nconst customerName = paymentObject.billing_details?.name || \n                     paymentObject.customer_name || \n                     paymentObject.description?.split(' for ')[1] || \n                     'New Client';\n\nconst paymentAmount = (paymentObject.amount || 0) / 100;\nconst paymentId = paymentObject.id || paymentObject.payment_intent || '';\nconst currency = paymentObject.currency?.toUpperCase() || 'USD';\n\n// Determine service type\nlet service = 'Build';\nlet serviceDescription = '';\n\nif (paymentAmount === 750) {\n  service = 'Audit';\n  serviceDescription = 'AI Operations Audit';\n} else if (paymentAmount >= 3000) {\n  service = 'Retainer';\n  serviceDescription = 'Growth Retainer - Monthly Optimization';\n} else if (paymentAmount >= 2500) {\n  service = 'Build';\n  serviceDescription = 'Workflow Automation Build';\n} else {\n  service = 'Custom';\n  serviceDescription = paymentObject.description || 'Custom Service';\n}\n\n// Validate required fields\nconst missingFields = [];\nif (!customerEmail) missingFields.push('email');\nif (!customerName || customerName === 'New Client') missingFields.push('name');\nif (!paymentId) missingFields.push('payment_id');\n\nreturn {\n  onboarding_id: `ONB-${Date.now()}`,\n  client_name: customerName,\n  client_email: customerEmail,\n  payment_amount: paymentAmount,\n  payment_id: paymentId,\n  currency: currency,\n  service: service,\n  service_description: serviceDescription,\n  folder_name: `${customerName.trim()} - Kindwork Project`,\n  payment_date: new Date().toISOString(),\n  status: 'pending_setup',\n  validation_passed: missingFields.length === 0,\n  missing_fields: missingFields.join(', '),\n  stripe_event_type: eventType\n};"
      },
      "id": "parse-validate",
      "name": "Parse & Validate Payment Data",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        470,
        500
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "validation-check",
              "leftValue": "={{ $json.validation_passed }}",
              "rightValue": true,
              "operator": {
                "type": "boolean",
                "operation": "true"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "validation-gate",
      "name": "Validation Gate",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        690,
        500
      ]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "text": "=\u26a0\ufe0f **Incomplete Payment Data**\\n\\n*Onboarding ID:* {{ $json.onboarding_id }}\\n*Payment ID:* {{ $json.payment_id }}\\n*Amount:* {{ $json.currency }} {{ $json.payment_amount }}\\n\\n*Missing fields:* {{ $json.missing_fields }}\\n\\n*Action needed:* Manual intervention required to complete onboarding.",
        "otherOptions": {}
      },
      "id": "alert-invalid",
      "name": "Alert - Invalid Data (Slack)",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        910,
        700
      ]
    },
    {
      "parameters": {
        "jsCode": "// Initialize onboarding context\nconst data = $input.item.json;\n\nreturn {\n  ...data,\n  setup_started_at: new Date().toISOString(),\n  setup_steps_completed: [],\n  setup_steps_pending: [\n    'create_folders',\n    'create_notion_project',\n    'create_tasks',\n    'send_welcome_email',\n    'schedule_kickoff'\n  ],\n  status: 'in_progress'\n};"
      },
      "id": "init-onboarding",
      "name": "Initialize Onboarding Context",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        910,
        300
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "root"
        },
        "name": "={{ $json.folder_name }}",
        "options": {}
      },
      "id": "create-main-folder",
      "name": "Create Main Project Folder",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1130,
        100
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create Main Project Folder').item.json.id }}"
        },
        "name": "01 - Deliverables",
        "options": {}
      },
      "id": "create-deliverables",
      "name": "Create Deliverables Folder",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1350,
        0
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create Main Project Folder').item.json.id }}"
        },
        "name": "02 - Assets",
        "options": {}
      },
      "id": "create-assets",
      "name": "Create Assets Folder",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1350,
        100
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create Main Project Folder').item.json.id }}"
        },
        "name": "03 - Contracts & Invoices",
        "options": {}
      },
      "id": "create-contracts",
      "name": "Create Contracts Folder",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1350,
        200
      ]
    },
    {
      "parameters": {
        "operation": "create",
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create Main Project Folder').item.json.id }}"
        },
        "name": "04 - Intake & Discovery",
        "options": {}
      },
      "id": "create-intake",
      "name": "Create Intake Folder",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1350,
        300
      ]
    },
    {
      "parameters": {
        "operation": "upload",
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create Main Project Folder').item.json.id }}"
        },
        "name": "README.txt",
        "options": {
          "binaryData": false,
          "inputDataFieldName": "={{ \"KINDWORK PROJECT FOLDER\\n\\nClient: \" + $('Initialize Onboarding Context').item.json.client_name + \"\\nProject Start: \" + new Date().toLocaleDateString() + \"\\nService: \" + $('Initialize Onboarding Context').item.json.service_description + \"\\n\\nThis folder contains all files related to your Kindwork automation project.\\n\\nFOLDER GUIDE:\\n- 01 - Deliverables: Your completed workflows, documentation, and training\\n- 02 - Assets: Logos, screenshots, and other project materials\\n- 03 - Contracts & Invoices: All legal and billing documents\\n- 04 - Intake & Discovery: Your intake responses, notes, and roadmap\\n\\nQuestions? Email hello@kindwork.co\\n\\n---\\nKindwork - AI Automation for Small Businesses\\ngetkindwork.com\" }}"
        }
      },
      "id": "create-readme",
      "name": "Create README File",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1350,
        400
      ]
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "merge-folders",
      "name": "Merge Folder Creation Results",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        1570,
        200
      ]
    },
    {
      "parameters": {
        "resource": "databasePage",
        "operation": "create",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "title": "={{ $('Initialize Onboarding Context').item.json.client_name }}",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Email",
              "emailValue": "={{ $('Initialize Onboarding Context').item.json.client_email }}"
            },
            {
              "key": "Service",
              "selectValue": "={{ $('Initialize Onboarding Context').item.json.service }}"
            },
            {
              "key": "Status",
              "selectValue": "New"
            },
            {
              "key": "Priority",
              "selectValue": "High"
            },
            {
              "key": "Start Date",
              "dateValue": "={{ $now.toISODate() }}"
            },
            {
              "key": "Payment Amount",
              "numberValue": "={{ $('Initialize Onboarding Context').item.json.payment_amount }}"
            },
            {
              "key": "Payment Status",
              "selectValue": "Paid"
            },
            {
              "key": "Stripe Payment ID",
              "textValue": "={{ $('Initialize Onboarding Context').item.json.payment_id }}"
            },
            {
              "key": "Drive Folder",
              "urlValue": "=https://drive.google.com/drive/folders/{{ $('Create Main Project Folder').item.json.id }}"
            },
            {
              "key": "Next Action",
              "textValue": "Awaiting intake form completion"
            }
          ]
        }
      },
      "id": "create-notion-project",
      "name": "Create Notion Project",
      "type": "n8n-nodes-base.notion",
      "typeVersion": 2,
      "position": [
        1130,
        400
      ]
    },
    {
      "parameters": {
        "jsCode": "// Create task checklist for Notion\nconst clientData = $('Initialize Onboarding Context').item.json;\n\nconst tasks = [\n  {\n    name: '\u2705 Welcome Email Sent',\n    status: 'complete',\n    due_date: new Date().toISOString()\n  },\n  {\n    name: '\ud83d\udcc1 Project Folder Created',\n    status: 'complete',\n    due_date: new Date().toISOString()\n  },\n  {\n    name: '\ud83d\udccb Client Intake Form',\n    status: 'pending',\n    due_date: new Date(Date.now() + 2 * 24 * 60 * 60 * 1000).toISOString(),\n    description: 'Client needs to complete intake form'\n  },\n  {\n    name: '\ud83d\udcc5 Kickoff Call Scheduled',\n    status: 'pending',\n    due_date: new Date(Date.now() + 3 * 24 * 60 * 60 * 1000).toISOString(),\n    description: 'Schedule via Calendly link sent in welcome email'\n  },\n  {\n    name: '\ud83d\udd0d Review Intake Responses',\n    status: 'pending',\n    due_date: new Date(Date.now() + 4 * 24 * 60 * 60 * 1000).toISOString(),\n    description: 'Review and prepare for kickoff call'\n  },\n  {\n    name: '\ud83c\udfaf Conduct Kickoff Call',\n    status: 'pending',\n    due_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()\n  },\n  {\n    name: '\ud83d\udcca Create Automation Roadmap',\n    status: 'pending',\n    due_date: new Date(Date.now() + 10 * 24 * 60 * 60 * 1000).toISOString()\n  },\n  {\n    name: '\ud83d\udce7 Send Roadmap to Client',\n    status: 'pending',\n    due_date: new Date(Date.now() + 11 * 24 * 60 * 60 * 1000).toISOString()\n  },\n  {\n    name: '\u2705 Get Client Approval',\n    status: 'pending',\n    due_date: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toISOString()\n  },\n  {\n    name: '\ud83d\ude80 Begin Implementation',\n    status: 'pending',\n    due_date: new Date(Date.now() + 15 * 24 * 60 * 60 * 1000).toISOString()\n  }\n];\n\nreturn {\n  client_name: clientData.client_name,\n  onboarding_id: clientData.onboarding_id,\n  tasks: tasks,\n  task_count: tasks.length,\n  completed_count: tasks.filter(t => t.status === 'complete').length\n};"
      },
      "id": "generate-tasks",
      "name": "Generate Task Checklist",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1130,
        600
      ]
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "merge-notion",
      "name": "Merge Notion Data",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        1350,
        500
      ]
    },
    {
      "parameters": {
        "jsCode": "// Prepare welcome email data\nconst clientData = $('Initialize Onboarding Context').item.json;\nconst folderData = $('Create Main Project Folder').item.json;\nconst notionData = $('Create Notion Project').item.json;\n\nconst driveFolderUrl = `https://drive.google.com/drive/folders/${folderData.id}`;\nconst calendlyLink = 'https://calendly.com/ben-kindwork/kickoff'; // Replace with actual link\nconst intakeFormUrl = 'https://forms.gle/YOUR_FORM_ID'; // Replace with actual form\n\nconst emailHtml = `\n<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; max-width: 600px; margin: 0 auto; }\n    .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px 20px; text-align: center; border-radius: 10px 10px 0 0; }\n    .content { background: #fff; padding: 30px 20px; border: 1px solid #e0e0e0; }\n    .cta-button { display: inline-block; background: #667eea; color: white; padding: 12px 30px; text-decoration: none; border-radius: 5px; margin: 10px 0; font-weight: bold; }\n    .checklist { background: #f8f9fa; padding: 20px; border-radius: 8px; margin: 20px 0; }\n    .check-item { margin: 10px 0; padding-left: 25px; position: relative; }\n    .check-item:before { content: '\u2713'; position: absolute; left: 0; color: #667eea; font-weight: bold; }\n    .footer { background: #f8f9fa; padding: 20px; text-align: center; font-size: 12px; color: #666; border-radius: 0 0 10px 10px; }\n    .highlight { background: #fff3cd; padding: 15px; border-left: 4px solid #ffc107; margin: 20px 0; border-radius: 4px; }\n  </style>\n</head>\n<body>\n  <div class=\"header\">\n    <h1>\ud83c\udf89 Welcome to Kindwork!</h1>\n    <p style=\"font-size: 18px; margin: 10px 0 0 0;\">Your Automation Journey Starts Now</p>\n  </div>\n  \n  <div class=\"content\">\n    <p>Hi <strong>${clientData.client_name}</strong>,</p>\n    \n    <p>Thank you for choosing Kindwork to transform your operations! We're excited to help you eliminate manual work and scale your business with intelligent automation.</p>\n    \n    <div class=\"highlight\">\n      <strong>\ud83d\udce6 Service:</strong> ${clientData.service_description}<br>\n      <strong>\ud83d\udcb0 Investment:</strong> ${clientData.currency} ${clientData.payment_amount}<br>\n      <strong>\ud83c\udd94 Project ID:</strong> ${clientData.onboarding_id}\n    </div>\n    \n    <h2>\ud83d\ude80 Your Next Steps</h2>\n    \n    <div class=\"checklist\">\n      <div class=\"check-item\"><strong>Access Your Project Folder</strong><br>\n      All project files will be organized here: <a href=\"${driveFolderUrl}\" style=\"color: #667eea;\">View Folder</a></div>\n      \n      <div class=\"check-item\"><strong>Complete Your Intake Form</strong><br>\n      Help us understand your workflow: <a href=\"${intakeFormUrl}\" class=\"cta-button\">Fill Out Intake Form</a></div>\n      \n      <div class=\"check-item\"><strong>Schedule Your Kickoff Call</strong><br>\n      Book a 30-minute discovery session: <a href=\"${calendlyLink}\" class=\"cta-button\">Book Your Call</a></div>\n    </div>\n    \n    <h2>\ud83d\udca1 What Happens Next</h2>\n    \n    <p>Once you've completed the intake form, I'll personally review your responses and come to our kickoff call prepared with:</p>\n    <ul>\n      <li>An initial automation roadmap tailored to your business</li>\n      <li>Quick wins we can implement immediately</li>\n      <li>ROI projections for each automation opportunity</li>\n      <li>A clear timeline and next steps</li>\n    </ul>\n    \n    <p><strong>\u23f1\ufe0f Timeline:</strong> We aim to have your first automation live within 2 weeks of our kickoff call.</p>\n    \n    <h2>\ud83d\udcde Questions?</h2>\n    \n    <p>Reply to this email anytime - I personally read and respond to every message. You can also reach me at:</p>\n    <ul>\n      <li>\ud83d\udce7 Email: hello@kindwork.co</li>\n      <li>\ud83c\udf10 Website: <a href=\"https://getkindwork.com\">getkindwork.com</a></li>\n    </ul>\n    \n    <p>Looking forward to transforming your operations together!</p>\n    \n    <p style=\"margin-top: 30px;\">Best regards,<br>\n    <strong>Ben Larrazolo</strong><br>\n    Founder, Kindwork</p>\n  </div>\n  \n  <div class=\"footer\">\n    <p>This email was automatically generated by our onboarding system \ud83e\udd16<br>\n    (Yes, we practice what we preach!)</p>\n    <p>\u00a9 ${new Date().getFullYear()} Kindwork. All rights reserved.</p>\n  </div>\n</body>\n</html>\n`;\n\nreturn {\n  to_email: clientData.client_email,\n  to_name: clientData.client_name,\n  subject: `Welcome to Kindwork, ${clientData.client_name}! \ud83c\udf89 Your Project is Ready`,\n  html_body: emailHtml,\n  drive_folder_url: driveFolderUrl,\n  calendly_link: calendlyLink,\n  intake_form_url: intakeFormUrl,\n  onboarding_id: clientData.onboarding_id\n};"
      },
      "id": "prepare-welcome-email",
      "name": "Prepare Welcome Email",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1570,
        500
      ]
    },
    {
      "parameters": {
        "fromEmail": "ben@getkindwork.com",
        "toEmail": "={{ $json.to_email }}",
        "subject": "={{ $json.subject }}",
        "emailFormat": "html",
        "html": "={{ $json.html_body }}",
        "options": {
          "senderName": "Ben from Kindwork"
        }
      },
      "id": "send-welcome-email",
      "name": "Send Welcome Email",
      "type": "n8n-nodes-base.sendGrid",
      "typeVersion": 1,
      "position": [
        1790,
        500
      ]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "text": "=\ud83c\udf89 **New Client Onboarded!**\\n\\n*Client:* {{ $('Initialize Onboarding Context').item.json.client_name }}\\n*Service:* {{ $('Initialize Onboarding Context').item.json.service_description }}\\n*Amount:* {{ $('Initialize Onboarding Context').item.json.currency }} {{ $('Initialize Onboarding Context').item.json.payment_amount }}\\n*Onboarding ID:* {{ $('Initialize Onboarding Context').item.json.onboarding_id }}\\n\\n*Status:*\\n\u2705 Folders created\\n\u2705 Notion project set up\\n\u2705 Welcome email sent\\n\u2705 Tasks generated\\n\\n*Next:* Client needs to complete intake form and schedule kickoff call.\\n\\n[View in Notion](NOTION_PROJECT_URL)",
        "otherOptions": {}
      },
      "id": "notify-team-slack",
      "name": "Notify Team (Slack)",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        1790,
        300
      ]
    },
    {
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Timestamp": "={{ $now.toISO() }}",
            "Onboarding ID": "={{ $('Initialize Onboarding Context').item.json.onboarding_id }}",
            "Client Name": "={{ $('Initialize Onboarding Context').item.json.client_name }}",
            "Client Email": "={{ $('Initialize Onboarding Context').item.json.client_email }}",
            "Service": "={{ $('Initialize Onboarding Context').item.json.service }}",
            "Payment Amount": "={{ $('Initialize Onboarding Context').item.json.payment_amount }}",
            "Payment ID": "={{ $('Initialize Onboarding Context').item.json.payment_id }}",
            "Drive Folder URL": "={{ $('Prepare Welcome Email').item.json.drive_folder_url }}",
            "Status": "Onboarded",
            "Welcome Email Sent": "Yes"
          }
        },
        "options": {}
      },
      "id": "log-onboarding",
      "name": "Log to Onboarding Tracker",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.4,
      "position": [
        2010,
        400
      ]
    },
    {
      "parameters": {
        "jsCode": "// Create onboarding completion summary\nconst clientData = $('Initialize Onboarding Context').item.json;\nconst emailData = $('Prepare Welcome Email').item.json;\n\nconst completionTime = Date.now() - new Date(clientData.setup_started_at).getTime();\nconst completionSeconds = Math.round(completionTime / 1000);\n\nreturn {\n  onboarding_id: clientData.onboarding_id,\n  client_name: clientData.client_name,\n  service: clientData.service,\n  status: 'completed',\n  completed_at: new Date().toISOString(),\n  completion_time_seconds: completionSeconds,\n  folders_created: 5,\n  notion_project_created: true,\n  tasks_generated: 10,\n  welcome_email_sent: true,\n  team_notified: true,\n  logged_to_tracker: true,\n  all_steps_successful: true\n};"
      },
      "id": "completion-summary",
      "name": "Generate Completion Summary",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2230,
        500
      ]
    },
    {
      "parameters": {
        "fromEmail": "ben@getkindwork.com",
        "toEmail": "ben@getkindwork.com",
        "subject": "=Internal: Onboarding Complete - {{ $('Initialize Onboarding Context').item.json.client_name }}",
        "text": "=Onboarding Workflow Completed Successfully\\n\\nClient: {{ $('Initialize Onboarding Context').item.json.client_name }}\\nService: {{ $('Initialize Onboarding Context').item.json.service_description }}\\nAmount: {{ $('Initialize Onboarding Context').item.json.currency }} {{ $('Initialize Onboarding Context').item.json.payment_amount }}\\n\\nCompleted in {{ $json.completion_time_seconds }} seconds\\n\\nAll automation steps executed successfully.\\nClient should receive welcome email shortly.\\n\\nNext manual steps:\\n- Monitor intake form completion\\n- Prepare for kickoff call\\n- Review client responses",
        "options": {
          "senderName": "Kindwork Automation"
        }
      },
      "id": "internal-confirmation",
      "name": "Internal Confirmation Email",
      "type": "n8n-nodes-base.sendGrid",
      "typeVersion": 1,
      "position": [
        2230,
        700
      ]
    },
    {
      "parameters": {},
      "id": "error-trigger",
      "name": "Error Trigger",
      "type": "n8n-nodes-base.errorTrigger",
      "typeVersion": 1,
      "position": [
        250,
        900
      ]
    },
    {
      "parameters": {
        "jsCode": "// Format error for notification\nconst error = $input.item.json.error || {};\nconst execution = $input.item.json.execution || {};\n\nreturn {\n  error_type: error.name || 'Unknown Error',\n  error_message: error.message || 'No details available',\n  failed_node: error.node?.name || 'Unknown',\n  execution_id: execution.id || 'unknown',\n  workflow_name: 'Kindwork Client Onboarding',\n  timestamp: new Date().toISOString(),\n  severity: 'critical',\n  requires_action: true\n};"
      },
      "id": "format-error",
      "name": "Format Error Details",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        470,
        900
      ]
    },
    {
      "parameters": {
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "text": "=\ud83d\udea8 **CRITICAL: Onboarding Workflow Failed**\\n\\n*Workflow:* {{ $json.workflow_name }}\\n*Failed at:* {{ $json.failed_node }}\\n*Error:* {{ $json.error_type }}\\n*Time:* {{ $json.timestamp }}\\n\\n*Message:*\\n```\\n{{ $json.error_message }}\\n```\\n\\n*\u26a0\ufe0f Action Required:* Manual onboarding needed for this client.\\n*Execution ID:* {{ $json.execution_id }}",
        "otherOptions": {}
      },
      "id": "alert-error-slack",
      "name": "Alert Error (Slack)",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2.2,
      "position": [
        690,
        900
      ]
    },
    {
      "parameters": {
        "fromEmail": "alerts@getkindwork.com",
        "toEmail": "ben@getkindwork.com",
        "subject": "\ud83d\udea8 URGENT: Onboarding Workflow Failed",
        "text": "=CRITICAL ALERT\\n\\nThe Kindwork client onboarding workflow has failed.\\n\\nWorkflow: {{ $json.workflow_name }}\\nFailed Node: {{ $json.failed_node }}\\nError Type: {{ $json.error_type }}\\nTime: {{ $json.timestamp }}\\n\\nError Message:\\n{{ $json.error_message }}\\n\\nExecution ID: {{ $json.execution_id }}\\n\\nACTION REQUIRED:\\n1. Check n8n execution logs\\n2. Identify the failed client (check Stripe recent payments)\\n3. Complete onboarding manually\\n4. Notify client of slight delay\\n\\nThis is a critical issue - immediate attention needed.",
        "options": {
          "senderName": "n8n Alerts"
        }
      },
      "id": "email-error",
      "name": "Email Error Alert",
      "type": "n8n-nodes-base.sendGrid",
      "typeVersion": 1,
      "position": [
        690,
        1050
      ]
    }
  ],
  "connections": {
    "Stripe Payment Webhook": {
      "main": [
        [
          {
            "node": "Parse & Validate Payment Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse & Validate Payment Data": {
      "main": [
        [
          {
            "node": "Validation Gate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validation Gate": {
      "main": [
        [
          {
            "node": "Initialize Onboarding Context",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Alert - Invalid Data (Slack)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Initialize Onboarding Context": {
      "main": [
        [
          {
            "node": "Create Main Project Folder",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Notion Project",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Task Checklist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Main Project Folder": {
      "main": [
        [
          {
            "node": "Create Deliverables Folder",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Assets Folder",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Contracts Folder",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Intake Folder",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create README File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Deliverables Folder": {
      "main": [
        [
          {
            "node": "Merge Folder Creation Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Assets Folder": {
      "main": [
        [
          {
            "node": "Merge Folder Creation Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Contracts Folder": {
      "main": [
        [
          {
            "node": "Merge Folder Creation Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Intake Folder": {
      "main": [
        [
          {
            "node": "Merge Folder Creation Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create README File": {
      "main": [
        [
          {
            "node": "Merge Folder Creation Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Notion Project": {
      "main": [
        [
          {
            "node": "Merge Notion Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Task Checklist": {
      "main": [
        [
          {
            "node": "Merge Notion Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge Notion Data": {
      "main": [
        [
          {
            "node": "Prepare Welcome Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Welcome Email": {
      "main": [
        [
          {
            "node": "Send Welcome Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Notify Team (Slack)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Welcome Email": {
      "main": [
        [
          {
            "node": "Log to Onboarding Tracker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Team (Slack)": {
      "main": [
        [
          {
            "node": "Log to Onboarding Tracker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Onboarding Tracker": {
      "main": [
        [
          {
            "node": "Generate Completion Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Completion Summary": {
      "main": [
        [
          {
            "node": "Internal Confirmation Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error Trigger": {
      "main": [
        [
          {
            "node": "Format Error Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Error Details": {
      "main": [
        [
          {
            "node": "Alert Error (Slack)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Email Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [],
  "triggerCount": 2,
  "versionId": null
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Kindwork Client Onboarding - Enterprise Edition. Uses slack, googleDrive, notion, sendGrid. Webhook trigger; 25 nodes.

Source: https://gist.github.com/gridrelay-max/887fd316fc9f8a003c0266c3d9ce4967 — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Meeting Notes Generator. Uses httpRequest, slack, notion, googleSheets. Webhook trigger; 17 nodes.

HTTP Request, Slack, Notion +2
Data & Sheets

Support Ticket Classifier. Uses httpRequest, slack, googleSheets, notion. Webhook trigger; 15 nodes.

HTTP Request, Slack, Google Sheets +2
Data & Sheets

This workflow triggers when a HubSpot deal stage changes to Closed Won and automatically generates an invoice. It collects deal and contact data, builds a styled invoice, converts it into a PDF, and s

HubSpot Trigger, HTTP Request, Google Sheets +4
Data & Sheets

Generate market research reports from news and competitor sites to Notion and Slack. Uses errorTrigger, httpRequest, notion, googleSheets. Event-driven trigger; 19 nodes.

Error Trigger, HTTP Request, Notion +2
Data & Sheets

This is an enterprise-grade Intelligent Document Processing (IDP) hub designed to handle high-volume document ingestion, classification, and departmental routing. It transforms monolithic bulk scans i

Notion, Slack, Google Sheets +3