This workflow corresponds to n8n.io template #8930 — we link there as the canonical source.
This workflow follows the Airtable → Gmail recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "qdRaoqaoF1ayiYyc",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Client Onboarding Workflow",
"tags": [],
"nodes": [
{
"id": "b0da85ba-e7ab-42eb-9f72-6fd8ac7b7c04",
"name": "Log Client",
"type": "n8n-nodes-base.googleSheets",
"position": [
624,
-96
],
"parameters": {
"columns": {
"value": {
"Name": "={{ $('Client Onboarding Webhook').item.json.body.name }}",
"Plan": "={{ $('Client Onboarding Webhook').item.json.body.plan }}",
"Email": "={{ $('Client Onboarding Webhook').item.json.body.email }}",
"Status": "Onboarding Started",
"Company": "={{ $('Client Onboarding Webhook').item.json.body.company }}",
"Timestamp": "={{ $now}}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Plan",
"type": "string",
"display": true,
"required": false,
"displayName": "Plan",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1AMKLyi8jT_6jkusylMVR8VPaDAK7mih0O9Sg9B_CGFs/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1AMKLyi8jT_6jkusylMVR8VPaDAK7mih0O9Sg9B_CGFs",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1AMKLyi8jT_6jkusylMVR8VPaDAK7mih0O9Sg9B_CGFs/edit?usp=drivesdk",
"cachedResultName": "master client database sheet"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "adbee833-3cc8-47e3-90c6-b991ca4858ea",
"name": "Assign Tier Logic",
"type": "n8n-nodes-base.code",
"position": [
832,
-96
],
"parameters": {
"jsCode": "const items = $input.all();\n\nreturn items.map(item => {\n const plan = item.json.Plan || 'free';\n \n let tier, priority;\n switch(plan.toLowerCase()) {\n case 'enterprise':\n tier = 'Premium Onboarding';\n priority = 'High';\n break;\n case 'pro':\n tier = 'Standard Onboarding';\n priority = 'Medium';\n break;\n default:\n tier = 'Basic Onboarding';\n priority = 'Low';\n }\n \n return {\n json: {\n // Keep the original data structure (capitalized from Google Sheets)\n Name: item.json.Name,\n Email: item.json.Email,\n Company: item.json.Company,\n Plan: item.json.Plan,\n Phone: item.json.Phone,\n Status: item.json.Status,\n Timestamp: item.json.Timestamp,\n // Add new fields only\n tier,\n priority,\n onboarding_id: `ONB-${Date.now()}`,\n welcome_template: tier === 'Premium Onboarding' ? 'enterprise_welcome' : \n tier === 'Standard Onboarding' ? 'pro_welcome' : 'basic_welcome'\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "aab04da1-8f8e-413e-bf27-7e8c7ceac7ec",
"name": "Send Welcome Email",
"type": "n8n-nodes-base.gmail",
"position": [
2048,
-96
],
"parameters": {
"sendTo": "={{ $('Assign Tier Logic').item.json.Email }}",
"message": "=Hi {{ $('Assign Tier Logic').item.json.Name }},\n\nWelcome to [Company Name]! \ud83c\udf8a\n\nWe're thrilled to have {{ $('Assign Tier Logic').item.json.Company }} join our community. Your {{ $('Assign Tier Logic').item.json.Plan }} plan is now active and ready to use.\n\n\ud83d\udcceAttached: Your personalized Welcome Pack with all the details you need to get started.\n\nWhat's Next?\n1. Log into your account using the credentials we've sent separately\n2. Complete your profile setup \n3. Book your welcome call with our team\n4. Explore our getting started guide\n\nNeed Help?\nOur support team is here for you:\n- Email: support@yourcompany.com\n- Priority: {{ $('Assign Tier Logic').item.json.priority }} ({{ $('Assign Tier Logic').item.json.tier }})\n- Your Onboarding ID: {{ $('Assign Tier Logic').item.json.onboarding_id }}\n\nLooking forward to helping you succeed!\n\nBest regards,\nThe [Company Name] Team\n\n---\nThis email was sent as part of your automated onboarding process.",
"options": {
"attachmentsUi": {
"attachmentsBinary": [
{}
]
}
},
"subject": "=Welcome to [Company Name] - Your {{ $('Assign Tier Logic').item.json.Plan }} Plan is Ready! \ud83c\udf89",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e706ee53-10c7-407e-bdff-422b2f77a22d",
"name": "Archive Data",
"type": "n8n-nodes-base.airtable",
"position": [
2272,
-96
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "app0C2XHO77J6kgNB"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblDgzEEY4qQV1ejU",
"cachedResultUrl": "https://airtable.com/app0C2XHO77J6kgNB/tblDgzEEY4qQV1ejU",
"cachedResultName": "Table 1"
},
"columns": {
"value": {
"Name": "={{ $('Assign Tier Logic').item.json.Name }}",
"Plan": "={{ $('Assign Tier Logic').item.json.Plan }}",
"Tier": "={{ $('Assign Tier Logic').item.json.tier }}",
"Email": "={{ $('Assign Tier Logic').item.json.Email }}",
"Status": "=Completed",
"Company": "={{ $('Assign Tier Logic').item.json.Company }}",
"Priority": "={{ $('Assign Tier Logic').item.json.priority }}",
"Onboarding ID": "={{ $('Assign Tier Logic').item.json.onboarding_id }}",
"Onboarding Date": "={{ $now }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Plan",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Plan",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Onboarding Date",
"type": "dateTime",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Onboarding Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Tier",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Tier",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Onboarding ID",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Onboarding ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Priority",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Priority",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {
"typecast": true
},
"operation": "create",
"authentication": "airtableOAuth2Api"
},
"credentials": {
"airtableOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "57212a0d-860c-4439-8bf8-0a36c00d1572",
"name": "Schedule Weekly Summary",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
640,
336
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 9 * * 1"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "7f6efa67-3ac2-45d4-bb58-0759a8843fec",
"name": "Weekly Report - Data Processing",
"type": "n8n-nodes-base.code",
"position": [
992,
336
],
"parameters": {
"jsCode": "// Get all input items\nconst items = $input.all();\n\n// Calculate date one week ago in IST\nconst oneWeekAgo = new Date();\noneWeekAgo.setDate(oneWeekAgo.getDate() - 7);\noneWeekAgo.setHours(0, 0, 0, 0); // Set to start of day for accurate comparison\n\n// Filter recent clients based on Onboarding Date\nconst recentClients = items\n .map(item => item.json) // Extract the json object from each item\n .filter(row => {\n const rowDate = new Date(row[\"Onboarding Date\"]); // Use Onboarding Date field\n return rowDate >= oneWeekAgo && !isNaN(rowDate); // Ensure valid date\n });\n\n// Process statistics\nconst totalClients = recentClients.length;\nconst planBreakdown = recentClients.reduce((acc, client) => {\n const plan = client.Plan; // Use Plan property\n acc[plan] = (acc[plan] || 0) + 1;\n return acc;\n}, {});\n\nconst tierBreakdown = recentClients.reduce((acc, client) => {\n const tier = client.Tier; // Use Tier property\n acc[tier] = (acc[tier] || 0) + 1;\n return acc;\n}, {});\n\nconst earliestOnboarding = recentClients.length > 0\n ? recentClients.reduce((earliest, client) => {\n const clientDate = new Date(client[\"Onboarding Date\"]);\n return !earliest || clientDate < earliest ? clientDate : earliest;\n }, null)\n : null;\n\nconst report = {\n week_ending: new Date().toLocaleDateString('en-IN', { timeZone: 'Asia/Kolkata' }), // e.g., \"25/09/2025\"\n total_new_clients: totalClients,\n plan_breakdown: planBreakdown,\n tier_breakdown: tierBreakdown,\n earliest_onboarding: earliestOnboarding ? earliestOnboarding.toISOString().split('T')[0] : \"N/A\",\n client_list: recentClients.map(client => ({\n name: client.Name,\n email: client.Email,\n company: client.Company,\n plan: client.Plan,\n onboarding_date: client[\"Onboarding Date\"],\n tier: client.Tier,\n onboarding_id: client[\"Onboarding ID\"],\n priority: client.Priority\n }))\n};\n\n// Return the report as a single JSON object\nreturn [{ json: report }];"
},
"typeVersion": 2
},
{
"id": "2a26989a-a526-4593-8058-aa33c4db937f",
"name": "Weekly Report - Data Collection",
"type": "n8n-nodes-base.airtable",
"position": [
816,
336
],
"parameters": {
"id": "recp3YDYpr3f3IrU3",
"base": {
"__rl": true,
"mode": "list",
"value": "app0C2XHO77J6kgNB",
"cachedResultUrl": "https://airtable.com/app0C2XHO77J6kgNB",
"cachedResultName": "Client Base"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblDgzEEY4qQV1ejU",
"cachedResultUrl": "https://airtable.com/app0C2XHO77J6kgNB/tblDgzEEY4qQV1ejU",
"cachedResultName": "onboarding list"
},
"options": {},
"authentication": "airtableOAuth2Api"
},
"credentials": {
"airtableOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "a028e0e8-25de-4b7e-b4b7-7af41ea918fd",
"name": "Client Onboarding Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-16,
32
],
"parameters": {
"path": "/client-onboarding",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "d45149ac-24f8-455c-a3e9-c27d9e9033a0",
"name": "Email Validation",
"type": "n8n-nodes-verifiemail.verifiEmail",
"position": [
192,
32
],
"parameters": {
"email": "={{ $json.body.email }}"
},
"credentials": {
"verifiEmailApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "0bd3ad3c-9864-4b36-9bb5-bea1da3fe66f",
"name": "Email Validity Check",
"type": "n8n-nodes-base.if",
"position": [
416,
32
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0c18e9d3-4716-4e77-84db-a124b5a4e24d",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.valid }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.2
},
{
"id": "884dd44e-4891-4101-bdb7-461dcc133f8a",
"name": "Generate Welcome PDF",
"type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
"position": [
1392,
-96
],
"parameters": {
"html_content": "=<html> <head> <style> body { font-family: Arial, sans-serif; margin: 20px; } h1 { color: #333; } .details { margin: 10px 0; } </style> </head> <body> <img src=\"https://yourcompany.com/logo.png\" alt=\"Company Logo\" style=\"max-width: 200px;\"> <h1>Welcome, {{ $json.name.split(' ')[0] }}!</h1> <div class=\"details\"> <p><strong>Client:</strong> {{ $json.name }}</p> <p><strong>Company:</strong> {{ $('Assign Tier Logic').item.json.Company }}</p> <p><strong>Email:</strong> {{ $json.email }}</p> <p><strong>Plan:</strong> {{ $('Assign Tier Logic').item.json.Plan }}</p> <p><strong>Priority:</strong> {{ $json.desc.match(/Priority: (\\w+)/)[1] }}</p> <p><strong>Onboarding ID:</strong> {{ $json.desc.match(/Onboarding ID: (\\w+)/)[1] }}</p> <h3>Next Steps:</h3> <pre>{{ $json.desc.match(/Next Steps:[\\s\\S]*$/m)[0].replace(/^\\s*- \\[ \\]/gm, '\u2022') }}</pre> </div> </body> </html>"
},
"credentials": {
"htmlcsstopdfApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "c6c0e5b5-3172-4b9f-a69b-fb3a7a2f7d19",
"name": "Send Slack Notification",
"type": "n8n-nodes-base.slack",
"position": [
1680,
-96
],
"parameters": {
"text": "=\ud83c\udf89 *New Client Onboarded!*\n\n\ud83d\udc64 *Client:* {{ $('Assign Tier Logic').item.json.Name }}\n\ud83c\udfe2 *Company:* {{ $('Assign Tier Logic').item.json.Company }}\n\ud83d\udce7 *Email:* {{ $('Assign Tier Logic').item.json.Email }}\n\ud83d\udcbc *Plan:* {{ $('Assign Tier Logic').item.json.Plan }}\n\ud83c\udfaf *Tier:* {{ $('Assign Tier Logic').item.json.tier }}\n\ud83c\udd94 *ID:* {{ $('Assign Tier Logic').item.json.onboarding_id }}\n\n\u2705 Welcome Pack generated and sent\n\ud83d\udccb Trello card created\n\ud83d\udcca Data logged to sheets\n\n*Priority:* {{ $('Assign Tier Logic').item.json.priority }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09D9V2A78A",
"cachedResultName": "new-channel"
},
"otherOptions": {
"unfurl_media": false
},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "222a7b72-8cb6-4dc9-9d21-8398f253ce9d",
"name": "Create Trello Task Card",
"type": "n8n-nodes-base.trello",
"position": [
1136,
-96
],
"parameters": {
"name": "=Onboard {{ $json.Name }}- {{ $json.Plan }} Plan",
"listId": "68d4187a255389342797eac8",
"description": "=Client: {{ $json.Name }}\nCompany: {{ $json.Company }}\nEmail: {{ $json.Email }}\nPlan: {{ $json.Plan }}\nPriority: {{ $json.priority }}\nOnboarding ID: {{ $json.onboarding_id }}\n\nNext Steps:\n- [ ] Welcome call scheduled\n- [ ] Account setup verified \n- [ ] Training session booked",
"additionalFields": {
"due": "={{ $now.plus(3, 'days') }}"
}
},
"credentials": {
"trelloApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "4ddbdf58-799a-45f9-ba22-6444faa3691b",
"name": "Download PDF File",
"type": "n8n-nodes-base.httpRequest",
"position": [
1872,
96
],
"parameters": {
"url": "={{ $('Generate Welcome PDF').item.json.pdf_url }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "26c5bb27-a4b0-4a7d-970e-9ecd8478d317",
"name": "Send Weekly Report Email",
"type": "n8n-nodes-base.gmail",
"position": [
1168,
336
],
"parameters": {
"sendTo": "user@example.com",
"message": "=Weekly Onboarding Summary ({{ $json.week_ending }}):\n\n1. Total New Clients: {{ $json.total_new_clients }}\n2. Plan Breakdown: {{ Object.entries($json.plan_breakdown).map(([k, v]) => `${k}: ${v}`).join(', ') }}\n3. Tier Breakdown: {{ Object.entries($json.tier_breakdown).map(([k, v]) => `${k}: ${v}`).join(', ') }}\n4. Earliest Onboarding: {{ $json.earliest_onboarding }}\n5. Client List{{ $json.client_list.map(c => `- ${c.name} (${c.plan}, ${c.company})`).join('\\n') }}",
"options": {},
"subject": "=Weekly Onboarding Report - {{ $json.week_ending }}",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "222bd0c0-04d9-42c7-b94f-002df0711f4c",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
-544
],
"parameters": {
"color": 7,
"width": 384,
"height": 368,
"content": "## \ud83d\udccc MAIN OVERVIEW \n\nThis workflow automates:\n1. **Client onboarding** with **email validation**\n2. **Tier assignment** (Basic/Pro/Premium)\n3. Task creation in **Trello** for **CSM** team\n4. Personalized **Welcome PDF generation**\n5. **Notifications** via **Slack + Email**\n6. Weekly summary reports to management\n\n**Who\u2019s it for?** Agencies, SaaS startups, **B2B** companies.\n**Requirements**: Google Sheets, Trello, Slack, Gmail, Airtable credentials."
},
"typeVersion": 1
},
{
"id": "00f3ea8b-c7d9-4d56-bef2-0633e6cafae4",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
-144
],
"parameters": {
"color": 7,
"width": 384,
"height": 336,
"content": "## EMAIL VALIDATION\n\n1. Capture client details from **form submission (Webhook)**.\n2. **Validate email authenticity** to avoid fake signups.\n3. Only proceed with valid entries \u2192 invalid entries are dropped."
},
"typeVersion": 1
},
{
"id": "6ca96f9c-cccd-47ba-b4ec-eef79b7e3d26",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
-288
],
"parameters": {
"color": 7,
"width": 416,
"height": 352,
"content": "## CLIENT LOGGING & TIER ASSIGNMENT \n\n1. **Log client** details in **Google Sheets** for record-keeping.\n2. Assign **tier (Basic/Pro)** automatically using logic function (e.g., plan selected or budget)."
},
"typeVersion": 1
},
{
"id": "14baceb6-f61f-45b5-a6fa-1b952dd9054c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
-272
],
"parameters": {
"color": 7,
"width": 464,
"height": 336,
"content": "## TASK CREATION & ONBOARDING PDF\n\n1. Auto-create **Trello task card** for onboarding tasks.\n2. Generate **personalized Welcome Pack PDF** (includes client name, plan details, support contacts).\n3. Store PDF link for further use."
},
"typeVersion": 1
},
{
"id": "45e3b3ad-6525-4ac5-b3da-d04348d5a75b",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1632,
-240
],
"parameters": {
"color": 7,
"width": 560,
"height": 304,
"content": "## TEAM & CLIENT COMMUNICATION \n\n1. Send **Slack notification** to internal team about **new client onboarding**.\n2. Send personalized email with **attached PDF** to client."
},
"typeVersion": 1
},
{
"id": "b2433eb7-7030-4f3a-acd0-7413f6d47858",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2240,
-256
],
"parameters": {
"color": 7,
"width": 224,
"height": 320,
"content": "## DATA STORAGE \n\nArchive all onboarding details (client info, assigned tier, PDF link, onboarding status) in **Airtable**."
},
"typeVersion": 1
},
{
"id": "80044205-e54c-41e2-ab64-93d7efee1a45",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
608,
160
],
"parameters": {
"color": 7,
"width": 752,
"height": 368,
"content": "## WEEKLY REPORTING \n\n1. Schedule a **weekly trigger**.\n2. Collect onboarding data from **Airtable/Sheets**.\n3. Process stats (number of onboarded clients, tier distribution).\n4. Send **weekly report** via **email** to management."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "8de3a88f-7eb6-4955-b0bb-9ff37f1d5bf1",
"connections": {
"Log Client": {
"main": [
[
{
"node": "Assign Tier Logic",
"type": "main",
"index": 0
}
]
]
},
"Email Validation": {
"main": [
[
{
"node": "Email Validity Check",
"type": "main",
"index": 0
}
]
]
},
"Assign Tier Logic": {
"main": [
[
{
"node": "Create Trello Task Card",
"type": "main",
"index": 0
}
]
]
},
"Download PDF File": {
"main": [
[
{
"node": "Send Welcome Email",
"type": "main",
"index": 0
}
]
]
},
"Send Welcome Email": {
"main": [
[
{
"node": "Archive Data",
"type": "main",
"index": 0
}
]
]
},
"Email Validity Check": {
"main": [
[
{
"node": "Log Client",
"type": "main",
"index": 0
}
]
]
},
"Generate Welcome PDF": {
"main": [
[
{
"node": "Send Slack Notification",
"type": "main",
"index": 0
}
]
]
},
"Create Trello Task Card": {
"main": [
[
{
"node": "Generate Welcome PDF",
"type": "main",
"index": 0
}
]
]
},
"Schedule Weekly Summary": {
"main": [
[
{
"node": "Weekly Report - Data Collection",
"type": "main",
"index": 0
}
]
]
},
"Send Slack Notification": {
"main": [
[
{
"node": "Download PDF File",
"type": "main",
"index": 0
}
]
]
},
"Client Onboarding Webhook": {
"main": [
[
{
"node": "Email Validation",
"type": "main",
"index": 0
}
]
]
},
"Weekly Report - Data Collection": {
"main": [
[
{
"node": "Weekly Report - Data Processing",
"type": "main",
"index": 0
}
]
]
},
"Weekly Report - Data Processing": {
"main": [
[
{
"node": "Send Weekly Report Email",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableOAuth2ApigmailOAuth2googleSheetsOAuth2ApihtmlcsstopdfApislackOAuth2ApitrelloApiverifiEmailApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This n8n workflow automates the end-to-end client onboarding process: capturing client details, validating emails, assigning tiers, generating welcome packs, creating tasks, notifying teams, archiving records, and sending weekly reports. B2B SaaS companies onboarding new…
Source: https://n8n.io/workflows/8930/ — 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.
This guide will walk you through setting up your n8n workflow. By the end, you'll have a fully automated system for managing your recruitment pipeline.
This workflow automates tax compliance by aggregating multi-channel revenue data, calculating jurisdiction-specific tax obligations, detecting anomalies, and generating submission-ready reports for ta
Founders, product managers, content strategists, indie hackers, and anyone who wants to automatically monitor tech industry trends across multiple sources — without manually browsing Hacker News and P
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
This is an elite enterprise-grade solution for Accounts Payable and Finance Ops teams. It automates the high-volume extraction of unstructured data from PDF invoices using the HTML to PDF (Parse PDF t