Automated event management with Typeform, Stripe, Google tools & Slack notifications
Pull contacts, verify each address with BillionVerify, and continue to Stripe — 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 Stripe step removes that risk automatically — only deliverable addresses continue, the rest are flagged.
The workflow
BillionVerify — verification sits right before the send.
Node by node
- 1Typeform Registration FormTrigger· n8n
Starts the workflow — on a schedule, a webhook, or manually while you test.
- 2Daily Reminder CheckTrigger· n8n
Starts the workflow — on a schedule, a webhook, or manually while you test.
- 3Daily Follow-up CheckTrigger· n8n
Starts the workflow — on a schedule, a webhook, or manually while you test.
- 4Workflow ConfigurationSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 5Get Upcoming EventsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 6Get Past EventsSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 7Add to Participant ListSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 8Calculate Reminder DateSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 9Calculate Follow-up DateSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 10Process PaymentSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 11Check If Reminder NeededLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 12Check If Follow-up NeededLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 13Check Payment StatusLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 14Verify Email (BillionVerify) 2Verify· 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.
- 15Verify Email (BillionVerify) 3Verify· 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.
- 16Verify 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.
- 17IF deliverable 2Logic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 18IF deliverable 3Logic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 19IF deliverableLogic· n8n
Branches on the verification result: only deliverable addresses continue to the send; the rest are skipped and flagged.
- 20Send Reminder EmailSend· n8n
Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.
- 21Send Thank You & SurveySend· n8n
Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.
- 22Send Confirmation EmailSend· n8n
Sends only to verified, deliverable addresses. Swap in your own provider node if you send elsewhere.
- 23Update Follow-up StatusSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 24Add to CalendarSource· n8n
Provides or transforms the contact data flowing through the workflow.
- 25Notify OrganizerSource· n8n
Provides or transforms the contact data flowing through the workflow.
Workflow JSON
Copy or download this workflow, then import it in n8n (Workflows → Import from File / Paste). Install the BillionVerify community node first, then add your API key credential.
{
"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"
}
}When to use this
- Cleaning a list before a Stripe send or sync.
- Protecting Stripe deliverability and sender reputation.
- Keeping bounce rates low so your sending is never throttled.
FAQ
Why verify before sending in Stripe?
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