← All Analytics Workflows
BillionVerifyDatabox

Send weekly Databox paid ads performance reports to Slack and email

Pull contacts, verify each address with BillionVerify, and continue to Databox β€” 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 Databox step removes that risk automatically β€” only deliverable addresses continue, the rest are flagged.

The workflow

BillionVerify β€” verification sits right before the send.

+7
n8n steps
+2
n8n steps

Node by node

  1. 1
    Every Monday 9 AMTriggerΒ· n8n

    Starts the workflow β€” on a schedule, a webhook, or manually while you test.

  2. 2
    Databox MCP ToolSourceΒ· n8n

    Provides or transforms the contact data flowing through the workflow.

  3. 3
    OpenAI Chat ModelSourceΒ· n8n

    Provides or transforms the contact data flowing through the workflow.

  4. 4
    Get Current DateSourceΒ· n8n

    Provides or transforms the contact data flowing through the workflow.

  5. 5
    Paid Ads Reporting AgentSourceΒ· n8n

    Provides or transforms the contact data flowing through the workflow.

  6. 6
    Parse AI OutputSourceΒ· n8n

    Provides or transforms the contact data flowing through the workflow.

  7. 7
    Send to SlackSourceΒ· n8n

    Provides or transforms the contact data flowing through the workflow.

  8. 8
    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.

  9. 9
    IF deliverableLogicΒ· n8n

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

  10. 10
    Send EmailSendΒ· n8n

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

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-databox.json
{
  "name": "Send weekly Databox paid ads performance reports to Slack and email + BillionVerify",
  "nodes": [
    {
      "id": "bf94a011-2f67-4330-aa95-bee4a2cc5eb1",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5904,
        6576
      ],
      "parameters": {
        "color": 7,
        "width": 1688,
        "height": 612,
        "content": "## Automated Paid Ads Weekly Performance Report via Databox MCP\n\nAutomate your paid advertising performance reporting across all platforms with AI-powered insights delivered every Monday morning. This workflow connects to your Databox account via MCP, automatically discovers which paid ads platforms you have connected, fetches 6 key metrics from each platform, calculates week-over-week performance changes, and sends beautifully formatted consolidated reports to both Slack and email-completely hands-free.\n\n### What you'll get\n- πŸ“Š Automated weekly reports \n- πŸ“ˆ 6 key metrics tracked per platform: Cost/Spend, Clicks, CPC, CTR, Impressions, Conversions\n- 🎯 Week-over-week % changes \n- πŸ’¬ Summary with highlights and AI-generated insights\n- πŸ“§ HTML email report \n- ⏰ Scheduled automation\n\n### How it works\n`Schedule Trigger` β†’ `AI Agent (auto-discovers connected platforms via Databox MCP)` β†’ `Aggregates metrics across all platforms` β†’ `Send report to Slack + Email`\n\n### What you need\n- Databox account with at least one paid ads platform connected β†’ Free plan available: https://databox.com/?ref=n8n\n- Claude or ChatGPT API key\n- Slack account (optional)\n- Gmail account (optional)\n\n### Supported Platforms\nFacebook Ads β€’ Google Ads β€’ LinkedIn Ads β€’ YouTube Ads β€’ Reddit Ads β€’ TikTok Ads β€’ Snapchat Ads β€’ Microsoft Advertising β€’ X (Twitter) Ads β€’ Pinterest Ads"
      },
      "typeVersion": 1
    },
    {
      "id": "ef60debc-97bb-4d10-80f9-ee41f4f5b219",
      "name": "Sticky Note 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5904,
        7216
      ],
      "parameters": {
        "color": 4,
        "width": 500,
        "height": 1138,
        "content": "## 1️⃣ Scheduled Execution\n\n### What this section does\nTriggers the workflow every **Monday at 9 AM** and captures the current date so the AI Agent can calculate the correct 7-day reporting windows (current week vs. previous week).\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n### Change the schedule (optional)\n- Click the \"Every Monday 9 AM\" node\n- Click on the Cron Expression field\n- Modify the schedule (e.g., change to daily, weekly on different day, or custom time)"
      },
      "typeVersion": 1
    },
    {
      "id": "c21c7662-dc7c-4777-8e84-b5df1798e19b",
      "name": "Sticky Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        6448,
        7216
      ],
      "parameters": {
        "color": 6,
        "width": 550,
        "height": 1132,
        "content": "## 2️⃣ AI Agent + Databox MCP Setup\n\n### What this section/Agent does\nThe AI Agent connects to Databox via MCP and intelligently auto-discovers your connected paid ads platforms, fetches data across all of them for 6 key metrics, aggregates performance, calculates week-over-week changes, and formats professional reports for Slack and Email.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n### What you need to do ⚠️\n1. Click the **OpenAI Chat Model** node β†’ add your `API key` credential\n   - You can also replace this node with the **OpenAI Chat Model** node\n2. Click the **Databox MCP Tool** node β†’ set Authentication to `OAuth2` β†’ authorize with your Databox account\n3. **Ensure at least one paid ads platform is connected** in your Databox account\n\n### How to connect Databox MCP Tool in n8n\n@[youtube](892KtXhv-vI)"
      },
      "typeVersion": 1
    },
    {
      "id": "d0ecc1bd-1929-49f6-9b8e-3793b120152a",
      "name": "Sticky Note 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7040,
        7216
      ],
      "parameters": {
        "color": 5,
        "width": 550,
        "height": 1132,
        "content": "## 3️⃣ Output & Notification\n\n### What this section does\nThe Parse AI Output node splits the Agent's response into two formatted reports - a concise Slack summary with top-level metrics and AI-generated insights, and a rich HTML email with individual platform tables and color-coded week-over-week changes - then delivers both simultaneously.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n### What you need to do ⚠️\n- **Slack**: Connect your account in **Send to Slack** node and set the Slack `channel` for report delivery\n- **Email**: Add your Gmail/SMTP credentials to the **Send Email** node\n- **Optional**: Add a Microsoft Teams, Discord, or Telegram node for additional outputs"
      },
      "typeVersion": 1
    },
    {
      "id": "df05566a-c4ff-432c-b754-e29628646ac8",
      "name": "Every Monday 9 AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "Triggers every Monday at 9 AM",
      "position": [
        5984,
        7456
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * 1"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "ab859925-15a9-4421-89b3-df2c7cc7a4fc",
      "name": "Get Current Date",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        6208,
        7456
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "ca60e49c-7b15-4aac-bc68-180c4ab94b97",
      "name": "Databox MCP Tool",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        6768,
        7664
      ],
      "parameters": {
        "options": {},
        "endpointUrl": "https://mcp.databox.com/mcp",
        "authentication": "mcpOAuth2Api"
      },
      "credentials": {
        "mcpOAuth2Api": {
          "id": "credential-id",
          "name": "Databox"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "501ab843-4c7a-4745-8590-8fedebef3212",
      "name": "Paid Ads Reporting Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        6608,
        7456
      ],
      "parameters": {
        "text": "=Today's Date: {{ $json.formattedDate }}\n\nGenerate a comprehensive weekly performance report for ALL connected paid advertising platforms.\n\nDetermine the exact date ranges for \"the last 7 days\" and the \"previous 7 days\" based on TODAY's DATE.\n\nQuery Databox to:\n1. Discover which paid ads platforms are connected (Facebook Ads, Google Ads, LinkedIn Ads, YouTube Ads, Reddit Ads, TikTok Ads, Snapchat Ads, Microsoft Advertising, X/Twitter Ads, Pinterest Ads)\n2. For EACH connected platform, fetch these 6 metrics for both weeks:\n   - Cost/Spend\n   - Clicks\n   - CPC (Cost Per Click)\n   - CTR (Click-Through Rate)\n   - Impressions\n   - Conversions\n\nCalculate:\n- Week-over-week (WoW) percentage changes for EVERY metric on EVERY platform\n- Aggregated totals across all platforms (total spend, total clicks, total impressions, total conversions)\n- Average CPC and CTR across all platforms (weighted by volume)\n\nFormat the output into a Slack summary and a detailed HTML email with platform breakdowns.",
        "options": {
          "systemMessage": "You are a performance reporting assistant that queries Databox through the MCP Client and formats cross-platform paid advertising reports.\n\nSTEP-BY-STEP WORKFLOW:\n\n1. Call list_accounts to get the account ID.\n\n2. Call list_data_sources with that account ID to discover ALL connected paid ads platforms. Look for data sources matching these names/patterns:\n   - Facebook Ads (or variations like \"Facebook Ad Account\")\n   - Google Ads (or \"Google AdWords\")\n   - LinkedIn Ads\n   - YouTube Ads\n   - Reddit Ads\n   - TikTok Ads\n   - Snapchat Ads\n   - Microsoft Advertising (or \"Bing Ads\")\n   - X Ads (or \"Twitter Ads\")\n   - Pinterest Ads\n\n3. For EACH connected platform found, call load_metric_data for these 6 metrics (use the appropriate metric keys for each platform):\n   - Cost/Spend (metric keys may vary: \"cost\", \"spend\", \"amount_spent\")\n   - Clicks\n   - CPC (Cost Per Click)\n   - CTR (Click-Through Rate)\n   - Impressions\n   - Conversions (or \"purchases\", \"leads\" depending on platform)\n\n   Use these parameters for each metric call:\n   - data_source_id: the platform's source ID from step 2\n   - start_date: 14 days before today (YYYY-MM-DD)\n   - end_date: today (YYYY-MM-DD)\n   - granulation_time_unit: 3 (weekly)\n   - granulation_multiplier: 1\n   - is_whole_range: false\n\n   Each call returns two data points β€” previous week and current week.\n\n4. If a platform is NOT connected or returns no data, silently skip it. Do NOT mention missing platforms in the output.\n\n5. If NO paid ads platforms are connected or all platforms return zero data:\n   - In the Slack message: State \"No paid advertising activity detected for the reporting period.\"\n   - In the email: Include \"Platforms analyzed: None\" in the subtitle and a message explaining no reportable activity was found.\n   - STILL include the ---SEPARATOR--- delimiter and generate the email structure with empty/zero values.\n\n5. Calculate WoW percentage change for every metric on every platform: ((current - previous) / previous) * 100\n\n6. Aggregate totals:\n   - Total Spend = sum of all platforms' spend\n   - Total Clicks = sum of all platforms' clicks\n   - Total Impressions = sum of all platforms' impressions\n   - Total Conversions = sum of all platforms' conversions\n   - Average CPC = Total Spend / Total Clicks\n   - Average CTR = (Total Clicks / Total Impressions) * 100\n\n7. Format the output.\n\nCRITICAL OUTPUT INSTRUCTIONS:\nAfter completing all calculations internally, output ONLY the two formatted sections below. Do NOT include any pre-calculation notes, data mapping explanations, raw values, formulas, or intermediate steps in your response. Your output must START DIRECTLY with the Slack message format.\n\nFORMAT RULES:\nOutput two sections separated exactly by ---SEPARATOR---\n\nFIRST β€” Slack message:\nPaid Ads Performance Snapshot πŸ“Š\n[Last 7 Days Dates]\n\n[One sentence summary highlighting cross-platform performance trends]\n\n*Aggregated Totals Across All Platforms:*\nπŸ’° *Total Spend:* $[value] ([+/-X.X%] WoW)\nπŸ–±οΈ *Total Clicks:* [value] ([+/-X.X%] WoW)\nπŸ‘οΈ *Total Impressions:* [value] ([+/-X.X%] WoW)\n🎯 *Total Conversions:* [value] ([+/-X.X%] WoW)\nπŸ’΅ *Avg CPC:* $[value] ([+/-X.X%] WoW)\nπŸ“Š *Avg CTR:* [value]% ([+/-X.X%] WoW)\n\n*Platform Breakdown:*\n[For each connected platform, list top 3 metrics with emojis]\n\nAutomated with this n8n workflow\n\n---SEPARATOR---\n\nSECOND β€” HTML email:\nStructure:\n<h2 style=\"color: #3164FA; font-family: 'Helvetica Neue', Arial, sans-serif; font-weight: 600; margin-bottom: 5px;\">Paid Ads Weekly Report</h2>\n<p style=\"color: #666; font-family: 'Helvetica Neue', Arial, sans-serif; margin-top: 0; font-size: 14px;\">[Last 7 Days Dates] vs [Previous 7 Days Dates]</p>\n<p style=\"color: #666; font-family: 'Helvetica Neue', Arial, sans-serif; font-size: 13px; font-style: italic;\">Platforms analyzed: [List of connected platforms]</p>\n\n<p style=\"font-family: 'Helvetica Neue', Arial, sans-serif; color: #333; margin-bottom: 20px; line-height: 1.6;\">[Executive summary paragraph highlighting key insights across all platforms]</p>\n\n<div style=\"background-color: #F7F9FC; border-left: 4px solid #3164FA; padding: 15px; font-family: 'Helvetica Neue', Arial, sans-serif; margin-bottom: 20px; border-radius: 4px;\">\n  <strong style=\"color: #3164FA; font-size: 16px;\">Key Highlights - Aggregated Totals</strong><br><br>\n  Total Spend: $XX,XXX (<span style=\"color: #059669;\">+X.X% WoW</span>)<br>\n  Total Clicks: XX,XXX (<span style=\"color: #059669;\">+X.X% WoW</span>)<br>\n  Total Conversions: XXX (<span style=\"color: #059669;\">+X.X% WoW</span>)<br>\n  Avg CPC: $X.XX (<span style=\"color: #dc2626;\">+X.X% WoW</span>)<br>\n  Avg CTR: X.XX% (<span style=\"color: #059669;\">+X.X% WoW</span>)\n</div>\n\n<!-- For EACH connected platform, create a table: -->\n<h3 style=\"color: #3164FA; font-family: 'Helvetica Neue', Arial, sans-serif; font-weight: 600; margin-top: 30px; margin-bottom: 10px;\">[Platform Name] Performance</h3>\n\n<table style=\"width: 100%; border-collapse: collapse; font-family: 'Helvetica Neue', Arial, sans-serif; margin-bottom: 30px;\">\n  <tr style=\"background-color: #3164FA; color: white;\">\n    <th style=\"padding: 12px; border: 1px solid #e5e7eb; text-align: left; font-weight: 600;\">Metric</th>\n    <th style=\"padding: 12px; border: 1px solid #e5e7eb; text-align: left; font-weight: 600;\">This Week</th>\n    <th style=\"padding: 12px; border: 1px solid #e5e7eb; text-align: left; font-weight: 600;\">Last Week</th>\n    <th style=\"padding: 12px; border: 1px solid #e5e7eb; text-align: left; font-weight: 600;\">WoW</th>\n  </tr>\n  <tr style=\"background-color: #ffffff;\">\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">Cost/Spend</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">$X,XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">$X,XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #059669;\">+X.X%</td>\n  </tr>\n  <tr style=\"background-color: #f9fafb;\">\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">Clicks</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">X,XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">X,XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #dc2626;\">-X.X%</td>\n  </tr>\n  <tr style=\"background-color: #ffffff;\">\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">CPC</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">$X.XX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">$X.XX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #059669;\">+X.X%</td>\n  </tr>\n  <tr style=\"background-color: #f9fafb;\">\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">CTR</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">X.XX%</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">X.XX%</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #059669;\">+X.X%</td>\n  </tr>\n  <tr style=\"background-color: #ffffff;\">\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">Impressions</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">XXX,XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">XXX,XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #dc2626;\">-X.X%</td>\n  </tr>\n  <tr style=\"background-color: #f9fafb;\">\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">Conversions</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #333;\">XXX</td>\n    <td style=\"padding: 12px; border: 1px solid #e5e7eb; color: #059669;\">+X.X%</td>\n  </tr>\n</table>\n\n<!-- Repeat table for each connected platform -->\n\n<p style=\"color: #999; font-size: 11px; margin-top: 25px; font-family: 'Helvetica Neue', Arial, sans-serif; border-top: 1px solid #e5e7eb; padding-top: 15px;\">Automated reporting via Databox MCP & n8n</p>\n\nSTRICT RULES:\n- DO NOT include ANY text before the formatted output sections. Start your response directly with \"Paid Ads Performance Snapshot\"\n- DO NOT show calculation steps, data mapping, timestamps, raw values, or intermediate work\n- DO NOT mention platforms that are not connected or have no data\n- DO NOT include warnings or caveats\n- Use Databox brand color #3164FA for headings and highlights\n- Make WoW values green (#059669) if positive, red (#dc2626) if negative\n- For cost metrics, lower is better (show red for increases in CPC)\n- For CTR, clicks, impressions, conversions - higher is better (show green for increases)\n- Keep the Slack message concise β€” title, date, summary, aggregated metrics, platform breakdown, and footer\n- In email, include executive summary paragraph before Key Highlights box\n- Create separate tables for each connected platform in the email\n- If a previous week value is 0, show \"N/A\" for WoW instead of dividing by zero\n- Format all numbers with thousand separators (commas)\n- For currency values, use $ symbol and format as $X,XXX.XX\n- For percentages, format as X.XX%\n- List platforms analyzed in the email subtitle"
        },
        "promptType": "define"
      },
      "retryOnFail": false,
      "typeVersion": 3,
      "alwaysOutputData": true
    },
    {
      "id": "7db0ea3c-fe4b-4424-b99b-79061b0be967",
      "name": "Parse AI Output",
      "type": "n8n-nodes-base.code",
      "position": [
        7136,
        7456
      ],
      "parameters": {
        "jsCode": "const aiOutput = $input.first().json.output;\n\nif (!aiOutput) {\n  throw new Error('No output received from the Paid Ads Reporting Agent.');\n}\n\nconst parts = aiOutput.split('---SEPARATOR---');\n\nif (parts.length < 2) {\n  throw new Error('AI output missing ---SEPARATOR--- delimiter.');\n}\n\n// Extract subject from the HTML or use default\nlet emailSubject = 'Paid Ads Weekly Report';\nconst titleMatch = parts[1].match(/<h2[^>]*>(.*?)<\\/h2>/i);\nif (titleMatch) {\n  emailSubject = titleMatch[1].replace(/<[^>]*>/g, '').trim();\n}\n\nreturn [{\n  json: {\n    slackMessage: parts[0].trim(),\n    emailSubject: emailSubject,\n    emailHtml: parts[1].trim()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "e4dde5cf-52b7-4c1b-93c5-8db357a00703",
      "name": "Send to Slack",
      "type": "n8n-nodes-base.slack",
      "notes": "Sends the Slack summary message",
      "position": [
        7376,
        7456
      ],
      "webhookId": "7763981b-c81a-423b-adda-840ce4f209ba",
      "parameters": {
        "text": "={{ $json.slackMessage }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "C0AELRTHZAA"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "id": "credential-id",
          "name": "Slack"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "20a77cc8-17bc-45a4-b3e6-4dc8779ad650",
      "name": "Send Email",
      "type": "n8n-nodes-base.gmail",
      "notes": "Sends the full HTML report via Gmail",
      "position": [
        7376,
        7632
      ],
      "webhookId": "unique-webhook-id",
      "parameters": {
        "sendTo": "user@example.com",
        "message": "={{ $json.emailHtml }}",
        "options": {},
        "subject": "={{ $json.emailSubject }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "credential-id",
          "name": "Gmail"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e6313e1a-00e4-4a53-880e-cc60799e0c9c",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        6576,
        7664
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "credential-id",
          "name": "RevOps Open AI"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "cb6b6fa3-51cb-4f98-9109-b836ffe29703",
      "name": "Sticky Note 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        7616,
        6576
      ],
      "parameters": {
        "color": 7,
        "width": 948,
        "height": 610,
        "content": "## How it works\n\n@[youtube](Y3bJsPWtSIA)"
      },
      "typeVersion": 1
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        7016,
        7632
      ],
      "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": [
        7196,
        7632
      ],
      "name": "IF deliverable"
    }
  ],
  "connections": {
    "Parse AI Output": {
      "main": [
        [
          {
            "node": "Send to Slack",
            "type": "main",
            "index": 0
          },
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Databox MCP Tool": {
      "ai_tool": [
        [
          {
            "node": "Paid Ads Reporting Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get Current Date": {
      "main": [
        [
          {
            "node": "Paid Ads Reporting Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Every Monday 9 AM": {
      "main": [
        [
          {
            "node": "Get Current Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Paid Ads Reporting Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Paid Ads Reporting Agent": {
      "main": [
        [
          {
            "node": "Parse AI Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}

When to use this

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

FAQ

Why verify before sending in Databox?

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