This workflow corresponds to n8n.io template #10326 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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": "gILrUPCbGHiFohxP",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Generate QA Test Cases from Figma Designs to Google Sheets using GPT-4",
"tags": [],
"nodes": [
{
"id": "dc0b7549-a744-4aa6-9d81-6570eae6acdb",
"name": "Workflow Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1616,
-320
],
"parameters": {
"color": 4,
"width": 400,
"height": 540,
"content": "## \ud83c\udfa8 Figma to Test Cases Generator\n\nThis workflow automates QA test case generation from Figma designs using AI.\n\n**What it does:**\n- Fetches Figma file data via API\n- Analyzes UI elements and design structure\n- Generates 5-10 comprehensive test cases using OpenAI\n- Exports test cases to Google Sheets\n\n**Use Case:**\n- QA teams needing automated test case generation\n- Product teams documenting user flows\n- Design handoff with test coverage\n\n**Requirements:**\n- Figma Personal Access Token\n- OpenAI API key (gpt-4o-mini)\n- Google Sheets OAuth2 connection\n\n**Time Saved:** ~2-3 hours per design review"
},
"typeVersion": 1
},
{
"id": "ef9db14b-34a0-497f-82c4-e0eb0d0fc498",
"name": "Setup Guide",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1200,
-560
],
"parameters": {
"color": 2,
"width": 360,
"height": 500,
"content": "## \u2699\ufe0f Setup Instructions\n\n**Step 1: Get Figma Token**\n- Go to Figma \u2192 Settings \u2192 Personal Access Tokens\n- Create new token with read access\n- Save in n8n Credentials (Header Auth)\n- Header name: `X-Figma-Token`\n\n**Step 2: Configure OpenAI**\n- Add OpenAI API key in Credentials\n- Model: gpt-4o-mini (cost-effective)\n- Est. cost: $0.02-0.05 per run\n\n**Step 3: Connect Google Sheets**\n- Create sheet with columns: `title`, `steps`\n- Authorize Google Sheets OAuth2\n- Share sheet with service account\n\n**Step 4: Input Figma File ID**\n- Get file ID from Figma URL\n- Format: `figma.com/file/{FILE_ID}/...`\n- Pass as input to workflow"
},
"typeVersion": 1
},
{
"id": "39541f14-cfd3-4c11-89b9-8e6aedc363fc",
"name": "Figma API Notes",
"type": "n8n-nodes-base.stickyNote",
"position": [
-816,
-480
],
"parameters": {
"color": 2,
"width": 300,
"height": 428,
"content": "## \ud83d\udccc Figma API Configuration\n\n**What it fetches:**\n- Complete file structure\n- Canvas and frame data\n- Component properties\n- Text and layer info\n\n**API Parameters:**\n- `depth=1`: Single level traversal\n- `geometry=paths`: Include vector data\n\n**Important:**\n- Replace file ID with dynamic input\n- Use: `={{$json.figmaFileId}}`\n- Timeout: 30s for large files\n- Rate limit: 500 requests/min"
},
"typeVersion": 1
},
{
"id": "b24caffc-87cf-458e-aecb-bf00ca9309be",
"name": "AI Processing Details",
"type": "n8n-nodes-base.stickyNote",
"position": [
-464,
-448
],
"parameters": {
"color": 2,
"width": 280,
"height": 368,
"content": "## \ud83e\udd16 AI Test Generation\n\n**Analysis Includes:**\n- UI elements and interactions\n- User flow identification\n- Edge case scenarios\n- Accessibility checks (WCAG 2.1)\n- Responsive design validation\n\n**Output Format:**\nStructured JSON with test cases\n\n**Temperature:** 0.7 for creative variety\n\n**Token Usage:** ~2000-4000 per run"
},
"typeVersion": 1
},
{
"id": "be300909-97ca-4d0c-b7f5-077cddc16f8f",
"name": "Code Logic Details",
"type": "n8n-nodes-base.stickyNote",
"position": [
-144,
96
],
"parameters": {
"color": 2,
"width": 280,
"height": 260,
"content": "## \ud83d\udcca Data Extraction\n\n**Processes AI output:**\n- Extracts test_cases array\n- Maps to Google Sheets format\n- Handles multiple test cases\n\n**Output fields:**\n- title: Test case name\n- steps: Step-by-step instructions\n\n**Error handling:**\nReturns empty array if parsing fails"
},
"typeVersion": 1
},
{
"id": "8aee5f1a-9b28-4951-a8c1-3438119266e9",
"name": "Sheets Configuration",
"type": "n8n-nodes-base.stickyNote",
"position": [
80,
-560
],
"parameters": {
"color": 2,
"width": 300,
"height": 476,
"content": "## \ud83d\udcdd Google Sheets Export\n\n**Configuration:**\n- Operation: Append (adds new rows)\n- Auto-map columns enabled\n- Columns: `title`, `steps`\n\n**Sheet Structure:**\n```\n| title | steps |\n|--------------------|-----------------------|\n| Test login flow | Step 1: Click... |\n| Validate form | Step 1: Enter... |\n```\n\n**Before sharing:**\n- Remove document ID\n- Use dynamic sheet reference\n- Clear cached result data"
},
"typeVersion": 1
},
{
"id": "f2dee891-a0a2-4426-9f3e-b818a11b1e40",
"name": "Manual Start",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-960,
-48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "a5cb1f68-d567-46f3-8aea-b462cede73c9",
"name": "Fetch Figma Design Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
-736,
-48
],
"parameters": {
"url": "=https://api.figma.com/v1/files/{{ $json.figmaFileId }}",
"options": {
"timeout": 30000,
"response": {
"response": {
"neverError": true,
"responseFormat": "json"
}
}
},
"sendQuery": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"queryParameters": {
"parameters": [
{
"name": "depth",
"value": "1"
},
{
"name": "geometry",
"value": "paths"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "96587a6a-4e70-4c6d-a9a8-a1da7e87e7a4",
"name": "OpenAI GPT-4o-mini",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-512,
192
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {
"maxTokens": 4000,
"temperature": 0.7
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "1b3d7d55-f24f-4d95-a098-7128696e7e87",
"name": "Parse and Format Test Cases",
"type": "n8n-nodes-base.code",
"position": [
-48,
-48
],
"parameters": {
"jsCode": "// Extract test cases from AI agent output\nconst aiOutput = $json.output;\n\n// Safely extract test cases array\nconst testCases = aiOutput?.test_cases || [];\n\n// Validate and map to Google Sheets format\nif (!Array.isArray(testCases) || testCases.length === 0) {\n console.log('No test cases generated');\n return [];\n}\n\n// Transform to structured output\nreturn testCases.map(tc => ({\n json: {\n title: tc.title || 'Untitled Test Case',\n steps: tc.steps || 'No steps provided'\n }\n}));"
},
"typeVersion": 2
},
{
"id": "1efaa8c3-a934-4702-9783-7da965178a27",
"name": "Export to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
176,
-48
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "title",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "steps",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "steps",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "Test Cases"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Configure Figma File ID').item.json.googleSheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "f3e20439-3b50-414a-a67f-2dd3d0324365",
"name": "JSON Output Schema",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-256,
192
],
"parameters": {
"jsonSchemaExample": "{\n \"test_cases\": [\n {\n \"title\": \"Test case title\",\n \"steps\": \"Step 1: Action\\nStep 2: Verification\\nStep 3: Expected result\"\n }\n ]\n}"
},
"typeVersion": 1.3
},
{
"id": "52e4bce6-4656-4658-833a-1d461fb743e5",
"name": "Conversation Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-384,
192
],
"parameters": {
"sessionKey": "=\"figma_test_generation_\" & $('Configure Figma File ID').item.json.figmaFileId",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "0a245b2b-7d42-4dc4-9393-f07af71321f6",
"name": "AI Test Case Generator",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-464,
-48
],
"parameters": {
"text": "=Here is the Figma design data:\n\n{{ JSON.stringify($json, null, 2) }}\n\n**Generate 5-10 comprehensive test cases covering:**\n\n1. **UI Elements & Interactions**\n - Button states and actions\n - Form field validations\n - Navigation flows\n\n2. **User Flows**\n - Primary user journeys\n - Alternative paths\n - Error scenarios\n\n3. **Edge Cases**\n - Empty states\n - Maximum character limits\n - Invalid inputs\n\n4. **Accessibility**\n - Keyboard navigation\n - Screen reader compatibility\n - Color contrast (WCAG 2.1 AA)\n\n5. **Responsive Design**\n - Mobile viewport behavior\n - Tablet adjustments\n - Desktop optimization\n\n**Return ONLY valid JSON in this exact structure:**\n\n```json\n{\n \"test_cases\": [\n {\n \"title\": \"Descriptive test case title\",\n \"steps\": \"Step 1: Detailed action\\nStep 2: Expected behavior\\nStep 3: Verification criteria\"\n }\n ]\n}\n```\n\n**Important:** Ensure each test case has clear, actionable steps.",
"options": {
"systemMessage": "You are an expert QA engineer and UX analyst specializing in test case generation.\n\n**Your expertise includes:**\n- Analyzing Figma design files and extracting testable elements\n- Creating comprehensive test scenarios for web and mobile applications\n- Identifying edge cases and accessibility requirements\n- Following industry-standard QA practices (ISTQB, Agile QA)\n\n**Your task:**\nReceive Figma file data as JSON and generate detailed, actionable test cases that cover:\n- Functional requirements\n- User experience flows\n- Accessibility compliance (WCAG 2.1)\n- Cross-browser/device compatibility\n- Edge cases and error handling\n\n**Output requirements:**\n- Return ONLY valid JSON matching the provided schema\n- Each test case must have a clear title and numbered steps\n- Steps should be specific, measurable, and executable\n- Include expected results in each step\n- Prioritize critical user paths first"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 2.1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "00a00b80-93a1-44c8-be7b-3cd1f78686fb",
"connections": {
"Manual Start": {
"main": [
[
{
"node": "Fetch Figma Design Data",
"type": "main",
"index": 0
}
]
]
},
"JSON Output Schema": {
"ai_outputParser": [
[
{
"node": "AI Test Case Generator",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"OpenAI GPT-4o-mini": {
"ai_languageModel": [
[
{
"node": "AI Test Case Generator",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Conversation Memory": {
"ai_memory": [
[
{
"node": "AI Test Case Generator",
"type": "ai_memory",
"index": 0
}
]
]
},
"AI Test Case Generator": {
"main": [
[
{
"node": "Parse and Format Test Cases",
"type": "main",
"index": 0
}
]
]
},
"Fetch Figma Design Data": {
"main": [
[
{
"node": "AI Test Case Generator",
"type": "main",
"index": 0
}
]
]
},
"Parse and Format Test Cases": {
"main": [
[
{
"node": "Export to Google Sheets",
"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.
googleSheetsOAuth2ApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Transform Figma design files into detailed QA test cases with AI-driven analysis and structured export to Google Sheets. This workflow helps QA and product teams streamline design validation, test coverage, and documentation — all without manual effort. 🎨🤖📋 Step 1: Trigger…
Source: https://n8n.io/workflows/10326/ — 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 automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
AI Blog Publisher – Automated Blog Content Workflow This workflow is designed for individuals and teams who regularly publish content on their blog and want to automate the entire process from start t
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