Google Chat email verification with BillionVerify
Google Chat is a team messaging and collaboration platform built into Google Workspace. When email addresses flow into Chat-connected workflows — via bot interactions, HR onboarding automations, or support ticket forms — BillionVerify validates them before they're stored or used to trigger outbound messages.
Why verify before the send
Google Chat integrations often feed contact data into CRMs, email campaigns, or notification systems. Storing unverified addresses means downstream emails to those contacts bounce, alert delivery fails, and your Workspace admin tools accumulate user records that can never be reached by email — inflating costs and distorting engagement metrics.
Ready-to-use n8n workflow
Import this workflow into n8n — it verifies every address with BillionVerify before Google Chat sends, so only deliverable contacts are emailed. Install the BillionVerify community node first, then add your API key. Adapted from this n8n template
{
"name": "Escalate overdue and blocked Jira tickets with Gmail and Google Chat + BillionVerify",
"nodes": [
{
"id": "c93cacbb-f5fd-4d12-9c8b-cb1a08c6215d",
"name": "When clicking ‘Execute workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
6016,
3088
],
"parameters": {},
"typeVersion": 1
},
{
"id": "6f4473d4-0134-4d95-8fba-ca32bc22298e",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
7424,
2704
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "341ef938-af93-46e2-a454-64ea5c7f991c",
"name": "END PROCESS",
"type": "n8n-nodes-base.noOp",
"position": [
8960,
2256
],
"parameters": {},
"typeVersion": 1
},
{
"id": "b351a94f-3217-4daf-9f6f-2a102aa23044",
"name": "Note - Level 1 Reminder",
"type": "n8n-nodes-base.stickyNote",
"position": [
8896,
2528
],
"parameters": {
"color": 7,
"width": 720,
"height": 272,
"content": "## LEVEL 1 -> REMINDER ASSIGNEE 🧠\n- [0 - 2] Imminent DueDate → Send email to ticket assignee"
},
"typeVersion": 1
},
{
"id": "0c9fb7ab-4cb6-4400-80bf-79f9d3921801",
"name": "Note - Level 2 Warning",
"type": "n8n-nodes-base.stickyNote",
"position": [
8896,
2848
],
"parameters": {
"color": 7,
"width": 1152,
"height": 560,
"content": "## LEVEL 2 -> (WARNING ASSIGNEE OR NOTIFICATION CHANNEL) -> WARNING ⚠️\n\n* **if [1 - 2] OverDue Days** → Send Email to ticket assignee\n\n* **if ]2 - 4] OverDue Days** → Send notification to google chat dedicated channel"
},
"typeVersion": 1
},
{
"id": "ff65c963-1b31-474a-9283-7061d3d9679e",
"name": "Note - Level 3 Escalation",
"type": "n8n-nodes-base.stickyNote",
"position": [
8896,
3456
],
"parameters": {
"color": 7,
"width": 768,
"height": 288,
"content": "## LEVEL 3 -> ESCALATION MANAGER -> ALERT 🚨\n* Greater than 4 OverDue Days → Send email to manager(s)"
},
"typeVersion": 1
},
{
"id": "c3235594-6225-4c8e-aebd-f64239a38217",
"name": "ROUTES",
"type": "n8n-nodes-base.switch",
"position": [
7984,
2912
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "37e0a73e-2415-4fc1-9998-4a261194236f",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $input.last().json.isImminent }}",
"rightValue": ""
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0c83b937-ca5a-49ec-be1a-194eb4c6e1f4",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $input.last().json.isOverdue && $input.last().json.overdue_days <= 4}}",
"rightValue": ""
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8d2eb47c-6428-4eee-a554-00eac1e7fbd8",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $input.last().json.isOverdue && $input.last().json.overdue_days > 4 }}",
"rightValue": ""
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e782ccbf-8565-428b-92dc-3deb04531162",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $input.last().json.isBlocked }}",
"rightValue": ""
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d68ebbe7-614e-4bbb-8f1a-28a77fa31a0c",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ true // Continue Loop }}",
"rightValue": ""
}
]
}
}
]
},
"options": {
"allMatchingOutputs": true
}
},
"typeVersion": 3.4
},
{
"id": "9d5faec2-6653-4007-bf77-c35d16f2260d",
"name": "Note - What Is This Workflow",
"type": "n8n-nodes-base.stickyNote",
"position": [
5824,
2016
],
"parameters": {
"width": 640,
"height": 944,
"content": "## Jira Tickets Monitoring — Deadlines & Blockages 🚨\n\nAutomate Jira ticket monitoring with progressive escalation to assignees, teams, and managers.\n\n\n### How it works\n\nFetches all open sprint tickets daily and routes each one based on its status:\n\n- 🧠 **Reminder** `[0–2 days left]` → Email to assignee\n- ⚠️ **Warning** `[1–4 days overdue]` → Email to assignee or Google Chat alert\n- 🚨 **Escalation** `[> 4 days overdue]` → Email to manager(s)\n- 🔴 **Blocked** → Escalates over 3 days: assignee email → team chat → manager\n\n\n### How to use\n\nEdit only the **⚙️ CONFIG** node with your 4 values, then enable the Schedule Trigger.\n\n\n### Requirements\n\n- Jira Software Cloud\n- Gmail (OAuth2)\n- Google Chat Webhook\n\n\n### ⚙️ CONFIG\n\n- `JIRA_DOMAIN`: e.g `my-company.atlassian.net`\n- `JIRA_PROJECT_KEY`: e.g. `PROJ`\n- `MANAGER_EMAILS`: Escalation recipient(s)\n- `GOOGLE_CHAT_WEBHOOK_URL`: Your Google Chat space webhook\n\n\n### Need Help?\n\nVisit 👉 [aixautomation.tech](https://aixautomation.tech/)"
},
"typeVersion": 1
},
{
"id": "ea6adf87-9a03-4eab-ac3e-198c179dd8b9",
"name": "MANAGER_ESCALATION",
"type": "n8n-nodes-base.gmail",
"onError": "continueRegularOutput",
"position": [
9008,
3568
],
"webhookId": "0d653565-9b18-473e-8246-cee2a4dae21c",
"parameters": {
"sendTo": "={{ $('⚙️ CONFIG').first().json.MANAGER_EMAILS }}",
"message": "=Hello {{ $input.last().json.assignee.displayName }}, This is an alert for an overdue ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
"options": {},
"subject": "Jira DueDate Ticket Alert 🚨",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "Gmail account"
}
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "d797d9f0-a813-4805-8792-91bbdffdc3f1",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
6432,
3104
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 7
}
]
}
},
"typeVersion": 1.3
},
{
"id": "0e6f9872-5176-4357-a969-b90bb0e45803",
"name": "Note - Blocked Tickets Logic",
"type": "n8n-nodes-base.stickyNote",
"position": [
8896,
3808
],
"parameters": {
"color": 7,
"width": 2464,
"height": 720,
"content": "## Blocked Tickets (WARNING ASSIGNEE ⚠️ OR ESCALATION EMAIL 🚨)\n* Blocked + 1 Days → Send Email to ticket assignee\n* Blocked + 2 Days -> Notify google chat team\n* Blocked + 3 Days → send email to manager. \n"
},
"typeVersion": 1
},
{
"id": "d6ee8543-a77f-4864-be81-f8c8bf15d026",
"name": "MANAGER_ESCALATION_BLOCKED",
"type": "n8n-nodes-base.gmail",
"onError": "continueRegularOutput",
"position": [
10464,
4240
],
"webhookId": "0d653565-9b18-473e-8246-cee2a4dae21c",
"parameters": {
"sendTo": "={{ $input.last().json.data.assignee.emailAddress }}",
"message": "=Hello {{ $input.last().json.data.assignee.displayName }}, This an Alert for blocked ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.data.key }}",
"options": {},
"subject": "Jira Blocked Ticket Alert 🚨",
"emailType": "text"
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "579919c1-a353-479b-b5b3-c2f9282a51fb",
"name": "IS_OVERDUE_BETWEEN",
"type": "n8n-nodes-base.if",
"position": [
8976,
3040
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "23a7703e-2b5f-4244-869b-23af22a1fec4",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $input.last().json.overdue_days >= 1 && $input.last().json.overdue_days <= 2 }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.3
},
{
"id": "c3fc68cd-b7ee-4861-8a4d-ab0082e34b2d",
"name": "AGGREGATE_ITEMS",
"type": "n8n-nodes-base.aggregate",
"position": [
9184,
4144
],
"parameters": {
"include": "specifiedFields",
"options": {},
"aggregate": "aggregateAllItemData",
"fieldsToInclude": "created, items",
"destinationFieldName": "jira_issue_changelog"
},
"typeVersion": 1
},
{
"id": "6baf8aac-d716-43af-9eb1-604051410174",
"name": "DATA_FLOW",
"type": "n8n-nodes-base.code",
"position": [
8976,
3968
],
"parameters": {
"jsCode": "return (\n [\n {\n json: {\n ...$input.last().json\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "47bb7350-1d66-4fc0-aad9-3633cda23f11",
"name": "MERGE_DATA",
"type": "n8n-nodes-base.merge",
"position": [
9424,
3984
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"executeOnce": true,
"typeVersion": 3.2
},
{
"id": "46e9dc22-e952-41ce-bffd-25094fa3fc42",
"name": "GET_BLOCKED_ITEM",
"type": "n8n-nodes-base.code",
"position": [
9664,
3984
],
"parameters": {
"jsCode": "const blocked_item = $input.last().json.jira_issue_changelog.filter((item) => {\n return (\n // filter by labels field\n item.items[0].field == \"labels\" && item.items[0].toString === \"blocked\"\n )\n})\n\n\nreturn (\n [\n {\n json: {\n blocked_item,\n data: $input.last().json\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "a9ae5760-cf82-46ef-943c-d03e39bf700f",
"name": "COMPUTE_BLOCKED_DAYS",
"type": "n8n-nodes-base.code",
"position": [
9872,
3984
],
"parameters": {
"jsCode": "const today = new Date();\nconst blocked_date = new Date($input.last().json.blocked_item[0].created)\nconst diff = today - blocked_date;\nconst blocked_days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\nreturn (\n [\n {\n json: {\n blocked_days,\n data: $input.last().json.data\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "d4f1ac3c-7605-4ec3-81d6-7fee1ac68dc6",
"name": "Switch",
"type": "n8n-nodes-base.switch",
"position": [
10080,
3952
],
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b899124e-ca75-4da5-8819-d31e7984559a",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{ $input.last().json.blocked_days }}",
"rightValue": 1
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c8d62507-f9dd-4128-a443-b64eafad39fa",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{ $input.last().json.blocked_days }}",
"rightValue": 2
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "e94bcb44-3073-483c-a487-dfcdbb7e32aa",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $input.last().json.blocked_days }}",
"rightValue": "3"
}
]
}
},
{
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3b878fe6-a918-4920-8602-f43ef9d9424b",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ true // continue loop }}",
"rightValue": ""
}
]
}
}
]
},
"options": {}
},
"typeVersion": 3.4
},
{
"id": "73b5c491-72da-4d7c-8d87-70415098ec95",
"name": "CONTINUE_LOOP",
"type": "n8n-nodes-base.code",
"position": [
8224,
3232
],
"parameters": {
"jsCode": "return (\n [\n {\n json: {\n success: true\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "4190444b-8700-4614-a0a6-04865a15d434",
"name": "CONTINUE_LOOP_OVERDUE_WARNING",
"type": "n8n-nodes-base.code",
"position": [
9472,
2624
],
"parameters": {
"jsCode": "return (\n [\n {\n json: {\n success_leve_1: true\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "0e5b6ed1-0f0d-4089-aa75-b2c1a1cbdc73",
"name": "CONTINUE_LOOP_ESCALATION",
"type": "n8n-nodes-base.code",
"position": [
9904,
3232
],
"parameters": {
"jsCode": "return (\n [\n {\n json: {\n success_leve_2: true\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "13d4646e-9424-4f16-be04-4f056de51843",
"name": "CONTINUE_LOOP_BLOCKED_WARNING",
"type": "n8n-nodes-base.code",
"position": [
9520,
3568
],
"parameters": {
"jsCode": "return (\n [\n {\n json: {\n success_leve_3: true\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "d31106b5-5277-40b2-a544-092744f58a33",
"name": "CONTINUE_LOOP_BLOCKED_ESCALATION",
"type": "n8n-nodes-base.code",
"position": [
11216,
4352
],
"parameters": {
"jsCode": "return (\n [\n {\n json: {\n success_leve_4: true\n }\n }\n ]\n)"
},
"typeVersion": 2
},
{
"id": "e02a848a-dad0-4c0e-a203-2e9c46f72859",
"name": "GET_JIRA_ISSUES",
"type": "n8n-nodes-base.jira",
"position": [
6976,
2704
],
"parameters": {
"options": {
"jql": "=project = {{ $('⚙️ CONFIG').first().json.JIRA_PROJECT_KEY }} AND status != Done AND sprint in openSprints()"
},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"jiraSoftwareCloudApi": {
"id": "credential-id",
"name": "Jira SW Cloud account"
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 5000
},
{
"id": "039f87a2-b2a1-4f2a-91f3-afec38ac6464",
"name": "GET_ISSUES_LIST",
"type": "n8n-nodes-base.code",
"position": [
7216,
2704
],
"parameters": {
"jsCode": "const issues = $input.all().map((e) => {\n const new_obj = {\n key:e.json.key,\n due_date:e.json.fields.duedate,\n assignee:e.json.fields.assignee,\n labels:e.json.fields.labels\n }\n return (\n new_obj\n )\n})\n\nconst issues_list = issues.filter((e) => {\n return (e.due_date != null)\n})\n\nreturn (\n [\n ...issues_list\n ]\n);"
},
"typeVersion": 2
},
{
"id": "d5931d7e-6b2c-4557-b94a-3c01a06bca09",
"name": "ISSUE_DATE_INSIGHTS",
"type": "n8n-nodes-base.code",
"position": [
7728,
2912
],
"parameters": {
"jsCode": "const dueDate_string = $input.last().json.due_date;\nconst today_string = new Date().toISOString().split('T')[0];\nconst key = $input.last().json.key;\nconst assignee = $input.last().json.assignee;\n\nconst due = new Date(dueDate_string);\nconst tod = new Date()\n// difftime < 0 overdue, == 0 duedate, > 0 still on date\nconst diffTime = due - tod;\nconst daysLeft = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\nreturn [\n {\n json: {\n key,\n dueDate_string,\n today_string,\n isOverdue: daysLeft < 0 ? true : false,\n isImminent: daysLeft >= 0 && daysLeft <= 2,\n isBlocked: $input.last().json.labels.includes(\"blocked\"),\n days_left: daysLeft,\n overdue_days: daysLeft < 0 ? daysLeft * -1 : 0,\n assignee: assignee\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "7bb905aa-b11a-49e5-b7b1-2c6c4b839387",
"name": "GET_ISSUE_CHANGELOG",
"type": "n8n-nodes-base.jira",
"position": [
8976,
4144
],
"parameters": {
"issueKey": "={{ $input.last().json.key }}",
"operation": "changelog"
},
"executeOnce": false,
"typeVersion": 1
},
{
"id": "bf6c3148-f27f-493f-98c1-30bdfadc19db",
"name": "Note - Production Quotas Warning",
"type": "n8n-nodes-base.stickyNote",
"position": [
10224,
2608
],
"parameters": {
"color": 3,
"width": 560,
"height": 1120,
"content": "## TO CONSIDER FOR PRODUCTION: ⚠️ GMAIL / GOOGLE CHAT QUOTA ⚠️\n\n\n### 💬 Google Chat Webhook Quotas\n* **Per-Space Limit:** 60 messages / minute (Strict).\n* **Per-Project Limit:** 3,000 messages / minute.\n* **Max Message Size:** ~32 KB.\n> **Tip:** In HTTP Node, set Batching to **1 item per 1000ms**.\n\n---\n\n\n### 📧 Gmail API Quotas (n8n Node)\n* **Daily Limit (Workspace):** 2,000 recipients / day.\n* **Daily Limit (Free):** 500 recipients / day.\n* **Burst Rate:** ~1–3 emails per second.\n> **Tip:** **Split In Batches** (Size 1) + **Wait Node** (1s).\n\n---\n\n\n### 🛠️ Error Handling Strategy\n* **Retry on Failure:**\n* **Max Retries:** 3\n* **Delay Between Retries:** 5000ms (5 seconds).\n* **Error Action:** \"Continue\" to avoid stopping the whole workflow."
},
"typeVersion": 1
},
{
"id": "96aeefd6-6ef9-46c9-b53f-746bd0396c66",
"name": "Wait - Rate Limit (Blocked Escalation)",
"type": "n8n-nodes-base.wait",
"position": [
10960,
4304
],
"webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "ab8da30a-eb23-4e26-89fc-955d02e6f7c0",
"name": "Wait - Rate Limit (Reminder)",
"type": "n8n-nodes-base.wait",
"position": [
9232,
2624
],
"webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "b54bacd9-b0d7-4163-985e-cad1b494b8a3",
"name": "Wait - Rate Limit (Warning)",
"type": "n8n-nodes-base.wait",
"position": [
9664,
3232
],
"webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "8c494186-d369-438c-a8ec-199ba4c0f8c6",
"name": "Wait - Rate Limit (Escalation)",
"type": "n8n-nodes-base.wait",
"position": [
9248,
3568
],
"webhookId": "e0ac94d8-7a0f-4784-9b30-9bc39e1c8355",
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "d77dc4fc-49fb-4a77-802d-5bcdafb6ed09",
"name": "NOTIFY_TEAM",
"type": "n8n-nodes-base.httpRequest",
"notes": "Quota | TypeLimit (per 60 seconds) | Impact\n\nPer-Project (Write)\t | 3,000 messages\t| This is the total messages your \"app\" (webhook) can send across all spaces it has access to.\n\nPer-Space (Write)\t | 60 messages\t| This is the limit for a single chat space. If you send more than 1 message per second to one channel, you will hit this.\n\nMessage Size\t | ~32 KB\t | A single message (including text and any card JSON) cannot exceed roughly 32 KB",
"position": [
9408,
3232
],
"parameters": {
"url": "={{ $('⚙️ CONFIG').first().json.GOOGLE_CHAT_WEBHOOK_URL }}",
"method": "POST",
"options": {
"batching": {
"batch": {
"batchSize": 1,
"batchInterval": 1100
}
}
},
"jsonBody": "={\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Jira DueDate Ticket Warning ⚠️\"\n },\n \"sections\": [\n {\n \"widgets\": [\n {\n \"textParagraph\": {\n \"text\": \"<b>Issue:</b> {{ $input.last().json.key }}\"\n }\n },\n {\n \"textParagraph\": {\n \"text\": \"<b>Assignee:</b> {{ $input.last().json.assignee.displayName }}\"\n }\n },\n {\n \"textParagraph\": {\n \"text\": \"<b>Due date:</b> {{ $input.last().json.dueDate_string }}\"\n }\n },\n {\n \"textParagraph\": {\n \"text\": \"{{ $input.last().json.isOverdue ? '⏱️ Cette tâche est en retard.' : '⏱️ Cette tâche est proche de la deadline.' }}\"\n }\n }\n ]\n },\n {\n \"widgets\": [\n {\n \"buttons\": [\n {\n \"textButton\": {\n \"text\": \"VOIR LE TICKET\",\n \"onClick\": {\n \"openLink\": {\n \"url\": \"https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}\"\n }\n }\n }\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"retryOnFail": true,
"typeVersion": 4.4
},
{
"id": "7115286c-b711-4cf8-9523-ce3e2509cc22",
"name": "SEND_BLOCKED_WARNING",
"type": "n8n-nodes-base.gmail",
"onError": "continueRegularOutput",
"position": [
10464,
3840
],
"webhookId": "2d7184d6-de02-40f3-964a-cbb084de7c07",
"parameters": {
"sendTo": "={{ $input.last().json.data.assignee.emailAddress }}",
"message": "=Hello {{ $input.last().json.data.assignee.displayName }}, This a warning for your blocked ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.data.key }}",
"options": {},
"subject": "Jira Blocked Ticket Warning ⚠️",
"emailType": "text"
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "886ec602-647b-40f2-8846-1ebf8421769f",
"name": "SEND_DUEDATE_REMINDER",
"type": "n8n-nodes-base.gmail",
"notes": "Account | TypeDaily Sending Limit | Burst Limit (Rate)\n\nFree Gmail | ~500 recipients/day | ~1 email per second\n\nGoogle Workspace | ~2,000 recipients/day | ~2–3 emails per second",
"onError": "continueRegularOutput",
"position": [
8992,
2624
],
"webhookId": "2d7184d6-de02-40f3-964a-cbb084de7c07",
"parameters": {
"sendTo": "={{ $input.last().json.assignee.emailAddress }}",
"message": "=Hello {{ $input.last().json.assignee.displayName }}, This is a reminder for your imminent ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
"options": {},
"subject": "Jira DueDate Ticket Reminder 🧠",
"emailType": "text"
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "bfb53c90-8246-4f95-8cdc-0d1890b72a33",
"name": "SEND_DUEDATE_WARNING",
"type": "n8n-nodes-base.gmail",
"onError": "continueRegularOutput",
"position": [
9408,
3024
],
"webhookId": "2d7184d6-de02-40f3-964a-cbb084de7c07",
"parameters": {
"sendTo": "={{ $input.last().json.assignee.emailAddress }}",
"message": "=Hello {{ $input.last().json.assignee.displayName }}, This is a warning for your overdue ticket: https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}",
"options": {},
"subject": "Jira DueDate Ticket Warning ⚠️",
"emailType": "text"
},
"retryOnFail": true,
"typeVersion": 2.2,
"waitBetweenTries": 5000
},
{
"id": "6c9b5ebc-ec31-482e-89fa-e2df0f683975",
"name": "NOTIFY_TEAM_BLOCKED",
"type": "n8n-nodes-base.httpRequest",
"notes": "Quota | TypeLimit (per 60 seconds) | Impact\n\nPer-Project (Write)\t | 3,000 messages\t| This is the total messages your \"app\" (webhook) can send across all spaces it has access to.\n\nPer-Space (Write)\t | 60 messages\t| This is the limit for a single chat space. If you send more than 1 message per second to one channel, you will hit this.\n\nMessage Size\t | ~32 KB\t | A single message (including text and any card JSON) cannot exceed roughly 32 KB",
"position": [
10464,
4048
],
"parameters": {
"url": "={{ $('⚙️ CONFIG').first().json.GOOGLE_CHAT_WEBHOOK_URL }}",
"method": "POST",
"options": {
"batching": {
"batch": {
"batchSize": 1,
"batchInterval": 1100
}
}
},
"jsonBody": "={\n \"cards\": [\n {\n \"header\": {\n \"title\": \"Jira DueDate Ticket Warning ⚠️\"\n },\n \"sections\": [\n {\n \"widgets\": [\n {\n \"textParagraph\": {\n \"text\": \"<b>Issue:</b> {{ $input.last().json.key }}\"\n }\n },\n {\n \"textParagraph\": {\n \"text\": \"<b>Assignee:</b> {{ $input.last().json.assignee.displayName }}\"\n }\n },\n {\n \"textParagraph\": {\n \"text\": \"<b>Due date:</b> {{ $input.last().json.dueDate_string }}\"\n }\n },\n {\n \"textParagraph\": {\n \"text\": \"{{ $input.last().json.isOverdue ? '⏱️ Cette tâche est en retard.' : '⏱️ Cette tâche est proche de la deadline.' }}\"\n }\n }\n ]\n },\n {\n \"widgets\": [\n {\n \"buttons\": [\n {\n \"textButton\": {\n \"text\": \"VOIR LE TICKET\",\n \"onClick\": {\n \"openLink\": {\n \"url\": \"https://{{ $('⚙️ CONFIG').first().json.JIRA_DOMAIN }}/browse/{{ $input.last().json.key }}\"\n }\n }\n }\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"retryOnFail": true,
"typeVersion": 4.4
},
{
"id": "6d921474-4367-49df-bcce-5663e9904d49",
"name": "Note - Manual Testing Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
5824,
2992
],
"parameters": {
"color": 7,
"width": 480,
"height": 288,
"content": "## MANUAL TRIGGER FOR TESTING"
},
"typeVersion": 1
},
{
"id": "24fe6d20-c826-44bf-8bb5-45a5bcb1b8ae",
"name": "⚙️ CONFIG",
"type": "n8n-nodes-base.set",
"position": [
6656,
2704
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "20ec815c-0122-4afd-8e28-92331aebc688",
"name": "JIRA_DOMAIN",
"type": "string",
"value": "YOUR-COMPANY.atlassian.net"
},
{
"id": "8ceaeb0e-a182-400f-811f-9c874abaa615",
"name": "JIRA_PROJECT_KEY",
"type": "string",
"value": "YOUR_PROJECT_KEY"
},
{
"id": "2be49975-547f-4515-af08-2dc8f88f4a22",
"name": "MANAGER_EMAILS",
"type": "string",
"value": "user@example.com [ CAN BE LIST OF EMAILS ]"
},
{
"id": "09ba7ee7-867d-48b0-b007-bad57c89c4cb",
"name": "GOOGLE_CHAT_WEBHOOK_URL",
"type": "string",
"value": "https://chat.googleapis.com/v1/spaces/XXXXXX/messages?key=YOUR_TOKEN_HERE&token=YOUR_TOKEN_HERE"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "b1193c34-7888-453e-8b4b-aa19e5a60853",
"name": "Note - Config Instructions",
"type": "n8n-nodes-base.stickyNote",
"position": [
6496,
2608
],
"parameters": {
"color": 3,
"width": 432,
"height": 240,
"content": "## ⚙️ CONFIGURATION NODE\nSet all your values here — **this is the only node you need to edit**"
},
"typeVersion": 1
},
{
"id": "7df7065a-4731-4d4a-8d13-e4fe76be5459",
"name": "Note - Prepare Data Section",
"type": "n8n-nodes-base.stickyNote",
"position": [
6944,
2608
],
"parameters": {
"color": 7,
"width": 944,
"height": 432,
"content": "## PREPARE DATA 📊"
},
"typeVersion": 1
},
{
"id": "5a690ddf-c55f-4359-bcdf-1480b97f379b",
"name": "Note - Workflow End",
"type": "n8n-nodes-base.stickyNote",
"position": [
8880,
2176
],
"parameters": {
"color": 7,
"width": 720,
"height": 256,
"content": "## WORKFLOW END"
},
"typeVersion": 1
},
{
"id": "dfeb8e14-ba51-4dfa-bb45-92328bcf4e6b",
"name": "Note - Automatic Trigger",
"type": "n8n-nodes-base.stickyNote",
"position": [
6336,
2992
],
"parameters": {
"color": 7,
"width": 480,
"height": 288,
"content": "## AUTOMATIC TRIGGER FOR PRODUCTION"
},
"typeVersion": 1
},
{
"parameters": {
"operation": "verify",
"email": "={{ $('⚙️ CONFIG').first().json.MANAGER_EMAILS }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
8648,
3568
],
"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": [
8828,
3568
],
"name": "IF deliverable"
},
{
"parameters": {
"operation": "verify",
"email": "={{ $input.last().json.data.assignee.emailAddress }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
10104,
4240
],
"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": [
10284,
4240
],
"name": "IF deliverable 2"
},
{
"parameters": {
"operation": "verify",
"email": "={{ $input.last().json.data.assignee.emailAddress }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
10104,
3840
],
"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": [
10284,
3840
],
"name": "IF deliverable 3"
},
{
"parameters": {
"operation": "verify",
"email": "={{ $input.last().json.assignee.emailAddress }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
8632,
2624
],
"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": [
8812,
2624
],
"name": "IF deliverable 4"
},
{
"parameters": {
"operation": "verify",
"email": "={{ $input.last().json.assignee.emailAddress }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
9048,
3024
],
"name": "Verify Email (BillionVerify) 5",
"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": [
9228,
3024
],
"name": "IF deliverable 5"
}
],
"connections": {
"ROUTES": {
"main": [
[
{
"node": "Verify Email (BillionVerify) 4",
"type": "main",
"index": 0
}
],
[
{
"node": "IS_OVERDUE_BETWEEN",
"type": "main",
"index": 0
}
],
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
],
[
{
"node": "GET_ISSUE_CHANGELOG",
"type": "main",
"index": 0
},
{
"node": "DATA_FLOW",
"type": "main",
"index": 0
}
],
[
{
"node": "CONTINUE_LOOP",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Verify Email (BillionVerify) 3",
"type": "main",
"index": 0
}
],
[
{
"node": "NOTIFY_TEAM_BLOCKED",
"type": "main",
"index": 0
}
],
[
{
"node": "Verify Email (BillionVerify) 2",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait - Rate Limit (Blocked Escalation)",
"type": "main",
"index": 0
}
]
]
},
"DATA_FLOW": {
"main": [
[
{
"node": "MERGE_DATA",
"type": "main",
"index": 0
}
]
]
},
"MERGE_DATA": {
"main": [
[
{
"node": "GET_BLOCKED_ITEM",
"type": "main",
"index": 0
}
]
]
},
"NOTIFY_TEAM": {
"main": [
[
{
"node": "Wait - Rate Limit (Warning)",
"type": "main",
"index": 0
}
]
]
},
"CONTINUE_LOOP": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"⚙️ CONFIG": {
"main": [
[
{
"node": "GET_JIRA_ISSUES",
"type": "main",
"index": 0
}
]
]
},
"AGGREGATE_ITEMS": {
"main": [
[
{
"node": "MERGE_DATA",
"type": "main",
"index": 1
}
]
]
},
"GET_ISSUES_LIST": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"GET_JIRA_ISSUES": {
"main": [
[
{
"node": "GET_ISSUES_LIST",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "END PROCESS",
"type": "main",
"index": 0
}
],
[
{
"node": "ISSUE_DATE_INSIGHTS",
"type": "main",
"index": 0
}
]
]
},
"GET_BLOCKED_ITEM": {
"main": [
[
{
"node": "COMPUTE_BLOCKED_DAYS",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "⚙️ CONFIG",
"type": "main",
"index": 0
}
]
]
},
"IS_OVERDUE_BETWEEN": {
"main": [
[
{
"node": "Verify Email (BillionVerify) 5",
"type": "main",
"index": 0
}
],
[
{
"node": "NOTIFY_TEAM",
"type": "main",
"index": 0
}
]
]
},
"MANAGER_ESCALATION": {
"main": [
[
{
"node": "Wait - Rate Limit (Escalation)",
"type": "main",
"index": 0
}
]
]
},
"GET_ISSUE_CHANGELOG": {
"main": [
[
{
"node": "AGGREGATE_ITEMS",
"type": "main",
"index": 0
}
]
]
},
"ISSUE_DATE_INSIGHTS": {
"main": [
[
{
"node": "ROUTES",
"type": "main",
"index": 0
}
]
]
},
"NOTIFY_TEAM_BLOCKED": {
"main": [
[
{
"node": "Wait - Rate Limit (Blocked Escalation)",
"type": "main",
"index": 0
}
]
]
},
"COMPUTE_BLOCKED_DAYS": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"SEND_BLOCKED_WARNING": {
"main": [
[
{
"node": "Wait - Rate Limit (Blocked Escalation)",
"type": "main",
"index": 0
}
]
]
},
"SEND_DUEDATE_WARNING": {
"main": [
[
{
"node": "Wait - Rate Limit (Warning)",
"type": "main",
"index": 0
}
]
]
},
"SEND_DUEDATE_REMINDER": {
"main": [
[
{
"node": "Wait - Rate Limit (Reminder)",
"type": "main",
"index": 0
}
]
]
},
"CONTINUE_LOOP_ESCALATION": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"MANAGER_ESCALATION_BLOCKED": {
"main": [
[
{
"node": "Wait - Rate Limit (Blocked Escalation)",
"type": "main",
"index": 0
}
]
]
},
"Wait - Rate Limit (Warning)": {
"main": [
[
{
"node": "CONTINUE_LOOP_ESCALATION",
"type": "main",
"index": 0
}
]
]
},
"Wait - Rate Limit (Reminder)": {
"main": [
[
{
"node": "CONTINUE_LOOP_OVERDUE_WARNING",
"type": "main",
"index": 0
}
]
]
},
"CONTINUE_LOOP_BLOCKED_WARNING": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"CONTINUE_LOOP_OVERDUE_WARNING": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Wait - Rate Limit (Escalation)": {
"main": [
[
{
"node": "CONTINUE_LOOP_BLOCKED_WARNING",
"type": "main",
"index": 0
}
]
]
},
"CONTINUE_LOOP_BLOCKED_ESCALATION": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "⚙️ CONFIG",
"type": "main",
"index": 0
}
]
]
},
"Wait - Rate Limit (Blocked Escalation)": {
"main": [
[
{
"node": "CONTINUE_LOOP_BLOCKED_ESCALATION",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "MANAGER_ESCALATION",
"type": "main",
"index": 0
}
],
[]
]
},
"Verify Email (BillionVerify) 2": {
"main": [
[
{
"node": "IF deliverable 2",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable 2": {
"main": [
[
{
"node": "MANAGER_ESCALATION_BLOCKED",
"type": "main",
"index": 0
}
],
[]
]
},
"Verify Email (BillionVerify) 3": {
"main": [
[
{
"node": "IF deliverable 3",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable 3": {
"main": [
[
{
"node": "SEND_BLOCKED_WARNING",
"type": "main",
"index": 0
}
],
[]
]
},
"Verify Email (BillionVerify) 4": {
"main": [
[
{
"node": "IF deliverable 4",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable 4": {
"main": [
[
{
"node": "SEND_DUEDATE_REMINDER",
"type": "main",
"index": 0
}
],
[]
]
},
"Verify Email (BillionVerify) 5": {
"main": [
[
{
"node": "IF deliverable 5",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable 5": {
"main": [
[
{
"node": "SEND_DUEDATE_WARNING",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
}
}Workflow templates with Google Chat
Ready-to-use workflows that verify emails before Google Chat sends.
How it works
- 1
Connect BillionVerify to your Google Chat automation using the n8n community node, Integrately, or the REST API.
- 2
Set a trigger — such as a bot receiving a message with contact details or a form submission posted to a Chat space.
- 3
BillionVerify checks the submitted email for validity, disposable domain patterns, role accounts, and catch-all behavior.
- 4
The workflow receives a pass or flag result and routes contacts accordingly — prompting for correction or proceeding with the valid address.
- 5
Verified addresses are stored and used in downstream email notifications, CRM records, or Workspace provisioning.
When to use this
Validate emails submitted through Chat bots or forms
Interactive Chat bots often collect contact information from employees or customers. Running those addresses through BillionVerify immediately catches typos and disposable entries before they're written to your database.
Screen new Workspace member emails during onboarding
When your HR or IT automation adds new members to Google Workspace groups via Chat workflows, verifying their email addresses prevents onboarding messages from bouncing and ensures the right people receive access instructions.
FAQ
What kinds of email problems does BillionVerify catch in Chat workflows?
It catches syntax errors, addresses on known disposable or temporary email providers, role accounts like admin@ that rarely belong to individuals, and domains configured as catch-all that may not deliver reliably.
How do I integrate BillionVerify with a Google Chat bot?
The most straightforward path is the REST API — your bot calls BillionVerify when it receives a contact detail, then acts on the result. n8n and Integrately offer no-code alternatives if you prefer a visual workflow builder.
Is real-time verification fast enough for a Chat bot interaction?
Yes. BillionVerify returns single-address results in milliseconds, so the bot can respond with confirmation or a correction prompt within the same conversational turn.
Verify emails in Google Chat
Create a free account, grab your API key, and stop bounces before they happen.
Get started free