Email Subscription Service with n8n Forms, Airtable and AI
Automate your email subscription service from end-to-end, managing sign-ups, content generation, and personalized email delivery with this comprehensive n8n workflow. This solution connects n8n Forms for subscriber management, Airtable for data storage, Gmail for sending emails, and OpenAI for dynamic content creation. It handles new subscriptions via the Subscribe Form, creates new entries in Airtable using the Create Subscriber node, and sends a confirmation email through Gmail. For existing subscribers, the Unsubscribe Form triggers an update in Airtable via the Update Subscriber node. The workflow intelligently searches Airtable daily, weekly, or for surprise content using dedicated Search nodes, then uses OpenAI's Content Generation Agent, Groq Chat Model, and Wikipedia tool to craft engaging email content and generate images. These images are then resized with the Resize Image node before being sent out as personalized emails via Gmail's Send Message node, with the last sent date logged back into Airtable. This workflow is ideal for content creators, marketers, or small businesses looking to automate their newsletter operations, ensuring consistent engagement, reducing manual content creation, and freeing up valuable time for strategic tasks. It transforms a labor-intensive process into an efficient, AI-powered system, saving significant operational costs and effort while enhancing subscriber experience.
Workflow JSON
{"nodes": [{"id": "4dd52c72-9a9b-4db4-8de5-5b12b1e5c4be", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [180, 1480], "parameters": {"rule": {"interval": [{"triggerAtHour": 9}]}}, "typeVersion": 1.2}, {"id": "9226181c-b84c-4ea1-a5b4-eedb6c62037b", "name": "Search daily", "type": "n8n-nodes-base.airtable", "position": [440, 1480], "parameters": {"base": {"__rl": true, "mode": "list", "value": "appL3dptT6ZTSzY9v", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v", "cachedResultName": "Scheduled Emails"}, "table": {"__rl": true, "mode": "list", "value": "tblzR9vSuFUzlQNMI", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v/tblzR9vSuFUzlQNMI", "cachedResultName": "Table 1"}, "options": {}, "operation": "search", "filterByFormula": "AND({Status} = 'active', {Interval} = 'daily')"}, "credentials": {"airtableTokenApi": {"id": "", "name": "[Your airtableTokenApi]"}}, "typeVersion": 2.1}, {"id": "1a3b6224-2f66-41c6-8b3d-be286cf16370", "name": "Search weekly", "type": "n8n-nodes-base.airtable", "position": [440, 1660], "parameters": {"base": {"__rl": true, "mode": "list", "value": "appL3dptT6ZTSzY9v", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v", "cachedResultName": "Scheduled Emails"}, "table": {"__rl": true, "mode": "list", "value": "tblzR9vSuFUzlQNMI", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v/tblzR9vSuFUzlQNMI", "cachedResultName": "Table 1"}, "options": {}, "operation": "search", "filterByFormula": "=AND(\n {Status} = 'active', \n {Interval} = 'weekly', \n {Last Sent} <= DATEADD(TODAY(), -7, 'days')\n)"}, "credentials": {"airtableTokenApi": {"id": "", "name": "[Your airtableTokenApi]"}}, "typeVersion": 2.1}, {"id": "1ea47e14-0a28-4780-95c7-31e24eb724d5", "name": "confirmation email1", "type": "n8n-nodes-base.gmail", "position": [620, 820], "webhookId": "dd8bd6df-2013-4f8d-a2cc-cd9b3913e3d2", "parameters": {"sendTo": "={{ $('Subscribe Form').item.json.email }}", "message": "=This is to confirm your request to subscribe to \"Learn something every day!\" - a free service to send you facts about your favourite topics.\n\nTopic: {{ $('Subscribe Form').item.json.topic }}\nSchedule: {{ $('Subscribe Form').item.json.frequency }}", "options": {"appendAttribution": false}, "subject": "Learn something every day confirmation"}, "credentials": {"gmailOAuth2": {"id": "", "name": "[Your gmailOAuth2]"}}, "typeVersion": 2.1}, {"id": "d95262af-1b52-4f9c-8346-183b4eee8544", "name": "Execute Workflow", "type": "n8n-nodes-base.executeWorkflow", "position": [1140, 1480], "parameters": {"mode": "each", "options": {"waitForSubWorkflow": false}, "workflowId": {"__rl": true, "mode": "id", "value": "={{ $workflow.id }}"}}, "typeVersion": 1.1}, {"id": "075292af-7a66-4275-ac2d-3c392189a10c", "name": "Create Event", "type": "n8n-nodes-base.set", "position": [980, 1480], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "b28a0142-a028-471a-8180-9883e930feea", "name": "email", "type": "string", "value": "={{ $json.Email }}"}, {"id": "970f5495-05df-42b6-a422-b2ac27f8eb95", "name": "topic", "type": "string", "value": "={{ $json.Topic }}"}, {"id": "e871c431-948f-4b80-aa17-1e4266674663", "name": "interval", "type": "string", "value": "={{ $json.Interval }}"}, {"id": "9b72597d-1446-4ef3-86e5-0a071c69155b", "name": "id", "type": "string", "value": "={{ $json.id }}"}, {"id": "b17039c2-14a2-4811-9528-88ae963e44f7", "name": "created_at", "type": "string", "value": "={{ $json.Created }}"}]}}, "typeVersion": 3.4}, {"id": "28776aaf-6bd9-4f9f-bcf0-3d4401a74219", "name": "Execute Workflow Trigger", "type": "n8n-nodes-base.executeWorkflowTrigger", "position": [1360, 1480], "parameters": {}, "typeVersion": 1}, {"id": "0eb62e75-228b-452b-80ab-f9ef3ad33204", "name": "Unsubscribe Form", "type": "n8n-nodes-base.formTrigger", "position": [180, 1160], "webhookId": "e64db96d-5e61-40d5-88fb-761621a829ab", "parameters": {"options": {"path": "free-factoids-unsubscribe"}, "formTitle": "Unsubscribe from Learn Something Every Day", "formFields": {"values": [{"fieldLabel": "ID", "requiredField": true}, {"fieldType": "dropdown", "fieldLabel": "Reason For Unsubscribe", "multiselect": true, "fieldOptions": {"values": [{"option": "Emails not relevant"}, {"option": "Too many Emails"}, {"option": "I did not sign up to this service"}]}}]}, "formDescription": "We're sorry to see you go! Please take a moment to help us improve the service."}, "typeVersion": 2.2}, {"id": "f889efe9-dc3c-428b-ad8e-4f7d17f23e75", "name": "Set Email Vars", "type": "n8n-nodes-base.set", "position": [2500, 1480], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "62a684fb-16f9-4326-8eeb-777d604b305a", "name": "to", "type": "string", "value": "={{ $('Execute Workflow Trigger').first().json.email }},jim@height.io"}, {"id": "4270849e-c805-4580-9088-e8d1c3ef2fb4", "name": "subject", "type": "string", "value": "=Your {{ $('Execute Workflow Trigger').first().json.interval }} factoid"}, {"id": "81d0e897-2496-4a3c-b16c-9319338f899f", "name": "message", "type": "string", "value": "=<p>\n<strong>You asked about \"{{ $('Execution Data').first().json.topic.replace('\"','') }}\"</strong>\n</p>\n<p>\n<i>{{ $('Content Generation Agent').first().json.output }}</i>\n</p>"}, {"id": "ee05de7b-5342-4deb-8118-edaf235d92cc", "name": "unsubscribe_link", "type": "string", "value": "=https://<MY_HOST>/form/inspiration-unsubscribe?ID={{ $('Execute Workflow Trigger').first().json.id }}"}]}, "includeOtherFields": true}, "typeVersion": 3.4}, {"id": "84741e6d-f5be-440d-8633-4eb30ccce170", "name": "Log Last Sent", "type": "n8n-nodes-base.airtable", "position": [2860, 1480], "parameters": {"base": {"__rl": true, "mode": "list", "value": "appL3dptT6ZTSzY9v", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v", "cachedResultName": "Scheduled Emails"}, "table": {"__rl": true, "mode": "list", "value": "tblzR9vSuFUzlQNMI", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v/tblzR9vSuFUzlQNMI", "cachedResultName": "Table 1"}, "columns": {"value": {"id": "={{ $('Execute Workflow Trigger').first().json.id }}", "Last Sent": "2024-11-29T13:34:11"}, "schema": [{"id": "id", "type": "string", "display": true, "removed": false, "readOnly": true, "required": false, "displayName": "id", "defaultMatch": true}, {"id": "Name", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Name", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Email", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Email", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Status", "type": "options", "display": true, "options": [{"name": "inactive", "value": "inactive"}, {"name": "active", "value": "active"}], "removed": true, "readOnly": false, "required": false, "displayName": "Status", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Interval", "type": "options", "display": true, "options": [{"name": "daily", "value": "daily"}, {"name": "weekly", "value": "weekly"}, {"name": "surprise", "value": "surprise"}], "removed": true, "readOnly": false, "required": false, "displayName": "Interval", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Start Day", "type": "options", "display": true, "options": [{"name": "Mon", "value": "Mon"}, {"name": "Tue", "value": "Tue"}, {"name": "Wed", "value": "Wed"}, {"name": "Thu", "value": "Thu"}, {"name": "Fri", "value": "Fri"}, {"name": "Sat", "value": "Sat"}, {"name": "Sun", "value": "Sun"}], "removed": true, "readOnly": false, "required": false, "displayName": "Start Day", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Topic", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Topic", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Created", "type": "string", "display": true, "removed": true, "readOnly": true, "required": false, "displayName": "Created", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Last Modified", "type": "string", "display": true, "removed": true, "readOnly": true, "required": false, "displayName": "Last Modified", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Last Sent", "type": "dateTime", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Last Sent", "defaultMatch": false, "canBeUsedToMatch": true}], "mappingMode": "defineBelow", "matchingColumns": ["id"]}, "options": {}, "operation": "update"}, "credentials": {"airtableTokenApi": {"id": "", "name": "[Your airtableTokenApi]"}}, "typeVersion": 2.1}, {"id": "88f864d6-13fb-4f09-b22d-030d016678e1", "name": "Search surprise", "type": "n8n-nodes-base.airtable", "position": [440, 1840], "parameters": {"base": {"__rl": true, "mode": "list", "value": "appL3dptT6ZTSzY9v", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v", "cachedResultName": "Scheduled Emails"}, "table": {"__rl": true, "mode": "list", "value": "tblzR9vSuFUzlQNMI", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v/tblzR9vSuFUzlQNMI", "cachedResultName": "Table 1"}, "options": {}, "operation": "search", "filterByFormula": "=AND(\n {Status} = 'active', \n {Interval} = 'surprise'\n)"}, "credentials": {"airtableTokenApi": {"id": "", "name": "[Your airtableTokenApi]"}}, "typeVersion": 2.1}, {"id": "28238d9a-7bc0-4a22-bb4e-a7a2827e4da3", "name": "Should Send = True", "type": "n8n-nodes-base.filter", "position": [800, 1840], "parameters": {"options": {}, "conditions": {"options": {"version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "9aaf9ae2-8f96-443a-8294-c04270296b22", "operator": {"type": "boolean", "operation": "true", "singleValue": true}, "leftValue": "={{ $json.should_send }}", "rightValue": ""}]}}, "typeVersion": 2.2}, {"id": "3a46dd3d-48a6-40ca-8823-0516aa9f73a4", "name": "Should Send?", "type": "n8n-nodes-base.code", "position": [620, 1840], "parameters": {"mode": "runOnceForEachItem", "jsCode": "const luckyPick = Math.floor(Math.random() * 10) + 1;\n$input.item.json.should_send = luckyPick == 8;\nreturn $input.item;"}, "typeVersion": 2}, {"id": "3611da19-920b-48e6-84a4-f7be0b3a78fc", "name": "Create Subscriber", "type": "n8n-nodes-base.airtable", "position": [440, 820], "parameters": {"base": {"__rl": true, "mode": "list", "value": "appL3dptT6ZTSzY9v", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v", "cachedResultName": "Scheduled Emails"}, "table": {"__rl": true, "mode": "list", "value": "tblzR9vSuFUzlQNMI", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v/tblzR9vSuFUzlQNMI", "cachedResultName": "Table 1"}, "columns": {"value": {"Email": "={{ $json.email }}", "Topic": "={{ $json.topic }}", "Status": "active", "Interval": "={{ $json.frequency }}", "Start Day": "={{ $json.submittedAt.toDateTime().format('EEE') }}"}, "schema": [{"id": "Name", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Name", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Email", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Email", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Status", "type": "options", "display": true, "options": [{"name": "inactive", "value": "inactive"}, {"name": "active", "value": "active"}], "removed": false, "readOnly": false, "required": false, "displayName": "Status", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Interval", "type": "options", "display": true, "options": [{"name": "daily", "value": "daily"}, {"name": "weekly", "value": "weekly"}, {"name": "surprise", "value": "surprise"}], "removed": false, "readOnly": false, "required": false, "displayName": "Interval", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Start Day", "type": "options", "display": true, "options": [{"name": "Mon", "value": "Mon"}, {"name": "Tue", "value": "Tue"}, {"name": "Wed", "value": "Wed"}, {"name": "Thu", "value": "Thu"}, {"name": "Fri", "value": "Fri"}, {"name": "Sat", "value": "Sat"}, {"name": "Sun", "value": "Sun"}], "removed": false, "readOnly": false, "required": false, "displayName": "Start Day", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Topic", "type": "string", "display": true, "removed": false, "readOnly": false, "required": false, "displayName": "Topic", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Created", "type": "string", "display": true, "removed": true, "readOnly": true, "required": false, "displayName": "Created", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Last Modified", "type": "string", "display": true, "removed": true, "readOnly": true, "required": false, "displayName": "Last Modified", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Last Sent", "type": "dateTime", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Last Sent", "defaultMatch": false, "canBeUsedToMatch": true}], "mappingMode": "defineBelow", "matchingColumns": ["Email"]}, "options": {}, "operation": "upsert"}, "credentials": {"airtableTokenApi": {"id": "", "name": "[Your airtableTokenApi]"}}, "typeVersion": 2.1}, {"id": "2213a81f-53a9-4142-9586-e87b88710eec", "name": "Update Subscriber", "type": "n8n-nodes-base.airtable", "position": [440, 1160], "parameters": {"base": {"__rl": true, "mode": "list", "value": "appL3dptT6ZTSzY9v", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v", "cachedResultName": "Scheduled Emails"}, "table": {"__rl": true, "mode": "list", "value": "tblzR9vSuFUzlQNMI", "cachedResultUrl": "https://airtable.com/appL3dptT6ZTSzY9v/tblzR9vSuFUzlQNMI", "cachedResultName": "Table 1"}, "columns": {"value": {"id": "={{ $json.ID }}", "Status": "inactive"}, "schema": [{"id": "id", "type": "string", "display": true, "removed": false, "readOnly": true, "required": false, "displayName": "id", "defaultMatch": true}, {"id": "Name", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Name", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Email", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Email", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Status", "type": "options", "display": true, "options": [{"name": "inactive", "value": "inactive"}, {"name": "active", "value": "active"}], "removed": false, "readOnly": false, "required": false, "displayName": "Status", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Interval", "type": "options", "display": true, "options": [{"name": "daily", "value": "daily"}, {"name": "weekly", "value": "weekly"}], "removed": true, "readOnly": false, "required": false, "displayName": "Interval", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Start Day", "type": "options", "display": true, "options": [{"name": "Mon", "value": "Mon"}, {"name": "Tue", "value": "Tue"}, {"name": "Wed", "value": "Wed"}, {"name": "Thu", "value": "Thu"}, {"name": "Fri", "value": "Fri"}, {"name": "Sat", "value": "Sat"}, {"name": "Sun", "value": "Sun"}], "removed": true, "readOnly": false, "required": false, "displayName": "Start Day", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Topic", "type": "string", "display": true, "removed": true, "readOnly": false, "required": false, "displayName": "Topic", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Created", "type": "string", "display": true, "removed": true, "readOnly": true, "required": false, "displayName": "Created", "defaultMatch": false, "canBeUsedToMatch": true}, {"id": "Last Modified", "type": "string", "display": true, "removed": true, "readOnly": true, "required": false, "displayName": "Last Modified", "defaultMatch": false, "canBeUsedToMatch": true}], "mappingMode": "defineBelow", "matchingColumns": ["id"]}, "options": {}, "operation": "update"}, "credentials": {"airtableTokenApi": {"id": "", "name": "[Your airtableTokenApi]"}}, "typeVersion": 2.1}, {"id": "c94ec18b-e0cf-4859-8b89-23abdd63739c", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [900, 1280], "parameters": {"color": 7, "width": 335, "height": 173, "content": "### 4. Using Subworkflows to run executions concurrently\nThis configuration is desired when sequential execution is slow and unnecessary. Also if one email fails, it doesn't fail the execution for everyone else."}, "typeVersion": 1}, {"id": "c14cab28-13eb-4d91-8578-8187a95a8909", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [180, 700], "parameters": {"color": 7, "width": 380, "height": 80, "content": "### 1. Subscribe flow\nUse a form to allow users to subscribe to the service."}, "typeVersion": 1}, {"id": "0e44ada0-f8a7-440e-aded-33b446190a08", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [180, 1020], "parameters": {"color": 7, "width": 355, "height": 115, "content": "### 2. Unsubscribe flow\n* Uses Form's pre-fill field feature to identify user\n* Doesn't use \"email\" as identifier so you can't unsubscribe others"}, "typeVersion": 1}, {"id": "e67bdffe-ccfc-4818-990d-b2a5ab613035", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [180, 1340], "parameters": {"color": 7, "width": 347, "height": 114, "content": "### 3. Scheduled Trigger\n* Runs every day at 9am\n* Handles all 3 frequency types\n* Send emails concurrently"}, "typeVersion": 1}, {"id": "ce7d5310-7170-46d3-b8d8-3f97407f9dfd", "name": "Subscribe Form", "type": "n8n-nodes-base.formTrigger", "position": [180, 820], "webhookId": "c6abe3e3-ba87-4124-a227-84e253581b58", "parameters": {"options": {"path": "free-factoids-subscribe", "appendAttribution": false, "respondWithOptions": {"values": {"formSubmittedText": "Thanks! Your factoid is on its way!"}}}, "formTitle": "Learn something every day!", "formFields": {"values": [{"fieldType": "textarea", "fieldLabel": "topic", "placeholder": "What topic(s) would you like to learn about?", "requiredField": true}, {"fieldType": "email", "fieldLabel": "email", "placeholder": "eg. jim@example.com", "requiredField": true}, {"fieldType": "dropdown", "fieldLabel": "frequency", "fieldOptions": {"values": [{"option": "daily"}, {"option": "weekly"}, {"option": "surprise me"}]}, "requiredField": true}]}, "formDescription": "Get a fact a day (or week) about any subject sent to your inbox."}, "typeVersion": 2.2}, {"id": "a5d50886-7d6b-4bf8-b376-b23c12a60608", "name": "Execution Data", "type": "n8n-nodes-base.executionData", "position": [1560, 1480], "parameters": {"dataToSave": {"values": [{"key": "email", "value": "={{ $json.email }}"}]}}, "typeVersion": 1}, {"id": "69b40d8d-7734-47f1-89fe-9ea0378424b7", "name": "Window Buffer Memory", "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow", "position": [1860, 1680], "parameters": {"sessionKey": "=scheduled_send_{{ $json.email }}", "sessionIdType": "customKey"}, "typeVersion": 1.3}, {"id": "f83cff18-f41f-4a63-9d43-7e3947aae386", "name": "Wikipedia", "type": "@n8n/n8n-nodes-langchain.toolWikipedia", "position": [2020, 1680], "parameters": {}, "typeVersion": 1}, {"id": "77457037-e3ab-42f1-948b-b994d42f2f6e", "name": "Content Generation Agent", "type": "@n8n/n8n-nodes-langchain.agent", "position": [1780, 1460], "parameters": {"text": "=Generate an new factoid on the following topic: \"{{ $json.topic.replace('\"','') }}\"\nEnsure it is unique and not one generated previously.", "options": {}, "promptType": "define"}, "typeVersion": 1.7}, {"id": "cdfdd870-48b6-4c7d-a7d1-a22d70423e37", "name": "Groq Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatGroq", "position": [1720, 1680], "parameters": {"model": "llama-3.3-70b-versatile", "options": {}}, "credentials": {"groqApi": {"id": "", "name": "[Your groqApi]"}}, "typeVersion": 1}, {"id": "87df322d-a544-476f-b2ff-83feb619fe7f", "name": "Generate Image", "type": "@n8n/n8n-nodes-langchain.openAi", "position": [2120, 1460], "parameters": {"prompt": "=Generate a child-friendly illustration which compliments the following paragraph:\n{{ $json.output }}", "options": {}, "resource": "image"}, "credentials": {"openAiApi": {"id": "", "name": "[Your openAiApi]"}}, "typeVersion": 1.7}, {"id": "5c8d9e72-4015-44da-b5d5-829864d33672", "name": "Resize Image", "type": "n8n-nodes-base.editImage", "position": [2280, 1460], "parameters": {"width": 480, "height": 360, "options": {}, "operation": "resize"}, "typeVersion": 1}, {"id": "a9939fad-98b3-4894-aae0-c11fa40d09da", "name": "Send Message", "type": "n8n-nodes-base.gmail", "position": [2680, 1480], "webhookId": "dd8bd6df-2013-4f8d-a2cc-cd9b3913e3d2", "parameters": {"sendTo": "={{ $json.to }}", "message": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>{{ $json.subject }}</title>\n</head>\n<body>\n {{ $json.message }}\n<p>\n<a href=\"{{ $json.unsubscribe_link }}\">Unsubscribe</a>\n</p>\n</body>\n</html>\n", "options": {"attachmentsUi": {"attachmentsBinary": [{}]}, "appendAttribution": false}, "subject": "={{ $json.subject }}"}, "credentials": {"gmailOAuth2": {"id": "", "name": "[Your gmailOAuth2]"}}, "typeVersion": 2.1}, {"id": "10b6ad35-fc1c-47a2-b234-5de3557d1164", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [1320, 1660], "parameters": {"color": 7, "width": 335, "height": 113, "content": "### 5. Use Execution Data to Filter Logs\nIf you've registered for community+ or are on n8n cloud, best practice is to use execution node to allow filtering of execution logs."}, "typeVersion": 1}, {"id": "e3563fae-ff35-457b-9fb1-784eda637518", "name": "Sticky Note5", "type": "n8n-nodes-base.stickyNote", "position": [1780, 1280], "parameters": {"color": 7, "width": 340, "height": 140, "content": "### 6. Use AI to Generate Factoid and Image\nUse an AI agent to automate the generation of factoids as requested by the user. This is a simple example but we recommend a adding a unique touch to stand out from the crowd!"}, "typeVersion": 1}, {"id": "d1016c5d-c855-44c5-8ad3-a534bedaa8cf", "name": "Sticky Note6", "type": "n8n-nodes-base.stickyNote", "position": [2500, 1040], "parameters": {"color": 7, "width": 460, "height": 400, "content": "### 7. Send Email to User\nFinally, send a message to the user with both text and image.\nLog the event in the Airtable for later analysis if required.\n\n"}, "typeVersion": 1}, {"id": "773075fa-e5a2-4d4f-8527-eb07c7038b00", "name": "Sticky Note7", "type": "n8n-nodes-base.stickyNote", "position": [-420, 680], "parameters": {"width": 480, "height": 900, "content": "## Try It Out!\n\n### This n8n templates demonstrates how to build a simple subscriber service entirely in n8n using n8n forms as a frontend, n8n generally as the backend and Airtable as the storage layer.\n\nThis template in particular shows a fully automated service to send automated messages containing facts about a topic the user requested for.\n\n### How it works\n* An n8n form is setup up to allow users to subscribe with a desired topic and interval of which to recieve messages via n8n forms which is then added to the Airtable.\n* A scheduled trigger is executed every morning and searches for subscribers to send messages for based on their desired intervals.\n* Once found, Subscribers are sent to a subworkflow which performs the text content generation via an AI agent and also uses a vision model to generate an image.\n* Both are attached to an email which is sent to the subscriber. This email also includes an unsubscribe link.\n* The unsubscribe flow works similarly via n8n form interface which when submitted disables further scheduled emails to the user.\n\n## How to use\n* Make a copy of sample Airtable here: https://airtable.com/appL3dptT6ZTSzY9v/shrLukHafy5bwDRfD\n* Make sure the workflow is \"activated\" and the forms are available and reachable by your audience.\n\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)!\n\nHappy Hacking!"}, "typeVersion": 1}], "pinData": {}, "connections": {"Wikipedia": {"ai_tool": [[{"node": "Content Generation Agent", "type": "ai_tool", "index": 0}]]}, "Create Event": {"main": [[{"node": "Execute Workflow", "type": "main", "index": 0}]]}, "Resize Image": {"main": [[{"node": "Set Email Vars", "type": "main", "index": 0}]]}, "Search daily": {"main": [[{"node": "Create Event", "type": "main", "index": 0}]]}, "Send Message": {"main": [[{"node": "Log Last Sent", "type": "main", "index": 0}]]}, "Should Send?": {"main": [[{"node": "Should Send = True", "type": "main", "index": 0}]]}, "Search weekly": {"main": [[{"node": "Create Event", "type": "main", "index": 0}]]}, "Execution Data": {"main": [[{"node": "Content Generation Agent", "type": "main", "index": 0}]]}, "Generate Image": {"main": [[{"node": "Resize Image", "type": "main", "index": 0}]]}, "Set Email Vars": {"main": [[{"node": "Send Message", "type": "main", "index": 0}]]}, "Subscribe Form": {"main": [[{"node": "Create Subscriber", "type": "main", "index": 0}]]}, "Groq Chat Model": {"ai_languageModel": [[{"node": "Content Generation Agent", "type": "ai_languageModel", "index": 0}]]}, "Search surprise": {"main": [[{"node": "Should Send?", "type": "main", "index": 0}]]}, "Schedule Trigger": {"main": [[{"node": "Search surprise", "type": "main", "index": 0}, {"node": "Search daily", "type": "main", "index": 0}, {"node": "Search weekly", "type": "main", "index": 0}]]}, "Unsubscribe Form": {"main": [[{"node": "Update Subscriber", "type": "main", "index": 0}]]}, "Create Subscriber": {"main": [[{"node": "confirmation email1", "type": "main", "index": 0}]]}, "Should Send = True": {"main": [[{"node": "Create Event", "type": "main", "index": 0}]]}, "Window Buffer Memory": {"ai_memory": [[{"node": "Content Generation Agent", "type": "ai_memory", "index": 0}]]}, "Content Generation Agent": {"main": [[{"node": "Generate Image", "type": "main", "index": 0}]]}, "Execute Workflow Trigger": {"main": [[{"node": "Execution Data", "type": "main", "index": 0}]]}}}How to Import This Workflow
- 1Copy the workflow JSON above using the Copy Workflow JSON button.
- 2Open your n8n instance and go to Workflows.
- 3Click Import from JSON and paste the copied workflow.
Don't have an n8n instance? Start your free trial at n8nautomation.cloud
Related Templates
Auto-create TikTok videos with VEED.io AI avatars, ElevenLabs & GPT-4
Automate the creation and distribution of trending TikTok videos using AI avatars. This workflow connects Telegram, Perplexity, OpenAI, ElevenLabs, VEED.io, and BLOTATO to generate scripts, synthesize voice, create video, and publish across multiple social platforms. Content creators and marketers can rapidly produce engaging short-form video content without manual editing.
Automate LinkedIn Posts with AI
Automate your LinkedIn content creation and publishing by leveraging AI with this powerful workflow. This n8n automation connects LinkedIn, OpenAI, and Notion to streamline your social media presence. A Schedule Trigger initiates the process daily, querying your Notion database for today's scheduled posts. For each post, the workflow fetches all content from its Notion page, including text blocks and an image URL, then uses OpenAI to reformat the post text for optimal engagement. The workflow then combines the rephrased text and fetched image, publishing the complete post directly to LinkedIn. Finally, it updates the post's status in Notion to "Done," ensuring your content calendar remains accurate. This workflow is ideal for content creators, marketers, and businesses looking to maintain a consistent and engaging LinkedIn presence without manual effort, saving significant time on content preparation and publishing while ensuring high-quality, AI-enhanced posts.
Personal life manager with Telegram, Google services & voice-enabled AI
Manage your personal life using voice or text commands through Telegram. This workflow connects Telegram, Google Calendar, Gmail, Google Tasks, and an AI assistant powered by OpenRouter to process requests. It's ideal for busy individuals who want to quickly schedule events, send emails, or manage tasks on the go. This automation streamlines daily organization, saving significant time and mental effort.