This workflow corresponds to n8n.io template #14019 — we link there as the canonical source.
This workflow follows the Form Trigger → Gmail 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": "d3RJdXx9kS9rjU5x",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AI-Powered Menstrual Cycle Tracker With Personalized Phase Reminders and Weekly Wellness Coaching",
"tags": [],
"nodes": [
{
"id": "679a5cab-eb40-461f-b221-8c4702acdc2c",
"name": "Calculate Cycle Dates",
"type": "n8n-nodes-base.code",
"position": [
-112,
-16
],
"parameters": {
"jsCode": "const name = $input.first().json['Full Name'] || '';\nconst email = $input.first().json['Email Address'] || '';\nconst lastPeriodRaw = $input.first().json['Last Period Start Date'] || '';\nconst cycleLength = parseInt($input.first().json['Cycle Length (days)']) || 28;\n\nconst lastPeriod = new Date(lastPeriodRaw);\n\n// Core cycle calculations\nconst nextPeriod = new Date(lastPeriod);\nnextPeriod.setDate(nextPeriod.getDate() + cycleLength);\n\nconst ovulationDate = new Date(nextPeriod);\novulationDate.setDate(ovulationDate.getDate() - 14);\n\nconst fertileStart = new Date(ovulationDate);\nfertileStart.setDate(fertileStart.getDate() - 5);\n\nconst fertileEnd = new Date(ovulationDate);\nfertileEnd.setDate(fertileEnd.getDate() + 1);\n\nconst pmsStart = new Date(nextPeriod);\npmsStart.setDate(pmsStart.getDate() - 5);\n\n// Format dates as YYYY-MM-DD\nconst fmt = d => d.toISOString().split('T')[0];\n\nreturn [{\n json: {\n name,\n email,\n last_period_date: fmt(lastPeriod),\n cycle_length: cycleLength,\n subscribed_date: fmt(new Date()),\n next_period: fmt(nextPeriod),\n ovulation_date: fmt(ovulationDate),\n fertile_start: fmt(fertileStart),\n fertile_end: fmt(fertileEnd),\n pms_start: fmt(pmsStart),\n last_email_sent: '',\n active: 'true'\n }\n}];"
},
"typeVersion": 2
},
{
"id": "a5a8ca61-18b8-452c-a291-5ec7c510c2af",
"name": "Build Welcome Email",
"type": "n8n-nodes-base.code",
"position": [
304,
-16
],
"parameters": {
"jsCode": "const data = $input.first().json;\n\nconst htmlEmail = `<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; background: #fff0f7; margin: 0; padding: 0; }\n .container { max-width: 600px; margin: 30px auto; background: #ffffff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }\n .header { background: linear-gradient(135deg, #e91e8c, #f06292); padding: 30px; text-align: center; color: white; }\n .header h1 { margin: 0; font-size: 24px; }\n .body { padding: 30px; color: #333; }\n .date-card { background: #fff0f7; border-left: 4px solid #e91e8c; padding: 14px 18px; border-radius: 8px; margin: 12px 0; }\n .date-label { font-weight: bold; color: #e91e8c; font-size: 13px; text-transform: uppercase; }\n .date-value { font-size: 16px; margin-top: 4px; }\n .footer { background: #fff0f7; padding: 16px; text-align: center; font-size: 12px; color: #999; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>\ud83c\udf38 Welcome to Cycle Wellness</h1>\n </div>\n <div class=\"body\">\n <p>Hi ${data.name} \ud83d\udc4b</p>\n <p>You're all set! Here's your personalized cycle overview based on the information you provided:</p>\n\n <div class=\"date-card\">\n <div class=\"date-label\">\ud83e\ude78 Next Period</div>\n <div class=\"date-value\">${data.next_period}</div>\n </div>\n <div class=\"date-card\">\n <div class=\"date-label\">\ud83e\udd5a Ovulation Day</div>\n <div class=\"date-value\">${data.ovulation_date}</div>\n </div>\n <div class=\"date-card\">\n <div class=\"date-label\">\ud83d\udc9a Fertile Window</div>\n <div class=\"date-value\">${data.fertile_start} \u2192 ${data.fertile_end}</div>\n </div>\n <div class=\"date-card\">\n <div class=\"date-label\">\ud83d\ude2e\u200d\ud83d\udca8 PMS Window Starts</div>\n <div class=\"date-value\">${data.pms_start}</div>\n </div>\n\n <p style=\"margin-top: 24px;\">You'll receive timely reminders before each phase \u2014 period incoming alerts, ovulation notifications, PMS prep tips, and weekly wellness emails to support you through every stage of your cycle.</p>\n <p>\ud83d\udc9c Take care of yourself \u2014 you've got this.</p>\n </div>\n <div class=\"footer\">You subscribed to Cycle Wellness reminders.<br/>Reply STOP to unsubscribe.</div>\n </div>\n</body>\n</html>`;\n\nreturn [{\n json: {\n ...data,\n htmlEmail,\n subject: `\ud83c\udf38 Welcome ${data.name} \u2014 Your Cycle Overview is Ready`\n }\n}];"
},
"typeVersion": 2
},
{
"id": "2869a51e-4fbe-4dd3-b7bf-3b529555c63e",
"name": "Send Welcome Email",
"type": "n8n-nodes-base.gmail",
"position": [
512,
-16
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "={{ $json.htmlEmail }}",
"options": {},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "e0eeb76d-dba1-4564-ad8a-334f5ad364a1",
"name": "Daily 8AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-400,
320
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.3
},
{
"id": "d7c87250-1136-4b92-982a-a3388c0facfb",
"name": "Build Reminder Email",
"type": "n8n-nodes-base.code",
"position": [
752,
304
],
"parameters": {
"jsCode": "const data = $input.first().json;\n\nconst emailTemplates = {\n period_incoming: {\n subject: `\ud83d\udd34 Heads Up ${data.name} \u2014 Your Period is Coming in 3 Days`,\n heading: '\ud83d\udd34 Period Incoming',\n color1: '#c0392b',\n color2: '#e74c3c',\n intro: `Your period is expected to start in 3 days on <strong>${data.nextPeriodStr}</strong>. Now is a great time to prepare.`,\n tips: [\n '\ud83d\udecd\ufe0f Stock up on pads, tampons, or your preferred products',\n '\ud83d\udc8a If you experience cramps, consider having pain relief on hand',\n '\ud83c\udf6b Reduce caffeine and salty foods to minimize bloating',\n '\ud83e\uddd8 Light stretching or yoga can help ease incoming discomfort',\n '\ud83d\ude34 Prioritize sleep over the next few nights'\n ],\n closing: 'Listen to your body over the next few days. Rest when you need to. \ud83d\udc9c'\n },\n period_start: {\n subject: `\ud83e\ude78 Your Period Has Started \u2014 Self-Care Tips for ${data.name}`,\n heading: '\ud83e\ude78 Your Period Has Started',\n color1: '#922b21',\n color2: '#c0392b',\n intro: `Your period is here. Be gentle with yourself today and over the coming days.`,\n tips: [\n '\ud83c\udf21\ufe0f A hot water bottle on your lower abdomen can ease cramps',\n '\ud83d\udca7 Stay hydrated \u2014 aim for at least 8 glasses of water today',\n '\ud83e\udd57 Iron-rich foods like spinach and lentils help replenish what you lose',\n '\ud83d\udeb6 Light walks can improve circulation and reduce pain',\n '\ud83d\udcf5 It is okay to say no to things today \u2014 rest is productive'\n ],\n closing: 'You handle this every month. You are stronger than you think. \ud83c\udf38'\n },\n ovulation: {\n subject: `\ud83e\udd5a Ovulation Window Alert for ${data.name}`,\n heading: '\ud83e\udd5a You Are in Your Ovulation Window',\n color1: '#1a7a4a',\n color2: '#27ae60',\n intro: `Today is your ovulation day. Your fertile window runs from <strong>${data.fertileStartStr}</strong> to <strong>${data.fertileEndStr}</strong>.`,\n tips: [\n '\u26a1 Energy levels are often highest during ovulation \u2014 use this time well',\n '\ud83d\udcaa This is a great phase for high intensity workouts',\n '\ud83d\udde3\ufe0f Many women feel more confident and social during ovulation',\n '\ud83e\udde0 Cognitive sharpness tends to peak \u2014 great time for presentations or decisions',\n '\ud83d\udca4 Some women experience mild ovulation pain \u2014 this is normal'\n ],\n closing: 'Your body is working exactly as it should. Stay in tune with it. \ud83d\udc9a'\n },\n pms_prep: {\n subject: `\ud83d\ude2e\u200d\ud83d\udca8 PMS Window Starting Soon \u2014 Tips for ${data.name}`,\n heading: '\ud83d\ude2e\u200d\ud83d\udca8 PMS Window is Starting',\n color1: '#6c3483',\n color2: '#8e44ad',\n intro: `Your PMS window starts today and runs until your period on <strong>${data.nextPeriodStr}</strong>. A little preparation goes a long way.`,\n tips: [\n '\ud83e\uddd8 Reduce stress with meditation, journaling, or gentle movement',\n '\ud83c\udf6c Cravings are normal \u2014 satisfy them mindfully without guilt',\n '\ud83d\udcf5 Set boundaries this week \u2014 protect your energy',\n '\ud83d\ude34 Sleep at least 7-8 hours to help regulate mood',\n '\ud83d\udcac Let someone close to you know you might need extra support'\n ],\n closing: 'PMS is real and valid. Take care of yourself without apology. \ud83d\udc9c'\n }\n};\n\nconst template = emailTemplates[data.emailType];\nconst tipsList = template.tips.map(t => `<li style=\"margin-bottom: 10px;\">${t}</li>`).join('');\n\nconst htmlEmail = `<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; background: #fff0f7; margin: 0; padding: 0; }\n .container { max-width: 600px; margin: 30px auto; background: #ffffff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }\n .header { background: linear-gradient(135deg, ${template.color1}, ${template.color2}); padding: 30px; text-align: center; color: white; }\n .header h1 { margin: 0; font-size: 22px; }\n .body { padding: 30px; color: #333; }\n .tip-box { background: #fff0f7; border-left: 4px solid ${template.color1}; padding: 16px 20px; border-radius: 8px; margin: 20px 0; }\n .footer { background: #fff0f7; padding: 16px; text-align: center; font-size: 12px; color: #999; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>${template.heading}</h1>\n </div>\n <div class=\"body\">\n <p>Hi ${data.name} \ud83d\udc4b</p>\n <p>${template.intro}</p>\n <div class=\"tip-box\">\n <strong>\ud83d\udca1 Tips for Today:</strong>\n <ul style=\"padding-left: 20px; margin-top: 12px;\">\n ${tipsList}\n </ul>\n </div>\n <p>${template.closing}</p>\n <p style=\"font-size: 13px; color: #888;\">\ud83d\udcc5 Cycle Day ${data.cycleDay} | Phase: ${data.phase}</p>\n </div>\n <div class=\"footer\">You subscribed to Cycle Wellness reminders.<br/>Reply STOP to unsubscribe.</div>\n </div>\n</body>\n</html>`;\n\nreturn [{\n json: {\n ...data,\n htmlEmail,\n subject: template.subject\n }\n}];"
},
"typeVersion": 2
},
{
"id": "baa29ebc-f4db-4ca3-a1ec-1fa0e2a0db88",
"name": "Send Reminder Email",
"type": "n8n-nodes-base.gmail",
"position": [
960,
304
],
"parameters": {
"sendTo": "={{ $json.email}}",
"message": "={{ $json.htmlEmail }}",
"options": {},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "741fc1fb-e0b8-41dd-a95f-762816416ca4",
"name": "Log to Send Log",
"type": "n8n-nodes-base.googleSheets",
"position": [
1392,
304
],
"parameters": {
"columns": {
"value": {
"date": "={{ new Date().toISOString().split('T')[0] }}",
"name": "={{ $('Build Reminder Email').item.json.name }}",
"email": "={{ $json.email }}",
"phase": "={{ $('Build Reminder Email').item.json.phase }}",
"subject": "={{ $('Build Reminder Email').item.json.subject }}",
"cycle_day": "={{ $('Build Reminder Email').item.json.cycleDay }}",
"email_type": "={{ $('Build Reminder Email').item.json.emailType }}"
},
"schema": [
{
"id": "date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email_type",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "email_type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cycle_day",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "cycle_day",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phase",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "phase",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "subject",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "subject",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1965817482,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit#gid=1965817482",
"cachedResultName": "Send Log"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit?usp=drivesdk",
"cachedResultName": "Period Health Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "dff6bf49-17d0-4a22-866d-8babb2c28e46",
"name": "Weekly Sunday 9AM Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-400,
720
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.3
},
{
"id": "19f3e83e-c717-4928-9956-887873a795c4",
"name": "Send Wellness Digest",
"type": "n8n-nodes-base.gmail",
"position": [
1104,
720
],
"parameters": {
"sendTo": "={{ $json.email }}",
"message": "={{ $json.htmlEmail }}",
"options": {},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "38e19bed-dd3d-491b-bf97-f0e5bed902ec",
"name": "Log to Send Log1",
"type": "n8n-nodes-base.googleSheets",
"position": [
1376,
720
],
"parameters": {
"columns": {
"value": {
"date": "={{ new Date().toISOString().split('T')[0] }}",
"name": "={{ $('Parse & Build Wellness Email').item.json.name }}",
"email": "={{ $('Parse & Build Wellness Email').item.json.email }}",
"phase": "={{ $('Parse & Build Wellness Email').item.json.phase }}",
"subject": "={{ $('Parse & Build Wellness Email').item.json.subject }}",
"cycle_day": "={{ $('Parse & Build Wellness Email').item.json.cycleDay }}",
"email_type": "=weekly_digest"
},
"schema": [
{
"id": "date",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email_type",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "email_type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cycle_day",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "cycle_day",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phase",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "phase",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "subject",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "subject",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1965817482,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit#gid=1965817482",
"cachedResultName": "Send Log"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit?usp=drivesdk",
"cachedResultName": "Period Health Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "0d94d46b-1172-45aa-9d5f-57d10abfeee4",
"name": "Cycle Wellness Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
-352,
-16
],
"parameters": {
"options": {},
"formTitle": "Period Health & Cycle Wellness",
"formFields": {
"values": [
{
"fieldLabel": "Full Name",
"placeholder": "Enter your full name",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Email Address",
"placeholder": "Enter your email address",
"requiredField": true
},
{
"fieldType": "date",
"fieldLabel": "Last Period Start Date",
"requiredField": true
},
{
"fieldType": "number",
"fieldLabel": "Cycle Length (days)",
"placeholder": "28",
"requiredField": true
}
]
},
"formDescription": "Track your cycle and receive personalized health reminders and wellness tips."
},
"typeVersion": 2.3
},
{
"id": "c17d3fc9-5382-4122-865c-0cb63c67104f",
"name": "Save to Subscribers",
"type": "n8n-nodes-base.googleSheets",
"position": [
96,
-16
],
"parameters": {
"columns": {
"value": {
"name": "={{ $json.name }}",
"email": "={{ $json.email }}",
"active": "={{ $json.active }}",
"pms_start": "={{ $json.pms_start }}",
"fertile_end": "={{ $json.fertile_end }}",
"next_period": "={{ $json.next_period }}",
"cycle_length": "={{ $json.cycle_length }}",
"fertile_start": "={{ $json.fertile_start }}",
"ovulation_date": "={{ $json.ovulation_date }}",
"last_email_sent": "={{ $json.last_email_sent }}",
"subscribed_date": "={{ $json.subscribed_date }}",
"last_period_date": "={{ $json.last_period_date }}"
},
"schema": [
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "last_period_date",
"type": "string",
"display": true,
"required": false,
"displayName": "last_period_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cycle_length",
"type": "string",
"display": true,
"required": false,
"displayName": "cycle_length",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "subscribed_date",
"type": "string",
"display": true,
"required": false,
"displayName": "subscribed_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "next_period",
"type": "string",
"display": true,
"required": false,
"displayName": "next_period",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ovulation_date",
"type": "string",
"display": true,
"required": false,
"displayName": "ovulation_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "pms_start",
"type": "string",
"display": true,
"required": false,
"displayName": "pms_start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "fertile_start",
"type": "string",
"display": true,
"required": false,
"displayName": "fertile_start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "fertile_end",
"type": "string",
"display": true,
"required": false,
"displayName": "fertile_end",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "last_email_sent",
"type": "string",
"display": true,
"required": false,
"displayName": "last_email_sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "active",
"type": "string",
"display": true,
"required": false,
"displayName": "active",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit#gid=0",
"cachedResultName": "Subscribers"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit?usp=drivesdk",
"cachedResultName": "Period Health Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "eb8c683c-422b-4820-9756-8a1aa83adad3",
"name": "Read All Subscribers",
"type": "n8n-nodes-base.googleSheets",
"position": [
-176,
320
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit#gid=0",
"cachedResultName": "Subscribers"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit?usp=drivesdk",
"cachedResultName": "Period Health Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "611b0434-0ad5-45e6-8e70-1ff8c1529154",
"name": "Filter Active Subscribers",
"type": "n8n-nodes-base.filter",
"position": [
80,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ca26b90f-cfb2-4726-b916-8eb953340507",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.active }}",
"rightValue": "="
}
]
}
},
"typeVersion": 2.3
},
{
"id": "10f858df-f10e-4a96-9b5b-ee59328a80a8",
"name": "Calculate Today's Phase",
"type": "n8n-nodes-base.code",
"position": [
288,
320
],
"parameters": {
"jsCode": "const today = new Date();\ntoday.setHours(0, 0, 0, 0);\nconst fmt = d => new Date(d).toISOString().split('T')[0];\nconst todayStr = fmt(today);\n\nconst results = [];\n\nfor (const item of $input.all()) {\n const u = item.json;\n\n const nextPeriod = new Date(u.next_period);\n const ovulationDate = new Date(u.ovulation_date);\n const fertileStart = new Date(u.fertile_start);\n const fertileEnd = new Date(u.fertile_end);\n const pmsStart = new Date(u.pms_start);\n const lastPeriod = new Date(u.last_period_date);\n\n // Set all to midnight for clean comparison\n [nextPeriod, ovulationDate, fertileStart, fertileEnd, pmsStart, lastPeriod].forEach(d => d.setHours(0,0,0,0));\n\n // Calculate cycle day\n const cycleDay = Math.floor((today - lastPeriod) / 86400000) + 1;\n\n // 3 days before period\n const threeDaysBefore = new Date(nextPeriod);\n threeDaysBefore.setDate(threeDaysBefore.getDate() - 3);\n threeDaysBefore.setHours(0,0,0,0);\n\n // Determine what to send today\n let emailType = null;\n\n if (fmt(today) === fmt(nextPeriod)) {\n emailType = 'period_start';\n } else if (fmt(today) === fmt(threeDaysBefore)) {\n emailType = 'period_incoming';\n } else if (fmt(today) === fmt(ovulationDate)) {\n emailType = 'ovulation';\n } else if (fmt(today) === fmt(pmsStart)) {\n emailType = 'pms_prep';\n }\n\n // Determine current phase label\n let phase = 'Follicular';\n if (today >= pmsStart && today < nextPeriod) phase = 'PMS';\n else if (today >= nextPeriod && cycleDay <= 5) phase = 'Menstrual';\n else if (today >= fertileStart && today <= fertileEnd) phase = 'Fertile';\n else if (fmt(today) === fmt(ovulationDate)) phase = 'Ovulation';\n\n // Skip if no email to send today\n if (!emailType) continue;\n\n // Skip if this email type already sent this cycle\n const lastSent = u.last_email_sent || '';\n if (lastSent.includes(`${emailType}_${u.next_period}`)) continue;\n\n results.push({\n json: {\n ...u,\n today: todayStr,\n cycleDay,\n phase,\n emailType,\n nextPeriodStr: fmt(nextPeriod),\n ovulationStr: fmt(ovulationDate),\n fertileStartStr: fmt(fertileStart),\n fertileEndStr: fmt(fertileEnd),\n pmsStartStr: fmt(pmsStart)\n }\n });\n}\n\nreturn results.length > 0 ? results : [{ json: { skip: true } }];"
},
"typeVersion": 2
},
{
"id": "048ff18a-cee7-442f-8cb9-0a284da42a4e",
"name": "IF Email to Send",
"type": "n8n-nodes-base.if",
"position": [
496,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "fed2911d-b2b6-4a70-a274-48a65ac8ada7",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.skip }}",
"rightValue": "true"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "28ffc1f6-b3cb-4544-aa7b-b85f56e36c5a",
"name": "Update Last Email Sent",
"type": "n8n-nodes-base.googleSheets",
"position": [
1184,
304
],
"parameters": {
"columns": {
"value": {
"email": "={{ $('Build Reminder Email').item.json.email }}",
"last_email_sent": "={{ $('Build Reminder Email').item.json.emailType + '_' + $('Build Reminder Email').item.json.next_period }}"
},
"schema": [
{
"id": "name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "email",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "last_period_date",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "last_period_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "cycle_length",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "cycle_length",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "subscribed_date",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "subscribed_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "next_period",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "next_period",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "ovulation_date",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "ovulation_date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "pms_start",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "pms_start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "fertile_start",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "fertile_start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "fertile_end",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "fertile_end",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "last_email_sent",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "last_email_sent",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "active",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "active",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"email"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit#gid=0",
"cachedResultName": "Subscribers"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit?usp=drivesdk",
"cachedResultName": "Period Health Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "1d810899-b02a-4c4b-829a-7f85067d40a7",
"name": "Read All Subscribers1",
"type": "n8n-nodes-base.googleSheets",
"position": [
-160,
720
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit#gid=0",
"cachedResultName": "Subscribers"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/16Ul8TmV1DeYdxDoymkOoZ5y2jD9ZsgDuWoUc7_RPo_o/edit?usp=drivesdk",
"cachedResultName": "Period Health Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "1384ff73-3ff8-45bc-ab40-18506487ac3f",
"name": "Filter Active Subscribers1",
"type": "n8n-nodes-base.filter",
"position": [
80,
720
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ca26b90f-cfb2-4726-b916-8eb953340507",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.active }}",
"rightValue": "="
}
]
}
},
"typeVersion": 2.3
},
{
"id": "5b2a9a48-d1a4-4faf-a84f-8319abdbb3b7",
"name": "Calculate Phase & Build Prompt",
"type": "n8n-nodes-base.code",
"position": [
304,
720
],
"parameters": {
"jsCode": "const today = new Date();\ntoday.setHours(0, 0, 0, 0);\n\nreturn $input.all().map(item => {\n const u = item.json;\n\n const nextPeriod = new Date(u.next_period);\n const ovulationDate = new Date(u.ovulation_date);\n const fertileStart = new Date(u.fertile_start);\n const fertileEnd = new Date(u.fertile_end);\n const pmsStart = new Date(u.pms_start);\n const lastPeriod = new Date(u.last_period_date);\n\n [nextPeriod, ovulationDate, fertileStart, fertileEnd, pmsStart, lastPeriod].forEach(d => d.setHours(0,0,0,0));\n\n const cycleDay = Math.floor((today - lastPeriod) / 86400000) + 1;\n\n // Determine phase\n let phase = 'Follicular';\n if (today >= pmsStart && today < nextPeriod) phase = 'PMS';\n else if (cycleDay <= 5) phase = 'Menstrual';\n else if (today >= fertileStart && today <= fertileEnd) phase = 'Fertile';\n else if (today.toISOString().split('T')[0] === ovulationDate.toISOString().split('T')[0]) phase = 'Ovulation';\n\n const daysUntilPeriod = Math.ceil((nextPeriod - today) / 86400000);\n\n const prompt = `You are a warm and knowledgeable women's health and wellness coach. Generate a personalized weekly wellness digest for a woman currently in her ${phase} phase of her menstrual cycle.\n\nUser:\n- Name: ${u.name}\n- Current Phase: ${phase}\n- Cycle Day: ${cycleDay}\n- Days Until Next Period: ${daysUntilPeriod}\n- Cycle Length: ${u.cycle_length} days\n\nRespond ONLY in this JSON format:\n{\n \"phase_summary\": \"2-3 sentences explaining what happens in the body during this phase\",\n \"energy_tip\": \"One specific tip for managing energy this week\",\n \"nutrition_tip\": \"One specific nutrition recommendation for this phase\",\n \"movement_tip\": \"One specific exercise or movement recommendation\",\n \"mindset_tip\": \"One specific mental wellness tip for this phase\",\n \"weekly_affirmation\": \"A powerful affirmation for women in this phase\",\n \"what_to_expect\": \"One thing she should expect physically or emotionally this week\"\n}\n\nRules:\n- Use her name throughout\n- Be warm, sisterly, and empowering\n- Give specific practical tips not generic advice\n- Keep each tip to 1-2 sentences`;\n\n return {\n json: {\n ...u,\n phase,\n cycleDay,\n daysUntilPeriod,\n prompt\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "9bb474c4-2c90-48f3-a95d-d71c80cbb2e4",
"name": "Wellness Coach",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
512,
720
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "GPT-4O"
},
"options": {},
"responses": {
"values": [
{
"content": "={{ $json.prompt }}"
}
]
},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "745e553c-cd0f-4ea9-8d1a-373663c9e114",
"name": "Parse & Build Wellness Email",
"type": "n8n-nodes-base.code",
"position": [
864,
720
],
"parameters": {
"jsCode": "const response = items[0].json.output[0].content[0].text;\nconst cleaned = response.replace(/```json|```/g, '').trim();\nconst parsed = JSON.parse(cleaned);\n\nconst userData = $('Calculate Phase & Build Prompt').item.json;\n\nconst phaseColors = {\n Menstrual: { color1: '#922b21', color2: '#c0392b', emoji: '\ud83e\ude78' },\n Follicular: { color1: '#1a5276', color2: '#2980b9', emoji: '\ud83c\udf31' },\n Fertile: { color1: '#1a7a4a', color2: '#27ae60', emoji: '\ud83d\udc9a' },\n Ovulation: { color1: '#1a7a4a', color2: '#27ae60', emoji: '\ud83e\udd5a' },\n PMS: { color1: '#6c3483', color2: '#8e44ad', emoji: '\ud83d\ude2e\u200d\ud83d\udca8' }\n};\n\nconst colors = phaseColors[userData.phase] || phaseColors.Follicular;\n\nconst htmlEmail = `<!DOCTYPE html>\n<html>\n<head>\n <style>\n body { font-family: Arial, sans-serif; background: #fff0f7; margin: 0; padding: 0; }\n .container { max-width: 600px; margin: 30px auto; background: #ffffff; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.08); }\n .header { background: linear-gradient(135deg, ${colors.color1}, ${colors.color2}); padding: 30px; text-align: center; color: white; }\n .header h1 { margin: 0; font-size: 22px; }\n .badge { display: inline-block; background: rgba(255,255,255,0.25); padding: 4px 14px; border-radius: 20px; font-size: 13px; margin-top: 8px; }\n .body { padding: 30px; color: #333; }\n .tip-card { background: #fff0f7; border-left: 4px solid ${colors.color1}; padding: 14px 18px; border-radius: 8px; margin: 14px 0; }\n .tip-label { font-weight: bold; color: ${colors.color1}; font-size: 12px; text-transform: uppercase; margin-bottom: 6px; }\n .affirmation { background: linear-gradient(135deg, ${colors.color1}, ${colors.color2}); color: white; padding: 20px; border-radius: 8px; text-align: center; font-size: 16px; font-style: italic; margin: 20px 0; }\n .footer { background: #fff0f7; padding: 16px; text-align: center; font-size: 12px; color: #999; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <div class=\"header\">\n <h1>${colors.emoji} Weekly Wellness Digest</h1>\n <span class=\"badge\">${userData.phase} Phase \u00b7 Day ${userData.cycleDay} \u00b7 ${userData.daysUntilPeriod} days until period</span>\n </div>\n <div class=\"body\">\n <p>Hi ${userData.name} \ud83d\udc4b</p>\n <p>${parsed.phase_summary}</p>\n\n <div class=\"tip-card\">\n <div class=\"tip-label\">\u26a1 Energy This Week</div>\n ${parsed.energy_tip}\n </div>\n <div class=\"tip-card\">\n <div class=\"tip-label\">\ud83e\udd57 Nutrition Tip</div>\n ${parsed.nutrition_tip}\n </div>\n <div class=\"tip-card\">\n <div class=\"tip-label\">\ud83c\udfc3 Movement Tip</div>\n ${parsed.movement_tip}\n </div>\n <div class=\"tip-card\">\n <div class=\"tip-label\">\ud83e\udde0 Mindset Tip</div>\n ${parsed.mindset_tip}\n </div>\n <div class=\"tip-card\">\n <div class=\"tip-label\">\ud83d\udcc5 What to Expect This Week</div>\n ${parsed.what_to_expect}\n </div>\n\n <div class=\"affirmation\">\n \ud83d\udc9c ${parsed.weekly_affirmation}\n </div>\n </div>\n <div class=\"footer\">You subscribed to Cycle Wellness reminders.<br/>Reply STOP to unsubscribe.</div>\n </div>\n</body>\n</html>`;\n\nreturn [{\n json: {\n ...userData,\n htmlEmail,\n subject: `${colors.emoji} Your Weekly Wellness Digest \u2014 ${userData.phase} Phase \u00b7 Day ${userData.cycleDay}`\n }\n}];"
},
"typeVersion": 2
},
{
"id": "6f3100af-2cc2-44fe-af82-4ffc4ed6aca4",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1232,
-528
],
"parameters": {
"width": 384,
"height": 592,
"content": "## Weekly Automation\n\nEvery woman's cycle is different. This workflow \ntracks each subscriber's unique cycle, sends \nperfectly timed reminders before every phase, and \ndelivers personalized weekly wellness tips powered \nby GPT-4o \u2014 all completely automatically.\n\n### HOW IT WORKS\n\nSubscribers fill in a simple form with their last \nperiod date and cycle length. The workflow calculates \nall key dates \u2014 next period, ovulation, fertile \nwindow, and PMS start. Every morning it checks all \nsubscribers and sends the right email at the right \ntime. Every Sunday it generates a personalized \nwellness digest based on each subscriber's current \ncycle phase.\n\n### SETUP STEPS\n\n1. Create the Google Sheet with 2 sheets \u2014\n Subscribers and Send Log\n2. Connect Google Sheets, OpenAI, and Gmail \n credentials\n3. Test by submitting the form with your own email"
},
"typeVersion": 1
},
{
"id": "680fc0ba-37a1-4db8-975a-706cc321cf0b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-128
],
"parameters": {
"color": 7,
"width": 1216,
"height": 304,
"content": "Triggered when a subscriber submits the form. Collects name, email, last period date, and cycle length. Calculates next period, ovulation day, fertile window, and PMS start date automatically. Saves full profile to Subscribers sheet and sends a welcome email with their complete cycle overview."
},
"typeVersion": 1
},
{
"id": "8519a174-db23-4674-909b-f53cd7c28d73",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
208
],
"parameters": {
"color": 7,
"width": 2112,
"height": 352,
"content": "Runs every morning at 8AM. Reads all active subscribers, calculates today's cycle phase for each one, and sends the right email only on the right day \u2014 period incoming (3 days before), period start, ovulation alert, or PMS prep. Duplicate send prevention ensures each email type is only sent once per cycle."
},
"typeVersion": 1
},
{
"id": "6b394e20-d3f8-4cd5-8872-5a6c05641b7e",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-480,
608
],
"parameters": {
"color": 7,
"width": 2128,
"height": 288,
"content": "Runs every Sunday at 9AM. Calculates each subscriber's current cycle phase and generates a fully personalized wellness email using GPT-4o with energy, nutrition, movement, and mindset tips specific to their phase. Email design and colors adapt automatically to the current phase."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "29137dc9-597b-4bff-ad4e-80bf62fd5a21",
"connections": {
"Wellness Coach": {
"main": [
[
{
"node": "Parse & Build Wellness Email",
"type": "main",
"index": 0
}
]
]
},
"IF Email to Send": {
"main": [
[
{
"node": "Build Reminder Email",
"type": "main",
"index": 0
}
]
]
},
"Daily 8AM Trigger": {
"main": [
[
{
"node": "Read All Subscribers",
"type": "main",
"index": 0
}
]
]
},
"Build Welcome Email": {
"main": [
[
{
"node": "Send Welcome Email",
"type": "main",
"index": 0
}
]
]
},
"Cycle Wellness Form": {
"main": [
[
{
"node": "Calculate Cycle Dates",
"type": "main",
"index": 0
}
]
]
},
"Save to Subscribers": {
"main": [
[
{
"node": "Build Welcome Email",
"type": "main",
"index": 0
}
]
]
},
"Send Reminder Email": {
"main": [
[
{
"node": "Update Last Email Sent",
"type": "main",
"index": 0
}
]
]
},
"Build Reminder Email": {
"main": [
[
{
"node": "Send Reminder Email",
"type": "main",
"index": 0
}
]
]
},
"Read All Subscribers": {
"main": [
[
{
"node": "Filter Active Subscribers",
"type": "main",
"index": 0
}
]
]
},
"Send Wellness Digest": {
"main": [
[
{
"node": "Log to Send Log1",
"type": "main",
"index": 0
}
]
]
},
"Calculate Cycle Dates": {
"main": [
[
{
"node": "Save to Subscribers",
"type": "main",
"index": 0
}
]
]
},
"Read All Subscribers1": {
"main": [
[
{
"node": "Filter Active Subscribers1",
"type": "main",
"index": 0
}
]
]
},
"Update Last Email Sent": {
"main": [
[
{
"node": "Log to Send Log",
"type": "main",
"index": 0
}
]
]
},
"Calculate Today's Phase": {
"main": [
[
{
"node": "IF Email to Send",
"type": "main",
"index": 0
}
]
]
},
"Filter Active Subscribers": {
"main": [
[
{
"node": "Calculate Today's Phase",
"type": "main",
"index": 0
}
]
]
},
"Weekly Sunday 9AM Trigger": {
"main": [
[
{
"node": "Read All Subscribers1",
"type": "main",
"index": 0
}
]
]
},
"Filter Active Subscribers1": {
"main": [
[
{
"node": "Calculate Phase & Build Prompt",
"type": "main",
"index": 0
}
]
]
},
"Parse & Build Wellness Email": {
"main": [
[
{
"node": "Send Wellness Digest",
"type": "main",
"index": 0
}
]
]
},
"Calculate Phase & Build Prompt": {
"main": [
[
{
"node": "Wellness Coach",
"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.
gmailOAuth2googleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Most period tracking apps tell you when your period is coming. This workflow goes further — it tracks every phase of every subscriber's unique cycle, sends the right email at exactly the right time, and delivers GPT-4o powered wellness coaching every week tailored to where each…
Source: https://n8n.io/workflows/14019/ — 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.
Property management companies, building managers, and inspection teams who want to automate recurring property inspections, improve issue tracking, and streamline reporting.
Personalized Outreach & Follow-Up - Phase 2. Uses googleSheets, openAi, gmail, gmailTrigger. Scheduled trigger; 59 nodes.
This advanced workflow automates brand monitoring and media coverage tracking for musicians, bands, and music labels. The system uses multiple search queries (dorky) to discover mentions across the we
Automatically analyze your full sports performance evolution using your Strava activities, enriched with AI insights and delivered directly to your email — all powered by your own n8n instance.
Stop wasting billable hours on manual time-tracking. AutoTimesheet Pro uses AI to collect emails, meetings, and GitHub work, then writes a clean timesheet straight into Google Sheets. Perfect for deve