← All Productivity

Documentero email verification with BillionVerify

Documentero is a document automation platform that generates PDFs and other files from templates and structured data. Adding BillionVerify to the pipeline validates recipient email addresses before documents are generated and dispatched, preventing wasted processing and protecting your email delivery reputation.

Why verify before the send

Every document generation job tied to an email delivery is only useful if the target inbox actually exists. Sending to invalid, role-based, or disposable addresses results in hard bounces and can get your sending domain blacklisted. BillionVerify adds a lightweight verification gate that filters out bad addresses before Documentero invests compute in generating the document.

Ready-to-use n8n workflow

Import this workflow into n8n — it verifies every address with BillionVerify before Documentero 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-documentero.json
{
  "name": "Run AI-powered market research with Groq, OpenAI, Documentero and Gmail + BillionVerify",
  "nodes": [
    {
      "id": "3e4b11c7-6650-46e1-8970-26d15548dc1a",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -1152,
        752
      ],
      "webhookId": "083a09c5-87b1-4691-999c-89ce86d772df",
      "parameters": {
        "options": {
          "responseMode": "lastNode"
        }
      },
      "notesInFlow": false,
      "typeVersion": 1.4,
      "alwaysOutputData": true
    },
    {
      "id": "2b71164d-a4ee-4079-8aa4-947328c14100",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -800,
        976
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "b2ac0b6f-032b-4c3a-8876-efbc54d2a3b9",
      "name": "Planner Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -864,
        752
      ],
      "parameters": {
        "text": "=You are a Senior Product Manager leading market discovery. You have 3 sub agents that can work in parallel.\n\nThe agents currently available are Customer Insights Agent, Market Scan Agent, Competitor Insights Agent. \nCustomer insights agent will, for the idea/problem at hand, draw customer insights based on understanding customer pain points, customer behaviour, customer feedback, etc.\nMarket Scan Agent is responsible for performing macro and micro analysis regd. the problem/idea at hand. It will also look at trends, market size, TAM, SAM, etc.\nCompetitor Insights agent will perform competitor analysis for the idea/problem at hand.\n\n\n\nYour task is to:\n1. Devise a structured market research plan for the input/given product idea - {{ $json.chatInput }}. You decide what tasks are necessary to do the market research. Name the tasks per the devised plan for example market_task for market analysis related activities, competitor_task for competitor analysis related activities, customer_tasks for customer evaluation related activities , and so on.\n2. Decide which specialist agents should run which of the aforementioned tasks. Assign that task to that agent. Also pass on context/problem at hand/idea at hand so the sub agent is more informed.\n3. Define clear outputs and assumptions for each task\n4. If there is a task that you have identified but cannot be assigned to the sub agent, call that out so it can be handled later.\n\nConstraints:\n- Assume limited time (PM reality)\n- Prefer directional accuracy over academic perfection\n- Explicitly call out assumptions\n\nOutput Details:\n\n  - Output STRICT JSON in this format:\n\n{\n  “Research_idea\": \"...\",\n“Research_objective\": \"...\",\n\"market_task\": \"...\",\n  \"competitor_task\": \"...\",\n  \"customer_task\": \"...\",\n  \"assumptions\": \"...\"\n}\n- Assign each task along with its goal, the respective key questions to be answered, constraints and assumptions to be factored in, to respective sub-agent based on sub-agent speciality (see description above). ",
        "options": {
          "systemMessage": "You are leading discovery. Hence your job is to plan the next steps/tasks required to do this market research. Then based on category of the step/task, pass the requisite information to sub-agents for them to work.\n\nFor example, you have identified that competitor analysis is one of the steps. Assign this to Competitor Agent. Pass on the details this agent will need. Similarly, if you have identified one of the task is to gain Customer insights, pass on required information to Customer Insight Agent.\n\nYou do not have to do the entire market research. Let the sub agents do their job as per their role."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3,
      "alwaysOutputData": true
    },
    {
      "id": "66059613-6dc2-4fff-9263-e32b8adbc7be",
      "name": "Simple Memory1",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        208,
        400
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "cac43b83-313b-45a5-b8be-7c9546449e9c",
      "name": "Market Scan Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        160,
        640
      ],
      "parameters": {
        "text": "=You are a market strategy analyst.\n\nFor {{ $json.output.research_objective }}  Your task is {{ $json.output.market_task }} for the given product idea\n{{ $json.output.research_idea }}\n and assumptions : {{ $json.output.assumptions }}\n\nGuidelines:\n- Use publicly available benchmarks and analogies\n- Clearly state assumptions\n- Prefer ranges over false precision\n- Avoid invented statistics\n\nOutput details such as  \nMarket definition, TAM / SAM / SOM (with assumptions), Growth drivers, Market maturity assessment, macro environment analysis, micro environment analysis, industry trends, key risks and uncertianities",
        "options": {
          "systemMessage": "You are a helpful assistantAlways return the output in JSON format prescribed"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3,
      "alwaysOutputData": false
    },
    {
      "id": "803b0705-7dbb-4419-9339-dc38d8f7088f",
      "name": "Simple Memory2",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        224,
        864
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "fcc1b6ca-0aeb-4540-a25a-01d74f308791",
      "name": "Customer Insights Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        144,
        176
      ],
      "parameters": {
        "text": "=You are a product discovery researcher.\n\nFor the product idea {{ $json.output.research_idea }}\n and {{ $json.output.assumptions }}\nYour task is {{ $json.output.customer_task }}. To do this, use:\n- Public forums\n- Reviews\n- Industry articles\n- Job-to-be-done reasoning\n\nDo NOT fabricate interviews.\n\nOutput:\n- Target customer segments\n- Core problems (ranked)\n- Current solutions & frustrations\n- JTBD-style insight statements \n\nEnsure each output item starts as a separate paragraph.",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "724f2544-ee10-40d0-b632-e7ccb9aba41e",
      "name": "Competitor Insights Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        160,
        1136
      ],
      "parameters": {
        "text": "=You are a competitive intelligence analyst.\n\nFor the product idea {{ $json.output.research_idea }}\n\n\nproblem statement {{ $json.output.competitor_task }}\nand {{ $json.output.assumptions }}\nYour task is to identify:\n- Direct competitors\n- Indirect alternatives\n- Substitutes and workarounds\n\nFocus on:\n- Value proposition\n- Differentiation\n- Pricing model (if public)\n- Target customer segment\n\nOutput:\n- Competitor table\n- Competitive gaps\n- Observed patterns ",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3,
      "alwaysOutputData": false
    },
    {
      "id": "2e3b3b4b-b2fe-4289-abb0-51f19c73abe3",
      "name": "Simple Memory3",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        224,
        1360
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "708d91f0-1406-4b47-9781-021a0b438db9",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -672,
        976
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"research_idea\": \"...\",\n  \"research_objective\": \"...\",\n\"market_task\": \"...\",\n  \"competitor_task\": \"...\",\n  \"customer_task\": \"...\",\n  \"assumptions\": \"...\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "4cc1a210-2218-4330-bc41-d0095312fe08",
      "name": "Structured Output Parser2",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        336,
        400
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"customer_insights\": {\n    \"target_customer_segments\": [],\n    \"core_problems_ranked\": [],\n    \"current_solutions_and_frustrations\": [],\n    \"jtbd_insight_statements\": []\n  }\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "061c09b5-18f8-46cb-96c5-fe9373427c99",
      "name": "Structured Output Parser3",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        352,
        864
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"output\": {\n    \"market_definition\": {\n      \"market_name\": \"\",\n      \"in_scope\": [],\n      \"out_of_scope\": [],\n      \"geographies\": [],\n      \"customer_types\": [],\n      \"value_chain_position\": \"\"\n    },\n\n    \"tam_sam_som\": {\n      \"tam\": {\n        \"value\": 0,\n        \"currency\": \"\",\n        \"assumptions\": []\n      },\n      \"sam\": {\n        \"value\": 0,\n        \"currency\": \"\",\n        \"assumptions\": []\n      },\n      \"som\": {\n        \"value\": 0,\n        \"currency\": \"\",\n        \"assumptions\": []\n      }\n    },\n\n    \"growth_drivers\": [],\n\n    \"market_maturity\": \"\",\n\n    \"macro_environment_analysis\": {\n      \"regulatory\": [],\n      \"economic\": [],\n      \"technological\": [],\n      \"societal\": []\n    },\n\n    \"micro_market_analysis\": {\n      \"customer_behavior_trends\": [],\n      \"competitive_dynamics\": [],\n      \"supplier_and_partner_landscape\": [],\n      \"barriers_to_entry\": [],\n      \"substitute_threats\": []\n    },\n\n    \"industry_trends\": [],\n\n    \"key_risks\": []\n  }\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "901e3dc5-562c-4ba9-8647-7aa013b1e247",
      "name": "Structured Output Parser4",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        352,
        1360
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"output\": {\n    \"competitor_table\": [\n      {\n        \"name\": \"\",\n        \"product_offering\": \"\",\n        \"pricing\": \"\",\n        \"market_position\": \"\",\n        \"strengths\": [],\n        \"weaknesses\": []\n      }\n    ],\n    \"competitive_gaps\": [],\n    \"observed_patterns\": []\n  }\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "b5c6f20a-aca2-4cb5-bcc1-eeff708c4db7",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        1152,
        720
      ],
      "parameters": {
        "numberInputs": 3
      },
      "executeOnce": false,
      "notesInFlow": false,
      "typeVersion": 3.2,
      "alwaysOutputData": true
    },
    {
      "id": "41a458cf-71ef-46fd-bc4b-56847373ee36",
      "name": "Synthesis Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1376,
        736
      ],
      "parameters": {
        "text": "=You are a market research assistant.\n\nYour task is to synthesize all research inputs: {{ $json.output }} into a PM-ready decision memo.\n\nReturn a single JSON object in the exact format below:\n\n{\n  \"output\": {\n    \"executive_summary\": {\n      \"heading\": \"Executive Summary\",\n      \"content\": \"\"\n    },\n    \"market_opportunity\": {\n      \"heading\": \"Market Opportunity\",\n      \"content\": \"\"\n    },\n    \"customer_problem\": {\n      \"heading\": \"Customer Problem\",\n      \"content\": \"\"\n    },\n    \"competitive_landscape\": {\n      \"heading\": \"Competitive Landscape\",\n      \"content\": \"\"\n    },\n    \"key_risks_and_open_questions\": {\n      \"heading\": \"Key Risks & Open Questions\",\n      \"content\": \"\"\n    },\n    \"recommendation_next_steps\": {\n      \"heading\": \"Recommendation & Next Steps\",\n      \"content\": \"\"\n    }\n  }\n}\n\n",
        "options": {
          "batching": {
            "batchSize": 3,
            "delayBetweenBatches": 10
          },
          "systemMessage": "=You are a helpful assistant. You take all three inputs into consideration and produce only 1 item as output"
        },
        "promptType": "define"
      },
      "typeVersion": 3,
      "alwaysOutputData": true
    },
    {
      "id": "af928424-621b-48b5-b264-75ff8b3d1e23",
      "name": "Simple Memory4",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        1504,
        960
      ],
      "parameters": {},
      "typeVersion": 1.3
    },
    {
      "id": "c9719da8-9b51-4acf-8347-4a026094a995",
      "name": "Groq Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        -928,
        976
      ],
      "parameters": {
        "model": "qwen/qwen3-32b",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "fabbcb78-5d8b-491f-8753-51131f35d9df",
      "name": "Groq Chat Model2",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        80,
        400
      ],
      "parameters": {
        "model": "moonshotai/kimi-k2-instruct-0905",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "baf89ec4-9304-4e1e-9fed-8813c1c2c42e",
      "name": "Groq Chat Model3",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        96,
        864
      ],
      "parameters": {
        "model": "meta-llama/llama-4-maverick-17b-128e-instruct",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "986942bc-eba0-4d2e-a514-884116fb782c",
      "name": "Groq Chat Model4",
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "position": [
        96,
        1360
      ],
      "parameters": {
        "model": "moonshotai/kimi-k2-instruct-0905",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "d60e37e6-a43c-41f5-abfb-57511dc26695",
      "name": "Documentero",
      "type": "n8n-nodes-preview-documentero.documentero",
      "position": [
        1952,
        736
      ],
      "parameters": {
        "operation": "generateAndEmail"
      },
      "credentials": {},
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "98180ba8-767a-4a9d-869c-56e7f8bd1fc2",
      "name": "OpenAI Chat Model3",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1376,
        960
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "68f8df65-f188-4e84-9984-d3adc56f2ac6",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2176,
        736
      ],
      "webhookId": "75e00afe-f8bd-4c93-ad7c-b5d51e4a4db9",
      "parameters": {
        "sendTo": "user@example.com",
        "message": "Here is the requested doc",
        "options": {
          "attachmentsUi": {
            "attachmentsBinary": [
              {}
            ]
          }
        },
        "subject": "Market Research Output"
      },
      "typeVersion": 2.2
    },
    {
      "id": "e81f1d0a-4601-42ab-a245-e6cd48255bc5",
      "name": "Format Data for Documentero",
      "type": "n8n-nodes-base.code",
      "position": [
        1728,
        736
      ],
      "parameters": {
        "jsCode": "// Step 1: Get the first item from the agent\nlet rawOutput = $input.first().json.output;\n\n// Step 2: If output is a string (escaped JSON), parse it\nlet parsedOutput;\ntry {\n    parsedOutput = typeof rawOutput === 'string' ? JSON.parse(rawOutput).output : rawOutput;\n} catch (err) {\n    throw new Error(\"Failed to parse Synthesis Agent output: \" + err.message);\n}\n\n// Step 3: Initialize HTML report\nlet reportHtml = \"\";\n\n// Step 4: Define the sections in order\nconst sectionsOrder = [\n    \"executive_summary\",\n    \"market_opportunity\",\n    \"customer_problem\",\n    \"competitive_landscape\",\n    \"key_risks_and_open_questions\",\n    \"recommendation_next_steps\"\n];\n\n// Step 5: Build HTML report\nsectionsOrder.forEach(sectionKey => {\n    if (parsedOutput[sectionKey] && parsedOutput[sectionKey].content) {\n        const heading = parsedOutput[sectionKey].heading || sectionKey;\n        const content = parsedOutput[sectionKey].content;\n        reportHtml += `<h2>${heading}</h2>\\n<p>${content}</p>\\n`;\n    }\n});\n\n// Step 6: Return as single item for downstream nodes\nreturn [{\n    json: {\n        research_content_html: reportHtml.trim(),\n        title: \"Market Research Report\",\n        generated_date: new Date().toISOString().split('T')[0]\n    }\n}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "e944ade9-440d-4be6-9a77-c70f3584da55",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1968,
        480
      ],
      "parameters": {
        "width": 384,
        "height": 1408,
        "content": "## Description\nThis n8n template demonstrates how to build an AI-powered Market Research Assistant using a multi-agent workflow.\nIt helps you get a 360-degree view of a product idea or research topic by analysing:\n* Customer insights and pain points\n* Market size and macro/micro-economic trends\n* Competitive landscape and alternatives\nThe workflow mirrors how product managers and strategy teams conduct discovery — by breaking down research into parallel workstreams and then synthesizing insights into a single narrative.\n\n\n## How it works\n1. Planner Agent
The main agent receives your research topic as input and defines:\n    * Research objective\n    * Key areas of focus (Customer, Market, Competition)\n    * Assumptions and constraints\n2. Parallel Research Agents
Based on the planner’s output, three specialist agents run in parallel:\n    * Customer Insights Agent
Researches public sources such as articles and forums to infer customer behaviour, pain points, and existing tools.\n    * Market Scan Agent
Analyses macro-economic and micro-economic trends, estimates TAM/SAM/SOM, and highlights key risks and assumptions.\n    * Competitor Insights Agent
Identifies existing competitors and substitutes and summarises how they are positioned in the market.\n3. Synthesis Agent
The outputs from all research agents are consolidated and analysed by a synthesis agent, which produces a market discovery memo.\n4. Final Output
The discovery memo is generated as a document and sent to your email.\n\n\n## How to use\n* Trigger the workflow via the chat message node.\n* Provide your research topic or product idea, along with optional context such as target market.\n* The workflow runs automatically and delivers a structured discovery memo to your inbox.\n\n\n## Setup Steps\n* API credentials for:\n    * Groq or OpenAI (LLM)\n    * Documentero (document generation)\n* A configured Documentero template\n* Gmail OAuth or email credentials for delivery of memo\n"
      },
      "typeVersion": 1
    },
    {
      "id": "612032cd-a7c4-45d0-88ee-d0c5426945c2",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        560
      ],
      "parameters": {
        "color": 6,
        "height": 384,
        "content": "## User Input & Trigger\n\nThis section captures the research topic or product idea provided by the user.\nThe workflow is triggered manually via a chat message to make it easy to test and iterate during discovery."
      },
      "typeVersion": 1
    },
    {
      "id": "fd91dd79-35ef-4886-b474-cbcfd257f556",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        576
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 544,
        "content": "## Research Planning (Planner Agent)\n\nThe planner agent defines the scope of market research before any analysis begins.\nIt translates the user’s idea into clear research tasks and assumptions, ensuring that downstream agents work with structured and consistent inputs."
      },
      "typeVersion": 1
    },
    {
      "id": "f5177dba-5bda-458d-8d1f-111e85e87e06",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1040,
        512
      ],
      "parameters": {
        "color": 5,
        "width": 608,
        "height": 592,
        "content": "## Insight Synthesis & Decision Memo\n\nOutputs from all research agents are consolidated and analysed in this section.\nThe synthesis agent focuses on producing a decision-ready discovery memo rather than raw AI output, highlighting key insights, risks, and next steps."
      },
      "typeVersion": 1
    },
    {
      "id": "ae2d01a2-85b8-4f15-bfcc-130b0017d46f",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        576
      ],
      "parameters": {
        "color": 3,
        "width": 688,
        "height": 384,
        "content": "## Document Generation & Delivery\n\nThe final discovery memo is converted into a document and delivered via email.\nThis step demonstrates how AI-generated insights can be operationalised into real PM or strategy workflows."
      },
      "typeVersion": 1
    },
    {
      "id": "beb9881f-7507-455f-9a13-458151a0ee39",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "color": 4,
        "width": 528,
        "height": 1504,
        "content": "## Parallel Market Research Agents\n\nThis section runs specialist research agents in parallel to reduce latency and avoid unnecessary dependencies.\nEach agent focuses on a single dimension of discovery (market, customers, or competitors) and works independently based on the planner’s instructions."
      },
      "typeVersion": 1
    },
    {
      "parameters": {
        "operation": "verify",
        "email": "={{ $json.email || $json.Email }}",
        "additionalOptions": {}
      },
      "type": "n8n-nodes-billionverify.billionVerify",
      "typeVersion": 1,
      "position": [
        1816,
        736
      ],
      "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": [
        1996,
        736
      ],
      "name": "IF deliverable"
    }
  ],
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Synthesis Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Documentero": {
      "main": [
        [
          {
            "node": "Verify Email (BillionVerify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Planner Agent": {
      "main": [
        [
          {
            "node": "Market Scan Agent",
            "type": "main",
            "index": 0
          },
          {
            "node": "Competitor Insights Agent",
            "type": "main",
            "index": 0
          },
          {
            "node": "Customer Insights Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Planner Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory1": {
      "ai_memory": [
        [
          {
            "node": "Customer Insights Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory2": {
      "ai_memory": [
        [
          {
            "node": "Market Scan Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory3": {
      "ai_memory": [
        [
          {
            "node": "Competitor Insights Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory4": {
      "ai_memory": [
        [
          {
            "node": "Synthesis Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Synthesis Agent": {
      "main": [
        [
          {
            "node": "Format Data for Documentero",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Planner Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "Customer Insights Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model3": {
      "ai_languageModel": [
        [
          {
            "node": "Market Scan Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model4": {
      "ai_languageModel": [
        [
          {
            "node": "Competitor Insights Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Market Scan Agent": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "OpenAI Chat Model3": {
      "ai_languageModel": [
        [
          {
            "node": "Synthesis Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Customer Insights Agent": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Competitor Insights Agent": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Structured Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "Planner Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser2": {
      "ai_outputParser": [
        [
          {
            "node": "Customer Insights Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser3": {
      "ai_outputParser": [
        [
          {
            "node": "Market Scan Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser4": {
      "ai_outputParser": [
        [
          {
            "node": "Competitor Insights Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "Planner Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Data for Documentero": {
      "main": [
        [
          {
            "node": "Documentero",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Email (BillionVerify)": {
      "main": [
        [
          {
            "node": "IF deliverable",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF deliverable": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    }
  },
  "settings": {
    "callerPolicy": "workflowsFromSameOwner",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v1"
  }
}

Workflow templates with Documentero

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

How it works

  1. 1

    Set up BillionVerify alongside Documentero via the n8n community node, Integrately, or the REST API — no custom code required for the first two options.

  2. 2

    When new data enters your document pipeline, extract the recipient email and send it to BillionVerify.

  3. 3

    Receive a structured result indicating whether the address is valid, invalid, disposable, a role account, or a catch-all.

  4. 4

    Branch your automation: generate and send the document for valid addresses, log or skip invalid ones.

  5. 5

    Review flagged addresses in your CRM or spreadsheet so upstream data collection can be improved.

When to use this

Gate document generation on email validity

Before Documentero processes a template, check the recipient email with BillionVerify. Skip generation entirely for invalid or undeliverable addresses, saving processing time and preventing bounce events downstream.

Validate emails from connected data sources

Documentero pulls data from spreadsheets, CRMs, and forms. Verify email columns from those sources with BillionVerify before each batch run to ensure the entire dataset is clean, not just individual addresses.

FAQ

How quickly does BillionVerify return results for Documentero workflows?

Single-address verification typically returns in under a second, making it practical to verify inline before triggering document generation. Bulk jobs are processed asynchronously for large datasets.

Do I need coding skills to connect BillionVerify with Documentero?

Not necessarily. The Integrately 1-click connector and n8n visual workflow builder both require no custom code. The REST API is available for developers who want deeper control.

What counts as an invalid email for Documentero purposes?

BillionVerify flags addresses with invalid syntax, non-existent mailboxes, known disposable-email domains, and role accounts such as noreply@ or admin@. Each category can be handled separately in your workflow logic.

Verify emails in Documentero

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

Get started free