Stripe email verification with BillionVerify
Stripe is the payments infrastructure behind millions of businesses, handling subscriptions, one-time purchases, and billing. BillionVerify integrates with Stripe workflows to validate customer email addresses at checkout or signup, reducing failed communications and keeping billing records accurate.
Why verify before the send
A wrong email at checkout means failed receipts, missed subscription renewal notices, and customers who can't recover their accounts. BillionVerify validates email addresses before or immediately after they enter Stripe, catching typos, disposable accounts, and invalid domains before they cause billing problems.
Ready-to-use n8n workflow
Import this workflow into n8n โ it verifies every address with BillionVerify before Stripe sends, so only deliverable contacts are emailed. Install the BillionVerify community node first, then add your API key. Adapted from this n8n template
{
"name": "Automated event management with Typeform, Stripe, Google tools & Slack notifications + BillionVerify",
"nodes": [
{
"id": "7c944a05-dc18-4966-875e-f101544e3597",
"name": "Typeform Registration Form",
"type": "n8n-nodes-base.typeformTrigger",
"position": [
0,
0
],
"webhookId": "baa3faaf-3d23-45ca-89b6-b2f399fb6899",
"parameters": {
"formId": "<__PLACEHOLDER_VALUE__Typeform Form ID__>"
},
"typeVersion": 1.1
},
{
"id": "b4c828ad-aae3-4131-9383-165702e353e4",
"name": "Workflow Configuration",
"type": "n8n-nodes-base.set",
"position": [
224,
0
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "id-1",
"name": "eventName",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Event Name__>"
},
{
"id": "id-2",
"name": "eventDate",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Event Date (YYYY-MM-DD)__>"
},
{
"id": "id-3",
"name": "eventTime",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Event Time__>"
},
{
"id": "id-4",
"name": "eventLocation",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Event Location__>"
},
{
"id": "id-5",
"name": "participationFee",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Participation Fee Amount__>"
},
{
"id": "id-6",
"name": "reminderDaysBefore",
"type": "number",
"value": 3
},
{
"id": "id-7",
"name": "followupDaysAfter",
"type": "number",
"value": 2
},
{
"id": "id-8",
"name": "organizerSlackChannel",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Slack Channel ID__>"
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "d2e4b2da-73e2-485c-82c7-1f41d6b9a4f4",
"name": "Add to Participant List",
"type": "n8n-nodes-base.googleSheets",
"position": [
448,
0
],
"parameters": {
"columns": {
"value": {
"Name": "={{ $json.name }}",
"Email": "={{ $json.email }}",
"Phone": "={{ $json.phone }}",
"Event Date": "={{ $('Workflow Configuration').first().json.eventDate }}",
"Event Name": "={{ $('Workflow Configuration').first().json.eventName }}",
"Payment Status": "Pending",
"Registration Date": "={{ $now.toISO() }}"
},
"schema": [
{
"id": "Name",
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"required": false,
"displayName": "Email",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Registration Date",
"required": false,
"displayName": "Registration Date",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Event Name",
"required": false,
"displayName": "Event Name",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Event Date",
"required": false,
"displayName": "Event Date",
"defaultMatch": false,
"canBeUsedToMatch": false
},
{
"id": "Payment Status",
"required": false,
"displayName": "Payment Status",
"defaultMatch": false,
"canBeUsedToMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
]
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "<__PLACEHOLDER_VALUE__Sheet Name (e.g., Participants)__>"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "<__PLACEHOLDER_VALUE__Google Sheets Document ID__>"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "credential-id",
"name": "googleSheetsOAuth2Api Credential"
}
},
"typeVersion": 4.7
},
{
"id": "0847f022-be9a-4137-95cb-291f6f1608e9",
"name": "Process Payment",
"type": "n8n-nodes-base.stripe",
"position": [
672,
0
],
"parameters": {
"amount": "={{ $('Workflow Configuration').first().json.participationFee * 100 }}",
"source": "<__PLACEHOLDER_VALUE__Source ID__>",
"currency": "jpy",
"resource": "charge",
"operation": "create",
"customerId": "<__PLACEHOLDER_VALUE__Customer ID__>",
"additionalFields": {
"metadata": {
"metadataProperties": [
{
"key": "participant_email",
"value": "={{ $json.email }}"
},
{
"key": "participant_name",
"value": "={{ $json.name }}"
},
{
"key": "event_name",
"value": "={{ $('Workflow Configuration').first().json.eventName }}"
}
]
},
"description": "={{ 'Event Registration: ' + $('Workflow Configuration').first().json.eventName }}"
}
},
"typeVersion": 1
},
{
"id": "5d2c0d4e-5f4e-4659-9467-575667f47c0b",
"name": "Check Payment Status",
"type": "n8n-nodes-base.if",
"position": [
896,
0
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "id-1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "succeeded"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e2462463-af2a-445c-b526-efcce51b9b18",
"name": "Send Confirmation Email",
"type": "n8n-nodes-base.gmail",
"position": [
1136,
-96
],
"webhookId": "8731cfaf-f3fb-46aa-923e-ce0a23184d70",
"parameters": {
"sendTo": "={{ $('Typeform Registration Form').first().json.email }}",
"message": "=<h2>ใ็ป้ฒใใใใจใใใใใพใ</h2><p>{{ $('Typeform Registration Form').first().json.name }} ๆง</p><p>{{ $('Workflow Configuration').first().json.eventName }} ใธใฎใ็ป้ฒใๅฎไบใใพใใใ</p><p><strong>ใคใใณใ่ฉณ็ดฐ:</strong></p><ul><li>ๆฅๆ: {{ $('Workflow Configuration').first().json.eventDate }} {{ $('Workflow Configuration').first().json.eventTime }}</li><li>ๅ ดๆ: {{ $('Workflow Configuration').first().json.eventLocation }}</li></ul><p>ๅฝๆฅใไผใใงใใใใจใๆฅฝใใฟใซใใฆใใใพใใ</p>",
"options": {},
"subject": "={{ 'ใคใใณใๅๅ ็ขบ่ช: ' + $('Workflow Configuration').first().json.eventName }}"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "gmailOAuth2 Credential"
}
},
"typeVersion": 2.1
},
{
"id": "e63d3572-bc39-4a7a-aa8c-2840ccc46c18",
"name": "Add to Calendar",
"type": "n8n-nodes-base.googleCalendar",
"position": [
1360,
-96
],
"parameters": {
"end": "={{ DateTime.fromISO($('Workflow Configuration').first().json.eventDate + 'T' + $('Workflow Configuration').first().json.eventTime).plus({ hours: 2 }).toISO() }}",
"start": "={{ $('Workflow Configuration').first().json.eventDate + 'T' + $('Workflow Configuration').first().json.eventTime }}",
"calendar": {
"__rl": true,
"mode": "id",
"value": "primary"
},
"additionalFields": {
"summary": "={{ $('Workflow Configuration').first().json.eventName }}",
"location": "={{ $('Workflow Configuration').first().json.eventLocation }}",
"description": "={{ 'Participant: ' + $('Typeform Registration Form').first().json.name }}"
}
},
"credentials": {
"googleCalendarOAuth2Api": {
"id": "credential-id",
"name": "googleCalendarOAuth2Api Credential"
}
},
"typeVersion": 1.3
},
{
"id": "b5c019f2-6e53-4348-adbf-1962574e9568",
"name": "Notify Organizer",
"type": "n8n-nodes-base.slack",
"position": [
1584,
-96
],
"webhookId": "bc4122aa-5c01-489d-a173-99dd915e0212",
"parameters": {
"text": "={{ '๐ ๆฐ่ฆๅๅ ่
็ป้ฒ\nๅๅ: ' + $('Typeform Registration Form').first().json.name + '\nใกใผใซ: ' + $('Typeform Registration Form').first().json.email + '\nใคใใณใ: ' + $('Workflow Configuration').first().json.eventName }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Configuration').first().json.organizerSlackChannel }}"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"id": "credential-id",
"name": "slackOAuth2Api Credential"
}
},
"typeVersion": 2.3
},
{
"id": "657ee013-6bca-4659-be15-1470fccb5b7f",
"name": "Daily Reminder Check",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
224
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "f4f8d33b-3f41-42d5-99f1-3c721bb1af0d",
"name": "Get Upcoming Events",
"type": "n8n-nodes-base.googleSheets",
"position": [
224,
224
],
"parameters": {
"options": {
"returnFirstMatch": false
},
"filtersUI": {
"values": [
{
"lookupValue": "succeeded",
"lookupColumn": "Payment Status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "<__PLACEHOLDER_VALUE__Sheet Name (e.g., Participants)__>"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "<__PLACEHOLDER_VALUE__Google Sheets Document ID (same as registration)__>"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "credential-id",
"name": "googleSheetsOAuth2Api Credential"
}
},
"typeVersion": 4.7
},
{
"id": "86f23720-e55e-492e-87ba-3b4a961565d7",
"name": "Calculate Reminder Date",
"type": "n8n-nodes-base.dateTime",
"position": [
448,
224
],
"parameters": {
"options": {},
"duration": "={{ $('Workflow Configuration').first().json.reminderDaysBefore }}",
"magnitude": "={{ $json['Event Date'] }}",
"operation": "subtractFromDate"
},
"typeVersion": 2
},
{
"id": "feb98889-9ac8-41cb-bbb1-ef6a26eb3b76",
"name": "Check If Reminder Needed",
"type": "n8n-nodes-base.if",
"position": [
672,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "id-1",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $now.toFormat('yyyy-MM-dd') }}",
"rightValue": "={{ $json.output }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "07b2d002-cb41-4228-b46f-fada104e2bf1",
"name": "Send Reminder Email",
"type": "n8n-nodes-base.gmail",
"position": [
1392,
256
],
"webhookId": "696b628c-3be0-432e-93e3-67c9e0c2ab34",
"parameters": {
"sendTo": "={{ $json.Email }}",
"message": "=<h2>ใคใใณใใชใใคใณใใผ</h2><p>{{ $json.Name }} ๆง</p><p>{{ $json['Event Name'] }} ใฎ้ๅฌใ่ฟใฅใใฆใพใใใพใใใ</p><p><strong>ใคใใณใ่ฉณ็ดฐ:</strong></p><ul><li>ๆฅๆ: {{ $json['Event Date'] }} {{ $('Workflow Configuration').first().json.eventTime }}</li><li>ๅ ดๆ: {{ $('Workflow Configuration').first().json.eventLocation }}</li></ul><p>ใๅฟใใชใใๅๅ ใใ ใใใ</p>",
"options": {},
"subject": "={{ 'ใชใใคใณใใผ: ' + $json['Event Name'] + ' ใ้ใใชใ้ๅฌใใใพใ' }}"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "gmailOAuth2 Credential"
}
},
"typeVersion": 2.1
},
{
"id": "b71cafb3-d90f-4817-a9b5-6f48bd3110da",
"name": "Daily Follow-up Check",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
0,
448
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 10
}
]
}
},
"typeVersion": 1.2
},
{
"id": "ac113bc3-20d2-455f-b042-de09ad00c333",
"name": "Get Past Events",
"type": "n8n-nodes-base.googleSheets",
"position": [
224,
448
],
"parameters": {
"options": {
"returnFirstMatch": false
},
"filtersUI": {
"values": [
{
"lookupValue": "succeeded",
"lookupColumn": "Payment Status"
},
{
"lookupColumn": "Follow-up Sent"
}
]
},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "<__PLACEHOLDER_VALUE__Sheet Name (e.g., Participants)__>"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "<__PLACEHOLDER_VALUE__Google Sheets Document ID (same as registration)__>"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "credential-id",
"name": "googleSheetsOAuth2Api Credential"
}
},
"typeVersion": 4.7
},
{
"id": "238e21d8-5ef5-4f41-8c24-969b0db3f66f",
"name": "Calculate Follow-up Date",
"type": "n8n-nodes-base.dateTime",
"position": [
448,
448
],
"parameters": {
"options": {},
"duration": "={{ $('Workflow Configuration').first().json.followupDaysAfter }}",
"magnitude": "={{ $json['Event Date'] }}",
"operation": "addToDate"
},
"typeVersion": 2
},
{
"id": "ac0142fc-af2f-4e01-8090-303f02b3fca0",
"name": "Check If Follow-up Needed",
"type": "n8n-nodes-base.if",
"position": [
672,
448
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "id-1",
"operator": {
"type": "string",
"operation": "gte"
},
"leftValue": "={{ $now.toFormat('yyyy-MM-dd') }}",
"rightValue": "={{ $json.output }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "9f776c37-6551-4f18-a046-c3dc59a53fe9",
"name": "Send Thank You & Survey",
"type": "n8n-nodes-base.gmail",
"position": [
912,
624
],
"webhookId": "0414943d-a2c0-442c-abc2-3165206f299e",
"parameters": {
"sendTo": "={{ $json.Email }}",
"message": "=<h2>ใๅๅ ใใใใจใใใใใพใใ</h2><p>{{ $json.Name }} ๆง</p><p>{{ $json['Event Name'] }} ใธใฎใๅๅ ใ่ช ใซใใใใจใใใใใพใใใ</p><p>ไปๅพใฎใคใใณใๆนๅใฎใใใ็ฐกๅใชใขใณใฑใผใใซใๅๅใใใ ใใพใใจๅนธใใงใใ</p><p><a href=\"<__PLACEHOLDER_VALUE__Survey URL__>\">ใขใณใฑใผใใซๅ็ญใใ</a></p><p>ใพใใฎใๅๅ ใใๅพ
ใกใใฆใใใพใใ</p>",
"options": {},
"subject": "={{ 'ใใใใจใใใใใพใใ: ' + $json['Event Name'] }}"
},
"credentials": {
"gmailOAuth2": {
"id": "credential-id",
"name": "gmailOAuth2 Credential"
}
},
"typeVersion": 2.1
},
{
"id": "22af0070-2118-4523-841c-533531700257",
"name": "Update Follow-up Status",
"type": "n8n-nodes-base.googleSheets",
"position": [
1120,
624
],
"parameters": {
"columns": {
"value": {
"Follow-up Date": "={{ $now.toISO() }}",
"Follow-up Sent": "Yes"
},
"schema": [
{
"id": "Email",
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Sent",
"required": false,
"displayName": "Follow-up Sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Follow-up Date",
"required": false,
"displayName": "Follow-up Date",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Email"
]
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "<__PLACEHOLDER_VALUE__Sheet Name (e.g., Participants)__>"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "<__PLACEHOLDER_VALUE__Google Sheets Document ID (same as registration)__>"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "credential-id",
"name": "googleSheetsOAuth2Api Credential"
}
},
"typeVersion": 4.7
},
{
"id": "42f7eaec-aa5a-4ee2-8d79-70bbbf8a73b0",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1744,
-416
],
"parameters": {
"width": 944,
"height": 1504,
"content": "## Event Participant Management and Automated Follow-up System\n**\n### Who is this for?\n\nThis template is ideal for event organizers, community managers, and businesses that host workshops, webinars, conferences, or any event requiring participant registration and communication.\n\n### How it works\n\nThe workflow is divided into three main parts:\n\n1. **Registration and Onboarding:**\n * When a new participant registers via a Typeform, their details are immediately added to a Google Sheet.\n * Payment is processed via Stripe.\n * Upon successful payment, a confirmation email is sent to the participant, and the event is added to their Google Calendar.\n * The organizer receives a Slack notification about the new registration.\n\n2. **Event Reminders:**\n * A daily scheduled trigger checks the Google Sheet for upcoming events.\n * It calculates if an event is within the specified reminder period (e.g., 3 days before).\n * If a reminder is needed, an email is automatically sent to the participant.\n\n3. **Post-Event Follow-up:**\n * Another daily scheduled trigger checks for past events.\n * It calculates if an event is due for a follow-up (e.g., 2 days after).\n * A thank-you email, including a survey link, is sent to participants.\n * The participant's status in the Google Sheet is updated to mark the follow-up as sent.\n\n### How to set it up\n\n1. **Typeform Registration Form:** Replace `<__PLACEHOLDER_VALUE__Typeform Form ID__>` with your actual Typeform ID.\n2. **Workflow Configuration:** Fill in the placeholder values for `Event Name`, `Event Date`, `Event Time`, `Event Location`, `Participation Fee Amount`, and `Slack Channel ID`.\n3. **Google Sheets:**\n * Replace `<__PLACEHOLDER_VALUE__Google Sheets Document ID__>` and `<__PLACEHOLDER_VALUE__Sheet Name (e.g., Participants)__>` with your Google Sheet details. Ensure your sheet has columns for \"Name\", \"Email\", \"Phone\", \"Registration Date\", \"Event Name\", \"Event Date\", \"Payment Status\", \"Follow-up Sent\", and \"Follow-up Date\".\n * You will need to set up Google Sheets OAuth2 API credentials.\n4. **Stripe (Process Payment):** Replace `<__PLACEHOLDER_VALUE__Customer ID__>` and `<__PLACEHOLDER_VALUE__Source ID__>` with your Stripe customer and source IDs. You will need Stripe API credentials.\n5. **Gmail (Send Confirmation Email, Send Reminder Email, Send Thank You & Survey):** You will need to set up Gmail OAuth2 credentials.\n6. **Google Calendar (Add to Calendar):** You will need to set up Google Calendar OAuth2 API credentials.\n7. **Slack (Notify Organizer):** Replace `<__PLACEHOLDER_VALUE__Slack Channel ID__>` (if not already set in Workflow Configuration) and set up Slack OAuth2 API credentials.\n8. **Survey URL (Send Thank You & Survey):** Replace `<__PLACEHOLDER_VALUE__Survey URL__>` with the link to your post-event survey.\n\n### Requirements\n\n* Typeform account and a registration form.\n* Google Sheet for participant management.\n* Stripe account for payment processing.\n* Gmail account for sending emails.\n* Google Calendar for event scheduling.\n* Slack account for organizer notifications.\n* n8n credentials for Google Sheets, Stripe, Gmail, Google Calendar, and Slack.\n\n### How to customize the workflow\n\n* **Reminder/Follow-up Timing:** Adjust the `reminderDaysBefore` and `followupDaysAfter` values in the \"Workflow Configuration\" node to change when reminder and follow-up emails are sent.\n* **Email Content:** Modify the HTML content in the \"Send Confirmation Email\", \"Send Reminder Email\", and \"Send Thank You & Survey\" nodes to match your branding and messaging.\n* **Payment Currency:** Change the `currency` in the \"Process Payment\" node if your event uses a different currency.\n* **Additional Data:** Extend the Google Sheets nodes to capture more participant information from Typeform if needed.\n* **Integration:** Easily integrate with other services by adding more nodes, for example, a CRM to add new participants as leads.\n`"
},
"typeVersion": 1
},
{
"id": "63c03b4f-0fd4-44e7-b220-f38b1edd266f",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-192
],
"parameters": {
"color": 3,
"width": 640,
"height": 784,
"content": "## Registration and Onboarding\n ใ* When a new participant registers via a Typeform, their details are immediately added to a Google Sheet.\n * Payment is processed via Stripe.\n * Upon successful payment, a confirmation email is sent to the participant, and the event is added to their Google Calendar.\n * The organizer receives a Slack notification about the new registration."
},
"typeVersion": 1
},
{
"id": "a6e75768-514e-498a-9f45-2ea5f9bfdede",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
432
],
"parameters": {
"color": 4,
"width": 448,
"height": 368,
"content": "## Post-Event Follow-up \n ใ* Another daily scheduled trigger checks for past events.\n * It calculates if an event is due for a follow-up (e.g., 2 days after).\n * A thank-you email, including a survey link, is sent to participants.\n * The participant's status in the Google Sheet is updated to mark the follow-up as sent.\n"
},
"typeVersion": 1
},
{
"id": "4f61bb8e-5bff-4dbd-abbc-0b5ef624bc6f",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
64
],
"parameters": {
"color": 6,
"width": 368,
"height": 336,
"content": "## Event Reminders \n** * A daily scheduled trigger checks the Google Sheet for upcoming events.\n * It calculates if an event is within the specified reminder period (e.g., 3 days before).\n * If a reminder is needed, an email is automatically sent to the participant."
},
"typeVersion": 1
},
{
"parameters": {
"operation": "verify",
"email": "={{ $('Typeform Registration Form').first().json.email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
776,
-96
],
"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": [
956,
-96
],
"name": "IF deliverable"
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
1032,
256
],
"name": "Verify Email (BillionVerify) 2",
"credentials": {
"billionVerifyApi": {
"id": "",
"name": "BillionVerify account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "is-deliverable",
"leftValue": "={{ $json.is_deliverable }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1212,
256
],
"name": "IF deliverable 2"
},
{
"parameters": {
"operation": "verify",
"email": "={{ $json.Email }}",
"additionalOptions": {}
},
"type": "n8n-nodes-billionverify.billionVerify",
"typeVersion": 1,
"position": [
552,
624
],
"name": "Verify Email (BillionVerify) 3",
"credentials": {
"billionVerifyApi": {
"id": "",
"name": "BillionVerify account"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "is-deliverable",
"leftValue": "={{ $json.is_deliverable }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
]
}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
732,
624
],
"name": "IF deliverable 3"
}
],
"connections": {
"Add to Calendar": {
"main": [
[
{
"node": "Notify Organizer",
"type": "main",
"index": 0
}
]
]
},
"Get Past Events": {
"main": [
[
{
"node": "Calculate Follow-up Date",
"type": "main",
"index": 0
}
]
]
},
"Process Payment": {
"main": [
[
{
"node": "Check Payment Status",
"type": "main",
"index": 0
}
]
]
},
"Get Upcoming Events": {
"main": [
[
{
"node": "Calculate Reminder Date",
"type": "main",
"index": 0
}
]
]
},
"Check Payment Status": {
"main": [
[
{
"node": "Verify Email (BillionVerify)",
"type": "main",
"index": 0
}
]
]
},
"Daily Reminder Check": {
"main": [
[
{
"node": "Get Upcoming Events",
"type": "main",
"index": 0
}
]
]
},
"Daily Follow-up Check": {
"main": [
[
{
"node": "Get Past Events",
"type": "main",
"index": 0
}
]
]
},
"Workflow Configuration": {
"main": [
[
{
"node": "Add to Participant List",
"type": "main",
"index": 0
}
]
]
},
"Add to Participant List": {
"main": [
[
{
"node": "Process Payment",
"type": "main",
"index": 0
}
]
]
},
"Calculate Reminder Date": {
"main": [
[
{
"node": "Check If Reminder Needed",
"type": "main",
"index": 0
}
]
]
},
"Send Confirmation Email": {
"main": [
[
{
"node": "Add to Calendar",
"type": "main",
"index": 0
}
]
]
},
"Send Thank You & Survey": {
"main": [
[
{
"node": "Update Follow-up Status",
"type": "main",
"index": 0
}
]
]
},
"Calculate Follow-up Date": {
"main": [
[
{
"node": "Check If Follow-up Needed",
"type": "main",
"index": 0
}
]
]
},
"Check If Reminder Needed": {
"main": [
[
{
"node": "Verify Email (BillionVerify) 2",
"type": "main",
"index": 0
}
]
]
},
"Check If Follow-up Needed": {
"main": [
[
{
"node": "Verify Email (BillionVerify) 3",
"type": "main",
"index": 0
}
]
]
},
"Typeform Registration Form": {
"main": [
[
{
"node": "Workflow Configuration",
"type": "main",
"index": 0
}
]
]
},
"Verify Email (BillionVerify)": {
"main": [
[
{
"node": "IF deliverable",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable": {
"main": [
[
{
"node": "Send Confirmation Email",
"type": "main",
"index": 0
}
],
[]
]
},
"Verify Email (BillionVerify) 2": {
"main": [
[
{
"node": "IF deliverable 2",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable 2": {
"main": [
[
{
"node": "Send Reminder Email",
"type": "main",
"index": 0
}
],
[]
]
},
"Verify Email (BillionVerify) 3": {
"main": [
[
{
"node": "IF deliverable 3",
"type": "main",
"index": 0
}
]
]
},
"IF deliverable 3": {
"main": [
[
{
"node": "Send Thank You & Survey",
"type": "main",
"index": 0
}
],
[]
]
}
},
"settings": {
"executionOrder": "v1"
}
}Workflow templates with Stripe
Ready-to-use workflows that verify emails before Stripe sends.
How it works
- 1
Listen for Stripe webhook events โ such as customer.created or checkout.session.completed โ using an n8n workflow.
- 2
Extract the customer email from the event payload and pass it to BillionVerify via the community node or REST API.
- 3
BillionVerify returns a verdict: valid, invalid, disposable, role, or catch-all.
- 4
Based on the result, update the Stripe customer with metadata tags or trigger a follow-up action such as an email confirmation request.
- 5
Optionally block or flag order completion for addresses that fail a minimum quality threshold.
When to use this
Checkout email validation
Before a customer is created in Stripe, verify their email with BillionVerify. Reject or flag disposable and clearly invalid addresses at the point of purchase to prevent account fraud and receipt failures.
Subscription lifecycle communications
Use a webhook-triggered workflow to verify customer emails when a new subscription starts, ensuring renewal reminders and failed-payment alerts reach a real inbox.
FAQ
Can I reject a checkout if the email is invalid?
BillionVerify works best as a pre-checkout check on your own form before Stripe is called, or as a post-creation review that flags the customer record for follow-up.
Why does email quality matter for a payments tool?
Stripe sends receipts, subscription alerts, and failed-payment notices by email. If the address is invalid, those communications fail silently, leading to churn and unresolved billing issues.
Does BillionVerify detect disposable email addresses used for free trials?
Yes. BillionVerify maintains a database of thousands of disposable and temporary email providers, flagging them so you can block or restrict trial signups from those addresses.
Will verification slow down the checkout experience?
Single-address checks typically return in under a second. For pre-checkout validation, this is imperceptible to the user while still catching bad addresses before they enter your system.
Verify emails in Stripe
Create a free account, grab your API key, and stop bounces before they happen.
Get started free