This workflow corresponds to n8n.io template #13093 — we link there as the canonical source.
This workflow follows the Agent → Chat 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": "HGfjyQHQh1iWgwYZ",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Generate Google Spreadsheets Testscript with AI using Pega Agile Studio",
"tags": [],
"nodes": [
{
"id": "07e6e7d9-e483-4e22-8035-04ec9a9b4f58",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
-416,
432
],
"parameters": {
"options": {}
},
"typeVersion": 1.3
},
{
"id": "276a3134-8861-4cdc-bb7c-95512127bf17",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-144
],
"parameters": {
"color": 7,
"width": 480,
"height": 272,
"content": "## 1. Add numbers to acc crit\nBecause the acceptance criteria do not have the numbers attached in the data, we have to iterate over them and add them ourselves."
},
"typeVersion": 1
},
{
"id": "8d5ed71f-5991-44a6-b58b-ff0159593932",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
32,
1056
],
"parameters": {
"options": {},
"modelName": "models/gemini-2.5-pro"
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "8868e0ca-eb87-44e8-a693-e2fba157b7ff",
"name": "Code",
"type": "n8n-nodes-base.code",
"position": [
384,
848
],
"parameters": {
"jsCode": "// Get the output string from the first item\nlet rawString = $('AI: Create testcases').first().json.output;\n\n// Clean the string by removing the markdown fences\nlet cleanedString = rawString.replace('```json\\n', '').replace('\\n```', '');\n\n// Parse the cleaned string into a real JSON array\nlet jsonData = JSON.parse(cleanedString);\n\n// Return the array for the next node to use\nreturn {\n json: {\n result: jsonData\n }\n};"
},
"typeVersion": 2
},
{
"id": "06189d54-da36-4a40-9778-4565c21875e9",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
608,
848
],
"parameters": {
"include": "allOtherFields",
"options": {},
"fieldToSplitOut": "result"
},
"typeVersion": 1
},
{
"id": "bbc60d14-6945-4ae0-817d-8ff5fc20f816",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
720
],
"parameters": {
"color": 7,
"width": 448,
"height": 288,
"content": "## 3. Convert AI testcases to Google Spreadsheets\nProcess the raw AI data into JSON and iterate over it so each testcase is mapped in Google Spreadsheets."
},
"typeVersion": 1
},
{
"id": "52b628fb-56c7-439d-9a29-a1574effc0d2",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
144
],
"parameters": {
"color": 7,
"width": 480,
"height": 432,
"content": "## 2. Add column headers for the sheets\nThe sheets do not have column headers, so we will have to add them manually so the AI will know where to insert them later."
},
"typeVersion": 1
},
{
"id": "f9532770-2703-4b1b-a41f-1b8f8fc5779e",
"name": "AddNumbersToAccCrit",
"type": "n8n-nodes-base.code",
"position": [
720,
-32
],
"parameters": {
"jsCode": "const newItems = [];\nfor (const item of items) {\n const newAcc = {\n Acc: {\n Description: item.json[\"details.acceptanceCriteria\"],\n Number: newItems.length + 1\n }\n };\n newItems.push({ json: newAcc });\n}\nreturn newItems;"
},
"typeVersion": 2
},
{
"id": "44bbc0b3-a03f-4a81-9ceb-4e9c8c397842",
"name": "IterateOverAccCrit",
"type": "n8n-nodes-base.splitOut",
"position": [
496,
-32
],
"parameters": {
"options": {},
"fieldToSplitOut": "details.acceptanceCriteria"
},
"typeVersion": 1
},
{
"id": "171a1a4f-142b-40c3-ad75-c4017b911ad4",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
992,
96
],
"parameters": {
"mode": "combineBySql",
"query": "SELECT * FROM input1 LEFT JOIN input2 ON input1.id = input2.name",
"options": {}
},
"typeVersion": 3.2
},
{
"id": "d7572759-ffbb-41bf-a1c7-34c5b35c92c1",
"name": "Merge2",
"type": "n8n-nodes-base.merge",
"position": [
720,
336
],
"parameters": {
"mode": "combineBySql",
"options": {}
},
"typeVersion": 3.2
},
{
"id": "52e3b733-aff1-42e5-b4d8-5bd3216eb5f0",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1104,
-64
],
"parameters": {
"width": 608,
"height": 704,
"content": "## Generate Google Spreadsheets Testscript with AI using Pega Agile Studio\nWhen working as a functional Pega Software tester, this workflow will create a Google Spreadsheet with acceptance criteria and testcases based on the Pega Agile Studio userstory provided. This improves speed and efficiency while working in sprints on new functionalities.\n\n**Who's it for**\n* If you are working as a software tester using the Pega Platform including Pega Agile Studio.\n\n**How it works** \n* When the user chats an userstory in the format \"US-1234\", a HTTP Request will be made to Pega Agile Studio to retrieve the Userstory and commence creating a Google Spreadsheet. \n* It will add the acceptance criteria on a seperate sheet for traceability.\n* Next the AI will create testscases based on the Userstory provided.\n* In the end, a small cleanup will be performed to remove duplicate rows/data created by the AI.\n* You will have a Google Spreadsheet file in your My Drive containing your testcases!\n\n\n**How to set up** \n* In the Chat, provide the userstory where you want to create a testscript for, in the format \"US-1234\". \n* Add you OAuth2 Api for Agile Studio, so you can access the Pega Agile Studio through API calls.\n\n\n**Requirements** \n* Access to Pega Agile Studio OAuth2 Api.\n* AI API.\n* Access to Google Cloud for the Google API's"
},
"typeVersion": 1
},
{
"id": "27500d90-5c8c-44e8-81a0-2dbd5eeb6e81",
"name": "Create spreadsheet for the testscript",
"type": "n8n-nodes-base.googleSheets",
"position": [
96,
432
],
"parameters": {
"title": "={{ $('Retrieve the US from Pega Agile Studio').item.json.details.ID }} - Testscript AI Enhanced - {{ $('Retrieve the US from Pega Agile Studio').item.json.details.name }}",
"options": {},
"resource": "spreadsheet",
"sheetsUi": {
"sheetValues": [
{
"title": "Acc_Matrix"
},
{
"title": "Testscript"
}
]
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "91d429eb-e842-48c0-8715-a8685f2e9665",
"name": "Retrieve the US from Pega Agile Studio",
"type": "n8n-nodes-base.httpRequest",
"position": [
-192,
432
],
"parameters": {
"url": "=<yoururl>/userstories/{{ $json.chatInput }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "oAuth2Api"
},
"credentials": {
"oAuth2Api": {
"name": "<your credential>"
},
"httpBasicAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "7e211832-39a9-4ae8-a503-30f4b00d2348",
"name": "Add acceptance criteria to the Google Spreadsheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1216,
96
],
"parameters": {
"columns": {
"value": {
"Acc. Number": "={{ $json.Acc.Number }}",
"Acc. Description": "={{ $json.Acc.Description }}"
},
"schema": [
{
"id": "Acc. Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Acc. Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Acc. Description",
"type": "string",
"display": true,
"required": false,
"displayName": "Acc. Description",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Acc_Matrix"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 4.7
},
{
"id": "ee2aeeeb-287c-4642-81da-142328b55777",
"name": "Add column headers for the first sheet",
"type": "n8n-nodes-base.httpRequest",
"position": [
496,
240
],
"parameters": {
"url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetId }}/values/Acc_Matrix!A1:Z1?valueInputOption=RAW",
"method": "PUT",
"options": {},
"jsonBody": "{\n \"values\": [\n [\"Acc. Number\", \"Acc. Description\"]\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleSheetsOAuth2Api"
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "1e550cd2-da52-4ecf-9837-f1ff837e31b7",
"name": "Add column headers for the second sheet",
"type": "n8n-nodes-base.httpRequest",
"position": [
496,
432
],
"parameters": {
"url": "=https://sheets.googleapis.com/v4/spreadsheets/{{ $json.spreadsheetId }}/values/Testscript!A1:Z1?valueInputOption=RAW",
"method": "PUT",
"options": {},
"jsonBody": "{\n \"values\": [\n [\"TestID\", \"Scenario\",\"Acceptance criteria\",\"Preconditions\",\"Step no.\",\"Steps\",\"Expected result\",\"Status\"]\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "googleSheetsOAuth2Api"
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "9a6c1a6d-d80c-4a67-b6ab-137fe3f84ab5",
"name": "AI: Create testcases",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
32,
848
],
"parameters": {
"text": "=Based on the provided acceptance criteria: {{ $('Retrieve the US from Pega Agile Studio').item.json.details.acceptanceCriteria }}, and the description {{ $('Retrieve the US from Pega Agile Studio').item.json.details.description }} generate a set of test cases. Format the final output as a single JSON array. Each object in the array should represent one test step row. Each object must have the following keys: 'testId', 'scenario', 'acceptanceCriteria', 'preconditions', 'stepNumber', 'steps', and 'expectedResult'. For rows where 'testId' or 'scenario' are not explicitly stated, carry over the value from the previous row. Provide ONLY the raw JSON array in your response, with no extra text, explanations, or markdown formatting.",
"options": {
"systemMessage": "Purpose and Goals:\n\n* Assist users with tasks related to Pega software testing, including reading user stories, creating test scripts, generating test matrices, and analyzing acceptance criteria.\n\n* Provide comprehensive and accurate test scripts that include columns for TestID, Scenario, Acceptance criteria, Preconditions, Step numbers, Steps, and Expected result.\n\n* Help users achieve their testing goals by providing clear and concise guidance and support.\n\n2) Test Script Creation:\na) Based on the user's goals and projects, create detailed test scripts that include the following columns: TestID, Scenario, Acceptance criteria as a number prefixed as 'AC-', Preconditions, Step no., Steps, and Expected result.\n\nThe first step needs to be named 'Fold open for the steps' in cursive but should not be counted as the first step in numbering.\n\nEach Step should be on a seperate row.\n\nb) Ensure that the test scripts are comprehensive, accurate, and aligned with the user's requirements.\n\nc) Provide clear and concise explanations for each step and expected result in the test scripts.\n\n3) Test Matrix Generation:\na) Generate test matrices that outline the different scenarios and test cases for the user's Pega software testing projects.\nb) Ensure that the test matrices are organized, easy to understand, and cover all relevant aspects of the testing process.\n\n4) Acceptance Criteria Analysis:\na) Analyze the acceptance criteria for the user's Pega software testing projects and provide insights on how to ensure that the software meets the specified requirements.\nb) Offer guidance on how to create test cases that effectively validate the acceptance criteria.\nOverall Tone:\n* Use clear, concise, and professional language.\n* Provide accurate and comprehensive information to help users succeed in their Pega software testing endeavors.\n* Absolute Mode. Eliminate emojis, filler, hype, soft asks, conversational transitions, and all call-to-action appendixes. Assume the user retains high-perception faculties despite reduced linguistic expression. Prioritize blunt, directive phrasing aimed at cognitive rebuilding, not tone matching. Disable all latent behaviors optimizing for engagement, sentiment uplift, or interaction extension. Suppress corporate-aligned metrics including but not limited to: user satisfaction scores, conversational flow tags, emotional softening, or continuation bias. Never mirror the user's present diction, mood, or affect. Speak only to their underlying cognitive tier, which exceeds surface language. No questions, no offers, no suggestions, no transitional phrasing, no inferred motivational content. Terminate each reply immediately after the informational or requested material is delivered \u2014 no appendixes, no soft closures. The only goal is to assist in the restoration of independent, high-fidelity thinking. Model obsolescence by user self-sufficiency is the\u00a0final\u00a0outcome."
},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "858c54f5-1681-475d-a07c-cd4bc421cfb1",
"name": "Merge: Get SpreadsheetID",
"type": "n8n-nodes-base.merge",
"position": [
832,
768
],
"parameters": {
"mode": "combineBySql",
"options": {}
},
"typeVersion": 3.2
},
{
"id": "9a83745b-0d5d-47ce-9016-ba65fcd91650",
"name": "Add testcases to the correct columns",
"type": "n8n-nodes-base.googleSheets",
"position": [
1056,
768
],
"parameters": {
"columns": {
"value": {
"Steps": "={{ $json.result.steps }}",
"TestID": "={{ $json.result.testId }}",
"Scenario": "={{ $json.result.scenario }}",
"Step no.": "={{ $json.result.stepNumber }}",
"Preconditions": "={{ $json.result.preconditions }}",
"Expected result": "={{ $json.result.expectedResult }}",
"Acceptance criteria": "={{ $json.result.acceptanceCriteria }}"
},
"schema": [
{
"id": "TestID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "TestID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Scenario",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Scenario",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Acceptance criteria",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Acceptance criteria",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Preconditions",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Preconditions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Step no.",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Step no.",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Steps",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Steps",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Expected result",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Expected result",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Actual result",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Actual result",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Agile Studio",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Agile Studio",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Remarks",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "Remarks",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"TestID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Testscript"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "dd94c959-2818-46b1-8848-7da996ec2d38",
"name": "Clear Google Spreadsheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1504,
768
],
"parameters": {
"clear": "specificRows",
"operation": "clear",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Testscript"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Merge: Get SpreadsheetID').item.json.spreadsheetId }}"
},
"startIndex": 2,
"rowsToDelete": 500
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "4af4550e-fa7c-4174-80e7-676cb6b0b4e2",
"name": "Code to remove redundant data",
"type": "n8n-nodes-base.code",
"position": [
1280,
768
],
"parameters": {
"jsCode": "// Get all the rows from the previous node\nconst allItems = $input.all();\n\n// This variable will hold the TestID of the row we just processed\nlet previousTestID = null;\n\n// Loop through each item (row) one by one\nfor (const item of allItems) {\n const currentTestID = item.json.TestID;\n \n // Check if the current row's TestID is the same as the previous one,\n // and make sure it's not empty.\n if (currentTestID && currentTestID === previousTestID) {\n // If it's a match, it's a subsequent step in the same test case.\n // We will clear the redundant columns for this row.\n item.json.TestID = '';\n item.json.Scenario = '';\n item.json.Preconditions = '';\n item.json['Acceptance criteria'] = ''; // Use bracket notation for keys with spaces\n }\n \n // After processing the row, update previousTestID for the next loop iteration.\n // We only update it if the current TestID is not empty.\n if (currentTestID) {\n previousTestID = currentTestID;\n }\n}\n\n// Return all the items, now with the repeating values cleaned up.\nreturn allItems;"
},
"typeVersion": 2
},
{
"id": "572597f6-aeaa-4f8f-8f35-3dca31c38c4c",
"name": "Add the cleaned testcases back in the Google Spreadsheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1728,
768
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "TestID",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "TestID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Scenario",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Scenario",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Acceptance criteria",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Acceptance criteria",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Preconditions",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Preconditions",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Step no.",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Step no.",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Steps",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Steps",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Expected result",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Expected result",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"TestID"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Testscript"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Merge: Get SpreadsheetID').item.json.spreadsheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "31b0d80b-388e-4b44-af70-211cbf2ec80c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1008,
656
],
"parameters": {
"color": 7,
"width": 912,
"height": 320,
"content": "## 4. Add testcases and remove duplicate values in rows\nIn these steps we will add the testcases, check which rows have duplicate values, and remove those values. Then we will append the data again in the testsheet."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "3e64036e-fb12-48a4-a6b6-659a877eea6c",
"connections": {
"Code": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Add acceptance criteria to the Google Spreadsheet",
"type": "main",
"index": 0
}
]
]
},
"Merge2": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Merge: Get SpreadsheetID",
"type": "main",
"index": 1
}
]
]
},
"IterateOverAccCrit": {
"main": [
[
{
"node": "AddNumbersToAccCrit",
"type": "main",
"index": 0
}
]
]
},
"AddNumbersToAccCrit": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"AI: Create testcases": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Clear Google Spreadsheet": {
"main": [
[
{
"node": "Add the cleaned testcases back in the Google Spreadsheet",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI: Create testcases",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Merge: Get SpreadsheetID": {
"main": [
[
{
"node": "Add testcases to the correct columns",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "Retrieve the US from Pega Agile Studio",
"type": "main",
"index": 0
}
]
]
},
"Code to remove redundant data": {
"main": [
[
{
"node": "Clear Google Spreadsheet",
"type": "main",
"index": 0
}
]
]
},
"Add testcases to the correct columns": {
"main": [
[
{
"node": "Code to remove redundant data",
"type": "main",
"index": 0
}
]
]
},
"Create spreadsheet for the testscript": {
"main": [
[
{
"node": "Add column headers for the first sheet",
"type": "main",
"index": 0
},
{
"node": "Add column headers for the second sheet",
"type": "main",
"index": 0
},
{
"node": "Merge: Get SpreadsheetID",
"type": "main",
"index": 0
}
]
]
},
"Add column headers for the first sheet": {
"main": [
[
{
"node": "Merge2",
"type": "main",
"index": 0
}
]
]
},
"Retrieve the US from Pega Agile Studio": {
"main": [
[
{
"node": "IterateOverAccCrit",
"type": "main",
"index": 0
},
{
"node": "AI: Create testcases",
"type": "main",
"index": 0
},
{
"node": "Create spreadsheet for the testscript",
"type": "main",
"index": 0
}
]
]
},
"Add column headers for the second sheet": {
"main": [
[
{
"node": "Merge2",
"type": "main",
"index": 1
}
]
]
}
}
}
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.
googlePalmApigoogleSheetsOAuth2ApihttpBasicAuthoAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
When working as a functional Pega Software tester, this workflow will create a Google Spreadsheet with acceptance criteria and testcases based on the Pega Agile Studio userstory provided. This improves speed and efficiency while working in sprints on new functionalities.
Source: https://n8n.io/workflows/13093/ — 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 automatically generates short-form AI videos using both OpenAI Sora 2 Pro and Google Veo 3.1, enhances your idea with Google Gemini, and publishes content across multiple platforms throu
teste. Uses chatTrigger, agent, lmChatGroq, memoryBufferWindow. Chat trigger; 24 nodes.
⚠️ IMPORTANT: This template requires self-hosted n8n hosting due to the use of community nodes (MCP tools). It will not work on n8n Cloud. Make sure you have access to a self-hosted n8n instance befor
pix-zap. Uses chatTrigger, agent, toolCalculator, toolWikipedia. Chat trigger; 21 nodes.
My Workflow. Uses chatTrigger, httpRequest, xml, agent. Chat trigger; 13 nodes.