This workflow corresponds to n8n.io template #5433 — we link there as the canonical source.
This workflow follows the Airtable → Gmail 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": "ySBT8cLVgOBLHPAg",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Centralize your forms and reply automatically with Tally + Airtable + Gmail",
"tags": [],
"nodes": [
{
"id": "6fca68c6-4f99-46a6-b5e8-c5e537734e7b",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
1168,
448
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "0186e9c9-424c-4ad8-8382-1614cf48c9d1",
"name": "full_name",
"type": "string",
"value": "={{ $json.body.data.fields[0].value }}"
},
{
"id": "e5559efc-1458-48e6-a207-f7fea896e930",
"name": "company_name",
"type": "string",
"value": "={{ $json.body.data.fields[1].value }}"
},
{
"id": "bbc04ed4-a8f7-4778-bfdc-038c637320fa",
"name": "job_title",
"type": "string",
"value": "={{ $json.body.data.fields[2].value }}"
},
{
"id": "8175addd-ef95-45f9-b307-b218d6ede2be",
"name": "email",
"type": "string",
"value": "={{ $json.body.data.fields[3].value }}"
},
{
"id": "f017c0bd-bd5d-4a5e-967f-bb27c514f5ee",
"name": "phone_number",
"type": "string",
"value": "={{ $json.body.data.fields[4].value }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "bbe5bde7-1f23-4bbb-8e42-cd9d43b6ad1b",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
1888,
448
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "12105139-18e1-485c-9b21-6c83ad3ba721",
"name": "Webhook : Tally",
"type": "n8n-nodes-base.webhook",
"position": [
848,
448
],
"parameters": {
"path": "formulaire-tally",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "de5f57be-7ebc-479a-a30b-1a19e05d8799",
"name": "Airtable : Create a record",
"type": "n8n-nodes-base.airtable",
"position": [
1488,
448
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appPk6zfIQ1EbBq43",
"cachedResultUrl": "https://airtable.com/appPk6zfIQ1EbBq43",
"cachedResultName": "Client Requests"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblLkuoQ9AYsAQ0io",
"cachedResultUrl": "https://airtable.com/appPk6zfIQ1EbBq43/tblLkuoQ9AYsAQ0io",
"cachedResultName": "Client Requests"
},
"columns": {
"value": {
"Email": "={{ $json.email }}",
"Full Name": "={{ $json.full_name }}",
"Job Title": "={{ $json.job_title }}",
"Company Name": "={{ $json.company_name }}",
"Phone Number": "={{ $json.phone_number }}"
},
"schema": [
{
"id": "Full Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Company Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Job Title",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Job Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone Number",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Phone Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Submission Date",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Submission Date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "9bb28166-bf1e-49aa-be3b-5538c7cd629e",
"name": "GMAIL : Send a message",
"type": "n8n-nodes-base.gmail",
"position": [
2208,
448
],
"parameters": {
"sendTo": "={{ $json.fields.Email }}",
"message": "=<p>Hi {{ $json.fields['Full Name'] }},</p>\n\n<p>Thanks for reaching out! We\u2019ve received your request and our team will get back to you as soon as possible.</p>\n\n<p><strong>Here\u2019s a quick summary:</strong></p>\n<ul>\n\n <li><strong>Company:</strong>{{ $json.fields['Company Name'] }} </li>\n <li><strong>Job Title:</strong> {{ $json.fields['Job Title'] }}</li>\n\n<p>We\u2019ll be in touch very soon!</p>\n<p>\u2014 The Team</p>\n\n",
"options": {},
"subject": "Thanks for reaching out!"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "b4de773e-1454-4c8f-a156-273d040d0859",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
592,
128
],
"parameters": {
"width": 200,
"height": 484,
"content": "**Still manually copy-pasting your Tally form responses?**\n\nWhat if every submission went straight into Airtable \u2014 and the user got an automatic email right after?\n\nThat\u2019s exactly what this workflow does.\nNo code, no headache \u2014 just a simple and fast automation:\n\n**Tally \u2192 Airtable \u2192 Gmail.**\n\n"
},
"typeVersion": 1
},
{
"id": "f24cb0f3-2a17-4301-a6d9-9421c62f5733",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
784,
-1024
],
"parameters": {
"color": 3,
"height": 1636,
"content": "## STEP 1 \u2014 Capture Tally Form Responses\n\n### Goal\nTrigger the workflow automatically every time someone submits your Tally form.\n\n### What we're setting up\nA webhook that catches form responses and kicks off the rest of the flow.\n\n### Steps to follow\nAdd a Webhook node\n\nParameter :\tValue\nMethod :\tPOST\nPath :\tformulaire-tally\nAuthentication : None\nRespond : Immediately\n\n\nSave the workflow\n\u2192 This will generate a URL like:\n\n*https://your-workspace.n8n.cloud/webhook-test/formulaire-tally*\n*\n\ud83d\udca1 Use the Test URL first (found under Parameters > Test URL)\n\nHead over to Tally\nGo to your form \u2192 Form Settings > Integrations > Webhooks\nPaste the Test URL into the Webhook field\nEnable the webhook \u2705\n\nSubmit a test entry\n\u2192 Tally won\u2019t send anything until a real submission is made.\nThis step is required for n8n to capture the structure.\n\n### Expected output\n\nn8n receives a JSON object containing:\n\nGeneral info (IDs, timestamps, etc.)\n\nA fields[] array with all the form inputs (name, email, etc.)\n\nEach field is nicely structured with a label, key, type, and most importantly, a value.\n\nPerfect foundation for the next step: data cleanup."
},
"typeVersion": 1
},
{
"id": "82800864-d262-4ce6-879f-651706f1ca36",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1024,
-544
],
"parameters": {
"color": 6,
"width": 380,
"height": 1160,
"content": "## STEP 2 \u2014 Clean and Structure the Form Data (Set node)\n\n### Goal\n\nTake the raw data sent by Tally and turn it into clean, readable JSON that's easy to use in the rest of the workflow.\n\nTally sends the responses inside a big array called field.\n\nCan you grab a field directly with something like {{$json[\"fields\"][3][\"value\"]}}? Yes.\n\nBut a good workflow is like a sock drawer \u2014 when everything\u2019s folded and labeled, life\u2019s just easier.\n\nSo we\u2019re going to clean it up using a Set node.\n\n### Steps to follow\n\nAdd a Set node right after the Webhook.\n\nEnable the \u201cKeep only set\u201d option.\n\nDefine the following fields in the Set node:\n\nField name:\tExpression\nfull_name:\t{{$json[\"fields\"][0][\"value\"]}}\ncompany_name:\t{{$json[\"fields\"][1][\"value\"]}}\njob_title:\t{{$json[\"fields\"][2][\"value\"]}}\nemail:\t{{$json[\"fields\"][3][\"value\"]}}\nphone_number:\t{{$json[\"fields\"][4][\"value\"] ?? \"\"}}\nsubmission_date:\t{{$now.toISOString()}}\n\n\u26a0\ufe0f The order of fields[] depends on your Tally form. If you change the question order, make sure to update these indexes accordingly.\n\n### Expected output\n\nYou\u2019ll get a clean, structured JSON like this:\n\nNow your data is clear, labeled, and ready for the rest of your workflow."
},
"typeVersion": 1
},
{
"id": "2278b4e6-73cb-4f7d-ab41-2a2a7aff1311",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1408,
-1024
],
"parameters": {
"color": 2,
"width": 312,
"height": 1644,
"content": "## STEP 3 \u2014 Save Data in Airtable\n\nEvery time someone submits your Tally form, their info is automatically added to an Airtable base. No more copy-pasting \u2014 everything lands right where it should.\n\n## Steps to follow\n1. Create your Airtable base\nStart by creating a base named Leads (or whatever you prefer), with a table called Form Submissions.\n\nAdd the following columns in this exact order so everything maps correctly later:\n\n### Generate an Airtable token\nSo n8n can send data into your base:\n\nGo to \ud83d\udc49 [ https://airtable.com/create/tokens](https://airtable.com/create/tokens\n)\n\nClick Create token\n\nGive it a name (e.g. Tally Automation)\n\nCheck the following permissions:\n\ndata.records:read\n\ndata.records:write\n\nschema.bases:read\n\nUnder Base access, either choose your base manually or select \u201cAll current and future bases\u201d\n\nClick Create token and copy the generated key\n\n### Add configure the Airtable node in n8n\n\nNode: Airtable\n\nOperation: Create\n\nAuthentication: Personal Access Token\n\nPaste your token\n\nn8n will suggest your base and table (or you can manually grab the IDs from the URL:\nhttps://airtable.com/appXXXXXXXX/tblYYYYYYYY/...)\n\nMap your fields\nInside the Airtable node, add the following field mappings:\n\nEvery new Tally form submission automatically creates a new row in your Airtable base."
},
"typeVersion": 1
},
{
"id": "420df683-9b1c-471d-8c90-1244db3feb95",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1712,
-480
],
"parameters": {
"color": 4,
"width": 712,
"height": 1092,
"content": "## STEP 4 \u2014 Send an Automatic Confirmation Email\n\n### Goal\n\nSend a professional email as soon as a form is completed\n\n### Steps to follow\n\n1. Add a Wait node\n\nYou don\u2019t want the email to go out instantly \u2014 it feels cold and robotic.\n\u2192 Add a Wait node right after Airtable.\n\nMode: Wait for a period of time\n\nDelay: 5 to 10 minutes\n\nUnit: Minutes\n\n2. Add a Gmail > Send Email node\nAuthentication: OAuth2\n\nConnect a Gmail account (business or test)\n\u26a0\ufe0f No API keys here \u2014 Gmail requires OAuth.\n\n3. Configure the Send Email node\n\n\n\nField\tValue\n\nCredential to connect with Gmail account via OAuth2\n\nResource :\tMessage\nOperation :\tSend\nTo :\t{{ $json.fields[\"Email\"] }}\nSubject : Thanks for reaching out!\nEmail Type : HTML\nMessage: (but do the mapping correctly using the Input so that lead receives its name correctly )"
},
"typeVersion": 1
},
{
"id": "c6675cf5-a621-4e37-a400-74257354a135",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2416,
416
],
"parameters": {
"width": 320,
"height": 200,
"content": "## End of the Workflow\n\nAnd that\u2019s it \u2014 your automation is live!\n\nYour lead fills out the Tally form \u2192 the info goes to Airtable \u2192 they get a clean, professional email without you doing a thing."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "efdec661-3213-4bf6-b3a2-2a13c9a07722",
"connections": {
"Wait": {
"main": [
[
{
"node": "GMAIL : Send a message",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Airtable : Create a record",
"type": "main",
"index": 0
}
]
]
},
"Webhook : Tally": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Airtable : Create a record": {
"main": [
[
{
"node": "Wait",
"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.
airtableTokenApigmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Still manually copy-pasting your Tally form responses?
Source: https://n8n.io/workflows/5433/ — 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.
Every quote request is a potential deal — but only if it's handled quickly, properly, and without things falling through the cracks. What if instead of copy-pasting emails and pinging teammates manual
Eliminate the manual chaos of HR and legal document management. This workflow automates the transition from a raw document upload to a structured, audit-ready archive by combining UploadToURL for inst
Wait. Uses httpRequest, itemLists, slack, gmail. Webhook trigger; 29 nodes.
Receive support tickets via webhook, categorize by priority, track SLA deadlines, notify your team on Slack, and send confirmation emails to customers.
This workflow demonstrates a resilient publish/subscribe automation pattern using n8n, RabbitMQ, JSON Schema validation, and Gmail.