This workflow follows the Chainllm → Emailsend 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": "9fbe05d0-8b60-4e73-8d4b-fe5f9b9ab114",
"name": "QAM - Scheduled Sprint Summary (Lab Starter)",
"nodes": [
{
"id": "trigger-1",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-380,
0
],
"notes": "Set to every 15 min for the lab exercise only. In real use, daily or weekly is more appropriate for a status report \u2014 discuss cadence with participants in B2.",
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 15
}
]
}
}
},
{
"id": "jira-1",
"name": "Get Sprint & Defect Issues",
"type": "n8n-nodes-base.jira",
"typeVersion": 1,
"position": [
-140,
0
],
"notes": "Attach a credential for YOUR OWN Jira project (the same one you queried via MCP in Part A). The JQL below ships as a placeholder (project QAM, Sprint 15) \u2014 replace both the project key and sprint name with your real ones before running this node.",
"parameters": {
"resource": "issue",
"operation": "getAll",
"returnAll": true,
"jql": "project = QAM AND sprint = \"Sprint 15\""
},
"credentials": {
"jiraSoftwareCloudApi": {
"name": "<your credential>"
}
}
},
{
"id": "code-1",
"name": "Format Issues For Prompt",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
100,
0
],
"notes": "Reduces the raw Jira issue array into a compact text block so the AI Summary node's prompt stays small. Participants edit the sections requested in step B3, not this node \u2014 but it's worth reading once. FACILITATOR: this hardcodes customfield_10016 for Story Points \u2014 confirm that's the real field ID on your sandbox after import (see sample-data/import-instructions.md step 5) before the session; if wrong it just shows 'n/a' silently, no crash.",
"parameters": {
"language": "javaScript",
"jsCode": "const issues = items.map(i => i.json);\nconst lines = issues.map(issue => {\n const f = issue.fields || {};\n return `- ${issue.key} | ${f.issuetype?.name || 'Unknown'} | status: ${f.status?.name || 'Unknown'} | points: ${f.customfield_10016 ?? 'n/a'} | priority: ${f.priority?.name || 'n/a'} | summary: ${f.summary || ''}`;\n}).join('\\n');\n\nreturn [{ json: { issueCount: issues.length, summaryText: lines } }];"
}
},
{
"id": "lm-1",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.3,
"position": [
360,
180
],
"notes": "The model sub-node feeding 'AI Summary' below (connected via the special Model input, not a regular data link). Swap the credential for whatever LLM provider your org standardizes on if not OpenAI \u2014 there are equivalent Chat Model nodes for Anthropic, Gemini, etc. in the same panel.",
"parameters": {
"model": {
"__rl": true,
"mode": "id",
"value": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"id": "chain-1",
"name": "AI Summary",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.6,
"position": [
360,
0
],
"notes": "Placeholder prompt \u2014 replace with the four-section structure from Part A (velocity, defect density, backlog health, risk flag) as instructed in lab-guide.md step B3. Output lands in $json.text on the item this node emits \u2014 confirm that by pinning/running the node once before wiring the Send Email step.",
"parameters": {
"promptType": "define",
"text": "=REPLACE THIS PROMPT (see lab-guide.md step B3): raw issue data below.\n\n{{ $json.summaryText }}",
"hasOutputParser": false,
"messages": {
"messageValues": [
{
"type": "SystemMessagePromptTemplate",
"message": "You are an assistant drafting an advisory sprint status summary for a Test Manager. Only use information present in the issue data provided \u2014 never invent details. Flag anything uncertain."
}
]
}
}
},
{
"id": "email-1",
"name": "Send Email",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [
620,
0
],
"notes": "Use the dedicated training mailbox's SMTP credential from 00-setup/setup-guide.md \u2014 never a personal or production account. Set 'toEmail' to your own address for the B4 test run.",
"parameters": {
"fromEmail": "training-lab@REPLACE_ME",
"toEmail": "REPLACE_ME@example.com",
"subject": "=QAM Sprint 15 Summary - {{ $now.format('yyyy-MM-dd HH:mm') }}",
"emailFormat": "text",
"text": "={{ $json.text }}"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Schedule Trigger": {
"main": [
[
{
"node": "Get Sprint & Defect Issues",
"type": "main",
"index": 0
}
]
]
},
"Get Sprint & Defect Issues": {
"main": [
[
{
"node": "Format Issues For Prompt",
"type": "main",
"index": 0
}
]
]
},
"Format Issues For Prompt": {
"main": [
[
{
"node": "AI Summary",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Summary",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Summary": {
"main": [
[
{
"node": "Send Email",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"_scaffoldNotice": "Hand-authored, but node types/versions/parameter shapes verified against a live n8n 2.35.3 container's own node registry (n8n export:nodes) and a successful `n8n import:workflow` \u2014 see facilitator-notes.md for what 'verified' does and doesn't cover here (credentials are still placeholders; nobody has run this end-to-end with real Jira/OpenAI/SMTP creds yet)."
}
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.
jiraSoftwareCloudApiopenAiApismtp
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
QAM - Scheduled Sprint Summary (Lab Starter). Uses jira, lmChatOpenAi, chainLlm, emailSend. Scheduled trigger; 6 nodes.
Source: https://github.com/Bosch-training/github-copilot-for-qa-mgmt/blob/main/lab/module-2-mcp-n8n/n8n-workflow-starter.json — 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.
Automate Customer Support Issue Resolution Using Ai Text Classifier. Uses lmChatOpenAi, scheduleTrigger, jira, outputParserStructured. Scheduled trigger; 36 nodes.
Jiratool Schedule. Uses lmChatOpenAi, scheduleTrigger, jira, outputParserStructured. Scheduled trigger; 36 nodes.
This n8n template is designed to assist and improve customer support team member capacity by automating the resolution of long-lived and forgotten JIRA issues. Schedule Trigger runs daily to check for
Automate Customer Support Issue Resolution using AI Text Classifier. Uses lmChatOpenAi, jira, outputParserStructured, slack. Scheduled trigger; 36 nodes.
This scheduled workflow scans Jira for long-lived unresolved issues, uses OpenAI to classify their status and sentiment, searches Notion and similar Jira issues for answers, then posts reminders or re