This workflow corresponds to n8n.io template #12760 — we link there as the canonical source.
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": "dzUhWkfShIkWdOzp",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Meeting Notes Distributor with Mailchimp and MongoDB",
"tags": [],
"nodes": [
{
"id": "d5ca58c0-3486-4f86-b6cc-862653466a4b",
"name": "\ud83d\udcd2 Meeting Notes Distributor \u2013 Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2224,
-608
],
"parameters": {
"width": 550,
"height": 786,
"content": "## How it works\nThe workflow looks for newly-available meeting recordings every 24 hours, automatically uploads each audio file to a third-party transcription API and polls until the transcript is finished. After a transcript is returned, a short executive summary is generated in a Code node, formatted into an HTML email body, and saved\u2014together with full metadata\u2014in a MongoDB collection for long-term search and analytics. Once the data is safely stored, all participant email addresses are synchronised with Mailchimp, a one-off campaign is created, populated with the summary, and immediately sent. Errors such as empty meeting lists or failed sends are caught with IF branches so the workflow can fail gracefully and log useful details.\n\n## Setup steps\n1. Create an HTTP credential named **\u201cMeetings API\u201d** that adds the required auth header.\n2. Create an HTTP credential named **\u201cTranscription API\u201d** and insert your key.\n3. Add a **MongoDB** credential with write access to your database.\n4. Add a **Mailchimp** credential that can create campaigns & manage members.\n5. Replace placeholder URLs, list IDs and sender information inside the nodes.\n6. Adjust the schedule rule if you need a different cadence.\n7. Execute once manually to verify end-to-end and check MongoDB / Mailchimp results."
},
"typeVersion": 1
},
{
"id": "ad4b08bb-4509-4a24-bc38-117be0432a5c",
"name": "Trigger & Retrieval (Info)",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1600,
-512
],
"parameters": {
"color": 7,
"width": 914,
"height": 350,
"content": "## Trigger & Retrieval\nThis group kicks off the automation and pulls raw meeting data. The **Schedule Trigger** fires once per day but can be shortened or lengthened to suit your needs. Immediately afterwards an **HTTP Request** talks to the internal meeting platform and returns a JSON array containing meeting IDs, recording URLs, titles, and participant information. An **IF node** makes sure we only continue when at least one recording is available; if the list is empty the workflow ends silently so you do not spend unnecessary API credits or send empty emails. Finally, **Split in Batches** feeds each meeting one by one to downstream nodes, giving reliable, serialised processing and making it simple to track which meeting is being handled."
},
"typeVersion": 1
},
{
"id": "e5634918-8d10-458f-89a0-bd190f4a4704",
"name": "Transcription & Summary (Info)",
"type": "n8n-nodes-base.stickyNote",
"position": [
-688,
-512
],
"parameters": {
"color": 7,
"width": 706,
"height": 350,
"content": "## Transcription & Summary\nEvery batch begins by posting the recording URL to a cloud transcription service. A short **Wait** node pauses just long enough for small-to-medium meetings; you can increase the delay for very long sessions. After waiting, another **HTTP Request** polls the job endpoint. If the status is `completed`, we continue; otherwise we bail out to avoid infinite loops. A **Code node** then distils the transcript into a tight executive summary (first five sentences by default, but the logic is easy to swap for an LLM). A second **Code node** wraps that summary inside a branded HTML template and also generates an email subject, keeping presentation concerns separate from raw NLP logic."
},
"typeVersion": 1
},
{
"id": "b33b38f7-7f96-4428-a00b-8a04c9b8e190",
"name": "Database Storage (Info)",
"type": "n8n-nodes-base.stickyNote",
"position": [
32,
-512
],
"parameters": {
"color": 7,
"width": 722,
"height": 398,
"content": "## Database Storage\nBefore any outbound communication happens, the workflow stores everything safely in MongoDB. A **Set node** assembles a clean document that includes meeting metadata, the full transcript text, the generated summary, a UTC timestamp, and a boolean flag that tracks whether the campaign was sent successfully. The **MongoDB** node inserts the document into the `meeting_summaries` collection and returns the Mongo `_id`, which is helpful for future auditing or troubleshooting. An IF branch can later update that record if Mailchimp fails, ensuring you always know the final state of each meeting."
},
"typeVersion": 1
},
{
"id": "1d781821-8e5a-4f13-85c5-9653e1ed8d8b",
"name": "Mailchimp Notifications (Info)",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1168,
-48
],
"parameters": {
"color": 7,
"width": 1810,
"height": 350,
"content": "## Mailchimp Notifications\nParticipant email addresses are pulled out, deduplicated and piped into Mailchimp one by one. New contacts are subscribed automatically, while existing contacts are simply updated\u2014protecting your list hygiene. When all members are ready, a **Campaign** is created, loaded with the HTML summary, and sent immediately. Success or failure is captured by a final **IF node**, making it easy to extend the workflow with Slack alerts or retries. This modular approach means you can swap Mailchimp for a different ESP later by replacing just three nodes."
},
"typeVersion": 1
},
{
"id": "9484492e-6c53-493c-b090-f8a5ca09848e",
"name": "Daily Schedule",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1648,
-256
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 24
}
]
}
},
"typeVersion": 1
},
{
"id": "86fd271c-feeb-415b-ba1a-1a39ef4c3575",
"name": "Fetch Meetings",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1456,
-256
],
"parameters": {
"url": "https://api.yourmeetings.com/v1/recordings?status=available",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth"
},
"typeVersion": 4
},
{
"id": "c7c8fae7-ed40-48ae-b55b-dd7e152e117c",
"name": "Any Meetings?",
"type": "n8n-nodes-base.if",
"position": [
-1248,
-256
],
"parameters": {
"options": {},
"conditions": {
"number": [
{
"value1": "={{ $items(\"Fetch Meetings\").length }}",
"value2": 0,
"operation": "larger"
}
]
}
},
"typeVersion": 2
},
{
"id": "8d02c83d-362a-445d-8280-560b3171ad96",
"name": "Split Meetings",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-1056,
-256
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "18f98440-803e-4027-8873-05c3e6dcb9ee",
"name": "Initiate Transcription",
"type": "n8n-nodes-base.httpRequest",
"position": [
-848,
-256
],
"parameters": {
"url": "https://api.transcriptionservice.com/v1/jobs",
"method": "POST",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth"
},
"typeVersion": 4
},
{
"id": "888f1892-4c4d-4c24-9b5d-bf827f995494",
"name": "Wait 2 min",
"type": "n8n-nodes-base.wait",
"position": [
-656,
-256
],
"parameters": {},
"typeVersion": 1
},
{
"id": "ea9501f8-bf91-41bb-a4f1-886ad991d233",
"name": "Get Transcript",
"type": "n8n-nodes-base.httpRequest",
"position": [
-448,
-256
],
"parameters": {
"url": "https://api.transcriptionservice.com/v1/jobs/{{ $json.id }}",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth"
},
"typeVersion": 4
},
{
"id": "e7276ac7-e959-49f9-8061-a39029d6ff9e",
"name": "Transcript Ready?",
"type": "n8n-nodes-base.if",
"position": [
-256,
-256
],
"parameters": {
"options": {},
"conditions": {
"string": [
{
"value1": "={{ $json.status }}",
"value2": "completed",
"operation": "equals"
}
]
}
},
"typeVersion": 2
},
{
"id": "97cd9d5a-be0a-49d4-b415-f9e0d4a86bb8",
"name": "Summarise Transcript",
"type": "n8n-nodes-base.code",
"position": [
-48,
-256
],
"parameters": {
"jsCode": "// Simple sentence-based summary (first 5 sentences)\nconst transcript = $json.transcript_text || '';\nconst sentences = transcript.split('.');\nconst summary = sentences.slice(0, 5).join('.').trim() + (sentences.length > 5 ? '...' : '.');\nreturn [{ json: { ...$json, summary } }];"
},
"typeVersion": 2
},
{
"id": "72764ce0-7075-4c52-9871-12dfc809bf29",
"name": "Format Email",
"type": "n8n-nodes-base.code",
"position": [
160,
-256
],
"parameters": {
"jsCode": "const meetingTitle = $json.meetingTitle || 'Meeting Summary';\nconst html = `<!DOCTYPE html><html><body><h2>${meetingTitle}</h2><p>${$json.summary}</p></body></html>`;\nreturn [{ json: { ...$json, emailSubject: `Summary \u2013 ${meetingTitle}`, htmlContent: html } }];"
},
"typeVersion": 2
},
{
"id": "86d06771-0bb7-48f8-ad0d-5c67f2ebca2c",
"name": "Prepare Mongo Document",
"type": "n8n-nodes-base.set",
"position": [
352,
-256
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "9182c460-d2a1-4e4e-8a18-f434c0a34bda",
"name": "Insert into MongoDB",
"type": "n8n-nodes-base.mongoDb",
"position": [
560,
-256
],
"parameters": {
"fields": {
"title": "={{ $json.title }}",
"summary": "={{ $json.summary }}",
"mailSent": false,
"createdAt": "={{ $json.timestamp }}",
"meetingId": "={{ $json.meetingId }}",
"transcript": "={{ $json.transcript }}",
"htmlContent": "={{ $json.htmlContent }}",
"emailSubject": "={{ $json.emailSubject }}"
},
"options": {},
"operation": "insert",
"collection": "meeting_summaries"
},
"typeVersion": 1
},
{
"id": "0d8a5e28-ae71-41ad-9a97-46e5cacb5c58",
"name": "Extract Participant Emails",
"type": "n8n-nodes-base.code",
"position": [
384,
64
],
"parameters": {
"jsCode": "const listId = '{{YOUR_MAILCHIMP_LIST_ID}}';\nconst participants = $json.participants || [];\nreturn participants.map(p => ({json: {email: p.email, listId, htmlContent: $json.htmlContent, emailSubject: $json.emailSubject}}));"
},
"typeVersion": 2
},
{
"id": "46b0e294-8f4f-4989-b278-72b88693df6a",
"name": "Split Participants",
"type": "n8n-nodes-base.splitInBatches",
"position": [
192,
64
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "92682f05-138f-406e-8aff-03f8fd464246",
"name": "Upsert Member",
"type": "n8n-nodes-base.mailchimp",
"position": [
-16,
64
],
"parameters": {
"operation": "addUpdate"
},
"typeVersion": 1
},
{
"id": "d01d3ded-bbd7-477d-b88a-f17281fcb57b",
"name": "Merge For Campaign",
"type": "n8n-nodes-base.merge",
"position": [
-224,
64
],
"parameters": {
"mode": "wait",
"options": {}
},
"typeVersion": 2
},
{
"id": "33ea6b4d-01ba-4230-9207-8e93e2fe44c4",
"name": "Create Campaign",
"type": "n8n-nodes-base.mailchimp",
"position": [
-416,
64
],
"parameters": {
"resource": "campaign",
"operation": "create"
},
"typeVersion": 1
},
{
"id": "f17995e7-0324-43f4-8d41-b1073ecb6313",
"name": "Set Campaign Content",
"type": "n8n-nodes-base.mailchimp",
"position": [
-624,
64
],
"parameters": {
"resource": "campaign",
"operation": "setContent"
},
"typeVersion": 1
},
{
"id": "d0a6c200-4163-4dc0-bb46-4b20da5af6aa",
"name": "Send Campaign",
"type": "n8n-nodes-base.mailchimp",
"position": [
-816,
64
],
"parameters": {
"resource": "campaign",
"operation": "send",
"campaignId": "={{ $json.id }}"
},
"typeVersion": 1
},
{
"id": "6da40248-eda2-469c-af76-8dd1694b4c85",
"name": "Mail Sent?",
"type": "n8n-nodes-base.if",
"position": [
-1024,
64
],
"parameters": {
"options": {},
"conditions": {
"string": [
{
"value1": "={{ $json.status || 'sent' }}",
"value2": "sent",
"operation": "equals"
}
]
}
},
"typeVersion": 2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "4a45c1bd-1940-41e0-acfa-b0799047dc84",
"connections": {
"Wait 2 min": {
"main": [
[
{
"node": "Get Transcript",
"type": "main",
"index": 0
}
]
]
},
"Format Email": {
"main": [
[
{
"node": "Prepare Mongo Document",
"type": "main",
"index": 0
}
]
]
},
"Any Meetings?": {
"main": [
[
{
"node": "Split Meetings",
"type": "main",
"index": 0
}
]
]
},
"Send Campaign": {
"main": [
[
{
"node": "Mail Sent?",
"type": "main",
"index": 0
}
]
]
},
"Upsert Member": {
"main": [
[
{
"node": "Merge For Campaign",
"type": "main",
"index": 0
}
]
]
},
"Daily Schedule": {
"main": [
[
{
"node": "Fetch Meetings",
"type": "main",
"index": 0
}
]
]
},
"Fetch Meetings": {
"main": [
[
{
"node": "Any Meetings?",
"type": "main",
"index": 0
}
]
]
},
"Get Transcript": {
"main": [
[
{
"node": "Transcript Ready?",
"type": "main",
"index": 0
}
]
]
},
"Split Meetings": {
"main": [
[
{
"node": "Initiate Transcription",
"type": "main",
"index": 0
}
]
]
},
"Create Campaign": {
"main": [
[
{
"node": "Set Campaign Content",
"type": "main",
"index": 0
}
]
]
},
"Transcript Ready?": {
"main": [
[
{
"node": "Summarise Transcript",
"type": "main",
"index": 0
}
]
]
},
"Merge For Campaign": {
"main": [
[
{
"node": "Create Campaign",
"type": "main",
"index": 0
}
]
]
},
"Split Participants": {
"main": [
[
{
"node": "Upsert Member",
"type": "main",
"index": 0
}
]
]
},
"Insert into MongoDB": {
"main": [
[
{
"node": "Extract Participant Emails",
"type": "main",
"index": 0
}
]
]
},
"Set Campaign Content": {
"main": [
[
{
"node": "Send Campaign",
"type": "main",
"index": 0
}
]
]
},
"Summarise Transcript": {
"main": [
[
{
"node": "Format Email",
"type": "main",
"index": 0
}
]
]
},
"Initiate Transcription": {
"main": [
[
{
"node": "Wait 2 min",
"type": "main",
"index": 0
}
]
]
},
"Prepare Mongo Document": {
"main": [
[
{
"node": "Insert into MongoDB",
"type": "main",
"index": 0
}
]
]
},
"Extract Participant Emails": {
"main": [
[
{
"node": "Split Participants",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically converts raw meeting recordings or written notes into concise summaries, stores them in MongoDB for future reference, and distributes the summaries to all meeting participants through Mailchimp. It is ideal for teams that want to keep everyone aligned…
Source: https://n8n.io/workflows/12760/ — 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.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
Development teams using Claude Code who want a chat-ops interface for project management. Instead of SSH-ing into a server to run Claude, your whole team interacts with it through a Matrix chat room —
Instead of providing a routine check, it focuses on significant movements by: Sending a Slack alert only if a query crosses a defined movement threshold. Emailing a structured report with the Top 25 i
Looking for a way to track GitHub bounty issues automatically and get notified in real time? This GitHub Bounty Tracker workflow monitors repositories for issues labeled 💎 Bounty, logs them in Google
This workflow automatically sends a beautifully designed HTML newsletter every Sunday at 8 AM, featuring products currently on sale from your Algolia-powered e-commerce store.