← All Productivity

Cala email verification with BillionVerify

Cala is a productivity platform designed to help teams organize work, manage tasks, and coordinate projects. Integrating BillionVerify into Cala-connected workflows means every email address used for collaboration invites, notifications, or contact records is verified before it causes a bounce or a missed message.

Why verify before the send

Unverified email addresses in a team productivity environment lead to failed notifications, missed deadlines communicated by email, and polluted contact lists. BillionVerify removes invalid, disposable, and role-based addresses from your pipeline early, so internal and external communications from Cala always land in real inboxes.

Ready-to-use n8n workflow

Import this workflow into n8n — it verifies every address with BillionVerify before Cala 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-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"
  }
}

Workflow templates with Cala

Ready-to-use workflows that verify emails before Cala sends.

How it works

  1. 1

    Connect BillionVerify to your Cala workflows using the n8n community node, Integrately, or the BillionVerify REST API.

  2. 2

    Trigger verification when a new contact, member, or collaborator email is added in Cala.

  3. 3

    BillionVerify checks syntax, MX records, SMTP deliverability, disposable domains, and catch-all status.

  4. 4

    Valid addresses proceed through your workflow; suspect addresses are flagged for review or removed automatically.

  5. 5

    Log results alongside your Cala records to maintain a documented history of contact quality.

When to use this

Verify collaborator emails before sending project invitations

Before Cala sends a workspace or project invitation, pass the recipient's email through BillionVerify. Catch typos and disposable addresses upfront so collaboration invites never bounce and onboarding runs smoothly.

Maintain clean contact lists synced from Cala

When exporting or syncing contacts from Cala to an email marketing tool or CRM, run the list through BillionVerify to remove invalid and undeliverable addresses before they inflate your bounce rate.

FAQ

How does BillionVerify connect to Cala?

Use the n8n community node to build a custom workflow, Integrately for a no-code 1-click integration, or call the BillionVerify REST API from any webhook or automation triggered by Cala events.

What happens to invalid email addresses detected by BillionVerify?

Your workflow decides the outcome. Common patterns include skipping the address, flagging the record in Cala for manual review, or routing it to a quarantine list instead of proceeding with the invitation or sync.

Is bulk verification supported for cleaning existing Cala contact exports?

Yes. BillionVerify supports bulk uploads via the REST API, making it straightforward to verify a full contact export from Cala in a single job before importing it elsewhere.

Verify emails in Cala

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

Get started free