← All Productivity Workflows
BillionVerifyCala

Task escalation system with Google Sheets, Gmail, Telegram & Jira automation

Pull contacts, verify each address with BillionVerify, and continue to Cala — only deliverable addresses get through.

Why verify before the send

Sending to invalid, risky, catch-all, or disposable addresses spikes your bounce rate and erodes sender reputation. A verification gate before the Cala step removes that risk automatically — only deliverable addresses continue, the rest are flagged.

The workflow

BillionVerify — verification sits right before the send.

+2
n8n steps
+8
n8n steps

Node by node

  1. 1
    Trigger when Urgent statusTrigger· n8n

    Starts the workflow — on a schedule, a webhook, or manually while you test.

  2. 2
    Condition to send the emailLogic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  3. 3
    Verify Email (BillionVerify)Verify· billionverify

    The BillionVerify node verifies the address — status (valid / invalid / risky / catch-all / role / disposable), is_deliverable, and a confidence score — before anything is sent.

  4. 4
    IF deliverableLogic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  5. 5
    Email alertSend· n8n

    Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.

  6. 6
    Notified updateSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  7. 7
    Waiting before checkSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  8. 8
    Check if task is dealt withLogic· n8n

    Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.

  9. 9
    Send the escalation messageSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  10. 10
    Jira ticket creationSource· n8n

    Provides or transforms the contact data flowing through the workflow.

  11. 11
    Send notification of the escalationSource· n8n

    Provides or transforms the contact data flowing through the workflow.

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-emails-in-cala.json
{
  "name": "Task escalation system with Google Sheets, Gmail, Telegram & Jira automation + BillionVerify",
  "nodes": [
    {
      "id": "e0f449a9-fd91-472f-a644-6d45e2198388",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        528,
        160
      ],
      "parameters": {
        "width": 304,
        "height": 1200,
        "content": "## Workflow Overview\nThis workflow creates a complete multi-step escalation system for urgent tasks stored in Google Sheets. When a task’s priority becomes “Urgent”, the workflow sends an immediate email alert to the task owner, updates the sheet to mark the task as notified, waits for a defined amount of time, and then checks whether the issue has been resolved. If the task is still open, it sends a Telegram escalation message and automatically creates a Jira ticket with highest priority, followed by a final Telegram message with the ticket details. This ensures critical tasks always enter a formal resolution workflow and are not forgotten.\n\n### How it works\n1. Google Sheets trigger detects when a task’s priority changes to **Urgent**.  \n2. An email alert is sent with key task details.  \n3. The Google Sheet is updated to mark the task as **Notified**.  \n4. After a delay (e.g. 2 hours), the workflow checks if the task has been updated or resolved.  \n5. If it is still unresolved, a Telegram message is sent and a Jira ticket is created automatically.\n\n### Setup steps\n- Connect Google Sheets, Gmail, Telegram and Jira credentials.  \n- Match your Sheet’s column names with the fields used in the workflow.  \n- Adjust the wait time in the **Wait** node to fit your process.  \n- Test by changing a task’s priority to **Urgent** in your Sheet.\n\n### Requirements\n- Google Sheets credential  \n- Gmail credential  \n- Telegram account  \n- Jira credentials  \n\n@[youtube](2iFMqQSjq7U)"
      },
      "typeVersion": 1
    },
    {
      "id": "07f5f14e-a152-48bb-8aef-6d4c9640f078",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        848,
        352
      ],
      "parameters": {
        "color": 7,
        "width": 1040,
        "height": 528,
        "content": "## Trigger, Filtering, Emailing & Notification\n\nTriggers when a task's priority becomes “Urgent”, sends an email alert, then marks it as notified in the Google Sheet to prevent duplicates.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "347eecce-1d94-4994-bee2-d82824a21894",
      "name": "Email alert",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1440,
        560
      ],
      "webhookId": "2e825ad5-2285-4245-a1ce-d281300f071b",
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=Hi,<br><br>\nA task has been marked as <b>Urgent</b> in the project tracking sheet.<br><br>\n📌 <b>Task:</b> {{$json[\"Task\"]}}<br>\n👤 <b>Owner:</b> {{$json[\"Owner\"]}}<br>\n📅 <b>Deadline:</b> {{$json[\"Deadline\"]}}<br>\n📋 <b>Status:</b> {{$json[\"Status\"]}}<br>\n🧭 <b>Next Step:</b> {{$json[\"Next step\"]}}<br><br>\nPlease review this task as soon as possible.<br><br>\n—<br>",
        "options": {},
        "subject": "A critical task has been flagged in the project sheet"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7af3d12b-6a83-45c4-a044-a53e41876b8a",
      "name": "Condition to send the email",
      "type": "n8n-nodes-base.if",
      "position": [
        1088,
        576
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bd3dbdbd-84b2-4a29-bc65-a0475de280bf",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{$json[\"Priority\"]}}",
              "rightValue": "Urgent"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b842538d-acfb-454d-9ffd-375df98d8b44",
      "name": "Trigger when Urgent status",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        896,
        576
      ],
      "parameters": {
        "options": {
          "columnsToWatch": [
            "Priority"
          ]
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "yoururl",
          "cachedResultName": "Feuille 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "yourdocid",
          "cachedResultUrl": "yoururl",
          "cachedResultName": "Reporting"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8bf4323f-87d2-41b8-930f-a6b7071cfad3",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1904,
        352
      ],
      "parameters": {
        "color": 7,
        "width": 1120,
        "height": 528,
        "content": "## Escalation, Jira Creation ticket and Telegram notification \n\nAfter a 2-hour delay, if the task is still unresolved, creates a Jira issue and a Telegram escalation message is sent.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "67fa4f37-452e-4681-b2ab-5e8b8c5a8ea2",
      "name": "Notified update",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1760,
        560
      ],
      "parameters": {
        "columns": {
          "value": {
            "Notified": "Yes",
            "Priority": "={{ $('Trigger when Urgent status').item.json.Priority }}",
            "row_number": "=\n"
          },
          "schema": [
            {
              "id": "Task",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Task",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Owner",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Owner",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Deadline",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Deadline",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Next step",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Next step",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Priority",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Priority",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Notified",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Notified",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Priority"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "yoururl",
          "cachedResultName": "Feuille 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "yourdocid",
          "cachedResultUrl": "yoururl",
          "cachedResultName": "Reporting"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "e9258c99-f669-422f-8b33-0a82f468fd22",
      "name": "Waiting before check",
      "type": "n8n-nodes-base.wait",
      "position": [
        1968,
        560
      ],
      "webhookId": "b3b73b14-e499-46c0-ba83-70293ec7748c",
      "parameters": {
        "unit": "hours",
        "amount": 2
      },
      "typeVersion": 1.1,
      "alwaysOutputData": true
    },
    {
      "id": "b4778d5a-0109-41ce-b6f4-1ada4370e6cb",
      "name": "Check if task is dealt with",
      "type": "n8n-nodes-base.if",
      "position": [
        2208,
        560
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "33799756-717a-4b03-8694-77f46be10988",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "Priority",
              "rightValue": "=Urgent"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "96672fd3-25f7-4c9d-9cb2-aaf7150bf79d",
      "name": "Send the escalation message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2448,
        576
      ],
      "webhookId": "b17690a8-d7c5-4a74-bb0d-66b551ab3636",
      "parameters": {
        "text": "=🚨 Task still open after 2h:\n📌 {{ $('Trigger when Urgent status').item.json.Task }}\n👤 {{ $('Trigger when Urgent status').item.json.Owner }}\n📅 {{ $('Trigger when Urgent status').item.json.Deadline }}\nStatus:{{ $('Trigger when Urgent status').item.json.Status }}\nNext step: {{ $('Trigger when Urgent status').item.json[\"Next step\"] }}\n\nPlease review this task in Google Sheets.\n",
        "chatId": "yourchatID",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "019a429f-2cb5-41cf-a106-7792d8d5d5d7",
      "name": "Jira ticket creation",
      "type": "n8n-nodes-base.jira",
      "position": [
        2624,
        576
      ],
      "parameters": {
        "project": {
          "__rl": true,
          "mode": "list",
          "value": "10002",
          "cachedResultName": "test2"
        },
        "summary": "={{ $('Trigger when Urgent status').item.json.Task }}",
        "issueType": {
          "__rl": true,
          "mode": "list",
          "value": "10013",
          "cachedResultName": "Bug"
        },
        "additionalFields": {
          "priority": {
            "__rl": true,
            "mode": "list",
            "value": "1",
            "cachedResultName": "Highest"
          },
          "description": "={{ $('Trigger when Urgent status').item.json.Task }}\n\nDeadline: {{ $('Trigger when Urgent status').item.json.Deadline }}\n\n{{ $('Trigger when Urgent status').item.json.Priority }}\n\n"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7e00b1b6-9db5-4fd3-b8e3-d416d0a1d493",
      "name": "Send notification of the escalation",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2848,
        576
      ],
      "webhookId": "4a9fc5d0-dd3e-4d46-889d-ca5ea1675eae",
      "parameters": {
        "text": "=Now a ticket has been created in Jira.\n\nKey: {{ $json.key }}\nPlease check the ticket:{{ $json.self }}",
        "chatId": "yourchatid",
        "additionalFields": {}
      },
      "typeVersion": 1.2
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        1080,
        560
      ],
      "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": [
        1260,
        560
      ],
      "name": "IF deliverable"
    }
  ],
  "connections": {
    "Email alert": {
      "main": [
        [
          {
            "node": "Notified update",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notified update": {
      "main": [
        [
          {
            "node": "Waiting before check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Jira ticket creation": {
      "main": [
        [
          {
            "node": "Send notification of the escalation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Waiting before check": {
      "main": [
        [
          {
            "node": "Check if task is dealt with",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger when Urgent status": {
      "main": [
        [
          {
            "node": "Condition to send the email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if task is dealt with": {
      "main": [
        [],
        [
          {
            "node": "Send the escalation message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Condition to send the email": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send the escalation message": {
      "main": [
        [
          {
            "node": "Jira ticket creation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "Email alert",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}

When to use this

  • Cleaning a list before a Cala send or sync.
  • Protecting Cala deliverability and sender reputation.
  • Keeping bounce rates low so your sending is never throttled.

FAQ

Why verify before sending in Cala?

Verifying first keeps your bounce rate low, which protects your sender reputation and your results.

How do I import this workflow?

Download the JSON, then in n8n go to Workflows → Import from File (or paste it). Install the BillionVerify community node and add your API key credential.

What happens to risky or catch-all addresses?

They are routed to the false branch and excluded from the send. You decide whether to retry, review, or drop them.

Add verification to your workflow

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

Get started free