AutomationFlowsAI & RAG › Turn Voice Memos Into Structured Task Lists with Google Gemini and Google Sheets

Turn Voice Memos Into Structured Task Lists with Google Gemini and Google Sheets

ByOka Hironobu @okp29 on n8n.io

This workflow collects a voice memo via an n8n form, transcribes it with Google Gemini, extracts a structured task list, emails the summary and tasks via Gmail, and appends each task as a new row in Google Sheets. Receives a voice memo, project name, and recipient email address…

Event trigger★★★★☆ complexityAI-powered14 nodesForm TriggerGoogle GeminiChain LlmGoogle Gemini ChatOutput Parser StructuredGmailGoogle Sheets
AI & RAG Trigger: Event Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Chainllm → Form 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 →

Download .json
{
  "id": "KDyveMgyIe1OPbOC",
  "meta": {
    "builderVariant": "mcp",
    "aiBuilderAssisted": true
  },
  "name": "Turn a voice memo into a task list with Gemini transcription and Google Sheets",
  "tags": [],
  "nodes": [
    {
      "id": "29c70a3f-beb4-438f-ba0d-c74e7f781a69",
      "name": "Voice Memo Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -192,
        32
      ],
      "parameters": {
        "options": {
          "buttonLabel": "Turn into tasks",
          "respondWithOptions": {
            "values": {
              "formSubmittedText": "Thanks! Your task list is being generated and will arrive by email shortly."
            }
          }
        },
        "formTitle": "Voice memo to task list",
        "formFields": {
          "values": [
            {
              "fieldType": "email",
              "fieldLabel": "Your email",
              "requiredField": true
            },
            {
              "fieldLabel": "Project",
              "placeholder": "e.g. Website launch"
            },
            {
              "fieldType": "file",
              "fieldLabel": "Voice memo",
              "multipleFiles": false,
              "requiredField": true,
              "acceptFileTypes": ".mp3,.m4a,.wav,.ogg"
            }
          ]
        },
        "formDescription": "Record a voice memo about what needs doing and get a clean task list by email."
      },
      "typeVersion": 2.6
    },
    {
      "id": "ab341392-23d2-47a7-8642-249664d3510d",
      "name": "Transcribe Voice Memo",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "onError": "continueErrorOutput",
      "position": [
        112,
        32
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "id",
          "value": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "audio",
        "inputType": "binary",
        "binaryPropertyName": "Voice_memo"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "6f9cbfaf-6d7a-4fff-925d-580f3194bb8c",
      "name": "Extract Tasks with Gemini",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        624,
        16
      ],
      "parameters": {
        "text": "=You are an assistant that turns a spoken brain-dump into a clean, actionable task list for the project \"{{ $('Voice Memo Form').item.json.Project }}\". From the transcript, extract each distinct task with an owner if mentioned, a due date in YYYY-MM-DD if a day or deadline is mentioned (resolve relative dates like \"Friday\" against today), and a priority of high, medium or low. Ignore filler and repetition. Also give a one-line summary.\n\nTranscript:\n{{ $json.text }}",
        "batching": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.9
    },
    {
      "id": "46952d40-692d-4f11-8035-0b7ddf815d39",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        608,
        176
      ],
      "parameters": {
        "options": {
          "temperature": 0.2
        },
        "modelName": "models/gemini-3.1-flash-lite"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "97d4e151-fa6f-4c16-8b76-43f23fbfc579",
      "name": "Task Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        800,
        176
      ],
      "parameters": {
        "jsonSchemaExample": "{\"summary\":\"Three tasks for the website launch\",\"tasks\":[{\"task\":\"Finish the homepage\",\"owner\":\"me\",\"due\":\"2026-08-01\",\"priority\":\"high\"}]}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "c82ab765-71c5-4ba5-aecb-94f6532395bf",
      "name": "Shape Tasks",
      "type": "n8n-nodes-base.code",
      "position": [
        976,
        16
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const src = $json.output || {};\nconst f = $('Voice Memo Form').item.json;\nconst list = Array.isArray(src.tasks) ? src.tasks : [];\nconst tasks = list.map(function (t) { return { task: t.task || '', owner: t.owner || 'me', due: t.due || '', priority: String(t.priority || 'medium').toLowerCase() }; });\nreturn { email: f['Your email'] || '', project: f.Project || '', summary: src.summary || '', taskCount: tasks.length, tasks: tasks, taskText: tasks.map(function (t) { return '- ' + t.task + ' (' + t.priority + (t.due ? ', due ' + t.due : '') + ')'; }).join('\\n') };"
      },
      "typeVersion": 2
    },
    {
      "id": "6f864549-9d0a-4918-a9b7-3b04c2dc0288",
      "name": "Email Task List",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1200,
        16
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "={{ $json.summary + \"\\n\\nTasks:\\n\" + $json.taskText }}",
        "options": {},
        "subject": "={{ \"Your tasks - \" + ($json.project || \"voice memo\") }}",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9dc4a770-f174-4cb7-b713-4c38eefc2b15",
      "name": "Split Tasks",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1200,
        192
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "tasks"
      },
      "typeVersion": 1
    },
    {
      "id": "c844df79-76ee-4ed2-8800-df73ca0cce85",
      "name": "Save Tasks to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1424,
        192
      ],
      "parameters": {
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Tasks"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Select your spreadsheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "603b1f38-34f1-4813-9c3b-810b306cb70f",
      "name": "Email Transcription Failure",
      "type": "n8n-nodes-base.gmail",
      "position": [
        384,
        160
      ],
      "parameters": {
        "sendTo": "={{ $(\"Voice Memo Form\").item.json[\"Your email\"] }}",
        "message": "Sorry - we could not transcribe your recording. Please try again with a clearer audio file (mp3, m4a or wav).",
        "options": {},
        "subject": "We could not read your voice memo",
        "emailType": "text"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "0e2f1745-15d7-4c0d-9283-276fc7ad1876",
      "name": "Overview Sticky",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -816,
        -160
      ],
      "parameters": {
        "width": 568,
        "height": 616,
        "content": "## Turn a voice memo into a task list with Gemini transcription and Google Sheets\n\n### How it works\nSpeaking is faster than typing, but voice memos pile up unactioned. Record a memo about what needs doing and upload it through the built-in n8n form. Google Gemini transcribes the audio directly - no separate speech service needed - and a Basic LLM Chain with Gemini turns the rambling transcript into a clean task list, pulling out each task with an owner, a due date (resolving relative dates like \"Friday\"), and a priority. The summary and tasks are emailed to you, and each task is split into its own row in Google Sheets so it drops straight into your tracker. Unreadable recordings trigger a helpful email instead of failing silently.\n\n### Setup\n1. Connect Google Gemini (PaLM) API, Google Sheets and Gmail.\n2. Point the Save Tasks node at your spreadsheet (tab: Tasks).\n3. Open the form on your phone and record a memo.\n\n### Customization tips\nPush tasks to Notion, Todoist or Trello instead of Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "a6d1942f-a099-4257-86fd-2cfb75dba918",
      "name": "S1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -224,
        -160
      ],
      "parameters": {
        "color": 7,
        "width": 796,
        "height": 500,
        "content": "## 1. Record & transcribe\nUpload a voice memo through the built-in form; Google Gemini transcribes the audio directly. Unreadable audio emails the user."
      },
      "typeVersion": 1
    },
    {
      "id": "766283d8-e862-4530-a4eb-e7a8dadb3315",
      "name": "S2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -160
      ],
      "parameters": {
        "color": 7,
        "width": 540,
        "height": 500,
        "content": "## 2. Extract tasks (Basic LLM Chain)\nGemini turns the transcript into a structured task list with owners, due dates and priorities."
      },
      "typeVersion": 1
    },
    {
      "id": "60102931-3e5d-44c1-ac9f-56e108f4ecab",
      "name": "S3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        -160
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 500,
        "content": "## 3. Email & save each task\nEmail the summary, then split the tasks into one row each in Google Sheets."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": true,
    "executionOrder": "v1"
  },
  "versionId": "977523ff-d531-44dd-a387-207f6c7c22f4",
  "nodeGroups": [],
  "connections": {
    "Shape Tasks": {
      "main": [
        [
          {
            "node": "Email Task List",
            "type": "main",
            "index": 0
          },
          {
            "node": "Split Tasks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Tasks": {
      "main": [
        [
          {
            "node": "Save Tasks to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Task Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Extract Tasks with Gemini",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Voice Memo Form": {
      "main": [
        [
          {
            "node": "Transcribe Voice Memo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe Voice Memo": {
      "main": [
        [
          {
            "node": "Extract Tasks with Gemini",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Email Transcription Failure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Extract Tasks with Gemini",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Extract Tasks with Gemini": {
      "main": [
        [
          {
            "node": "Shape Tasks",
            "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

This workflow collects a voice memo via an n8n form, transcribes it with Google Gemini, extracts a structured task list, emails the summary and tasks via Gmail, and appends each task as a new row in Google Sheets. Receives a voice memo, project name, and recipient email address…

Source: https://n8n.io/workflows/17656/ — 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

This workflow collects candidate applications via an n8n form, extracts resume text with Mistral AI, matches the candidate to an open role stored in Google Sheets and Google Docs, scores the fit using

Form, Form Trigger, Google Sheets +7
AI & RAG

Automate your lead intake, scoring, and outreach pipeline. This workflow collects leads from forms, enriches and scores them using Relevance AI, routes them by quality, and triggers the right follow-u

Form Trigger, HTTP Request, Chain Llm +6
AI & RAG

This workflow collects a PDF and study preferences via an n8n form, extracts its text, uses Google Gemini to generate flashcards, a quiz, key topics, and a study plan, then saves the cards and quiz to

Form Trigger, Chain Llm, Google Gemini Chat +3
AI & RAG

This workflow collects a resume PDF and job description via an n8n form, extracts resume text, uses Google Gemini to generate a match score and improvement report, logs the results to Google Sheets, a

Form Trigger, Chain Llm, Google Gemini Chat +3
AI & RAG

This workflow collects a CSV bank statement via an n8n form, detects stable recurring charges, and uses Google Gemini to classify subscriptions and recommend keep/review/cancel. It emails the results

Form Trigger, Chain Llm, Google Gemini Chat +3