Workflow: Streamline data from an n8n form into Google Sheet and Airtable
Integrations: airtable, code, formTrigger, gmail, googleSheets, set, stickyNote, stopAndError

{"id": "g25bM3Hj71T3ZVVe", "meta": {"instanceId": "workflow-0963993a", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:43.796999", "updatedAt": "2025-09-29T07:07:43.797020", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production"}, "name": "Streamline data from an n8n form into Google Sheet and Airtable", "tags": ["automation", "n8n", "production-ready", "excellent", "optimized"], "nodes": [{"id": "32bd3bcb-7de7-4ca3-ba31-897e90f663b1", "name": "n8n Form Trigger", "type": "n8n-nodes-base.formTrigger", "position": [720, -400], "webhookId": "c07c8eb6-cf56-4941-91cc-e3cb31c90b5c", "parameters": {"path": "c07c8eb6-cf56-4941-91cc-e3cb31c90b5c", "options": {}, "formTitle": "Data Colleacation", "formFields": {"values": [{"fieldLabel": "What's your name ?", "requiredField": true}, {"fieldLabel": "Where do you live ?", "requiredField": true}, {"fieldLabel": "Your Email ?", "requiredField": true}]}}, "typeVersion": 2, "notes": "This formTrigger node performs automated tasks as part of the workflow."}, {"id": "bf341165-2698-4f42-a92d-bc5e9a750bf1", "name": "Extracting Date and Time Fields from 'submittedAt' Field", "type": "n8n-nodes-base.code", "position": [920, -400], "parameters": {"jsCode": "// Loop over input items and separate date and time into two new fields\nfor (const item of $input.all()) {\n  // Extract date and time from 'submittedAt' field\n  const submittedAt = new Date(item.json['submittedAt']);\n  const date = submittedAt.toISOString().split('T')[0]; // Get date part\n  const time = submittedAt.toISOString().split('T')[1].split('.')[0]; // Get time part\n\n  // Remove the old 'submittedAt' field\n  delete item.json['submittedAt'];\n\n  // Add new 'Date' and 'Time' fields with respective values\n  item.json['Date'] = date;\n  item.json['Time'] = time;\n}\n\nreturn $input.all();\n"}, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow."}, {"id": "c9955ba1-0aa4-476b-b2ac-8a458b1547b3", "name": "Format the Fields", "type": "n8n-nodes-base.set", "position": [1100, -400], "parameters": {"fields": {"values": [{"name": "Name", "stringValue": "={{ $json['What\\'s your name ?'] }}"}, {"name": "City", "stringValue": "={{ $json['Where do you live ?'] }}"}, {"name": "Date", "stringValue": "={{ $json.Date }}"}, {"name": "Time", "stringValue": "={{ $json.Time }}"}, {"name": "Email", "stringValue": "={{ $json['Your Email ?'] }}"}]}, "include": "selected", "options": {}}, "typeVersion": 3.2, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "50e6057e-4b26-40f6-adc1-1721818f7a46", "name": "Airtable", "type": "n8n-nodes-base.airtable", "position": [1320, -260], "parameters": {"base": {"__rl": true, "mode": "id", "value": "appIIeJ18fnPkNyNS"}, "table": {"__rl": true, "mode": "id", "value": "tblZvKuOMmtHnv5TH"}, "columns": {"value": {"City": "={{ $json.City }}", "Date": "={{ $json.Date }}", "Name": "={{ $json.Name }}", "Time": "={{ $json.Time }}", "Email": "={{ $json.Email }}"}, "schema": [{"id": "Name", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Name", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "City", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "City", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Email", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Email", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Date", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Date", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Time", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Time", "defaultMatch": false, "canBeUsedToMatch": true}], "mappingMode": "defineBelow", "matchingColumns": []}, "options": {}, "operation": "create"}, "credentials": {"airtableTokenApi": {"id": "maZEeRzOyC8Q06Zf", "name": "Airtable Personal Access Token account"}}, "typeVersion": 2, "notes": "This airtable node performs automated tasks as part of the workflow."}, {"id": "4f561bd8-a5dd-4ff2-9d3e-cdac6f762bd4", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [100, -680], "parameters": {"color": 5, "width": 2256.3366317584496, "height": 851.9587677224575, "content": "### Workflow Description:\n\n1. **n8n Form Trigger:**\n   - A trigger node that initiates the workflow when a form is submitted.\n   - Form fields include Name, City, and Email.\n\n2. **Extracting Date and Time Fields from 'submittedAt' Field:**\n   - A code node that extracts Date and Time from the submittedAt field.\n\n3. **Format the Fields:**\n   - Sets the format for the extracted fields (Name, City, Date, Time, Email).\n\n4. **Airtable:**\n   - Creates a new record in Airtable with the formatted data.\n   - Includes columns for Name, City, Email, Time, and Date.\n\n5. **Google Sheets:**\n   - Appends the formatted data to a Google Sheet.\n   - Includes columns for Name, City, Email, Date, and Time.\n\n6. **Gmail:**\n   - Sends an email to the provided Email address.\n   - Subject: \"Testing Text Message Delivery\"\n   - Message: Customized message with Name placeholder.\n\n7. **Gmail1:**\n   - Sends another email using a different template.\n   - Subject includes the Date field.\n   - Similar message content with a different subject line.\n\n### Workflow Connections:\n- n8n Form Trigger -> Extracting Date and Time Fields -> Format the Fields -> Google Sheets & Airtable -> Gmail\n- Google Sheets -> Gmail1\n\nThis workflow collects data from a form submission, processes it to extract Date and Time fields, saves the formatted data to Google Sheets and Airtable, and sends customized emails to the submitter.\n\n\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "a0d53cb5-27c8-4dfb-a1ea-e2403bde1fc4", "name": "Google Sheets", "type": "n8n-nodes-base.googleSheets", "position": [1320, -540], "parameters": {"columns": {"value": {"City": "={{ $json.City }}", "Date": "={{ $json.Date }}", "Name": "={{ $json.Name }}", "Time": "={{ $json.Time }}", "Email": "={{ $json.Email }}"}, "schema": [{"id": "Name", "type": "string", "display": true, "required": false, "displayName": "Name", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "City", "type": "string", "display": true, "required": false, "displayName": "City", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Email", "type": "string", "display": true, "required": false, "displayName": "Email", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Date", "type": "string", "display": true, "required": false, "displayName": "Date", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Time", "type": "string", "display": true, "required": false, "displayName": "Time", "defaultMatch": false, "canBeUsedToMatch": true}], "mappingMode": "defineBelow", "matchingColumns": []}, "options": {}, "operation": "append", "sheetName": {"__rl": true, "mode": "list", "value": "gid=0", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Page"}, "documentId": {"__rl": true, "mode": "list", "value": "1Ss6AEwaXpAl54YQAQDf1z6SRyh6pj719-A9eOzf2Dv4", "cachedResultUrl": "{{ $env.WEBHOOK_URL }}", "cachedResultName": "Streamline data from an n8n form into Google Sheet and Airtable"}}, "credentials": {"googleSheetsOAuth2Api": {"id": "L5CnisK8R3BgVGcO", "name": "Omar sheet"}}, "typeVersion": 4.2, "notes": "This googleSheets node performs automated tasks as part of the workflow."}, {"id": "de697574-f547-4374-86d9-c6d9f709c404", "name": "Gmail", "type": "n8n-nodes-base.gmail", "position": [1560, -260], "parameters": {"sendTo": "={{ $json.fields.Email }}", "message": "=Dear {{ $json.fields.Name }} ..\n\nHey there! Just testing to see if this message goes through. Let me know if you receive it. \n\nThanks! \nSupport Team", "options": {}, "subject": "Testing Text Message Delivery", "emailType": "text"}, "credentials": {"gmailOAuth2": {"id": "UJx4Tiq8WRtxWEIP", "name": "Gmail Omar"}}, "typeVersion": 2.1, "notes": "This gmail node performs automated tasks as part of the workflow."}, {"id": "66677b7e-d053-4050-a65c-9c9f8f689646", "name": "Gmail1", "type": "n8n-nodes-base.gmail", "position": [1560, -540], "parameters": {"sendTo": "={{ $json.Email }}", "message": "=Dear {{ $json.Name }} ..\n\nHey there! Just testing to see if this message goes through. Let me know if you receive it. \n\nThanks! \nSupport Team  ", "options": {}, "subject": "=Testing Text Message Delivery , ( {{ $json.Date }} ) ", "emailType": "text"}, "credentials": {"gmailOAuth2": {"id": "UJx4Tiq8WRtxWEIP", "name": "Gmail Omar"}}, "typeVersion": 2.1, "notes": "This gmail node performs automated tasks as part of the workflow."}, {"id": "e440b4cb-6910-4bc7-b3df-7c14dd9c43a9", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [1820, -640], "parameters": {"width": 510.8381838182147, "height": 206.48715095387286, "content": "### Links to Node Documentation:\n1. [n8n Form Trigger Documentation]({{ $env.WEBHOOK_URL }}\n2. [Code Node Documentation]({{ $env.WEBHOOK_URL }}\n3. [Set Node Documentation]({{ $env.WEBHOOK_URL }}\n4. [Airtable Node Documentation]({{ $env.WEBHOOK_URL }}\n5. [Google Sheets Node Documentation]({{ $env.WEBHOOK_URL }}\n6. [Gmail Node Documentation]({{ $env.WEBHOOK_URL }}\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "541ecd4c-22bc-4bc9-8364-ca73b4650092", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [680, -640], "parameters": {"width": 1105.0652438372836, "height": 630.9350509674927, "content": ""}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "error-c336389e", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [1000, 400], "parameters": {"message": "Workflow execution error", "options": {}}}], "active": false, "pinData": {}, "settings": {"executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000}, "versionId": "de903de6-c793-4a64-9d3c-0ade08d6994e", "connections": {"a0d53cb5-27c8-4dfb-a1ea-e2403bde1fc4": {"main": [[{"node": "error-handler-a0d53cb5-27c8-4dfb-a1ea-e2403bde1fc4-601db50e", "type": "main", "index": 0}]]}}, "description": "Automated workflow: Streamline data from an n8n form into Google Sheet and Airtable. This workflow integrates 8 different services: stickyNote, formTrigger, airtable, code, set. It contains 11 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Streamline data from an n8n form into Google Sheet and Airtable. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}