{
  "id": "YBUP7BDTMrzcWncr",
  "meta": {
    "instanceId": "18b0d04ad5030054be4ab49562e84ea4a079ab4cb036003697394140227c7e76",
    "templateCredsSetupCompleted": true
  },
  "name": "Automate Quote Request Processing with Tally, Airtable, Slack and Gmail",
  "tags": [],
  "nodes": [
    {
      "id": "6a6880c5-cab9-4473-8515-672049ce61e3",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        1328,
        560
      ],
      "webhookId": "f9c8eafb-ecaa-4b32-a6b5-fb10dbee1f19",
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "43240a01-1678-46b8-89ef-e22b7b34b68e",
      "name": "Webhook : Tally",
      "type": "n8n-nodes-base.webhook",
      "position": [
        112,
        560
      ],
      "webhookId": "2eefd271-2928-42a7-98ef-7fc65524a950",
      "parameters": {
        "path": "Request a Quote",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "8099b72c-4d67-4bdf-8d07-e286864b4413",
      "name": "GMAIL : Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1584,
        560
      ],
      "webhookId": "38134cd8-0b71-4d19-bab4-3c473cb35f47",
      "parameters": {
        "sendTo": "={{ $('Edit Fields').item.json['Email Address'] }}",
        "message": "=Hi {{ $('Edit Fields').item.json.Name }} ,\n\nThanks a lot for your quote request — we’ve received your information!\n\nOur team will get back to you within the next 24 hours to discuss your project.\n\nTalk soon,  \n— The WebExperts Team",
        "options": {},
        "subject": "Thanks for your quote request 🙌"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "0ecb54fe-09cb-4778-b740-02c891576ef4",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        416,
        560
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "95bdaad3-0b5e-44a4-bbd3-060d425d7b68",
              "name": "Name",
              "type": "string",
              "value": "={{ $json.body.data.fields[0].label }}"
            },
            {
              "id": "479970d8-e639-463a-bf7a-5f8d55cd65b2",
              "name": "Email Address",
              "type": "string",
              "value": "={{ $json.body.data.fields[1].value }}"
            },
            {
              "id": "ce6234c2-ceff-4191-8942-55a88dc47c77",
              "name": "Type of Service Needed",
              "type": "string",
              "value": "={{ $json.body.data.fields[2].value }}"
            },
            {
              "id": "d2cb542d-1145-466b-93b4-4e377ecc1334",
              "name": " Estimated Budget",
              "type": "string",
              "value": "={{ $json.body.data.fields[3].value }}"
            },
            {
              "id": "e375ee00-745c-472a-862c-dfae10867d3f",
              "name": "Preferred Timeline",
              "type": "string",
              "value": "={{ $json.body.data.fields[4].value }}"
            },
            {
              "id": "0165025d-aee9-4853-ae94-314644aab9e1",
              "name": "Additional Details or Questions",
              "type": "string",
              "value": "={{ $json.body.data.fields[5].value }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "51b5ca70-f018-4f27-a321-1edc79f917ee",
      "name": "Create a record",
      "type": "n8n-nodes-base.airtable",
      "position": [
        800,
        560
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appZ7CtNukjbwxDap",
          "cachedResultUrl": "https://airtable.com/appZ7CtNukjbwxDap",
          "cachedResultName": "Request A Quote - Airtable Base"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblcS0ZQeEo4dC1Iv",
          "cachedResultUrl": "https://airtable.com/appZ7CtNukjbwxDap/tblcS0ZQeEo4dC1Iv",
          "cachedResultName": "Request A Quote - Airtable Base"
        },
        "columns": {
          "value": {
            "Name": "={{ $json.Name }}",
            "Email": "={{ $json['Email Address'] }}",
            "Type of Service": "={{ $json['Type of Service Needed'] }}",
            "Additional Details": "={{ $json['Additional Details or Questions'] }}",
            "Preferred Timeline": "={{ $json['Preferred Timeline'] }}",
            "Estimated Budget (€)": "={{ $json[' Estimated Budget'] }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Type of Service",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Type of Service",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Estimated Budget (€)",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Estimated Budget (€)",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Preferred Timeline",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Preferred Timeline",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Additional Details",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Additional Details",
              "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": {
          "id": "credential-id",
          "name": "airtableTokenApi Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "1261dcfa-1c5e-4cb0-afa2-b4944a294373",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        1136,
        560
      ],
      "webhookId": "fd880910-128a-47f8-98a6-c1b486d98381",
      "parameters": {
        "text": "=:new: *New quote request received!*\n\n*👤 Name: {{ $json.fields.Name }}\n*📧 Email: {{ $json.fields.Email }}\n*💼 Service: {{ $json.fields['Type of Service'] }}\n*💰 Budget: {{ $json.fields['Estimated Budget (€)'] }}\n*⏱️ Timeline: {{ $json.fields['Preferred Timeline'] }}\n*📝 Notes: {{ $json.fields['Additional Details'] }}\n",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "=YOUR CANAL"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "id": "credential-id",
          "name": "slackOAuth2Api Credential"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "95ad5ca7-5cc4-44d0-81e8-1b91a3e436cd",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        480
      ],
      "parameters": {
        "width": 380,
        "height": 220,
        "content": "**=== AUTOMATION OVERVIEW ===**\n\n**Workflow:** Tally → Airtable → Slack → Gmail  \n**Purpose:** Automatically process client quote requests\n\n*What if your quote requests managed themselves?*\n\nInstead of manually checking emails, notifying your team, and logging leads — this automation handles it all.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "02e8d819-c9ad-42e1-892b-daa4abab5571",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        176
      ],
      "parameters": {
        "color": 2,
        "height": 520,
        "content": "**== STEP 1 – Webhook (Tally) ==**\n\n**Trigger:** When a user submits the quote form.  \n**Type:** POST Webhook  \n**Path:** `/Request a Quote`  \n**Authentication:** None  \n**Respond:** Immediately\n\nTally sends the form fields as an array in `body.data.fields`.  \nEach item contains a `label` and a `value`.\n\nWe’ll extract and map these manually in the next step.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3ca3da74-7036-4618-b77b-6956a3af6015",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        96
      ],
      "parameters": {
        "color": 3,
        "width": 320,
        "height": 604,
        "content": "**== STEP 2 – Edit Fields ==**\n\n**Goal:** Convert raw array into usable fields.\n\nUse a Set node or Function with manual mapping:\n\n- `Name` = `{{ $json.body.data.fields[0].label }}`\n- `Email Address` = `{{ $json.body.data.fields[1].value }}`\n- `Type of Service Needed` = `{{ $json.body.data.fields[2].value }}`\n- `Estimated Budget` = `{{ $json.body.data.fields[3].value }}`\n- `Preferred Timeline` = `{{ $json.body.data.fields[4].value }}`\n- `Additional Details` = `{{ $json.body.data.fields[5].value }}`\n\nThis prepares clean variables for Airtable, Slack and Gmail.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4980315f-a820-40fe-859a-3fb6f1866d9d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        160
      ],
      "parameters": {
        "color": 4,
        "width": 444,
        "height": 544,
        "content": "**== STEP 3 – Create Airtable Record ==**\n\n**Base:** Request a Quote - Airtable Base  \n**Operation:** Create  \n**Table:** Same name  \n**Mode:** Map Each Column Manually\n\n**Mapped fields:**\n- Name → `{{ $json.Name }}`\n- Email → `{{ $json[\"Email Address\"] }}`\n- Service → `{{ $json[\"Type of Service Needed\"] }}`\n- Budget → `{{ $json[\"Estimated Budget\"] }}`\n- Timeline → `{{ $json[\"Preferred Timeline\"] }}`\n- Notes → `{{ $json[\"Additional Details\"] }}`\n\nEach request is now stored as a structured CRM lead.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d61542e0-f8a0-4839-8743-b7e1de00c8a5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1072,
        160
      ],
      "parameters": {
        "color": 5,
        "width": 216,
        "height": 540,
        "content": "**== STEP 4 – Send Slack Notification ==**\n\n**Channel:** #sales (or any other)  \n**Message Type:** Simple text\n\n**Slack message:**\n:new: *New quote request received!*\n\n**👤 Name:** {{ Name }}  \n**📧 Email:** {{ Email }}  \n**💼 Service:** {{ Service }}  \n**💰 Budget:** {{ Budget }}  \n**⏱️ Timeline:** {{ Timeline }}  \n**📝 Notes:** {{ Notes }}\n\nOptionally include an Airtable link at the bottom.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5e360dd9-ed44-44e8-9bc9-0a017018e97d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1280,
        240
      ],
      "parameters": {
        "color": 6,
        "width": 200,
        "height": 456,
        "content": "**== STEP 5 – Wait Node ==**\n\n**Purpose:** Delay the confirmation email by 5 minutes.  \nThis allows a human to respond first if needed.\n\n**Settings:**\n- Resume After Time Interval\n- Wait Amount: 5\n- Wait Unit: Minutes\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3082e948-6062-4e64-adcf-2e01552f4193",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1472,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 536,
        "content": "**== STEP 6 – Send Email via Gmail ==**\n\n**To:** `{{ $('Edit Fields').item.json[\"Email Address\"] }}`  \n**Subject:** \"Thanks for your quote request 🙌\"  \n**Email Type:** HTML\n\n**Email Body:**\n\nHi `{{ $('Edit Fields').item.json.Name }}`,\n\nThanks a lot for your quote request — we’ve received your information!\n\nOur team will get back to you within the next 24 hours to discuss your project.\n\nTalk soon,  \n— The WebExperts Team\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6b50fb1b-4fbe-40b5-8df4-8ce624571377",
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "GMAIL : Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Create a record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create a record": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook : Tally": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}