← All Productivity

Google Calendar email verification with BillionVerify

Google Calendar is a widely-used scheduling tool for managing meetings, events, and reminders. When email addresses are collected through calendar booking forms, event RSVPs, or scheduling integrations, BillionVerify confirms those addresses are real before you send confirmations, reminders, or follow-ups.

Why verify before the send

Calendar-based workflows send time-sensitive messages β€” booking confirmations, event reminders, and post-meeting follow-ups. Delivering these to invalid or disposable addresses wastes send credits, generates bounces that erode deliverability, and means attendees may never receive critical scheduling information, leading to missed appointments and poor experiences.

Ready-to-use n8n workflow

Import this workflow into n8n β€” it verifies every address with BillionVerify before Google Calendar sends, so only deliverable contacts are emailed. Install the BillionVerify community node first, then add your API key. Adapted from this n8n template

verify-emails-in-google-calendar.json
{
  "name": "Automated Interview Tracker with Google Calendar, Sheets & Gmail Alerts + BillionVerify",
  "nodes": [
    {
      "id": "40220665-8466-4ca5-a665-59b1b7fb4dcd",
      "name": "Check Every 5 Minutes",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        144,
        -64
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "minutes"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cec5691c-d2e4-4da0-a72f-a5eacc87e4d1",
      "name": "Get Calendar Events",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        368,
        -64
      ],
      "parameters": {
        "options": {
          "timeMax": "={{ $now.plus({ hours: 1 }).toISO() }}",
          "timeMin": "={{ $now.toISO() }}"
        },
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "=76iujhgtr4321eryi8"
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "credential-id",
          "name": "googleCalendarOAuth2Api Credential"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "e600def1-33a8-433b-978a-5bd334d4e861",
      "name": "Filter Upcoming Interviews",
      "type": "n8n-nodes-base.filter",
      "position": [
        592,
        -64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "condition1",
              "operator": {
                "type": "dateTime",
                "operation": "before",
                "singleValue": true
              },
              "leftValue": "={{ $json.start.dateTime }}",
              "rightValue": "={{ $now.plus({ minutes: 5 }).toISO() }}"
            },
            {
              "id": "condition2",
              "operator": {
                "type": "dateTime",
                "operation": "after",
                "singleValue": true
              },
              "leftValue": "={{ $json.start.dateTime }}",
              "rightValue": "={{ $now.toISO() }}"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "871ea2fb-6f24-4291-888c-94c1a47a6518",
      "name": "Add to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        816,
        -160
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_SPREADSHEET_ID"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "id": "credential-id",
          "name": "googleApi Credential"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "97b38c41-ea45-4e4b-8318-5da4d3c24135",
      "name": "Send Reminder to Candidate",
      "type": "n8n-nodes-base.gmail",
      "position": [
        816,
        32
      ],
      "webhookId": "4aa88c2f-aa96-4773-a71b-6dd89843b55a",
      "parameters": {
        "sendTo": "={{ $json.attendees[0].email }}",
        "message": "=<h2>Interview Reminder</h2>\n<p>Dear Candidate,</p>\n<p>Your interview is scheduled to start in <strong>5 minutes</strong>.</p>\n<p><strong>Interview:</strong> {{ $json.summary }}<br>\n<strong>Time:</strong> {{ $json.start.dateTime }}<br>\n<strong>Google Meet Link:</strong> <a href=\"{{ $json.hangoutLink }}\">Join Meeting</a></p>\n<p>Please join on time. Good luck!</p>",
        "options": {},
        "subject": "Interview Reminder - Starting in 5 Minutes"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "53f7164c-9007-4261-8628-24b1bcdac2c7",
      "name": "Update Sheet with Result",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        368,
        352
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_SPREADSHEET_ID"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "id": "credential-id",
          "name": "googleApi Credential"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "6780349a-d56e-465c-8dc4-4a23a2523dbf",
      "name": "Webhook: Submit Interview Result",
      "type": "n8n-nodes-base.webhook",
      "position": [
        144,
        352
      ],
      "webhookId": "interview-result-webhook",
      "parameters": {
        "path": "interview-result",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "4269bbb9-8d74-4d20-8053-260836d36478",
      "name": "Check if Passed",
      "type": "n8n-nodes-base.if",
      "position": [
        592,
        352
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "passed-condition",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.result }}",
              "rightValue": "Pass"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "e9572ff4-464a-4956-a14e-2c0b1917a3c3",
      "name": "Email Candidate - Passed",
      "type": "n8n-nodes-base.gmail",
      "position": [
        816,
        256
      ],
      "webhookId": "7b073d4f-6bb9-4b31-aa60-8f9e0cebb3e5",
      "parameters": {
        "sendTo": "={{ $json.candidateEmail }}",
        "message": "=<h2>Congratulations!</h2>\n<p>Dear Candidate,</p>\n<p>We are pleased to inform you that you have <strong>PASSED</strong> the interview.</p>\n<p><strong>Feedback:</strong> {{ $json.feedback }}</p>\n<p>Our team will contact you soon with next steps.</p>\n<p>Best regards,<br>HR Team</p>",
        "options": {},
        "subject": "πŸŽ‰ Congratulations! You Passed the Interview"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "11a09ef5-e424-45db-9923-700ca794fc47",
      "name": "Email Candidate - Failed",
      "type": "n8n-nodes-base.gmail",
      "position": [
        816,
        448
      ],
      "webhookId": "0ea6d946-1e54-47c6-ae97-7cbeb6c0a919",
      "parameters": {
        "sendTo": "={{ $json.candidateEmail }}",
        "message": "=<h2>Interview Result</h2>\n<p>Dear Candidate,</p>\n<p>Thank you for taking the time to interview with us.</p>\n<p>After careful consideration, we have decided not to move forward with your application at this time.</p>\n<p><strong>Feedback:</strong> {{ $json.feedback }}</p>\n<p>We wish you all the best in your future endeavors.</p>\n<p>Best regards,<br>HR Team</p>",
        "options": {},
        "subject": "Interview Result"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "1d62aabc-dc5b-40d8-9be5-d18eff86a10e",
      "name": "Email Manager",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1040,
        352
      ],
      "webhookId": "13efb4cd-fe47-4727-a220-2825ea71ee75",
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=<h2>Interview Completed</h2>\n<p><strong>Candidate:</strong> {{ $json.candidateEmail }}<br>\n<strong>Result:</strong> {{ $json.result }}<br>\n<strong>Feedback:</strong> {{ $json.feedback }}</p>\n<p>Updated in Google Sheet.</p>",
        "options": {},
        "subject": "Interview Result: {{ $json.candidateEmail }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "gmailOAuth2 Credential"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "0c077145-df34-4e7d-8bf1-31244f07fca9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -336
      ],
      "parameters": {
        "color": 3,
        "width": 672,
        "height": 208,
        "content": "## Workflow Overview\n\n- **Check Every 5 Minutes**: Triggers the workflow to run every 5 minutes.\n- **Get Calendar Events**: Retrieves upcoming interview events from Google Calendar.\n- **Filter Upcoming Interviews**: Filters the retrieved events to focus on upcoming interviews.\n- **Add to Google Sheet**: Appends filtered interview details to a Google Sheet.\n- **Send Reminder to Candidate**: Sends an email reminder to the candidate via Gmail.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e553920b-784e-4841-b3ec-2fb43307a6a0",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        96
      ],
      "parameters": {
        "width": 688,
        "height": 224,
        "content": "## Workflow Overview\n\n- **Webhook: Submit Interview Result**: Receives interview result data via a webhook.\n- **Update Sheet with Result**: Updates the Google Sheet with the submitted interview result.\n- **Check if Passed**: Evaluates whether the interview result indicates a pass or fail.\n- **Email Candidate - Passed**: Sends a pass notification email to the candidate via Gmail.\n- **Email Manager**: Sends an email update to the manager via Gmail.\n- **Email Candidate - Failed**: Sends a fail notification email to the candidate via Gmail."
      },
      "typeVersion": 1
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.attendees[0].email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        456,
        32
      ],
      "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": [
        636,
        32
      ],
      "name": "IF deliverable"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.candidateEmail }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        456,
        256
      ],
      "name": "Verify Email (BillionVerify) 2",
      "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": [
        636,
        256
      ],
      "name": "IF deliverable 2"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.candidateEmail }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        456,
        448
      ],
      "name": "Verify Email (BillionVerify) 3",
      "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": [
        636,
        448
      ],
      "name": "IF deliverable 3"
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        680,
        352
      ],
      "name": "Verify Email (BillionVerify) 4",
      "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": [
        860,
        352
      ],
      "name": "IF deliverable 4"
    }
  ],
  "connections": {
    "Check if Passed": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Verify Email (BillionVerify) 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Calendar Events": {
      "main": [
        [
          {
            "node": "Filter Upcoming Interviews",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Every 5 Minutes": {
      "main": [
        [
          {
            "node": "Get Calendar Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Candidate - Failed": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Email Candidate - Passed": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify) 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Sheet with Result": {
      "main": [
        [
          {
            "node": "Check if Passed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Upcoming Interviews": {
      "main": [
        [
          {
            "node": "Add to Google Sheet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook: Submit Interview Result": {
      "main": [
        [
          {
            "node": "Update Sheet with Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "Send Reminder to Candidate",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 2": {
      "main": [
        [
          {
            "node": "IF deliverable 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 2": {
      "main": [
        [
          {
            "node": "Email Candidate - Passed",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 3": {
      "main": [
        [
          {
            "node": "IF deliverable 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 3": {
      "main": [
        [
          {
            "node": "Email Candidate - Failed",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Verify Email (BillionVerify) 4": {
      "main": [
        [
          {
            "node": "IF deliverable 4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable 4": {
      "main": [
        [
          {
            "node": "Email Manager",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}

Workflow templates with Google Calendar

Ready-to-use workflows that verify emails before Google Calendar sends.

How it works

  1. 1

    Connect BillionVerify to your Google Calendar workflow using the n8n community node or Integrately.

  2. 2

    Trigger verification when a new event is created, a booking form is submitted, or a guest RSVP arrives.

  3. 3

    BillionVerify checks the attendee's email for deliverability, typos, disposable domains, and role prefixes.

  4. 4

    Addresses that fail verification are flagged so the workflow can request a corrected email before sending the invite.

  5. 5

    Valid addresses receive the calendar invitation, reminder, and any follow-up communications without issue.

When to use this

Verify attendee emails before sending event invitations

When scheduling tools connected to Google Calendar collect attendee emails, BillionVerify checks each one before the invitation goes out, preventing bounces and ensuring guests actually receive their calendar links.

Validate booking form emails for appointment-based businesses

Clients booking appointments through forms linked to Google Calendar sometimes enter typos or disposable addresses. Real-time verification catches these errors so you can prompt for a correction before the slot is confirmed.

FAQ

Why would someone enter an invalid email when booking a calendar event?

Typos are the most common cause β€” transposing characters in a domain or name is easy under time pressure. Some users also test booking flows with disposable addresses before committing a real one.

Can I verify emails collected by third-party scheduling tools that sync with Google Calendar?

Yes. Using n8n or Integrately, you can intercept the contact data from any scheduling tool β€” Calendly, Cal.com, and others β€” and pass emails to BillionVerify before they trigger calendar invitations.

Does email verification work for recurring event series?

Verification is most valuable at the point of initial sign-up. Once an address is confirmed valid, you do not need to re-check it for every occurrence in a recurring series unless you want periodic re-validation.

Verify emails in Google Calendar

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

Get started free