Home/ Workflows/ Freelancers/ Business Process Automation
Workflow · Freelancers

Complete Client Onboarding Automation for Freelancers with n8n

Streamline your freelance business with an automated client onboarding workflow that handles contract generation, payment collection, project setup, and communication

Complete Client Onboarding Automation for Freelancers with n8n

Why This Automation Matters

As a freelancer, client onboarding can be time-consuming and repetitive. This workflow automates the entire process from initial client inquiry to project kickoff, saving you 3-5 hours per client while ensuring consistency and professionalism.

Benefits:

What You Need Before Starting

Required Accounts & Tools:

Credentials to Set Up:

Templates to Prepare:

Complete Node-by-Node Build Instructions

1. Webhook Trigger Node

2. Extract Client Data Node

3. Create CRM Entry Node

4. Generate Contract Node

5. Set Contract Permissions Node

7. Set Up Project Board Node

8. Create Communication Channel Node

9. Send Welcome Email Node

Hi {{ $('Extract Client Data').item.json.client_name }},

Welcome aboard! I'm excited to work on your {{ $('Extract Client Data').item.json.project_type }} project.

Next steps:
1. Review and sign your contract: {{ $('Generate Contract').item.json.webViewLink }}
2. Complete your deposit payment: {{ $('Create Payment Link').item.json.url }}
3. Join our project channel: {{ $('Create Communication Channel').item.json.channel.name }}

Once payment is received, we'll schedule our kickoff call and begin work immediately.

Best regards,
[Your Name]

10. Wait for Payment Node

11. Update Client Status Node

12. Schedule Kickoff Call Node

13. Send Kickoff Email Node

14. Error Handling Node

Full Workflow JSON Code

{
  "meta": {
    "instanceId": "your-instance-id"
  },
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "client-onboarding",
        "responseMode": "respondImmediately"
      },
      "id": "webhook-trigger",
      "name": "Client Onboarding Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [240, 300]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "client_name",
              "value": "={{ $json.body.client_name }}"
            },
            {
              "name": "client_email", 
              "value": "={{ $json.body.client_email }}"
            },
            {
              "name": "project_type",
              "value": "={{ $json.body.project_type }}"
            },
            {
              "name": "budget",
              "value": "={{ $json.body.budget }}"
            },
            {
              "name": "timeline",
              "value": "={{ $json.body.timeline }}"
            },
            {
              "name": "client_id",
              "value": "={{ $json.body.client_id || 'CLT_' + new Date().getTime() }}"
            }
          ]
        }
      },
      "id": "extract-data",
      "name": "Extract Client Data",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [460, 300]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": "your-google-sheet-id",
        "sheetName": "Clients",
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "client_id": "={{ $('Extract Client Data').item.json.client_id }}",
            "client_name": "={{ $('Extract Client Data').item.json.client_name }}",
            "client_email": "={{ $('Extract Client Data').item.json.client_email }}",
            "project_type": "={{ $('Extract Client Data').item.json.project_type }}",
            "budget": "={{ $('Extract Client Data').item.json.budget }}",
            "timeline": "={{ $('Extract Client Data').item.json.timeline }}",
            "status": "Contract Sent",
            "created_date": "={{ new Date().toISOString() }}"
          }
        }
      },
      "id": "create-crm-entry",
      "name": "Create CRM Entry",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 3,
      "position": [680, 180]
    },
    {
      "parameters": {
        "operation": "createFromTemplate",
        "templateId": "your-contract-template-id",
        "title": "Contract - {{ $('Extract Client Data').item.json.client_name }}",
        "replacements": [
          {
            "find": "{{CLIENT_NAME}}",
            "replace": "={{ $('Extract Client Data').item.json.client_name }}"
          },
          {
            "find": "{{PROJECT_TYPE}}",
            "replace": "={{ $('Extract Client Data').item.json.project_type }}"
          },
          {
            "find": "{{BUDGET}}",
            "replace": "={{ $('Extract Client Data').item.json.budget }}"
          },
          {
            "find": "{{TIMELINE}}",
            "replace": "={{ $('Extract Client Data').item.json.timeline }}"
          }
        ]
      },
      "id": "generate-contract",
      "name": "Generate Contract",
      "type": "n8n-nodes-base.googleDocs",
      "typeVersion": 1,
      "position": [680, 300]
    },
    {
      "parameters": {
        "operation": "share",
        "fileId": "={{ $('Generate Contract').item.json.documentId }}",
        "permissions": {
          "role": "reader",
          "type": "user",
          "emailAddress": "={{ $('Extract Client Data').item.json.client_email }}"
        }
      },
      "id": "share-contract",
      "name": "Share Contract",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [680, 420]
    },
    {
      "parameters": {
        "resource": "price",
        "operation": "create",
        "productId": "your-product-id",
        "unitAmount": "={{ Math.round($('Extract Client Data').item.json.budget * 50) }}",
        "currency": "usd",
        "recurring": false
      },
      "id": "create-payment",
      "name": "