AutomationFlowsAI & RAG › Jira Epic Done → AI Lessons Learned Report in Google Docs

Jira Epic Done → AI Lessons Learned Report in Google Docs

Original n8n title: Generate Lessons Learned Reports From Jira Epics with AI and Google Docs

ByTarek Mustafa @tarekadam on n8n.io

Jira users who want to *automate the generation of a Lessons Learned or Retrospective* report after an Epic is Done.

Event trigger★★★★☆ complexityAI-powered13 nodesJiraAgentOpenAI ChatGoogle DocsJira TriggerMemory Buffer Window
AI & RAG Trigger: Event Nodes: 13 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #3934 — we link there as the canonical source.

This workflow follows the Agent → Google Docs 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 →

Download .json
{
  "id": "U1xUqDLvBYYSU6EU",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Jira Retrospective",
  "tags": [],
  "nodes": [
    {
      "id": "b91c4727-8c63-4bf3-8101-6282aa6f592c",
      "name": "Jira Get All Issues",
      "type": "n8n-nodes-base.jira",
      "position": [
        60,
        60
      ],
      "parameters": {
        "options": {},
        "operation": "getAll"
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4cf0689c-2a1f-4a90-81f4-d3483c63fc96",
      "name": "Jira Get All Comments",
      "type": "n8n-nodes-base.jira",
      "position": [
        280,
        60
      ],
      "parameters": {
        "options": {},
        "issueKey": "={{ $json.key }}",
        "resource": "issueComment",
        "operation": "getAll"
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "26803742-1a94-4969-878b-2f757aced4f8",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        940,
        60
      ],
      "parameters": {
        "text": "=comments = {{ $json.concatenated_Comment }}\ndescription = {{ $json.Description }}\ntitle = {{ $json.Title }}\nstatus = {{ $json.EpicStatus }}\nepic_name = {{ $json.EpicName }}\n",
        "options": {
          "systemMessage": "=You are an AI assistant specialized in creating comprehensive Agile retrospective documents. Your task is to analyze the provided information about a completed task and generate an insightful **Lessons Learned** report formatted in **clean Markdown**, optimized for seamless conversion to Google Docs.\n\n---\n\n### \ud83d\udce5 Input Format\nYou will receive structured input containing:\n* `epic_name`: The broader initiative or project category\n* `title`: The specific task or user story name\n* `description`: A concise explanation of what the task involved\n\n---\n\n### \ud83d\udce4 Output Instructions\nGenerate a detailed **Lessons Learned** report using the following **Markdown** structure:\n\n# LESSONS LEARNED REPORT\n\n**Epic:** {epic_name} \n**Date:** {{$today.format('yyyy-MM-dd')}}}  \n**Task:** {title}  \n**Description:** {description}\n\n## Key Findings\n\n* Clear, specific insight about a technical challenge encountered\n* Process-related discovery that impacted delivery\n* Team dynamics observation or workflow improvement identified\n* {Add more if needed}\n\n## Comments & Observations\n\n{Write 2\u20133 paragraphs with:}\n\n* Specific examples from task execution\n* Feedback or quotes from team members (if available)\n* Comparisons to prior approaches\n* Unexpected challenges or positive surprises\n\n## Actionable Recommendations\n\n1. Specific, implementable action to address a finding\n2. Concrete suggestion for process improvement\n3. Recommendation for knowledge sharing or team development\n4. {Add more as needed}\n\n## Metrics & Impact\n\n{When possible, include:}\n\n* Time saved or efficiency gained\n* Quality improvements\n* User/customer feedback\n* Cost implications\n\n## Tags\n\n`#lessons-learned` `#{normalized_epic_name}` `#{relevant_technology}` `#{improvement_area}`\n\n---\n\n### \ud83d\udcdd Guidelines\n\n1. **Be specific** \u2013 use real details, not vague statements\n2. **Stay relevant** \u2013 stick to the task and its broader context\n3. **Focus on learning** \u2013 prioritize transferable insights\n4. **Balance** \u2013 include both wins and challenges\n5. **Actionability** \u2013 make every suggestion doable\n6. **Concise yet clear** \u2013 avoid fluff; write for impact\n7. **Formatting Guidelines for Google Docs compatibility:**\n   * Use only asterisks (*) for bullet points, never hyphens (-)\n   * Add two spaces after each line in lists for proper line breaks\n   * Always leave a blank line before and after headings\n   * Avoid using underscores (_) in text; use hyphens (-) instead\n   * For emphasis, use consistently **bold** for important points and *italics* for supplementary information\n   * When mentioning code or technical terms, use `single backticks`, never triple backticks\n   * Use a pipe-separated format for tables as shown in the template\n   * Keep paragraphs short (3-5 sentences) for better readability\n8. **Metadata Handling:** Include the epic name and task title exactly as provided in the input, without modification\n9. **Date Format:** Use YYYY-MM-DD format for the date for consistent sorting and display\n10. **Tags:** Keep tags lowercase, with hyphens instead of spaces, and relevant to the content\n\n---"
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "29e37c80-68a4-490a-8952-2dcf974ff8d3",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        920,
        280
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "da5e365b-cc69-4bdd-bd58-e5b2ecb17387",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        500,
        60
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "84fcaf69-4234-46be-9fa7-15026c60fed4",
              "name": "EpicName",
              "type": "string",
              "value": "={{ $('Jira Get All Issues').item.json.fields.parent.fields.summary }}"
            },
            {
              "id": "a7890a6b-1d0d-4486-908e-d3db571b89af",
              "name": "EpicStatus",
              "type": "string",
              "value": "={{ $('Jira Get All Issues').item.json.fields.parent.fields.status.statusCategory.name }}"
            },
            {
              "id": "c2c58d73-17a8-47b5-beb6-8295905cd8c2",
              "name": "Title",
              "type": "string",
              "value": "={{ $('Jira Get All Issues').item.json.fields.summary }}"
            },
            {
              "id": "baa10a35-ab3e-490f-b9ed-e661a6e9f4aa",
              "name": "Description",
              "type": "string",
              "value": "={{ $('Jira Get All Issues').item.json.fields.description }}"
            },
            {
              "id": "5da4ae54-07e6-41b8-bd51-054fe56beb5f",
              "name": "Comment",
              "type": "string",
              "value": "={{ $json.body.content[0].content[0].text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "9718b066-e28f-41ea-97c2-559cbd894764",
      "name": "Summarize",
      "type": "n8n-nodes-base.summarize",
      "position": [
        720,
        60
      ],
      "parameters": {
        "options": {},
        "fieldsToSplitBy": "EpicName, EpicStatus, Title, Description",
        "fieldsToSummarize": {
          "values": [
            {
              "field": "Comment",
              "separateBy": "\n",
              "aggregation": "concatenate"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1d37efb7-09f1-43a7-a6c0-77d07b1f7a6b",
      "name": "Google Docs",
      "type": "n8n-nodes-base.googleDocs",
      "position": [
        1280,
        60
      ],
      "parameters": {
        "simple": false,
        "actionsUi": {
          "actionFields": [
            {
              "text": "={{ $json.output }}",
              "action": "insert"
            }
          ]
        },
        "operation": "update",
        "documentURL": ""
      },
      "credentials": {
        "googleDocsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "bfab4af8-1f26-45b0-952b-1bd5f411d5f4",
      "name": "Jira Trigger",
      "type": "n8n-nodes-base.jiraTrigger",
      "position": [
        -380,
        180
      ],
      "parameters": {
        "events": [
          "jira:issue_updated"
        ],
        "additionalFields": {
          "filter": ""
        }
      },
      "credentials": {
        "jiraSoftwareCloudApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "cc654cf3-c360-4704-a4b7-57447dbec8c6",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -200,
        180
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a7028dd9-e262-4528-a20f-c80a26a28202",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.changelog.items[0].toString }}",
              "rightValue": "Done"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b3ccd93e-a412-46f5-858d-ef8a2cd0efa9",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        1080,
        280
      ],
      "parameters": {
        "sessionKey": "47",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e8379684-93ca-4118-bab5-f52a444c50e1",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -420,
        -120
      ],
      "parameters": {
        "width": 380,
        "height": 580,
        "content": "## Epic Done?\nThis Node is Triggered on any issue change in Jira. However it only triggers the automation when the Epic status is changed to **Done**"
      },
      "typeVersion": 1
    },
    {
      "id": "cdddcd3f-f896-4dbf-89e2-09060111cbc6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        -120
      ],
      "parameters": {
        "color": 5,
        "width": 820,
        "height": 580,
        "content": "## Fetch issue Description and Comments\nOnce the Epic is Done, these nodes fetch issues and comments that fall under the Epic. For further processing the output is bundled."
      },
      "typeVersion": 1
    },
    {
      "id": "c718a2e8-be7b-47b9-b7cc-9f4549a1060f",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        -120
      ],
      "parameters": {
        "color": 3,
        "width": 540,
        "height": 580,
        "content": "## Summarize and send to Google Docs\nThe LLM is summarizing the description / comments and generates a report with a layout defined in the System Message. Finally the output is send to Google Docs."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "793ad505-261f-44ae-a197-a7c0e496dd69",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Jira Get All Issues",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Google Docs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Summarize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Jira Trigger": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Jira Get All Issues": {
      "main": [
        [
          {
            "node": "Jira Get All Comments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Jira Get All Comments": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Jira users who want to *automate the generation of a Lessons Learned or Retrospective* report after an Epic is Done.

Source: https://n8n.io/workflows/3934/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Jira Retrospective. Uses jira, agent, lmChatOpenAi, summarize. Event-driven trigger; 13 nodes.

Jira, Agent, OpenAI Chat +3
AI & RAG

🧠 Give Your AI Agent Chatbot Long Term Memory Tools Router. Uses executeWorkflowTrigger, googleDocs, telegram, gmail. Event-driven trigger; 39 nodes.

Execute Workflow Trigger, Google Docs, Telegram +7
AI & RAG

This n8n workflow equips your AI agent with long-term memory and a dynamic tools router, enabling it to provide intelligent, context-aware responses while managing tasks across multiple tools. By comb

Execute Workflow Trigger, Google Docs, Telegram +7
AI & RAG

This workflow creates an automated Product Intelligence Engine that continuously collects signals from multiple product sources and generates structured PRD updates using AI. It ingests conversations,

Slack Trigger, Form Trigger, HTTP Request +9
AI & RAG

My workflow 7. Uses lmChatOpenRouter, slackTrigger, chatTrigger, agent. Event-driven trigger; 37 nodes.

OpenRouter Chat, Slack Trigger, Chat Trigger +7