← All Lead Capture Workflows

Verify form leads before emailing them (Tally β†’ Google Sheets β†’ SendGrid)

A new Tally form submission is logged to Google Sheets, verified, and then a welcome email is sent via SendGrid β€” but only when the address is deliverable.

Why verify before the send

Public forms attract typos, fake signups, and disposable addresses. Emailing them straight away hurts your SendGrid reputation and inflates bounce metrics. Verifying at intake keeps your list clean from the very first email.

The workflow

Tally β†’ Google Sheets β†’ BillionVerify β†’ SendGrid β€” verification sits right before the send.

Node by node

  1. 1
    Tally TriggerTriggerΒ· tally

    Fires when a new form submission arrives. Map the email field and any contact details you want to store.

  2. 2
    Append rowSourceΒ· google-sheets

    Logs the raw submission to a sheet for record-keeping before any email is sent.

  3. 3
    Verify EmailVerifyΒ· billionverify

    The BillionVerify node, operation "Verify Email". Map its Email field to the address from the previous node. It returns status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, a confidence score, and the reason β€” all before anything is sent.

  4. 4
    IF deliverableLogicΒ· n8n

    Branches on the verification result. Condition: is_deliverable is true. The true branch continues to the send; the false branch skips the send and flags the contact.

  5. 5
    Send welcome emailSendΒ· sendgrid

    Sends the welcome / confirmation email through SendGrid, only for deliverable addresses, protecting your sender score.

Workflow JSON

Copy or download this workflow, then import it in n8n (Workflows β†’ Import from File / Paste). Install the BillionVerify community node first, then add your API key credential.

verify-tally-form-leads-before-sendgrid.json
{
  "name": "Automate lead intake & CRM with Tally Forms to Google Sheets and SendGrid emails + BillionVerify",
  "nodes": [
    {
      "id": "3164137f-9e3b-4cc1-93e9-98a3e039373c",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -624,
        -144
      ],
      "parameters": {
        "width": 512,
        "height": 464,
        "content": "## LEAD INTAKE & CRM AUTOMATION\n\n## How it works\n1. Webhook receives data from form on submission.\n2. Code assign lead ID calculate follow-up dates and generate email according to tag\n3. SendGrid send emails\n\n\n## Setup\n- Copy all \"GET THE TEMPLATE\" sheets\n- Create Tally form and add webhook url\n- Configure  Google Sheet credential\n- Configure  SendGrid credential\n\n\nGET THE TEMPLATE: https://docs.google.com/spreadsheets/d/1U6PG53V2IDjax3eDurufyvM8iSn_Su_YOfOCDC_M3lY/edit?usp=sharing\n"
      },
      "typeVersion": 1
    },
    {
      "id": "08fb1b00-3b72-4698-8858-c10eadc2aed6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -64
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 272,
        "content": "## 1. Arrange lead(s)"
      },
      "typeVersion": 1
    },
    {
      "id": "3e1c36ac-3acf-428b-b009-38cc1c3dbc60",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 304,
        "content": "## 2. Save to CRM"
      },
      "typeVersion": 1
    },
    {
      "id": "4252ca8e-5bc6-4846-a538-7b7948add81d",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1248,
        -160
      ],
      "parameters": {
        "color": 7,
        "width": 784,
        "height": 336,
        "content": "## 3. Send email & update CRM"
      },
      "typeVersion": 1
    },
    {
      "id": "c72203e4-c483-45ca-9ed2-e35f1d6a471b",
      "name": "Receive Lead from Tally Form",
      "type": "n8n-nodes-base.webhook",
      "position": [
        0,
        0
      ],
      "webhookId": "953a8fef-50bf-46a6-b17c-305d79a6ee07",
      "parameters": {
        "path": "953a8fef-50bf-46a6-b17c-305d79a6ee07",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "lastNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "5cdd29a1-3a33-4114-bd51-809859d8ebe7",
      "name": "Generate Unique Lead ID",
      "type": "n8n-nodes-base.code",
      "position": [
        208,
        0
      ],
      "parameters": {
        "jsCode": "const timestamp = Date.now();\nconst randomNum = Math.floor(Math.random() * 1000);\nconst leadId = `LEAD-${timestamp}-${randomNum}`;\n\n// Get fields array\nconst fields = $input.item.json.body.data.fields;\n\n// Helper to get a field by label or key\nfunction getField(label) {\n  return fields.find(f => f.label.includes(label) || f.key === label);\n}\n\n// Extract basic info\nconst name = getField(\"What's your Name\")?.value || \"\";\nconst email = getField(\"email address\")?.value || \"\";\n\n// Business type (multiple choice – get text)\nconst businessField = getField(\"What type of business\");\nlet businessType = \"\";\nif (businessField?.value?.length) {\n  const selectedId = businessField.value[0];\n  const option = businessField.options.find(o => o.id === selectedId);\n  businessType = option?.text || \"\";\n}\n\n// Interest level (multiple choice – get text)\nconst interestField = getField(\"How interested\");\nlet interestLevel = \"\";\nif (interestField?.value?.length) {\n  const selectedId = interestField.value[0];\n  const option = interestField.options.find(o => o.id === selectedId);\n  interestLevel = option?.text || \"\";\n}\n\n// Services selected (checkboxes – use IDs β†’ text)\nconst servicesField = getField(\"What kind of services\");\nlet services = [];\nif (servicesField?.value?.length) {\n  services = servicesField.value.map(id => {\n    const opt = servicesField.options.find(o => o.id === id);\n    return opt?.text;\n  }).filter(Boolean);\n}\n\n// Return final unified structured lead object\nreturn [{\n  json: {\n    leadId: leadId,\n    name,\n    email,\n    businessType,\n    interestLevel,\n    services\n  }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "90b6125e-afb8-4235-b162-cc339340d700",
      "name": "Auto-Tag Lead by Services",
      "type": "n8n-nodes-base.code",
      "position": [
        416,
        0
      ],
      "parameters": {
        "jsCode": "const data = $input.item.json;\n\nconst serviceTagMap = {\n  \"Podcast Production\": \"Podcast Lead\",\n  \"Social Media Management\": \"Social Content Lead\",\n  \"Video Editing\": \"Video Editing Lead\",\n  \"Website Design\": \"Website Lead\",\n  \"Marketing Strategy\": \"Strategy Lead\",\n  \"Content Creation\": \"Content Lead\"\n};\n\nconst detectedTags = [];\n\n// Tag from selected services\nif (data.services) {\n  const selectedServices = Array.isArray(data.services) \n    ? data.services \n    : data.services.split(',').map(s => s.trim());\n  \n  selectedServices.forEach(service => {\n    if (serviceTagMap[service]) {\n      detectedTags.push(serviceTagMap[service]);\n    }\n  });\n}\n\n// Keyword detection fallback\nconst tagKeywords = {\n  \"Podcast Lead\": [\"podcast\", \"audio\", \"episode\"],\n  \"Social Content Lead\": [\"social media\", \"instagram\", \"facebook\", \"tiktok\"],\n  \"Video Editing Lead\": [\"video\", \"editing\", \"youtube\", \"reel\"],\n  \"Website Lead\": [\"website\", \"web design\", \"site\", \"landing page\"],\n  \"Strategy Lead\": [\"strategy\", \"consulting\", \"growth plan\"]\n};\n\nconst textToAnalyze = [\n  data.businessType || \"\",\n  data.services || \"\"\n].join(\" \").toLowerCase();\n\nfor (const [tag, keywords] of Object.entries(tagKeywords)) {\n  for (const keyword of keywords) {\n    if (textToAnalyze.includes(keyword) && !detectedTags.includes(tag)) {\n      detectedTags.push(tag);\n      break;\n    }\n  }\n}\n\nif (detectedTags.length === 0) {\n  detectedTags.push(\"General Lead\");\n}\n\nconst tagsString = detectedTags.join(\", \");\n\nreturn {\n  json: {\n    ...data,\n    tags: tagsString,\n    detectedTags: detectedTags\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "7ac7533b-99c9-4bba-93da-f4a3ae5c32a6",
      "name": "Calculate Follow-up Date & Lead Score",
      "type": "n8n-nodes-base.code",
      "position": [
        624,
        0
      ],
      "parameters": {
        "jsCode": "const data = $input.item.json;\nconst today = new Date().toISOString().split('T')[0];\n\n// Calculate next touch based on interest level\nlet daysToAdd = 7;\nif (data.interestLevel.includes(\"Very Interested\")) {\n  daysToAdd = 1;\n} else if (data.interestLevel.includes(\"Interested\")) {\n  daysToAdd = 3;\n} else if (data.interestLevel.includes(\"Somewhat\")) {\n  daysToAdd = 7;\n} else {\n  daysToAdd = 14;\n}\n\nconst nextTouch = new Date();\nnextTouch.setDate(nextTouch.getDate() + daysToAdd);\nconst nextTouchFormatted = nextTouch.toISOString().split('T')[0];\n\n// Initial lead score\nlet initialScore = 20; // Base score for signing up\nif (data.interestLevel.includes(\"Very Interested\")) initialScore = 40;\nelse if (data.interestLevel.includes(\"Interested\")) initialScore = 30;\n\nreturn {\n  json: {\n    ...data,\n    createdDate: today,\n    lastContact: today,\n    nextTouch: nextTouchFormatted,\n    status: \"New Lead\",\n    nurtureStage: 0,\n    leadScore: initialScore,\n    emailOpens: 0,\n    emailClicks: 0,\n    leadMagnetSent: \"NO\",\n    calendlyClicked: \"NO\",\n    meetingBooked: \"NO\",\n    daysInactive: 0,\n    notes: `New lead from form. Tags: ${data.tags}`\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "89b2ee2a-2ba2-45d1-abd6-8f8e5c2d5901",
      "name": "Save Lead to CRM Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        832,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{$json.name}}",
            "Tags": "={{$json.tags}}",
            "Email": "={{$json.email}}",
            "Notes": "={{$json.notes}}",
            "Status": "={{$json.status}}",
            "Lead ID": "={{$json.leadId}}",
            "Services": "={{$json.services.join(\", \")}}",
            "Lead Score": "={{$json.leadScore}}",
            "Next Touch": "={{$json.nextTouch}}",
            "Email Opens": "={{$json.emailOpens}}",
            "Lead Source": "={{$json.leadSource}}",
            "Created Date": "={{$json.createdDate}}",
            "Email Clicks": "={{$json.emailClicks}}",
            "Last Contact": "={{$json.lastContact}}",
            "Business Type": "={{$json.businessType}}",
            "Days Inactive": "={{$json.daysInactive}}",
            "Nurture Stage": "={{$json.nurtureStage}}",
            "Interest Level": "={{$json.interestLevel}}",
            "Meeting Booked": "={{$json.meetingBooked}}",
            "Last Email Sent": "={{$json.lastEmailSent}}",
            "Calendly Clicked": "={{$json.calendlyClicked}}",
            "Lead Magnet Sent": "={{$json.leadMagnetSent}}"
          },
          "schema": [
            {
              "id": "Lead ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Business Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Business Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Interest Level",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Interest Level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Services",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Services",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Source",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead Source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Tags",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Created Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Contact",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Last Contact",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Next Touch",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Next Touch",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Nurture Stage",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Nurture Stage",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Email Sent",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Last Email Sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Opens",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email Opens",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Clicks",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email Clicks",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Magnet Sent",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead Magnet Sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Calendly Clicked",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Calendly Clicked",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Meeting Booked",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Meeting Booked",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Days Inactive",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Days Inactive",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notes",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8/edit#gid=0",
          "cachedResultName": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8/edit?usp=drivesdk",
          "cachedResultName": "Complete Mini CRM"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "credential-id",
          "name": "googleSheetsOAuth2Api Credential"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "43038ebb-c3a0-4c1c-a38b-79031594ca70",
      "name": "Log Activity to Tracker",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1040,
        -96
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $json['Name'] }}",
            "Details": "=Form submission with tags: {{ $json['Tags'] }}",
            "Lead ID": "={{ $json['Lead ID'] }}",
            "Timestamp": "={{ $now.toISO() }}",
            "Activity Type": "Lead Captured"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Lead ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Activity Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Activity Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Details",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Details",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1376113895,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8/edit#gid=1376113895",
          "cachedResultName": "Activity Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8/edit?usp=drivesdk",
          "cachedResultName": "Complete Mini CRM"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "credential-id",
          "name": "googleSheetsOAuth2Api Credential"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "fa5f1269-8205-4de4-bf61-a72c29be537d",
      "name": "Generate Personalized Welcome Email",
      "type": "n8n-nodes-base.code",
      "position": [
        1296,
        0
      ],
      "parameters": {
        "jsCode": "const data = $input.item.json;\nconst tags = data.detectedTags || [];\n\nlet servicesMention = \"\";\nif (tags.includes(\"Podcast Lead\")) {\n  servicesMention = \"I noticed you're interested in podcast production. We help creators launch and grow shows that actually get heard.\";\n} else if (tags.includes(\"Video Editing Lead\")) {\n  servicesMention = \"I see you're looking for video editing support. We transform raw footage into scroll-stopping content that drives results.\";\n} else if (tags.includes(\"Social Content Lead\")) {\n  servicesMention = \"Social media can feel overwhelming, we get it. We help businesses turn social platforms into lead-generating machines.\";\n} else if (tags.includes(\"Website Lead\")) {\n  servicesMention = \"Your website should work as hard as you do. We build sites that convert visitors into customers.\";\n} else if (tags.includes(\"Strategy Lead\")) {\n  servicesMention = \"Great marketing starts with clear strategy. We help businesses cut through the noise and focus on what actually moves the needle.\";\n} else {\n  servicesMention = \"We specialize in digital marketing that gets real results, from content creation to complete campaign management.\";\n}\n\nconst subject = `Welcome, ${data['Name']}! Let's talk about your marketing goals`;\n\nconst emailBody = `Hi ${data['Name']},\n\nThanks for reaching out, I'm glad you found us.\n\nI want to confirm that we received your information and let you know what happens next.\n\n${servicesMention}\n\nHere's what you can expect:\n\n→ We will review your details and put together some initial thoughts\n→ You'll hear back from us within 24-48 hours\n→ We'll schedule a quick call to discuss your specific needs (no pressure, no sales pitch, just a genuine conversation about how we might help)\n\nIn the meantime, feel free to reply to this email with any questions or additional context about what you're trying to achieve. The more I know, the more helpful I can be when we connect.\n\nLooking forward to speaking with you soon.\n\nBest regards,\nGilbert Onyebuchi\n\nP.S. Keep an eye on your inbox. Over the next week, I'll send you some helpful insights about building marketing systems that actually work.`;\n\nreturn {\n  json: {\n    ...data,\n    emailSubject: subject,\n    emailBody: emailBody\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "057b5ac6-07cd-46cc-9460-e0305a82dfae",
      "name": "Send Welcome Email via SendGrid",
      "type": "n8n-nodes-base.sendGrid",
      "position": [
        1552,
        -96
      ],
      "parameters": {
        "subject": "={{ $json.emailSubject }}",
        "toEmail": "={{ $json['Email'] }}",
        "resource": "mail",
        "contentValue": "={{ $json.emailBody }}",
        "additionalFields": {}
      },
      "credentials": {
        "sendGridApi": {
          "id": "credential-id",
          "name": "sendGridApi Credential"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0c3d1194-f9f2-4ca9-bbf0-8a91fcb15652",
      "name": "Update Lead Status to Nurturing",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1808,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Nurturing",
            "Lead ID": "={{ $json['Lead ID'] }}",
            "Nurture Stage": " 0",
            "Last Email Sent": "={{ $now.format('YYYY-MM-DD') }}"
          },
          "schema": [
            {
              "id": "Lead ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Lead ID",
              "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": "Business Type",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Business Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Interest Level",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Interest Level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Services",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Services",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Source",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Lead Source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Tags",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Score",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Lead Score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Created Date",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Created Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Contact",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Last Contact",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Next Touch",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Next Touch",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Nurture Stage",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Nurture Stage",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last Email Sent",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Last Email Sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Opens",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Email Opens",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email Clicks",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Email Clicks",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Lead Magnet Sent",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Lead Magnet Sent",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Calendly Clicked",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Calendly Clicked",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Meeting Booked",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Meeting Booked",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Days Inactive",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Days Inactive",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notes",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Notes",
              "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": [
            "Lead ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8/edit#gid=0",
          "cachedResultName": "Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/15r9eQaQp69Tb75AgU7hM6wzP3s6SjyoUn2S18hbZqC8/edit?usp=drivesdk",
          "cachedResultName": "Complete Mini CRM"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "credential-id",
          "name": "googleSheetsOAuth2Api Credential"
        }
      },
      "typeVersion": 4.7
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json['Email'] }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        1192,
        -96
      ],
      "name": "Verify Email (BillionVerify)",
      "credentials": {
        "billionVerifyApi": {
          "id": "",
          "name": "BillionVerify account"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "is-deliverable",
              "leftValue": "={{ $json.is_deliverable }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ]
        }
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1372,
        -96
      ],
      "name": "IF deliverable"
    }
  ],
  "connections": {
    "Save Lead to CRM Sheet": {
      "main": [
        [
          {
            "node": "Log Activity to Tracker",
            "type": "main",
            "index": 0
          },
          {
            "node": "Generate Personalized Welcome Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Unique Lead ID": {
      "main": [
        [
          {
            "node": "Auto-Tag Lead by Services",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Activity to Tracker": {
      "main": [
        []
      ]
    },
    "Auto-Tag Lead by Services": {
      "main": [
        [
          {
            "node": "Calculate Follow-up Date & Lead Score",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive Lead from Tally Form": {
      "main": [
        [
          {
            "node": "Generate Unique Lead ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Welcome Email via SendGrid": {
      "main": [
        []
      ]
    },
    "Update Lead Status to Nurturing": {
      "main": [
        []
      ]
    },
    "Generate Personalized Welcome Email": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Update Lead Status to Nurturing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Follow-up Date & Lead Score": {
      "main": [
        [
          {
            "node": "Save Lead to CRM Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "Send Welcome Email via SendGrid",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}

When to use this

  • Lead-gen landing pages that send an instant welcome or lead magnet.
  • Waitlists and beta signups that must keep a clean list from day one.
  • Any form-to-CRM flow where the first email should never bounce.

FAQ

Why verify at the form instead of later?

Catching bad addresses at intake stops them entering your CRM and ESP at all, so every downstream email and metric stays clean.

Can I use a different form tool?

Yes. Swap the Tally trigger for Typeform, Jotform, Google Forms, or a generic Webhook β€” the verification step is identical.

Does an invalid signup still get stored?

It is logged to the sheet with its verification status, but it is not emailed. You can review or purge those rows later.

Add verification to your workflow

Create a free account, grab your API key, and stop bounces before they happen.

Get started free