This workflow corresponds to n8n.io template #13843 — we link there as the canonical source.
This workflow follows the Emailsend → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "UISyAvsCmmnO2Luf",
"name": "Participant Re-engager for Event Registration TEMPLATE",
"tags": [],
"nodes": [
{
"id": "c2cf5909-9f0b-434d-b67c-4feb97cf5a22",
"name": "Start Alumni Campaign",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1184,
512
],
"parameters": {},
"typeVersion": 1
},
{
"id": "fce39914-0ad4-4e61-8c2e-82245aa11c38",
"name": "Set Campaign Config",
"type": "n8n-nodes-base.set",
"position": [
-976,
512
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cfg-1",
"name": "event_id",
"type": "string",
"value": "vivatech-2026"
},
{
"id": "cfg-2",
"name": "event_name",
"type": "string",
"value": "VivaTech 2026"
},
{
"id": "cfg-3",
"name": "event_date",
"type": "string",
"value": "June 11-14, 2026"
},
{
"id": "cfg-4",
"name": "reg_url",
"type": "string",
"value": "PLACEHOLDER_REG_URL"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "cd3546b4-ff76-4eea-bcf1-13f6cac0da8b",
"name": "Fetch Past Attendees from HubSpot",
"type": "n8n-nodes-base.httpRequest",
"position": [
-624,
512
],
"parameters": {
"url": "https://api.hubapi.com/crm/v3/objects/contacts/search",
"method": "POST",
"options": {
"timeout": 15000
},
"jsonBody": "{\n \"filterGroups\": [\n {\n \"filters\": [\n {\n \"propertyName\": \"event_registration\",\n \"operator\": \"HAS_PROPERTY\"\n }\n ]\n }\n ],\n \"properties\": [\n \"email\", \"firstname\", \"lastname\", \"company\",\n \"event_registration\", \"lifecyclestage\",\n \"jobtitle\", \"industry\", \"city\", \"country\",\n \"hs_lead_status\", \"num_associated_deals\"\n ],\n \"limit\": 100,\n \"after\": 0\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2,
"continueOnFail": true
},
{
"id": "90157f85-0085-4868-9fb8-881a5f191605",
"name": "Filter Already Registered",
"type": "n8n-nodes-base.code",
"position": [
-416,
512
],
"parameters": {
"jsCode": "// Filter out alumni who already registered for the current event\nconst response = $input.first().json;\nconst contacts = response.results || [];\nconst eventId = $('Set Campaign Config').first().json.event_id;\n\nif (contacts.length === 0) {\n return [{ json: { empty: true, message: 'No past attendees found in HubSpot' } }];\n}\n\nconst eligible = contacts.filter(contact => {\n const props = contact.properties || {};\n const pastEvents = (props.event_registration || '').toLowerCase();\n\n // Skip if already registered for current event\n if (pastEvents.includes(eventId.toLowerCase())) return false;\n\n // Must have an email\n if (!props.email) return false;\n\n return true;\n});\n\nif (eligible.length === 0) {\n return [{ json: { empty: true, message: 'All past attendees already registered for ' + eventId } }];\n}\n\n// Normalize HubSpot contact data for downstream nodes\nreturn eligible.map(contact => {\n const p = contact.properties || {};\n return {\n json: {\n hubspot_id: contact.id,\n email: p.email,\n first_name: p.firstname || '',\n last_name: p.lastname || '',\n company: p.company || '',\n role: p.jobtitle || '',\n industry: p.industry || '',\n location: [p.city, p.country].filter(Boolean).join(', '),\n events_attended: p.event_registration || '',\n lifecycle_stage: p.lifecyclestage || '',\n lead_status: p.hs_lead_status || '',\n deals_count: parseInt(p.num_associated_deals || '0', 10)\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "e27854e8-6a33-463c-9c98-e06b0ed1c433",
"name": "Has Eligible Alumni?",
"type": "n8n-nodes-base.if",
"position": [
-224,
512
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "boolean",
"operation": "notEquals"
},
"leftValue": "={{ $json.empty }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.2
},
{
"id": "3d7e5f19-01c1-4f86-be25-b8914a1e0c2c",
"name": "Segment Alumni by Engagement",
"type": "n8n-nodes-base.code",
"position": [
48,
512
],
"parameters": {
"jsCode": "// Segment alumni by engagement level (using HubSpot data)\nconst alumni = $input.all();\n\nreturn alumni.map(a => {\n const d = a.json;\n\n // Count past events from the event_registration property (comma-separated)\n const eventsAttended = (d.events_attended || '').split(',').map(s => s.trim()).filter(Boolean);\n const eventsCount = eventsAttended.length;\n\n // Segment by attendance history + deal activity\n let segment = 'one-timer';\n if (eventsCount >= 3 || d.deals_count >= 2) segment = 'champion';\n else if (eventsCount >= 2) segment = 'returning';\n\n return {\n json: {\n ...d,\n segment,\n events_count: eventsCount,\n past_events: eventsAttended,\n event_id: $('Set Campaign Config').first().json.event_id,\n event_name: $('Set Campaign Config').first().json.event_name,\n event_date: $('Set Campaign Config').first().json.event_date,\n reg_url: $('Set Campaign Config').first().json.reg_url\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "fd6e6756-635a-4133-bc28-695cf2d47db2",
"name": "Generate Personalized Email with Gemini",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
368,
512
],
"parameters": {
"options": {},
"schemaType": "fromJson",
"jsonSchemaExample": "{\"email_body\": \"<p>Welcome back paragraph...</p><p>What is new...</p><p>CTA...</p>\", \"subject_line\": \"Welcome back to VivaTech, Jane\"}"
},
"typeVersion": 1
},
{
"id": "1ae20779-399d-4fa1-93d0-35765c5a5d40",
"name": "Google Gemini for Alumni",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
368,
704
],
"parameters": {
"options": {
"temperature": 0.7
},
"modelName": "models/gemini-2.5-flash-lite"
},
"typeVersion": 1
},
{
"id": "8c9f37c8-78c6-4f46-b7e8-a3b0796a5bd0",
"name": "Send Alumni Email",
"type": "n8n-nodes-base.emailSend",
"position": [
688,
512
],
"parameters": {
"options": {},
"subject": "={{ $json.output?.subject_line || 'Welcome back to ' + $('Set Campaign Config').first().json.event_name }}"
},
"typeVersion": 2.1,
"continueOnFail": true
},
{
"id": "11221d06-fd8e-4e26-a183-2b25cb655e8d",
"name": "Log Alumni Outreach",
"type": "n8n-nodes-base.code",
"position": [
1088,
512
],
"parameters": {
"jsCode": "// Log alumni outreach for tracking\nconst alumni = $('Segment Alumni by Engagement').item.json;\nreturn [{\n json: {\n hubspot_id: alumni.hubspot_id || '',\n email: alumni.email,\n segment: alumni.segment,\n events_count: alumni.events_count,\n event_id: alumni.event_id,\n sent_at: new Date().toISOString(),\n status: 'sent'\n }\n}];"
},
"typeVersion": 2
},
{
"id": "7b8cf979-ab53-4284-b421-83098d9375af",
"name": "Post Campaign Summary to Slack",
"type": "n8n-nodes-base.slack",
"position": [
1360,
512
],
"parameters": {
"text": "=\ud83d\udce3 *Alumni Re-engagement Campaign Sent*\n\nEvent: {{ $('Set Campaign Config').first().json.event_name }}\nAlumni contacted: {{ $input.all().length }}\nSegments: Champions, Returning, One-timers\n\n_AI-personalized emails sent via Gemini Flash Lite_",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "PLACEHOLDER_REGISTRATIONS_CHANNEL"
},
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.3,
"continueOnFail": true
},
{
"id": "sticky-intro-alumni",
"name": "Intro \u2014 Alumni Re-engager",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1904,
80
],
"parameters": {
"width": 640,
"height": 1156,
"content": "## Alumni Re-engager for Event Registration\n\n### **What it does:**\nFetches past event attendees from **HubSpot CRM**, segments them by engagement history, generates **AI-personalized outreach emails** with Gemini, and sends targeted re-engagement campaigns.\n\n### **Why it matters:**\nPer Julius Solaris: \"Alumni are the most important segment.\" They already know the event, have lower acquisition costs, and convert at **3-5x the rate** of cold prospects.\n\n### **How it works:**\n1. Manual trigger with event configuration\n2. Search **HubSpot CRM** for contacts with past `event_registration`\n3. Filter out those already registered for the current event\n4. Segment by engagement: **champions** (3+ events), **returning** (2), **one-timers** (1)\n5. **Gemini Flash Lite** generates unique email copy per attendee\n6. Send personalized emails with alumni-exclusive CTA\n7. Post campaign summary to **Slack**\n\n### **Setup steps:**\n1. Create HTTP Header Auth credential: `Authorization: Bearer YOUR_HUBSPOT_API_KEY`\n2. Ensure HubSpot contacts have `event_registration` custom property\n3. Update `Set Campaign Config` with your event details\n4. Connect **Email** (SMTP) and **Slack** OAuth2 credentials\n5. Update `PLACEHOLDER_REGISTRATIONS_CHANNEL` with your Slack channel ID\n6. Run manually or convert trigger to schedule (8-12 weeks pre-event)\n\n### **HubSpot requirements:**\n- Custom property `event_registration` (single-line text, comma-separated event IDs)\n- Created automatically by the companion **Event Registration + Auto-Enrichment** template\n\n### **Companion templates:**\n- **Event Registration + Auto-Enrichment Intelligence** \u2014 main registration + enrichment\n- **Abandoned Cart Recovery** \u2014 follow-up for form openers who didn't submit"
},
"typeVersion": 1
},
{
"id": "sticky-ai-alumni",
"name": "Section 4 \u2014 AI Personalization",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
80
],
"parameters": {
"color": 2,
"width": 612,
"height": 772,
"content": "## 4. AI Personalization\n\n**Gemini Flash Lite** generates unique email copy for each alumnus based on their profile and history.\n\n**Input per contact:**\n- Name, company, role, industry (from HubSpot)\n- Segment: champion / returning / one-timer\n- Past events attended, last attended date\n\n**Output:**\n- `email_body` \u2014 3-4 HTML paragraphs, warm professional tone\n- `subject_line` \u2014 personalized subject line\n\n**Segment-specific tone:**\n- **Champions** (3+): VIP language, exclusive insider access\n- **Returning** (2): Welcome back, what's new since last time\n- **One-timers** (1): Re-engage, demonstrate fresh value"
},
"typeVersion": 1
},
{
"id": "sticky-section-1",
"name": "Section 1 \u2014 Trigger & Configure",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1232,
80
],
"parameters": {
"color": 6,
"width": 520,
"height": 788,
"content": "## 1. Trigger & Configure\n\nSet your event details here before running:\n- `event_id` \u2014 unique identifier (e.g., `vivatech-2026`)\n- `event_name` \u2014 display name for emails\n- `event_date` \u2014 shown in email copy\n- `reg_url` \u2014 registration page URL for CTAs\n\n**Tip:** Convert the Manual Trigger to a Schedule Trigger to run automatically 8-12 weeks before your event."
},
"typeVersion": 1
},
{
"id": "sticky-section-2",
"name": "Section 2 \u2014 Fetch & Filter Alumni",
"type": "n8n-nodes-base.stickyNote",
"position": [
-672,
80
],
"parameters": {
"color": 5,
"width": 560,
"height": 788,
"content": "## 2. Fetch & Filter Alumni from HubSpot\n\nSearches HubSpot CRM via the **Search API** for contacts where `event_registration` is set (past attendees).\n\n**Filtering logic:**\n- Excludes contacts already registered for the current `event_id`\n- Requires valid email address\n- Normalizes HubSpot properties to flat JSON for downstream nodes\n\n**Properties fetched:**\n`email`, `firstname`, `lastname`, `company`, `jobtitle`, `industry`, `city`, `country`, `event_registration`, `lifecyclestage`, `num_associated_deals`"
},
"typeVersion": 1
},
{
"id": "sticky-section-3",
"name": "Section 3 \u2014 Segment by Engagement",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
96
],
"parameters": {
"color": 4,
"width": 380,
"height": 764,
"content": "## 3. Segment by Engagement\n\nCategorizes alumni into three tiers:\n- **Champion** \u2014 3+ past events or 2+ deals\n- **Returning** \u2014 2 past events\n- **One-timer** \u2014 1 past event\n\nSegmentation drives personalization tone and urgency level in the AI-generated emails."
},
"typeVersion": 1
},
{
"id": "sticky-section-5",
"name": "Section 5 \u2014 Send & Log",
"type": "n8n-nodes-base.stickyNote",
"position": [
992,
80
],
"parameters": {
"color": 5,
"width": 632,
"height": 764,
"content": "## 5. Send & Log\n\n- **Alumni Email** \u2014 HTML email with Braia Labs dark branding, alumni-exclusive CTA\n- **Log Outreach** \u2014 records HubSpot ID, segment, event, timestamp\n- **Slack Summary** \u2014 posts campaign stats to your registrations channel\n\nAll three nodes use `continueOnFail` \u2014 one failure doesn't block the others."
},
"typeVersion": 1
},
{
"id": "sticky-errors",
"name": "Section \u2014 Error Handling",
"type": "n8n-nodes-base.stickyNote",
"position": [
-672,
944
],
"parameters": {
"color": 3,
"width": 520,
"height": 280,
"content": "## \u26a0\ufe0f Error Handling\n\n**`continueOnFail`** is enabled on:\n- `Fetch Past Attendees from HubSpot` \u2014 CRM unreachable? Workflow stops gracefully\n- `Send Alumni Email` \u2014 SMTP failure doesn't block logging\n- `Post Campaign Summary to Slack` \u2014 Slack down? Email still sends\n\n**HubSpot pagination:** Search API returns max 100 contacts per page. For databases with >100 alumni, add a Loop node with the `after` cursor from the response."
},
"typeVersion": 1
},
{
"id": "76fb3b81-4514-4b27-86b0-9e7dd1a67121",
"name": "Contact \u2014 Braia Labs",
"type": "n8n-nodes-base.stickyNote",
"position": [
1680,
96
],
"parameters": {
"width": 560,
"height": 1160,
"content": "## Was this helpful? Get in touch!\n\n[](https://tally.so/r/EkKGgB)\n\nI really hope this automation helped you. Your feedback is incredibly valuable and helps me create better resources for business and the n8n community.\n\n### **Have Feedback, a Question, or a Project Idea?**\n\nI've streamlined the way we connect. It all starts with one simple form that takes less than 10 seconds. After that, you'll chat with my AI assistant who will gather the key details and pass them directly on to me.\n\n#### **[Start the conversation here](https://tally.so/r/EkKGgB)**\n\n* **Give Feedback:** Share your thoughts on this template\u2014whether you found a typo, encountered an unexpected error, have a suggestion, or just want to say thanks!\n\n* **n8n Consulting:** Have a complex business challenge or need a custom workflow built from scratch? Let's partner on a powerful automation solution tailored to your specific needs.\n\n* **Join your team:** We can work together to get you launched with confidence.\n\n---\n\nHappy Automating!\n[Milo Bravo](https://linkedin.com/in/MiloBravo/) | BRaiA Labs | Automation & BI Systems + AI Integration"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "6809bba2-ed5f-428b-8558-5517d99c7827",
"connections": {
"Send Alumni Email": {
"main": [
[
{
"node": "Log Alumni Outreach",
"type": "main",
"index": 0
}
]
]
},
"Log Alumni Outreach": {
"main": [
[
{
"node": "Post Campaign Summary to Slack",
"type": "main",
"index": 0
}
]
]
},
"Set Campaign Config": {
"main": [
[
{
"node": "Fetch Past Attendees from HubSpot",
"type": "main",
"index": 0
}
]
]
},
"Has Eligible Alumni?": {
"main": [
[
{
"node": "Segment Alumni by Engagement",
"type": "main",
"index": 0
}
],
[]
]
},
"Start Alumni Campaign": {
"main": [
[
{
"node": "Set Campaign Config",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini for Alumni": {
"ai_languageModel": [
[
{
"node": "Generate Personalized Email with Gemini",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Filter Already Registered": {
"main": [
[
{
"node": "Has Eligible Alumni?",
"type": "main",
"index": 0
}
]
]
},
"Segment Alumni by Engagement": {
"main": [
[
{
"node": "Generate Personalized Email with Gemini",
"type": "main",
"index": 0
}
]
]
},
"Fetch Past Attendees from HubSpot": {
"main": [
[
{
"node": "Filter Already Registered",
"type": "main",
"index": 0
}
]
]
},
"Generate Personalized Email with Gemini": {
"main": [
[
{
"node": "Send Alumni Email",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
httpHeaderAuthslackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Who is this for? Event marketers and conference organizers who want to reactivate past attendees with AI-personalized emails at 3-5x ROI vs. cold leads. What problem is this workflow solving? Alumni gold is untapped: Past attendees convert 3-5x better Manual segmentation takes…
Source: https://n8n.io/workflows/13843/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Who is this for? Event organizers, conference planners, and marketing teams fighting registration drop-off who want 4-field forms with LinkedIn-level attendee intelligence. What problem is this workfl
This n8n template automates scraping content from Skool communities using the Olostep API. It collects structured data from Skool pages and stores it in a clean format, making it easy to analyze commu
It is ideal for businesses handling vendor invoices, reimbursement forms, or bulk document intake.
This template is only available on n8n self-hosted as it's making use of the community node for MCP Client.
Manually adding important term dates to your calendar by hand? Stop! Automate it with this simple AI/LLM-powered document understanding and extraction template. This cool use-case can be applied to ma