This workflow corresponds to n8n.io template #16019 — we link there as the canonical source.
This workflow follows the Google Drive → Google Sheets recipe pattern — see all workflows that pair these two integrations.
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 →
{
"id": "xLXlZeBczAseQqwU",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Auto-create and share client folders from Google Sheets to Google Drive",
"tags": [],
"nodes": [
{
"id": "d821daea-2e60-46b1-b49e-cefeca964530",
"name": "When sheet row is added",
"type": "n8n-nodes-base.googleSheetsTrigger",
"position": [
-96,
160
],
"parameters": {
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyHour"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "",
"cachedResultName": ""
},
"documentId": {
"__rl": true,
"mode": "list",
"value": ""
}
},
"credentials": {
"googleSheetsTriggerOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1,
"alwaysOutputData": false
},
{
"id": "7a432ead-8f47-4d97-a2df-9e913b1f6ca2",
"name": "Configuration",
"type": "n8n-nodes-base.set",
"position": [
96,
160
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "baa458e5-2d85-4cf0-b3f9-8aa4aa2d4036",
"name": "ParentDriveFolderUrl",
"type": "string",
"value": ""
}
]
}
},
"typeVersion": 3.4
},
{
"id": "6f5ba8bc-152f-4377-a407-2be2bd8bd17f",
"name": "Share folder with client",
"type": "n8n-nodes-base.googleDrive",
"position": [
2176,
368
],
"parameters": {
"options": {},
"resource": "folder",
"operation": "share",
"permissionsUi": {
"permissionsValues": {
"role": "reader",
"type": "user",
"emailAddress": "={{ $json.value }}"
}
},
"folderNoRootId": {
"__rl": true,
"mode": "id",
"value": "={{ $if( $(\"Create Client folder\").isExecuted, $('Create Client folder').first().json.id, $('Search for client folder').first().json.id ) }}"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "41bc1c3d-01f1-4e48-9058-3a5c15e6aeb5",
"name": "Update sheet with folder URL",
"type": "n8n-nodes-base.googleSheets",
"position": [
2384,
96
],
"parameters": {
"columns": {
"value": {
"Url": "=https://drive.google.com/drive/u/0/folders/{{ $if( $(\"Create Client folder\").isExecuted, $('Create Client folder')?.item?.json?.id, $('Search for client folder').item.json.id ) }}\n\n",
"Code": "={{ $('When sheet row is added').item.json.Code }}"
},
"schema": [
{
"id": "Code",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Code",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Code"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "id",
"value": "={{ $('When sheet row is added').params.sheetName.value }}"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "={{ $('When sheet row is added').params.documentId.value }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "99660e77-b2d0-4086-8ce7-bbbd1363791f",
"name": "Search for client folder",
"type": "n8n-nodes-base.googleDrive",
"onError": "continueRegularOutput",
"position": [
288,
160
],
"parameters": {
"filter": {
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultUrl": "https://drive.google.com/drive/my-drive",
"cachedResultName": "My Drive"
},
"whatToSearch": "folders"
},
"options": {},
"resource": "fileFolder",
"queryString": "={{ $('When sheet row is added').item.json.Code }}"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3,
"alwaysOutputData": true
},
{
"id": "8104ede4-1038-46db-94c9-faa3e33110f0",
"name": "Check if folder exists",
"type": "n8n-nodes-base.if",
"position": [
496,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "82382bdd-ef8b-4ed7-ba2a-72fbb3e718d6",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.3
},
{
"id": "aeef3ff1-aea7-4086-bb19-e2450c7dc884",
"name": "Parse client emails",
"type": "n8n-nodes-base.code",
"position": [
1840,
112
],
"parameters": {
"jsCode": "const items = [];\nconst users = $('When sheet row is added').first().json.Email.split(',')\nconst lists = users.map(value => value.trim())\n\nfor (const text of lists) {\n items.push({ json: { value: text } });\n}\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "ac4c9514-5986-45f0-a89e-490cec9dbe28",
"name": "Loop over emails",
"type": "n8n-nodes-base.splitInBatches",
"position": [
2112,
112
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "c0887ba9-4aa3-4157-9e8b-d303cce4c7a9",
"name": "Create Documents subfolder",
"type": "n8n-nodes-base.googleDrive",
"position": [
1136,
624
],
"parameters": {
"name": "=Documents",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"resource": "folder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "1b915af6-5010-49d7-94c1-f5afac3168cb",
"name": "Create Media subfolder",
"type": "n8n-nodes-base.googleDrive",
"position": [
1328,
624
],
"parameters": {
"name": "=Media",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Create Client folder').item.json.id }}"
},
"resource": "folder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "31126ca5-396d-4753-9a96-4e7eaa79979b",
"name": "Overview sticky",
"type": "n8n-nodes-base.stickyNote",
"position": [
-128,
-576
],
"parameters": {
"color": 6,
"width": 752,
"height": 624,
"content": "## Client Onboarding Automation\n\n**Who it is for:** Photographers, agencies, consultants, or any service-based business that needs to onboard new clients with organized file sharing.\n\n**What it does:**\n- Watches a Google Sheet for new client rows\n- Checks if a Google Drive folder already exists for that client\n- Automatically creates a client folder and subfolders (Documents, Media) if missing\n- Shares the folder with the client's email address(es)\n- Writes the Drive folder URL back to the sheet for easy access\n\n**How it works:** When a new row is added to your Google Sheet, the workflow reads the client code, name, and email. It then searches for an existing folder in Google Drive. If none exists, it creates the folder structure and shares it.\n\n**Requirements:**\n- Google Sheets and Google Drive OAuth2 credentials\n- A Google Sheet with columns: Code, Name, Email, Drive, Url\n- A parent Google Drive folder to store all client folders\n\n**How to set up:**\n1. Open the Configuration node and enter your Parent Folder URL.\n2. Connect your Google OAuth2 credentials for both Sheets and Drive.\n3. Activate the workflow and add a new client row to your sheet to test.\n\n**How to customize:**\nYou can change the subfolder names, permission roles, or add more columns to track additional data."
},
"typeVersion": 1
},
{
"id": "99c1480c-9ba4-4729-a526-f4d9215de23e",
"name": "Step 1 sticky",
"type": "n8n-nodes-base.stickyNote",
"position": [
816,
464
],
"parameters": {
"width": 704,
"height": 384,
"content": "### Step 1: Folder Check & Creation\n\n1. Search for existing client folder by Code\n2. If found, skip to email parsing\n3. If not found, create client folder inside parent folder\n4. Create Documents and Media subfolders inside client folder"
},
"typeVersion": 1
},
{
"id": "04f6a6e1-368c-48d8-a58f-dbd9a0568b7c",
"name": "Step 2 sticky",
"type": "n8n-nodes-base.stickyNote",
"position": [
1728,
0
],
"parameters": {
"width": 944,
"height": 624,
"content": "### Step 2: Sharing & Update\n\n1. Parse comma-separated emails from the sheet\n2. Loop over each email and share the folder\n3. Update the sheet row with Drive folder ID and URL"
},
"typeVersion": 1
},
{
"id": "96f7db4b-fd27-4556-bec9-bdef9472cc26",
"name": "Create Client folder",
"type": "n8n-nodes-base.googleDrive",
"position": [
944,
624
],
"parameters": {
"name": "={{ $('When sheet row is added').item.json.Code }} - {{ $('When sheet row is added').item.json.Name }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "url",
"value": "={{ $(\"Configuration\").item.json.ParentDriveFolderUrl }}"
},
"resource": "folder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "2eb61fa9-dc6e-4433-ab00-9f8655752a43",
"connections": {
"Configuration": {
"main": [
[
{
"node": "Search for client folder",
"type": "main",
"index": 0
}
]
]
},
"Loop over emails": {
"main": [
[
{
"node": "Update sheet with folder URL",
"type": "main",
"index": 0
}
],
[
{
"node": "Share folder with client",
"type": "main",
"index": 0
}
]
]
},
"Parse client emails": {
"main": [
[
{
"node": "Loop over emails",
"type": "main",
"index": 0
}
]
]
},
"Create Client folder": {
"main": [
[
{
"node": "Create Documents subfolder",
"type": "main",
"index": 0
}
]
]
},
"Check if folder exists": {
"main": [
[
{
"node": "Parse client emails",
"type": "main",
"index": 0
}
],
[
{
"node": "Create Client folder",
"type": "main",
"index": 0
}
]
]
},
"Create Media subfolder": {
"main": [
[
{
"node": "Parse client emails",
"type": "main",
"index": 0
}
]
]
},
"When sheet row is added": {
"main": [
[
{
"node": "Configuration",
"type": "main",
"index": 0
}
]
]
},
"Search for client folder": {
"main": [
[
{
"node": "Check if folder exists",
"type": "main",
"index": 0
}
]
]
},
"Share folder with client": {
"main": [
[
{
"node": "Loop over emails",
"type": "main",
"index": 0
}
]
]
},
"Create Documents subfolder": {
"main": [
[
{
"node": "Create Media subfolder",
"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.
googleDriveOAuth2ApigoogleSheetsOAuth2ApigoogleSheetsTriggerOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow watches a Google Sheets worksheet for new client rows, creates (or reuses) a matching client folder structure in Google Drive, shares the folder with one or more client email addresses, and writes the Drive folder URL back to the sheet. Runs every hour and triggers…
Source: https://n8n.io/workflows/16019/ — 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.
Stickynote Workflow. Uses googleTranslate, googleSheetsTrigger, googleDrive, httpRequest. Event-driven trigger; 22 nodes.
This workflow automatically generates a branded PDF invoice from data in Google Sheets and saves it to Google Drive. No manual document editing required.
[](https://youtu.be/Ft3c_NPRlI8)
PCN. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 60 nodes.
The workflow automates the process of gathering extensive keyword data for a "Main Keyword." It starts by reading initial parameters from a Google Sheets template, creates a new dedicated Google Sheet