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 →
{
"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
}
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Meeting Notes Generator. Uses httpRequest, slack, notion, googleSheets. Webhook trigger; 17 nodes.
Support Ticket Classifier. Uses httpRequest, slack, googleSheets, notion. Webhook trigger; 15 nodes.
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
Generate market research reports from news and competitor sites to Notion and Slack. Uses errorTrigger, httpRequest, notion, googleSheets. Event-driven trigger; 19 nodes.
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