{
  "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
          }
        ]
      ]
    }
  }
}