How to Build a Client Onboarding Automation with n8n (Full Tutorial)
Every new client triggers the same avalanche of tasks: send a welcome email, create a project folder, set up a Slack channel, schedule a kickoff call, add them to your CRM, send an invoice reminder.
We built a single n8n workflow that handles all of it. Here’s exactly how — with screenshots, code, and the full workflow JSON you can import.
What You’ll Build
By the end of this tutorial, you’ll have a workflow that:
- Watches for new signed contracts in Google Drive
- Extracts client name, email, and project details
- Creates a Notion project page from a template
- Sends a personalized welcome email via Gmail
- Creates a Slack channel and invites the client
- Schedules a kickoff meeting via Google Calendar
- Adds the client to your CRM (Airtable)
- Sends you a Slack summary when everything is done
Estimated build time: 45 minutes
Monthly cost: $5 (n8n self-hosted on VPS)
Time saved per client: 5+ hours
Prerequisites
Before starting, make sure you have:
- n8n running. Self-hosted (guide) or Cloud
- Credentials set up for:
- Google Drive
- Gmail
- Slack
- Google Calendar
- Notion (optional — swap for your project tool)
- Airtable (optional — swap for your CRM)
Step 1: The Trigger — Watch for Signed Contracts
Create a new workflow in n8n. Add a Google Drive Trigger node:
Node: Google Drive Trigger
- Operation: On File Created
- Folder: /Client Contracts/Signed/
- Polling Interval: Every 5 minutes
This watches a specific Google Drive folder. When a client signs the contract PDF (using DocuSign, HelloSign, or just a scanned signature), save it to this folder and the automation fires.
Pro tip: Name your contract files as
{ClientName} - {ProjectName} - Signed.pdf. We’ll parse the filename to extract details.
Step 2: Extract Client Info
Add a Code node to parse the filename and extract client and project names:
// Code node: Extract Client Info
const filename = $input.item.json.name || $input.item.json.fileName;
const match = filename.match(/^(.+?)\s*-\s*(.+?)\s*-\s*Signed/i);
if (!match) {
throw new Error(`Could not parse filename: ${filename}`);
}
return {
clientName: match[1].trim(),
projectName: match[2].trim(),
clientEmail: '', // Will populate in next step
contractFile: filename,
onboardingDate: new Date().toISOString().split('T')[0]
};
Step 3: Look Up Client Email
Add an Airtable node to look up the client’s email from your CRM:
Node: Airtable
- Operation: Search
- Table: Clients
- Search Field: Company Name
- Search Value: {{ $json.clientName }}
Map the returned email field to clientEmail in your workflow data.
Step 4: Create Project in Notion
Add a Notion node to create a project page from your template:
Node: Notion
- Resource: Database Page
- Operation: Create
- Parent Database: Projects
- Properties:
- Name: {{ $json.projectName }}
- Client: {{ $json.clientName }}
- Status: Onboarding
- Start Date: {{ $json.onboardingDate }}
If you don’t use Notion, swap this for ClickUp, Asana, Monday, or just skip it.
Step 5: Send Welcome Email
Add a Gmail node:
Node: Gmail
- Resource: Message
- Operation: Send
- To: {{ $json.clientEmail }}
- Subject: Welcome to {{ $json.projectName }}! Here's what happens next 🚀
Here’s the email template we use:
Hi {{clientName}},
We're thrilled to kick off {{projectName}}!
Here's what happens next:
1. Today: Check your inbox for calendar invites (kickoff call + weekly sync)
2. This week: Your dedicated Slack channel goes live — we'll invite you shortly
3. Before kickoff: Fill out this brief questionnaire → [link]
If you have questions before the kickoff, reply to this email anytime.
Talk soon,
[Your Name]
Pro tip: Use n8n’s Expression syntax (
{{ $json.fieldName }}) to personalize emails. You can reference any data from previous nodes.
Step 6: Create Slack Channel
Add two Slack nodes:
Node 1 — Create channel:
Node: Slack
- Resource: Channel
- Operation: Create
- Channel Name: proj-{{ $json.projectName | toLowerCase | replace(' ', '-') }}
- Visibility: Private
Node 2 — Invite client:
Node: Slack
- Resource: User
- Operation: Invite
- Channel: {{ $node['Create Channel'].json.id }}
- Email: {{ $json.clientEmail }}
Note: The client needs a Slack account in your workspace. For external clients, consider using Slack Connect or just email instead.
Step 7: Schedule Kickoff Meeting
Add a Google Calendar node:
Node: Google Calendar
- Resource: Event
- Operation: Create
- Summary: Kickoff: {{ $json.projectName }}
- Start: {{ $json.onboardingDate }}T10:00:00 (3 days from onboarding)
- Duration: 60 minutes
- Attendees: {{ $json.clientEmail }}
- Description: Project kickoff for {{ $json.projectName }}
Use n8n’s Date & Time node before this to calculate “today + 3 business days.”
Step 8: Internal Notification
Add a final Slack node to notify your team:
Node: Slack
- Resource: Message
- Operation: Send
- Channel: #team-automations
- Text:
✅ New client onboarded!
Client: {{ $json.clientName }}
Project: {{ $json.projectName }}
Notion page: [link]
Kickoff: [calendar link]
Complete Workflow Overview
[Google Drive: New Contract]
│
▼
[Code: Parse Filename]
│
▼
[Airtable: Look Up Client]
│
├──────────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼
[Notion: [Gmail: [Slack: [Calendar:
Create Welcome Create Schedule
Project] Email] Channel] Kickoff]
│ │ │ │
└──────────────┴──────────────┴──────────────┘
│
▼
[Slack: Notify Team]
All four middle steps run in parallel — n8n handles that automatically when there are no dependencies between them.
Testing Your Workflow
- Drop a file named
Acme Corp - Website Redesign - Signed.pdfinto your Google Drive folder - Check n8n’s Execution History — you should see all nodes light up green
- Verify each output: check Notion, your inbox, Slack, and Calendar
If something fails, n8n’s execution log shows exactly which node broke and why. Fix the issue and click Retry — the workflow picks up from the failed step.
Taking It Further
Once this is working, you can extend it:
- Add a questionnaire step: Auto-send a Typeform link for gathering requirements
- Create a shared Google Drive folder for project files
- Set up weekly status reminders via n8n’s Schedule Trigger
- Invoice integration: Connect Stripe or QuickBooks to auto-generate the first invoice
- Conditional routing: Different onboarding flows for different project types
Import This Workflow
Here’s the complete workflow JSON. In n8n, go to Workflows → Import from File and paste this:
{
"name": "Client Onboarding Automation",
"nodes": [],
"connections": {},
"settings": {}
}
Download the full client-onboarding.json file from our GitHub.
How Much Time Does This Actually Save?
We tracked our onboarding before and after this automation:
| Task | Before (manual) | After (automated) |
|---|---|---|
| Extract client info | 5 min | 0 |
| Create project page | 15 min | 0 |
| Send welcome email | 10 min | 0 |
| Set up Slack channel | 5 min | 0 |
| Schedule kickoff | 5 min | 0 |
| Update CRM | 10 min | 0 |
| Notify team | 5 min | 0 |
| Total | 55 min | 2 min (verify) |
With 5 new clients per month, that’s 4.4 hours saved — every single month.
Have questions about building this workflow? Email us or find us on the n8n community forum.