This workflow corresponds to n8n.io template #9344 — we link there as the canonical source.
This workflow follows the Agent → 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": "zX0SNUBqlonCm9UQ",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Generate n8n template descriptions from Google Drive",
"tags": [],
"nodes": [
{
"id": "ddb41538-8446-4938-9233-7475b5a63fbb",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-688,
-64
],
"parameters": {},
"typeVersion": 1
},
{
"id": "7c0fd462-7b25-4e1f-852d-5b526f16de0f",
"name": "Extract from File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
208,
-192
],
"parameters": {
"options": {},
"operation": "fromJson"
},
"typeVersion": 1
},
{
"id": "5e02aa21-b341-489c-82fb-feacb0747b13",
"name": "Download file",
"type": "n8n-nodes-base.googleDrive",
"position": [
-16,
-192
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{$json[\"id\"]}}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "016bff72-bd86-4eba-9c10-86853cd102cc",
"name": "Search files and folders",
"type": "n8n-nodes-base.googleDrive",
"position": [
-464,
-64
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1HP3LnTPLwe81xUrp0P6aV2nJKdX6BIcM",
"cachedResultUrl": "https://drive.google.com/drive/folders/1HP3LnTPLwe81xUrp0P6aV2nJKdX6BIcM",
"cachedResultName": "n8n json checker"
}
},
"options": {},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3,
"alwaysOutputData": true
},
{
"id": "eca112e7-3b66-455e-8086-2d3bf701cd3b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-832,
-320
],
"parameters": {
"height": 192,
"content": "## \u2699\ufe0f Step 1: Manual Trigger \nUse this to manually start the workflow when testing or batch-processing workflow descriptions. \n\u27a1\ufe0f No setup required.\n"
},
"typeVersion": 1
},
{
"id": "7e6d213b-112d-4759-bc8d-2d5f675a1098",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-544,
96
],
"parameters": {
"width": 288,
"height": 320,
"content": "## \ud83d\udcc2 Step 2: Search Files and Folders \nThis node searches a specific Google Drive folder for JSON workflow files to process. \n\n**Setup Instructions:** \n- Connect your own Google Drive OAuth2 credentials. \n- Replace any hardcoded folder ID with a variable or reference to your Drive. \n\n\n"
},
"typeVersion": 1
},
{
"id": "e51a77b0-95e8-418a-89d3-2e610c6cac7d",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
208
],
"parameters": {
"height": 304,
"content": "## \ud83e\udde0 Step 8:Store AI Context (LangChain Memory)\nStores short-term AI context to improve continuity during prompt execution. \nNo credentials required. \n\ud83d\udca1 Keep context window small (7\u201310) to avoid large memory overhead.\n"
},
"typeVersion": 1
},
{
"id": "8ff67280-778b-4de1-86d2-82905c3ed3e4",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1184,
-496
],
"parameters": {
"height": 288,
"content": "## \u2728 Step 11: Format HTML Email \nCreates clean HTML and plain-text versions of the generated description for email + Google Sheet logging. \n\n\u2705 No credentials here. \n\ud83d\udca1 You may adjust the CSS styling within the HTML block.\n"
},
"typeVersion": 1
},
{
"id": "e8695343-49c0-4cf3-b0b0-305b36c5a450",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
816,
-592
],
"parameters": {
"height": 368,
"content": "## \ud83e\uddfe Step 10: Format Markdown Description \nTakes the AI output and converts it into structured Markdown text suitable for n8n template publishing. \n\n**Setup Instructions:** \n- Ensure each section (Overview, Benefits, etc.) is returned properly. \n- You can tweak emoji styles or section titles here. \n\u2705 No credentials required.\n"
},
"typeVersion": 1
},
{
"id": "453d0845-afca-4018-a7be-b464150598d9",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
800,
160
],
"parameters": {
"height": 288,
"content": "## \ud83e\udde9 Step 9: Parse AI Response into Structured JSON\nEnsures AI response is parsed into clean JSON format for the next node. \n\u2705 No sensitive data. \n\ud83d\udca1 You can adjust the schema if adding more description sections.\n"
},
"typeVersion": 1
},
{
"id": "af7d1723-3163-4083-857a-d3367b9cbd79",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
192,
176
],
"parameters": {
"height": 320,
"content": "## \ud83d\udcac Step 7: Connect to Azure OpenAI GPT Model\n\n**Setup Instructions:** \n- Use your own `azureOpenAiApi` credential . \n- Verify the model name (gpt-4o or equivalent). \n\n"
},
"typeVersion": 1
},
{
"id": "205d405d-85ff-4ee8-be90-31df1da4f56a",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
512,
-688
],
"parameters": {
"height": 448,
"content": "## \ud83e\udd16 Step 6: AI Agent \nUses a LangChain agent + Azure OpenAI model to generate workflow titles and structured descriptions. \n\n**Setup Instructions:** \n- Connect the AI Language Model and Output Parser as shown. \n- This node defines the prompt and ensures the response follows n8n Template Guidelines. \n\n\u2705 No sensitive info here \u2014 well-structured system prompt! \n OpenAI.\n"
},
"typeVersion": 1
},
{
"id": "6181afda-2715-438e-8a4a-4233ef3b824b",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
176,
-400
],
"parameters": {
"height": 192,
"content": "## \ud83d\udce6 Step 5: Extract JSON Data \nParses the downloaded file to extract workflow JSON data before AI processing. \nNo credentials needed here.\n"
},
"typeVersion": 1
},
{
"id": "da26533d-f55d-4e7c-b97a-1d7be91897f8",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-80,
-528
],
"parameters": {
"height": 320,
"content": "## \u2b07\ufe0f Step 4: Download File \nDownloads the JSON file contents for each matched Drive item. \n\n**Setup Instructions:** \n- Connect to your Google Drive OAuth2 credentials . \n- Ensure file access permissions allow downloads. \n\n\n"
},
"typeVersion": 1
},
{
"id": "129b4156-d3ec-4528-9be9-743dc3371fc1",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-352,
-352
],
"parameters": {
"height": 240,
"content": "## \ud83d\udd01 Step 3: Loop Over JSONS \nProcesses each found file individually to ensure the workflow handles large folders efficiently. \nNo credential changes required. \n\u27a1\ufe0f You can adjust batch size in the node options.\n"
},
"typeVersion": 1
},
{
"id": "c51e2df4-3e5a-4f65-b77f-24d6ce7dcec2",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
1728,
-240
],
"parameters": {
"height": 368,
"content": "## \ud83d\udce7 Step 13: Send Email with Description \nSends a formatted HTML email with the generated template description. \n\n \n\n**Setup:** \n- Use your Gmail OAuth2 credentials (`gmailOAuth2`). \n- Test with a non-personal account if publishing publicly.\n"
},
"typeVersion": 1
},
{
"id": "68f7f509-ebe2-45f1-a4d7-a3f306222dc4",
"name": "Sticky Note13",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1360,
-352
],
"parameters": {
"width": 384,
"height": 448,
"content": "## \ud83d\udfe8 Workflow Overview \nThis workflow automates the creation of structured n8n template descriptions. \nIt fetches JSON workflow files from Google Drive, uses an AI agent (Azure OpenAI + LangChain) to analyze them, and then formats detailed descriptions for publishing. \n\n### \u2699\ufe0f Flow Summary \n1. Trigger workflow manually. \n2. Search workflow files in Google Drive. \n3. Download and extract JSON data. \n4. Use AI Agent to generate title + description. \n5. Format Markdown and HTML outputs. \n6. Append results to Google Sheets. \n7. Send formatted description via Gmail. \n\n**Use Case:** Ideal for automating n8n template documentation and content generation.\n"
},
"typeVersion": 1
},
{
"id": "35a62d62-6ede-4b06-8d04-a4d3760e220f",
"name": "Loop Over JSONS",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-240,
-64
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "77e3adc9-3c23-4eb8-8c29-0cd630ccb8cc",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
496,
-192
],
"parameters": {
"text": "=You are given this n8n workflow JSON:\n\n{{ JSON.stringify($json) }}\n\nGenerate the **best possible template title** and a **structured description** following the rules. \nMake sure the title matches the format (Action verb + thing being manipulated + to/on/in/from + where). \nThe description must follow the defined section structure and highlight actual logic from the workflow.\n",
"options": {
"systemMessage": "=You are an **expert n8n template description generator**. \nYour role is to analyze a provided workflow JSON and generate both a **precise template title** and a **structured description** suitable for n8n\u2019s Template Publishing Guidelines. \n\n---\n\n### \ud83d\udd11 Title Rules\n- Format: **Action verb** + **thing being manipulated** + **to/on/in/from** + **where** \n - Example: \u201cOne-way contact sync from Pipedrive to HubSpot\u201d \n- The title must: \n - Be **short (\u226410 words)**, with no filler. \n - Use **active verbs** (Automate, Sync, Track, Re-engage, Generate, etc.). \n - Clearly name the **services, apps, or data being connected**. \n - Indicate **directionality** where applicable (from \u2192 to). \n\n---\n\n### \ud83d\udcdd Description Style Guidelines\n- Write in **professional, user-friendly language**. \n- Use **light emoji markers** (\ud83d\udcca, \u26a1, \ud83d\ude80, \ud83d\udce7) to improve readability. \n- Avoid generic filler \u2014 **every point must reflect actual workflow logic**. \n- Keep explanations **short, direct, and clear**. \n- Structure content in **bulleted lists** under clear section headers. \n- Ensure **accuracy to the JSON nodes and connections**. \n- Use an **automation-savvy tone** (confident, helpful, concise). \n\n---\n\n### \ud83d\udce6 Output Sections (Always in This Order)\n\n1. **title** \n - A concise workflow title that follows the naming convention above. \n\n2. **overview** \n - A one-line, catchy summary of the workflow\u2019s purpose. \n\n3. **what_this_template_does** \n - Step-by-step, **chronological explanation** of the workflow. \n - Mention triggers, actions, and end results in plain English. \n\n4. **key_benefits** \n - 4\u20136 **outcome-focused benefits** (time saved, efficiency, error reduction). \n\n5. **features** \n - Breakdown of **nodes, triggers, filters, and integrations**. \n\n6. **requirements** \n - List of **services, credentials, or accounts** needed. \n\n7. **target_audience** \n - Who the workflow is most useful for (teams, roles, industries). \n\n8. **setup_instructions** \n - Practical, **step-by-step setup guidance** (credentials, environment variables, import, testing, activation). \n\n---\n\n### \u26a0\ufe0f Critical Rules\n- Do **not** invent steps or tools not present in the JSON. \n- If a section has no applicable content, **omit gracefully** (do not fill with placeholders). \n- Ensure consistency: every bullet point must tie back to actual workflow logic. \n- Avoid redundancy \u2014 keep the flow **concise but complete**. \n\n---\n\n### \u2705 Example Output Format (for clarity)\n\n**title:** \nOne-way contact sync from Pipedrive to HubSpot \n\n**overview:** \nAutomatically sync new contacts from Pipedrive into HubSpot CRM to keep sales and marketing aligned. \ud83d\udd04 \n\n**what_this_template_does:** \n- Runs every hour via schedule trigger \u23f0 \n- Fetches new contacts from Pipedrive \ud83d\udce5 \n- Creates or updates matching contacts in HubSpot CRM \ud83d\udcca \n\n**key_benefits:** \n- \u2705 No more manual contact transfers \n- \u2705 Keeps CRM records consistent \n- \u2705 Saves time for sales teams \n\n**features:** \n- Hourly schedule trigger \n- Pipedrive API integration \n- HubSpot CRM integration \n\n**requirements:** \n- Pipedrive OAuth2 credentials \n- HubSpot OAuth2 credentials \n\n**target_audience:** \n- Sales teams managing dual CRMs \n- Agencies working with multiple clients \n\n**setup_instructions:** \n- Connect Pipedrive and HubSpot accounts \ud83d\udd11 \n- Import the workflow JSON \ud83d\udce6 \n- Adjust sync interval if needed \ud83d\udd52 \n- Activate workflow \ud83d\ude80 \n"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.1
},
{
"id": "c3f2e1e9-69db-4ccb-9022-2ebc4b45e88d",
"name": "Format Markdown Description",
"type": "n8n-nodes-base.code",
"position": [
896,
-192
],
"parameters": {
"jsCode": "// Get input data\nconst inputData = $input.all();\n\n// Function to convert array to numbered list with emojis\nfunction formatList(items, emoji = '') {\n return items.map((item, index) => `${index + 1}. ${item} ${emoji}`).join('\\n');\n}\n\n// Function to convert array to bullet list with checkmarks\nfunction formatBenefits(items) {\n return items.map(item => `\u2705 ${item}`).join('\\n');\n}\n\n// Function to convert array to bullet list with asterisks\nfunction formatFeatures(items) {\n return items.map(item => `* ${item}`).join('\\n');\n}\n\n// Function to convert array to bullet list with emojis\nfunction formatAudience(items) {\n const emojis = ['\ud83d\udc69\u200d\ud83d\udcbc', '\ud83d\udd04', '\ud83c\udfe2', '\ud83c\udf10', '\ud83d\udcca'];\n return items.map((item, index) => `* ${item} ${emojis[index] || '\u2728'}`).join('\\n');\n}\n\n// Function to convert setup instructions\nfunction formatSetup(items) {\n const emojis = ['\ud83d\udd11', '\u2699\ufe0f', '\ud83d\udd52', '\ud83d\udce6', '\u2705', '\ud83d\ude80'];\n return items.map((item, index) => `${index + 1}. ${item} ${emojis[index] || '\ud83d\udccc'}`).join('\\n');\n}\n\n// Process each item in the input\nconst results = inputData.map(item => {\n const data = item.json.output;\n \n // Build the formatted output\n let formattedOutput = `**Description**\\n`;\n formattedOutput += `${data.overview} \ud83d\udc8c\ud83d\udcca\ud83d\udcac\\n\\n`;\n \n formattedOutput += `**What This Template Does**\\n`;\n formattedOutput += formatList(data.what_this_template_does, '') + '\\n\\n';\n \n formattedOutput += `**Key Benefits**\\n`;\n formattedOutput += formatBenefits(data.key_benefits) + '\\n\\n';\n \n formattedOutput += `**Features**\\n`;\n formattedOutput += formatFeatures(data.features) + '\\n\\n';\n \n formattedOutput += `**Requirements**\\n`;\n formattedOutput += data.requirements.map(item => `* ${item}`).join('\\n') + '\\n\\n';\n \n formattedOutput += `**Target Audience**\\n`;\n formattedOutput += formatAudience(data.target_audience) + '\\n\\n';\n \n formattedOutput += `**Step-by-Step Setup Instructions**\\n`;\n formattedOutput += formatSetup(data.setup_instructions);\n \n return {\n json: {\n title: data.title,\n formatted_description: formattedOutput\n }\n };\n});\n\nreturn results;"
},
"typeVersion": 2
},
{
"id": "11f7b052-0cb4-4cfe-8aae-bf933d797a5a",
"name": "Format HTML Email",
"type": "n8n-nodes-base.code",
"position": [
1344,
-192
],
"parameters": {
"jsCode": "// Get input data\nconst inputData = $input.all();\n\nconst results = inputData.map(item => {\n const data = item.json;\n const description = data.formatted_description || '';\n\n // Parse sections\n const sections = {\n overview: description.match(/\\*\\*Description\\*\\*\\n(.*?)\\n\\n/s)?.[1]?.trim() || '',\n what_does: description.match(/\\*\\*What This Template Does\\*\\*\\n(.*?)\\n\\n/s)?.[1]?.trim() || '',\n benefits: description.match(/\\*\\*Key Benefits\\*\\*\\n(.*?)\\n\\n/s)?.[1]?.trim() || '',\n features: description.match(/\\*\\*Features\\*\\*\\n(.*?)\\n\\n/s)?.[1]?.trim() || '',\n requirements: description.match(/\\*\\*Requirements\\*\\*\\n(.*?)\\n\\n/s)?.[1]?.trim() || '',\n audience: description.match(/\\*\\*Target Audience\\*\\*\\n(.*?)\\n\\n/s)?.[1]?.trim() || '',\n setup: description.match(/\\*\\*Step-by-Step Setup Instructions\\*\\*\\n(.*?)$/s)?.[1]?.trim() || ''\n };\n\n // \ud83e\uddfe Plain text version for Google Sheets logging\n const plainText = `\n${data.title}\n\n\ud83d\udccb Overview:\n${sections.overview}\n\n\u2699\ufe0f What This Template Does:\n${sections.what_does}\n\n\ud83d\ude80 Key Benefits:\n${sections.benefits}\n\n\u2728 Features:\n${sections.features}\n\n\ud83d\udd10 Requirements:\n${sections.requirements}\n\n\ud83c\udfaf Target Audience:\n${sections.audience}\n\n\ud83d\udcdd Step-by-Step Setup Instructions:\n${sections.setup}\n\n\ud83c\udfaf Ready to automate? Import this template into your n8n instance and get started!\n `.trim();\n\n // \ud83d\udc8c HTML version for Email\n const htmlEmail = `\n<!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>${data.title}</title>\n<style>\n body {font-family: 'Segoe UI', Arial, sans-serif; line-height:1.6; color:#333; background:#f5f5f5; padding:30px;}\n .container {background:#fff; border-radius:10px; padding:40px; max-width:800px; margin:auto; box-shadow:0 2px 8px rgba(0,0,0,0.1);}\n h1 {color:#1f2937;}\n h2 {color:#4f46e5; border-bottom:2px solid #eee; padding-bottom:6px;}\n .section {margin-bottom:30px;}\n .highlight {background:#eef2ff; padding:15px; border-radius:6px;}\n .benefit {background:#ecfdf5; padding:10px; border-left:4px solid #22c55e; margin-bottom:10px;}\n .feature {background:#eff6ff; padding:10px; border-left:4px solid #3b82f6; margin-bottom:10px;}\n .requirement {background:#fef3c7; padding:10px; border-left:4px solid #f59e0b; margin-bottom:10px;}\n .audience {background:#fce7f3; padding:10px; border-left:4px solid #ec4899; margin-bottom:10px;}\n .setup {background:#f9fafb; padding:10px; border-left:4px solid #6366f1; margin-bottom:10px;}\n .footer {text-align:center; color:#888; font-size:14px; margin-top:30px;}\n</style>\n</head>\n<body>\n <div class=\"container\">\n <h1>${data.title}</h1>\n <div class=\"section\"><h2>\ud83d\udccb Overview</h2><div class=\"highlight\">${sections.overview}</div></div>\n <div class=\"section\"><h2>\u2699\ufe0f What This Template Does</h2>${sections.what_does.split('\\n').map(l => `<div class=\"setup\">${l}</div>`).join('')}</div>\n <div class=\"section\"><h2>\ud83d\ude80 Key Benefits</h2>${sections.benefits.split('\\n').map(l => `<div class=\"benefit\">${l}</div>`).join('')}</div>\n <div class=\"section\"><h2>\u2728 Features</h2>${sections.features.split('\\n').map(l => `<div class=\"feature\">${l}</div>`).join('')}</div>\n <div class=\"section\"><h2>\ud83d\udd10 Requirements</h2>${sections.requirements.split('\\n').map(l => `<div class=\"requirement\">${l}</div>`).join('')}</div>\n <div class=\"section\"><h2>\ud83c\udfaf Target Audience</h2>${sections.audience.split('\\n').map(l => `<div class=\"audience\">${l}</div>`).join('')}</div>\n <div class=\"section\"><h2>\ud83d\udcdd Step-by-Step Setup Instructions</h2>${sections.setup.split('\\n').map(l => `<div class=\"setup\">${l}</div>`).join('')}</div>\n <div class=\"footer\">\ud83c\udfaf Ready to automate? Import this template into your n8n instance and start building magic!</div>\n </div>\n</body>\n</html>\n `.trim();\n\n // Return both\n return {\n json: {\n title: data.title,\n formatted_description: data.formatted_description,\n html_email: htmlEmail, // for Gmail\n plain_text_email: plainText, // for Sheets\n subject: `n8n Template: ${data.title}`,\n preview_text: sections.overview.substring(0, 100) + '...'\n }\n };\n});\n\nreturn results;\n"
},
"typeVersion": 2
},
{
"id": "36faaf0f-90a2-42c8-909a-8544a48d621b",
"name": "Sticky Note14",
"type": "n8n-nodes-base.stickyNote",
"position": [
1088,
-16
],
"parameters": {
"height": 192,
"content": "## \ud83e\uddfe Step 12: Save to Google Sheets \nStores the generated template title and formatted description in a spreadsheet for record-keeping. \n\n\n"
},
"typeVersion": 1
},
{
"id": "61d49f4e-e961-4359-8735-925a55eaa7f8",
"name": "Save To Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
1120,
-192
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "title",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "formatted_description",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "formatted_description",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1u_PoDeJHJnMyocSXmGH0sO9ybo5LrUszTkU6p3KzYAg/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1u_PoDeJHJnMyocSXmGH0sO9ybo5LrUszTkU6p3KzYAg",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1u_PoDeJHJnMyocSXmGH0sO9ybo5LrUszTkU6p3KzYAg/edit?usp=drivesdk",
"cachedResultName": "JSON Data with Description"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "d031644e-84ea-4121-84d2-41e9d05207b5",
"name": "Send Email With Description",
"type": "n8n-nodes-base.gmail",
"position": [
1568,
-64
],
"parameters": {
"sendTo": "user@example.com",
"message": "={{ $json.html_email }}",
"options": {},
"subject": "={{ $json.subject }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "8d655ca0-13d7-41ab-b3cf-e1387cdb61d0",
"name": "Store AI Context (LangChain Memory)",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
560,
32
],
"parameters": {
"sessionKey": "\"json_review\"",
"sessionIdType": "customKey",
"contextWindowLength": 7
},
"typeVersion": 1.3
},
{
"id": "3064a4d2-4329-4371-bc5d-47ee568205ef",
"name": "Connect to Azure OpenAI GPT Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAzureOpenAi",
"position": [
432,
32
],
"parameters": {
"model": "gpt-4o",
"options": {}
},
"credentials": {
"azureOpenAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "ad5ee442-1644-4ab2-bdf9-cbf84447a5ff",
"name": "Parse AI Response into Structured JSON",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
688,
32
],
"parameters": {
"jsonSchemaExample": "{\n \"title\": \"string\",\n \"overview\": \"string\",\n \"what_this_template_does\": [\"step1\", \"step2\", \"step3\"],\n \"key_benefits\": [\"benefit1\", \"benefit2\", \"benefit3\"],\n \"features\": [\"feature1\", \"feature2\", \"feature3\"],\n \"requirements\": [\"requirement1\", \"requirement2\"],\n \"target_audience\": [\"audience1\", \"audience2\"],\n \"setup_instructions\": [\"instruction1\", \"instruction2\", \"instruction3\"]\n}\n"
},
"typeVersion": 1.3
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "f22edb61-a906-4778-9a79-8d50a8fb1b2d",
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Format Markdown Description",
"type": "main",
"index": 0
}
]
]
},
"Download file": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"Loop Over JSONS": {
"main": [
[],
[
{
"node": "Download file",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Format HTML Email": {
"main": [
[
{
"node": "Send Email With Description",
"type": "main",
"index": 0
}
]
]
},
"Save To Google Sheets": {
"main": [
[
{
"node": "Format HTML Email",
"type": "main",
"index": 0
}
]
]
},
"Search files and folders": {
"main": [
[
{
"node": "Loop Over JSONS",
"type": "main",
"index": 0
}
]
]
},
"Format Markdown Description": {
"main": [
[
{
"node": "Save To Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Send Email With Description": {
"main": [
[
{
"node": "Loop Over JSONS",
"type": "main",
"index": 0
}
]
]
},
"Connect to Azure OpenAI GPT Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Store AI Context (LangChain Memory)": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Search files and folders",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Response into Structured JSON": {
"ai_outputParser": [
[
{
"node": "AI Agent",
"type": "ai_outputParser",
"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.
azureOpenAiApigmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically generate polished, n8n-ready template descriptions from your saved JSON workflows in Google Drive. This AI-powered automation processes workflow files, drafts compliant descriptions, and delivers Markdown and HTML outputs directly to your inbox. 🚀💌📊💬 Manually…
Source: https://n8n.io/workflows/9344/ — 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 workflow automates end-to-end validation, assessment, and reporting of n8n workflow JSON templates using Google Drive, Azure OpenAI GPT-4o, Gmail, and Slack. It retrieves workflows from a Drive f
Automatically capture customer onboarding help requests from Typeform, log them in Google Sheets, validate email addresses, and send a professional HTML welcome email via Gmail. Ensures smooth onboard
Automate customer feedback analysis and action planning by integrating Monday.com, Azure OpenAI, Jira, Google Sheets, and Outlook. This workflow classifies customer feedback with AI, calculates busine
Automated Research Report Generation with OpenAI, Wikipedia, Google Search, and Gmail/Telegram. Uses lmChatOpenAi, memoryBufferWindow, toolHttpRequest, agent. Event-driven trigger; 26 nodes.
This workflow automates the process of generating professional research reports for researchers, students, and professionals. It eliminates manual research and report formatting by aggregating data, g