This workflow corresponds to n8n.io template #16028 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger 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": "vj7BlcV26okN7uqr",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Daily Study Planner",
"tags": [],
"nodes": [
{
"id": "4d9ef950-73af-4ef8-baff-43e9f7e90276",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-896,
-240
],
"parameters": {
"color": 4,
"width": 524,
"height": 1124,
"content": "## Daily Study Planner \u2014 GPT-4o-mini + Google Calendar + Google Sheets + Gmail\n\nFor students who want to automatically generate a personalised week-wise study schedule from their exam date, subjects, and daily available hours \u2014 with every study session added to Google Calendar and a full tracker saved to Google Sheets. Submit the form with your name, exam date, subjects, daily hours, and email. GPT-4o-mini generates a complete day-by-day study plan with specific topics per subject, session types (New Learning, Revision, Practice), duration, and start/end times \u2014 distributed intelligently across the available days with more revision closer to the exam. A Code node parses every individual study session into flat items. SplitInBatches processes one session at a time, creating a Google Calendar event for each. Once all events are created, a Code node rebuilds the full schedule rows from the parsed data. Google Sheets appends one row per study session to the Study Planner sheet. Gmail sends a formatted HTML confirmation email with the full week-wise schedule and study tips.\n\n## How it works\n- **1. Form \u2014 Study Planner Input** collects name, exam date, subjects, daily available hours, and email\n- **2. AI Agent \u2014 Generate Study Schedule** uses GPT-4o-mini to produce a complete day-by-day JSON study plan with topics, durations, and times\n- **OpenAI \u2014 GPT-4o-mini Model** language model attached to the AI Agent\n- **3. Code \u2014 Parse Schedule** strips markdown fences, parses JSON, flattens all daily sessions into individual items, and stores full metadata\n- **4. SplitInBatches \u2014 One Session at a Time** processes each study session individually in the loop\n- **5. Google Calendar \u2014 Create Study Event** creates one calendar event per study session with subject, topic, time, and session type in description\n- **6. Code \u2014 Build Sheet Rows and Email** runs after all calendar events are created \u2014 rebuilds session rows from stored data and builds the HTML confirmation email\n- **7. Google Sheets \u2014 Log Study Plan** appends one row per study session: date, subject, topic, duration, start/end time, session type, priority\n- **8. Gmail \u2014 Send Confirmation Email** sends the full formatted HTML study schedule with tips to the student\n\n## Set up steps\n1. In **OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI API credential\n2. In **5. Google Calendar \u2014 Create Study Event** \u2014 connect Google Calendar OAuth2 credential and replace `YOUR_CALENDAR_ID` (usually your email address or find it in Google Calendar settings)\n3. In **7. Google Sheets \u2014 Log Study Plan** \u2014 connect Google Sheets OAuth2 credential and replace `YOUR_GOOGLE_SHEET_ID`. Create a sheet tab named Study Planner with columns: Student Name, Exam Date, Subject, Topic, Date, Day, Start Time, End Time, Duration (hrs), Session Type, Priority, Status\n4. In **8. Gmail \u2014 Send Confirmation Email** \u2014 connect Gmail OAuth2 credential"
},
"typeVersion": 1
},
{
"id": "90e618c4-a961-4202-8f66-6c21127493d5",
"name": "Section \u2014 Form Input and GPT-4o-mini Schedule Generation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-272,
-96
],
"parameters": {
"color": 5,
"width": 580,
"height": 596,
"content": "## Form Input and GPT-4o-mini Schedule Generation\nForm collects exam details. GPT-4o-mini generates a complete day-by-day study plan in strict JSON \u2014 topics per subject, session types, durations, and start/end times distributed intelligently across available days."
},
"typeVersion": 1
},
{
"id": "8d69c89b-f252-43a3-b6a5-4bac626a0fc8",
"name": "Section \u2014 Schedule Parse and Session Split",
"type": "n8n-nodes-base.stickyNote",
"position": [
336,
0
],
"parameters": {
"color": 6,
"width": 500,
"height": 308,
"content": "## Schedule Parse and Session Split\nCode strips markdown, parses JSON, and flattens all sessions into individual items. SplitInBatches loops one session at a time \u2014 output[0] processes each session, output[1] fires when all sessions are done."
},
"typeVersion": 1
},
{
"id": "4aa2cc9d-88fa-45a6-ad57-fd72a49bbc97",
"name": "Section \u2014 Google Calendar Event Creation Loop",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
-64
],
"parameters": {
"color": 6,
"width": 308,
"height": 468,
"content": "## Google Calendar Event Creation Loop\nCreates one calendar event per study session. Loops back to SplitInBatches after each event until all sessions are created."
},
"typeVersion": 1
},
{
"id": "9d476154-a6bb-48ec-a1fb-2e68871d957f",
"name": "Section \u2014 Sheet Row Build, Sheets Log, and Gmail Confirmation",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
32
],
"parameters": {
"color": 4,
"width": 700,
"height": 324,
"content": "## Sheet Row Build, Sheets Log, and Gmail Confirmation\nAfter all calendar events are created, Code rebuilds the full session list from stored parse data. Sheets appends one row per session. Gmail sends the HTML schedule with tips."
},
"typeVersion": 1
},
{
"id": "ea7ddc4a-ac7f-454e-8183-ced09f126e48",
"name": "1. Form \u2014 Study Planner Input",
"type": "n8n-nodes-base.formTrigger",
"position": [
-192,
128
],
"parameters": {
"options": {},
"formTitle": "Daily Study Planner",
"formFields": {
"values": [
{
"fieldLabel": "Your Name",
"placeholder": "e.g. Rahul Sharma",
"requiredField": true
},
{
"fieldType": "date",
"fieldLabel": "Exam Date",
"requiredField": true
},
{
"fieldLabel": "Subjects",
"placeholder": "e.g. Mathematics, Physics, Chemistry, English",
"requiredField": true
},
{
"fieldType": "number",
"fieldLabel": "Daily Available Hours",
"placeholder": "e.g. 6",
"requiredField": true
},
{
"fieldLabel": "Study Start Time",
"placeholder": "e.g. 09:00 (24-hour format)",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Your Email",
"placeholder": "your@email.com",
"requiredField": true
}
]
},
"formDescription": "Enter your exam details and get a personalised week-wise study schedule added to your Google Calendar \u2014 automatically."
},
"typeVersion": 2.2
},
{
"id": "d8f4bdde-0dad-4f99-abc5-6db9cc009203",
"name": "2. AI Agent \u2014 Generate Study Schedule",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
64,
128
],
"parameters": {
"text": "=Student Name: {{ $json['Your Name'] }}\nExam Date: {{ $json['Exam Date'] }}\nSubjects: {{ $json['Subjects'] }}\nDaily Available Hours: {{ $json['Daily Available Hours'] }}\nStudy Start Time: {{ $json['Study Start Time'] }}\nToday's Date: {{ $now.toFormat('yyyy-MM-dd') }}",
"options": {
"systemMessage": "You are an expert study planner and educational coach. Create a personalised week-wise study schedule for a student.\n\nRules:\n1. Count the exact number of days from today to the exam date (inclusive of today, exclusive of exam day)\n2. Distribute subjects evenly across available days \u2014 more revision sessions closer to the exam\n3. First 60% of days: New Learning sessions. Last 40% of days: Revision + Practice sessions\n4. Keep each session duration between 1.5 and 3 hours\n5. Total sessions per day must not exceed the daily available hours\n6. Spread subjects fairly \u2014 no subject should be neglected\n7. Include short breaks implicitly (do not schedule break blocks)\n8. Assign specific topics per subject (not just 'study mathematics' \u2014 be specific like 'Quadratic Equations', 'Integration by Parts', etc.)\n9. Last 2 days before exam: only Revision and Quick Practice sessions\n\nSession types allowed: New Learning, Revision, Practice Test, Quick Review\nPriority levels: High, Medium, Low\n\nReturn ONLY a valid JSON object \u2014 no markdown, no backticks, no explanation:\n{\n \"student_name\": \"string\",\n \"exam_date\": \"YYYY-MM-DD\",\n \"start_date\": \"YYYY-MM-DD\",\n \"total_days\": 14,\n \"total_sessions\": 28,\n \"subjects\": [\"Subject1\", \"Subject2\"],\n \"overview_summary\": \"3-4 sentence summary of the study plan strategy\",\n \"study_tips\": [\"tip 1\", \"tip 2\", \"tip 3\", \"tip 4\", \"tip 5\"],\n \"daily_plan\": [\n {\n \"date\": \"YYYY-MM-DD\",\n \"day_number\": 1,\n \"day_of_week\": \"Monday\",\n \"sessions\": [\n {\n \"subject\": \"Mathematics\",\n \"topic\": \"Quadratic Equations \u2014 Discriminant and Roots\",\n \"duration_hours\": 2,\n \"start_time\": \"09:00\",\n \"end_time\": \"11:00\",\n \"session_type\": \"New Learning\",\n \"priority\": \"High\"\n }\n ]\n }\n ]\n}\n\nReturn ONLY the JSON object. Nothing before or after it."
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "e7ddc74d-9c52-4f17-8b3a-52bfdf41e6a1",
"name": "OpenAI \u2014 GPT-4o-mini Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
64,
336
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {},
"builtInTools": {}
},
"typeVersion": 1.3
},
{
"id": "6404a031-e8a0-44a4-8f07-6b17a3821de9",
"name": "3. Code \u2014 Parse Schedule",
"type": "n8n-nodes-base.code",
"position": [
368,
128
],
"parameters": {
"jsCode": "// Parse AI output and flatten all sessions into individual items\nconst raw = $input.first().json.output || $input.first().json.text || '';\n\nlet schedule;\ntry {\n const cleaned = raw.replace(/```json/gi, '').replace(/```/g, '').trim();\n schedule = JSON.parse(cleaned);\n} catch (e) {\n throw new Error('Could not parse study schedule JSON from AI. Raw: ' + raw.slice(0, 300));\n}\n\nif (!schedule.daily_plan || schedule.daily_plan.length === 0) {\n throw new Error('AI returned an empty daily plan. Check the exam date and subjects.');\n}\n\n// Flatten all sessions into individual items for SplitInBatches\nconst sessions = [];\nfor (const day of schedule.daily_plan) {\n for (const session of (day.sessions || [])) {\n sessions.push({\n // Session fields for Calendar + Sheets\n student_name: schedule.student_name,\n exam_date: schedule.exam_date,\n date: day.date,\n day_number: day.day_number,\n day_of_week: day.day_of_week,\n subject: session.subject,\n topic: session.topic,\n duration_hours: session.duration_hours,\n start_time: session.start_time,\n end_time: session.end_time,\n session_type: session.session_type,\n priority: session.priority,\n // Full schedule stored for reference after loop\n _overview_summary: schedule.overview_summary,\n _study_tips: JSON.stringify(schedule.study_tips || []),\n _total_sessions: schedule.total_sessions,\n _total_days: schedule.total_days,\n _subjects: JSON.stringify(schedule.subjects || []),\n _user_email: $('1. Form \u2014 Study Planner Input').item.json['Your Email'],\n _user_name: $('1. Form \u2014 Study Planner Input').item.json['Your Name']\n });\n }\n}\n\nif (sessions.length === 0) {\n throw new Error('No study sessions generated. The exam date may be too close or in the past.');\n}\n\nreturn sessions.map(s => ({ json: s }));"
},
"typeVersion": 2
},
{
"id": "9257d391-7aa7-4fdd-996d-1b912ea352e1",
"name": "4. SplitInBatches \u2014 One Session at a Time",
"type": "n8n-nodes-base.splitInBatches",
"position": [
608,
128
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "60c52e11-0854-45f6-9286-8b1546eda8f0",
"name": "5. Google Calendar \u2014 Create Study Event",
"type": "n8n-nodes-base.googleCalendar",
"position": [
928,
112
],
"parameters": {
"end": "={{ $json.date + 'T' + $json.end_time + ':00' }}",
"start": "={{ $json.date + 'T' + $json.start_time + ':00' }}",
"calendar": {
"__rl": true,
"mode": "id",
"value": "YOUR_CALENDAR_ID"
},
"additionalFields": {
"summary": "={{ $json.subject + ' \u2014 ' + $json.topic }}",
"description": "=Session Type: {{ $json.session_type }}\nPriority: {{ $json.priority }}\nDuration: {{ $json.duration_hours }} hour(s)\nDay {{ $json.day_number }} of {{ $json._total_days }}\n\nExam Date: {{ $json.exam_date }}\nStudent: {{ $json.student_name }}"
}
},
"typeVersion": 1.3
},
{
"id": "a448eac7-3035-40f1-93e8-cbeec8f2fc83",
"name": "6. Code \u2014 Build Sheet Rows and Email",
"type": "n8n-nodes-base.code",
"position": [
1312,
160
],
"parameters": {
"jsCode": "// Build all session rows for Sheets and HTML email from stored data\n// This runs ONCE after all calendar events are created (SplitInBatches done output)\n// Get all sessions from node 3 parse output\nconst allSessions = $('3. Code \u2014 Parse Schedule').all();\n\nif (!allSessions || allSessions.length === 0) {\n throw new Error('No session data found from parse node.');\n}\n\n// Get metadata from first session\nconst meta = allSessions[0].json;\nconst studentName = meta._user_name || '';\nconst userEmail = meta._user_email || '';\nconst examDate = meta.exam_date || '';\nconst overviewSummary = meta._overview_summary || '';\nconst studyTips = JSON.parse(meta._study_tips || '[]');\nconst subjects = JSON.parse(meta._subjects || '[]');\nconst totalSessions = meta._total_sessions || allSessions.length;\nconst totalDays = meta._total_days || 0;\n\n// Build Sheets rows array\nconst sheetRows = allSessions.map(s => ({\n 'Student Name': s.json.student_name,\n 'Exam Date': s.json.exam_date,\n 'Subject': s.json.subject,\n 'Topic': s.json.topic,\n 'Date': s.json.date,\n 'Day': s.json.day_of_week + ' (Day ' + s.json.day_number + ')',\n 'Start Time': s.json.start_time,\n 'End Time': s.json.end_time,\n 'Duration (hrs)': s.json.duration_hours,\n 'Session Type': s.json.session_type,\n 'Priority': s.json.priority,\n 'Status': 'Scheduled'\n}));\n\n// Group sessions by date for HTML email\nconst byDate = {};\nfor (const s of allSessions) {\n const d = s.json.date;\n if (!byDate[d]) byDate[d] = { day_of_week: s.json.day_of_week, day_number: s.json.day_number, sessions: [] };\n byDate[d].sessions.push(s.json);\n}\n\nconst esc = str => String(str || '').replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');\n\nconst sessionTypeColor = t => {\n if (t === 'New Learning') return '#3b82f6';\n if (t === 'Revision') return '#10b981';\n if (t === 'Practice Test') return '#f59e0b';\n if (t === 'Quick Review') return '#8b5cf6';\n return '#6b7280';\n};\n\nconst priorityBadge = p => {\n const c = p === 'High' ? '#ef4444' : p === 'Medium' ? '#f97316' : '#22c55e';\n return `<span style=\"background:${c};color:#fff;font-size:10px;padding:2px 7px;border-radius:10px;font-weight:700;\">${esc(p)}</span>`;\n};\n\n// Build schedule table rows grouped by day\nlet scheduleHtml = '';\nfor (const [date, dayData] of Object.entries(byDate)) {\n const dateFormatted = new Date(date).toLocaleDateString('en-US', { weekday:'long', month:'short', day:'numeric' });\n scheduleHtml += `\n <tr>\n <td colspan=\"5\" style=\"background:#1e3a5f;color:#fff;padding:8px 12px;font-size:12px;font-weight:700;\">\n Day ${dayData.day_number} \u2014 ${dateFormatted}\n </td>\n </tr>`;\n for (const session of dayData.sessions) {\n const tc = sessionTypeColor(session.session_type);\n scheduleHtml += `\n <tr style=\"border-bottom:1px solid #f0f4f8;\">\n <td style=\"padding:7px 12px;font-size:13px;font-weight:600;color:#1e3a5f;\">${esc(session.subject)}</td>\n <td style=\"padding:7px 12px;font-size:12px;color:#374151;\">${esc(session.topic)}</td>\n <td style=\"padding:7px 12px;font-size:12px;color:#6b7280;\">${esc(session.start_time)} \u2013 ${esc(session.end_time)}</td>\n <td style=\"padding:7px 12px;\">\n <span style=\"background:${tc};color:#fff;font-size:10px;padding:2px 7px;border-radius:10px;font-weight:600;\">${esc(session.session_type)}</span>\n </td>\n <td style=\"padding:7px 12px;\">${priorityBadge(session.priority)}</td>\n </tr>`;\n }\n}\n\nconst tipsHtml = studyTips.map(t => `<li style=\"margin-bottom:6px;font-size:13px;color:#374151;\">${esc(t)}</li>`).join('');\n\nconst htmlEmail = `<!DOCTYPE html>\n<html>\n<head><meta charset=\"UTF-8\"></head>\n<body style=\"font-family:Arial,sans-serif;max-width:700px;margin:0 auto;background:#f0f4f8;padding:20px;\">\n\n <div style=\"background:#1e3a5f;padding:28px;border-radius:10px 10px 0 0;\">\n <div style=\"font-size:11px;color:#93c5fd;letter-spacing:1.5px;text-transform:uppercase;margin-bottom:8px;\">Study Planner</div>\n <h1 style=\"color:#fff;font-size:22px;margin:0;\">Your Study Schedule is Ready, ${esc(studentName)}!</h1>\n <p style=\"color:#93c5fd;font-size:13px;margin:8px 0 0;\">Exam Date: ${esc(examDate)} \u2022 ${totalSessions} sessions across ${totalDays} days</p>\n </div>\n\n <div style=\"background:#fff;padding:24px;\">\n <div style=\"background:#eff6ff;border-left:4px solid #3b82f6;padding:14px 16px;border-radius:0 6px 6px 0;margin-bottom:20px;\">\n <p style=\"font-weight:700;color:#1e3a5f;margin:0 0 6px;\">Study Plan Overview</p>\n <p style=\"font-size:13px;color:#374151;margin:0;line-height:1.7;\">${esc(overviewSummary)}</p>\n </div>\n\n <p style=\"font-size:13px;color:#374151;margin-bottom:16px;\">All study sessions have been added to your Google Calendar. Here is your complete schedule:</p>\n\n <table style=\"width:100%;border-collapse:collapse;font-size:13px;margin-bottom:24px;\">\n <thead>\n <tr style=\"background:#f8fafc;\">\n <th style=\"padding:8px 12px;text-align:left;font-size:11px;color:#6b7280;text-transform:uppercase;border-bottom:2px solid #e5e7eb;\">Subject</th>\n <th style=\"padding:8px 12px;text-align:left;font-size:11px;color:#6b7280;text-transform:uppercase;border-bottom:2px solid #e5e7eb;\">Topic</th>\n <th style=\"padding:8px 12px;text-align:left;font-size:11px;color:#6b7280;text-transform:uppercase;border-bottom:2px solid #e5e7eb;\">Time</th>\n <th style=\"padding:8px 12px;text-align:left;font-size:11px;color:#6b7280;text-transform:uppercase;border-bottom:2px solid #e5e7eb;\">Type</th>\n <th style=\"padding:8px 12px;text-align:left;font-size:11px;color:#6b7280;text-transform:uppercase;border-bottom:2px solid #e5e7eb;\">Priority</th>\n </tr>\n </thead>\n <tbody>${scheduleHtml}</tbody>\n </table>\n\n <h3 style=\"color:#1e3a5f;font-size:14px;margin:0 0 10px;\">Study Tips</h3>\n <ul style=\"padding-left:18px;margin:0 0 20px;\">${tipsHtml}</ul>\n\n <div style=\"background:#f0fdf4;border-left:4px solid #10b981;padding:12px 16px;border-radius:0 6px 6px 0;font-size:13px;color:#065f46;\">\n All ${totalSessions} study sessions are now in your Google Calendar. Open your calendar to view the full schedule.\n </div>\n </div>\n\n <div style=\"background:#1e3a5f;padding:14px 24px;border-radius:0 0 10px 10px;text-align:center;\">\n <p style=\"color:#93c5fd;font-size:11px;margin:0;\">Generated by n8n Daily Study Planner \u2022 Powered by GPT-4o-mini</p>\n </div>\n\n</body>\n</html>`;\n\nreturn [{ json: {\n user_email: userEmail,\n student_name: studentName,\n exam_date: examDate,\n total_sessions: totalSessions,\n total_days: totalDays,\n sheet_rows: sheetRows,\n html_email: htmlEmail\n}}];"
},
"typeVersion": 2
},
{
"id": "41a58215-b9d2-4113-9dd5-1f241b1563b2",
"name": "7. Google Sheets \u2014 Log Study Plan",
"type": "n8n-nodes-base.googleSheets",
"position": [
1552,
160
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "Student Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Student Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Exam Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Exam Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Subject",
"type": "string",
"display": true,
"required": false,
"displayName": "Subject",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Topic",
"type": "string",
"display": true,
"required": false,
"displayName": "Topic",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Day",
"type": "string",
"display": true,
"required": false,
"displayName": "Day",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Start Time",
"type": "string",
"display": true,
"required": false,
"displayName": "Start Time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "End Time",
"type": "string",
"display": true,
"required": false,
"displayName": "End Time",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Duration (hrs)",
"type": "string",
"display": true,
"required": false,
"displayName": "Duration (hrs)",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Session Type",
"type": "string",
"display": true,
"required": false,
"displayName": "Session Type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Priority",
"type": "string",
"display": true,
"required": false,
"displayName": "Priority",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": true
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Study Planner"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "f95f977a-f4f9-4949-a435-7dfcfcf9ca46",
"name": "8. Gmail \u2014 Send Confirmation Email",
"type": "n8n-nodes-base.gmail",
"position": [
1792,
160
],
"parameters": {
"sendTo": "={{ $json.user_email }}",
"message": "={{ $json.html_email }}",
"options": {
"senderName": "Study Planner Bot"
},
"subject": "=Your Study Schedule is Ready \u2014 Exam on {{ $json.exam_date }} | {{ $json.total_sessions }} Sessions Planned"
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "a7e7a835-42e2-46dc-81d2-4a54e13691b5",
"connections": {
"3. Code \u2014 Parse Schedule": {
"main": [
[
{
"node": "4. SplitInBatches \u2014 One Session at a Time",
"type": "main",
"index": 0
}
]
]
},
"OpenAI \u2014 GPT-4o-mini Model": {
"ai_languageModel": [
[
{
"node": "2. AI Agent \u2014 Generate Study Schedule",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"1. Form \u2014 Study Planner Input": {
"main": [
[
{
"node": "2. AI Agent \u2014 Generate Study Schedule",
"type": "main",
"index": 0
}
]
]
},
"7. Google Sheets \u2014 Log Study Plan": {
"main": [
[
{
"node": "8. Gmail \u2014 Send Confirmation Email",
"type": "main",
"index": 0
}
]
]
},
"6. Code \u2014 Build Sheet Rows and Email": {
"main": [
[
{
"node": "7. Google Sheets \u2014 Log Study Plan",
"type": "main",
"index": 0
}
]
]
},
"2. AI Agent \u2014 Generate Study Schedule": {
"main": [
[
{
"node": "3. Code \u2014 Parse Schedule",
"type": "main",
"index": 0
}
]
]
},
"5. Google Calendar \u2014 Create Study Event": {
"main": [
[
{
"node": "4. SplitInBatches \u2014 One Session at a Time",
"type": "main",
"index": 0
}
]
]
},
"4. SplitInBatches \u2014 One Session at a Time": {
"main": [
[
{
"node": "5. Google Calendar \u2014 Create Study Event",
"type": "main",
"index": 0
}
],
[
{
"node": "6. Code \u2014 Build Sheet Rows and Email",
"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 collects exam details via an n8n Form, uses OpenAI (GPT-4o-mini) to generate a day-by-day study plan, creates one Google Calendar event per study session, logs all sessions to Google Sheets, and emails the full schedule to the student via Gmail. Receives study…
Source: https://n8n.io/workflows/16028/ — 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.
This n8n workflow template automates your lead generation and follow-up process using AI. It captures leads through a form, enriches them with company data, classifies them into different categories,
This workflow is designed for Scrum Masters and Agile Coaches who prepare and coordinate Sprint Planning sessions, using Google Calendar, Google Sheets, and OpenAI.
This workflow is designed for Scrum Masters, Agile Coaches, and Product Owners who want to automate backlog refinement preparation using Google Sheets, Gmail, and OpenAI. It’s ideal for teams seeking
The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical
This n8n workflow automates turning short user ideas into production-ready real-estate marketing assets (photorealistic images and optional 360° videos). A form submission seeds a prompt board → an LL