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": "NTF 10 Customer Onboarding Flow",
"tags": [
{
"name": "NTF-Playbook"
}
],
"settings": {
"executionOrder": "v1"
},
"nodes": [
{
"id": "sticky-readme",
"name": "README",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-60,
-520
],
"parameters": {
"content": "## NTF 10 Customer Onboarding Flow\n\n**Trigger:** Webhook, new CRM customer event (or manual trigger)\n\n**30-day sequence:**\n- Day 0: Welcome email immediately\n- Day 3: First check-in plus tips email\n- Day 7: Short friction survey\n- Day 14: If survey score low, flag to inbox (human needed)\n- Day 30: NPS survey plus referral ask if NPS high\n\n**Setup:**\n- Connect Gmail OAuth credential\n- Webhook receives: { name, email, company, plan }\n- Edit email templates in each Send Email node\n- Day 14 and Day 30 branches use IF nodes based on survey responses\n- For survey responses: use a separate webhook-triggered workflow or Typeform/Tally integration",
"height": 400,
"width": 560,
"color": 6
}
},
{
"id": "webhook-trigger",
"name": "New Customer Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
0,
0
],
"parameters": {
"httpMethod": "POST",
"path": "customer-onboarding",
"responseMode": "responseNode",
"options": {}
}
},
{
"id": "extract-customer",
"name": "Extract Customer Data",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
220,
0
],
"parameters": {
"mode": "manual",
"assignments": {
"assignments": [
{
"id": "name",
"name": "name",
"value": "={{ $json.body.name }}",
"type": "string"
},
{
"id": "email",
"name": "email",
"value": "={{ $json.body.email }}",
"type": "string"
},
{
"id": "company",
"name": "company",
"value": "={{ $json.body.company || '' }}",
"type": "string"
},
{
"id": "plan",
"name": "plan",
"value": "={{ $json.body.plan || 'Standard' }}",
"type": "string"
},
{
"id": "sender_name",
"name": "sender_name",
"value": "YOUR_NAME",
"type": "string"
}
]
}
}
},
{
"id": "webhook-response",
"name": "Webhook Response",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
440,
-160
],
"parameters": {
"respondWith": "json",
"responseBody": "={{ JSON.stringify({ received: true }) }}"
}
},
{
"id": "day-0-welcome",
"name": "Day 0 Welcome Email",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
440,
0
],
"parameters": {
"operation": "send",
"sendTo": "={{ $json.email }}",
"subject": "=Welcome, {{ $json.name }}, here's how to get started",
"message": "=Hi {{ $json.name }},\n\nWelcome, and thank you for joining.\n\nHere's what to do first:\n1. [STEP 1, most important action]\n2. [STEP 2, second most important action]\n3. [STEP 3, quick win]\n\nIf you run into anything, reply to this email. I read every reply.\n\n{{ $json.sender_name }}",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"id": "wait-3-days",
"name": "Wait 3 Days",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
660,
0
],
"parameters": {
"resume": "timeInterval",
"unit": "days",
"amount": 3,
"options": {}
}
},
{
"id": "day-3-checkin",
"name": "Day 3 Check-in Email",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
880,
0
],
"parameters": {
"operation": "send",
"sendTo": "={{ $json.email }}",
"subject": "=Quick check-in, how's it going?",
"message": "=Hi {{ $json.name }},\n\nThree days in. How are things going?\n\nHere are a few things customers find most useful at this stage:\n* [TIP 1]\n* [TIP 2]\n* [TIP 3]\n\nAnything unclear or not working as expected? Hit reply.\n\n{{ $json.sender_name }}",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"id": "wait-4-more-days",
"name": "Wait 4 More Days",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
1100,
0
],
"parameters": {
"resume": "timeInterval",
"unit": "days",
"amount": 4,
"options": {}
}
},
{
"id": "day-7-survey",
"name": "Day 7 Friction Survey",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
1320,
0
],
"parameters": {
"operation": "send",
"sendTo": "={{ $json.email }}",
"subject": "=One quick question (takes 30 seconds)",
"message": "=Hi {{ $json.name }},\n\nYou're a week in. One question:\n\nOn a scale of 1-10, how likely are you to keep using [PRODUCT]?\n\nReply with just a number. If it's below 7, tell me why in one sentence. I'll fix it.\n\n{{ $json.sender_name }}",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"id": "wait-7-more-days",
"name": "Wait 7 More Days",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
1540,
0
],
"parameters": {
"resume": "timeInterval",
"unit": "days",
"amount": 7,
"options": {}
}
},
{
"id": "day-14-flag",
"name": "Day 14 Flag for Human Touch",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
1760,
0
],
"parameters": {
"operation": "send",
"sendTo": "={{ $json.sender_name }}@YOUR_DOMAIN.com",
"subject": "=[Action needed] 14-day check-in for {{ $json.name }} ({{ $json.company }})",
"message": "=Customer {{ $json.name }} ({{ $json.email }}) at {{ $json.company }} has been active for 14 days on the {{ $json.plan }} plan.\n\nThis is your manual touchpoint reminder. Reach out personally today.\n\nSuggested talking points:\n- What have they achieved so far?\n- Any friction points they haven't mentioned?\n- Are there features they haven't discovered yet?\n\nRemember: a proactive call here prevents a cancellation at day 30.",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
},
{
"id": "wait-16-more-days",
"name": "Wait 16 More Days",
"type": "n8n-nodes-base.wait",
"typeVersion": 1.1,
"position": [
1980,
0
],
"parameters": {
"resume": "timeInterval",
"unit": "days",
"amount": 16,
"options": {}
}
},
{
"id": "day-30-nps",
"name": "Day 30 NPS plus Referral",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [
2200,
0
],
"parameters": {
"operation": "send",
"sendTo": "={{ $json.email }}",
"subject": "=30 days in, two quick things",
"message": "=Hi {{ $json.name }},\n\nYou've been with us for 30 days. Two things:\n\n1. How likely are you to recommend us to someone you know? Reply with a number from 0 to 10.\n\n2. If there's one person in your network who would benefit from [PRODUCT], I'd love an introduction. No pressure, just if someone comes to mind.\n\nThank you for being a customer.\n\n{{ $json.sender_name }}",
"options": {}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
}
}
],
"connections": {
"New Customer Webhook": {
"main": [
[
{
"node": "Extract Customer Data",
"type": "main",
"index": 0
}
]
]
},
"Extract Customer Data": {
"main": [
[
{
"node": "Webhook Response",
"type": "main",
"index": 0
},
{
"node": "Day 0 Welcome Email",
"type": "main",
"index": 0
}
]
]
},
"Day 0 Welcome Email": {
"main": [
[
{
"node": "Wait 3 Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 3 Days": {
"main": [
[
{
"node": "Day 3 Check-in Email",
"type": "main",
"index": 0
}
]
]
},
"Day 3 Check-in Email": {
"main": [
[
{
"node": "Wait 4 More Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 4 More Days": {
"main": [
[
{
"node": "Day 7 Friction Survey",
"type": "main",
"index": 0
}
]
]
},
"Day 7 Friction Survey": {
"main": [
[
{
"node": "Wait 7 More Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 7 More Days": {
"main": [
[
{
"node": "Day 14 Flag for Human Touch",
"type": "main",
"index": 0
}
]
]
},
"Day 14 Flag for Human Touch": {
"main": [
[
{
"node": "Wait 16 More Days",
"type": "main",
"index": 0
}
]
]
},
"Wait 16 More Days": {
"main": [
[
{
"node": "Day 30 NPS plus Referral",
"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.
gmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
NTF 10 Customer Onboarding Flow. Uses gmail. Webhook trigger; 13 nodes.
Source: https://github.com/MinaSaad1/n8n-customer-onboarding/blob/main/workflows/01-customer-onboarding.json — 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.
Wait. Uses httpRequest, itemLists, slack, gmail. Webhook trigger; 29 nodes.
Receive support tickets via webhook, categorize by priority, track SLA deadlines, notify your team on Slack, and send confirmation emails to customers.
This workflow demonstrates a resilient publish/subscribe automation pattern using n8n, RabbitMQ, JSON Schema validation, and Gmail.
This workflow is a fully automated AI matte painting generation system for VFX pipelines, designed to convert a single environment prompt into multiple cinematic background variations. It handles gene
Construction and renovation businesses that need to generate detailed quotes from customer inquiries—plasterers, painters, contractors, renovation specialists, or any construction service provider han