🀝 Complete client onboarding: Form to Monday.com, Google Drive & Email

⚑ 288 views · 🀝 CRM & Sales Operations

Description

Overview

Streamline your entire client onboarding process with a single workflow. When a new client submits the intake form, this automation creates a Monday.com item, generates a complete Google Drive folder structure from your template, updates the Monday item with the folder link, and sends a personalized welcome emailβ€”all automatically.

What This Workflow Does

  1. Displays a professional intake form (client name, email, project type)
  2. Creates a new item in your Monday.com board with all details
  3. Generates a Google Drive folder for the client
  4. Duplicates your template folder structure using Apps Script
  5. Updates the Monday.com item with the Google Drive folder link
  6. Sends a welcome email to the client with folder access

Key Features

Prerequisites

Setup

Step 1: Get your Monday.com IDs

  1. Open your Monday.com board
  2. Board ID: Check the URL β†’ monday.com/boards/BOARD_ID
  3. Group ID: Use Monday API Explorer or browser dev tools
  4. Column IDs: Found in column settings or via API

Step 2: Create your Drive template folder

πŸ“ {{NAME}} - Client Files
β”œβ”€β”€ πŸ“ 01. Contracts & Agreements
β”œβ”€β”€ πŸ“ 02. {{NAME}} - Assets
β”œβ”€β”€ πŸ“ 03. Deliverables
β”œβ”€β”€ πŸ“ 04. Communications
└── πŸ“„ {{NAME}} - Project Brief.gdoc

Step 3: Deploy Apps Script

  1. Go to script.google.com
  2. Create new project β†’ Paste code below
  3. Deploy β†’ New deployment β†’ Web app
  4. Execute as: Me | Access: Anyone
  5. Copy the deployment URL

Step 4: Configure the workflow

Replace these placeholders:

Step 5: Connect credentials


Apps Script Code

function doPost(e) {
  try {
    var params = e.parameter;
    var templateFolderId = params.templateFolderId;
    var name = params.name;
    var destinationFolderId = params.destinationFolderId;
    
    if (!templateFolderId || !name) {
      return jsonResponse({
        success: false,
        error: 'Missing required parameters: templateFolderId and name are required'
      });
    }
    
    var templateFolder = DriveApp.getFolderById(templateFolderId);
    
    if (destinationFolderId) {
      var destinationFolder = DriveApp.getFolderById(destinationFolderId);
      copyContentsRecursively(templateFolder, destinationFolder, name);
      
      return jsonResponse({
        success: true,
        id: destinationFolder.getId(),
        url: destinationFolder.getUrl(),
        name: destinationFolder.getName(),
        mode: 'copied_to_existing',
        timestamp: new Date().toISOString()
      });
    } else {
      var parentFolder = templateFolder.getParents().next();
      var newFolderName = replacePlaceholders(templateFolder.getName(), name);
      var newFolder = parentFolder.createFolder(newFolderName);
      copyContentsRecursively(templateFolder, newFolder, name);
      
      return jsonResponse({
        success: true,
        id: newFolder.getId(),
        url: newFolder.getUrl(),
        name: newFolder.getName(),
        mode: 'created_new',
        timestamp: new Date().toISOString()
      });
    }
  } catch (error) {
    return jsonResponse({
      success: false,
      error: error.toString()
    });
  }
}

function replacePlaceholders(text, name) {
  var result = text;
  result = result.replace(/\{\{NAME\}\}/g, name);
  result = result.replace(/\{\{name\}\}/g, name.toLowerCase());
  result = result.replace(/\{\{Name\}\}/g, name);
  return result;
}

function copyContentsRecursively(sourceFolder, destinationFolder, name) {
  var files = sourceFolder.getFiles();
  while (files.hasNext()) {
    try {
      var file = files.next();
      var newFileName = replacePlaceholders(file.getName(), name);
      file.makeCopy(newFileName, destinationFolder);
      Utilities.sleep(150);
    } catch (error) {
      Logger.log('Error copying file: ' + error.toString());
    }
  }
  
  var subfolders = sourceFolder.getFolders();
  while (subfolders.hasNext()) {
    try {
      var subfolder = subfolders.next();
      var newSubfolderName = replacePlaceholders(subfolder.getName(), name);
      var newSubfolder = destinationFolder.createFolder(newSubfolderName);
      Utilities.sleep(200);
      copyContentsRecursively(subfolder, newSubfolder, name);
    } catch (error) {
      Logger.log('Error copying subfolder: ' + error.toString());
    }
  }
}

function jsonResponse(data) {
  return ContentService
    .createTextOutput(JSON.stringify(data))
    .setMimeType(ContentService.MimeType.JSON);
}

Use Cases

Customization Ideas

Notes

πŸ”— Nodes Used

HTTP Request, Google Drive, Monday.com, Gmail, n8n Form Trigger

πŸ“₯ Import

Download workflow.json and import into n8n: Workflow menu β†’ Import from File

πŸ“– Importing guide Β· πŸ”‘ Credential setup