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:

  1. Watches for new signed contracts in Google Drive
  2. Extracts client name, email, and project details
  3. Creates a Notion project page from a template
  4. Sends a personalized welcome email via Gmail
  5. Creates a Slack channel and invites the client
  6. Schedules a kickoff meeting via Google Calendar
  7. Adds the client to your CRM (Airtable)
  8. 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

  1. Drop a file named Acme Corp - Website Redesign - Signed.pdf into your Google Drive folder
  2. Check n8n’s Execution History — you should see all nodes light up green
  3. 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:

TaskBefore (manual)After (automated)
Extract client info5 min0
Create project page15 min0
Send welcome email10 min0
Set up Slack channel5 min0
Schedule kickoff5 min0
Update CRM10 min0
Notify team5 min0
Total55 min2 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.