This workflow corresponds to n8n.io template #16664 — we link there as the canonical source.
This workflow follows the Google Drive → Google Drive 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": "XKKBECEYcCGjMBAa",
"meta": {
"builderVariant": "mcp",
"aiBuilderAssisted": true
},
"name": "Create Google Tasks from Tactis Transcriptions",
"tags": [],
"nodes": [
{
"id": "0d1203d4-fd40-4365-b323-d6c671c8aff8",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-624,
1120
],
"parameters": {
"width": 480,
"height": 896,
"content": "## Create Google Tasks from Tactis Transcriptions\n\n### How it works\n\nThis workflow monitors a Google Drive folder for new Tactiq transcript files, with an optional scheduled fallback to re-check the folder. It skips transcripts already recorded in an n8n data table, downloads new files, extracts transcript text, and uses OpenAI to identify explicit action items. When tasks are found, it creates Google Tasks, records the transcript as processed, and sends Telegram notifications for successes or task creation errors.\n\n### Setup steps\n\n- Connect Google Drive credentials and configure the watched Tactiq transcript folder ID in the template variables.\n- Create or select the n8n data table used to store processed transcript records, then set its ID in the workflow variables.\n- Connect OpenAI credentials and verify the prompt/model used to extract explicit action items from transcript text.\n- Connect Google Tasks credentials and choose the destination task list for created tasks.\n- Connect Telegram bot credentials and set the target chat ID in the workflow variables.\n- Confirm the timezone variable and enable the optional 12-hour schedule trigger only if periodic fallback scans are desired.\n\n### Customization\n\nAdjust the OpenAI extraction prompt to change what qualifies as an action item, update the Google Task fields or target list, and modify the Telegram message templates for different notification details."
},
"typeVersion": 1
},
{
"id": "fcc62687-3ff7-45ef-82e7-cc0e2087161b",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-64,
1200
],
"parameters": {
"color": 7,
"width": 416,
"height": 528,
"content": "## Start and configure\n\nEntry triggers for Drive changes and scheduled fallback scans feed into shared template variables such as folder IDs, chat ID, and timezone."
},
"typeVersion": 1
},
{
"id": "0283307f-57cb-4ddd-8011-e03843e5a187",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
1312
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Load transcript inventory\n\nRetrieves the existing processed-transcript records and lists transcript files from the configured Google Drive folder."
},
"typeVersion": 1
},
{
"id": "ace73bf2-7094-4d46-b986-0a5bdaa674b6",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
832,
1312
],
"parameters": {
"color": 7,
"width": 416,
"height": 320,
"content": "## Detect new files\n\nCompares Drive files against the processed list and branches only when there are new transcript files to handle."
},
"typeVersion": 1
},
{
"id": "d8872ce9-b5f7-489e-95dd-4ca193f02128",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1280,
1344
],
"parameters": {
"color": 7,
"width": 640,
"height": 304,
"content": "## Download transcript content\n\nSplits the new transcript file list into individual items, downloads each file, and extracts the raw transcript text for analysis."
},
"typeVersion": 1
},
{
"id": "139b8d41-18cb-47c0-a0aa-bfa0b755e34a",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
1344
],
"parameters": {
"color": 7,
"width": 912,
"height": 304,
"content": "## Extract action items\n\nSends the transcript text to OpenAI, extracts the JSON response, parses the resulting tasks, and checks whether any actionable tasks were found."
},
"typeVersion": 1
},
{
"id": "7807fed6-611f-4804-b28c-ee256b73b5bd",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2896,
1120
],
"parameters": {
"color": 7,
"width": 640,
"height": 416,
"content": "## Create and summarize tasks\n\nSplits extracted tasks into individual records, creates each one in Google Tasks, and summarizes created tasks back by transcript on the success path."
},
"typeVersion": 1
},
{
"id": "b722ff82-ed9c-400b-b361-146203170cee",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
3296,
1568
],
"parameters": {
"color": 7,
"width": 640,
"height": 512,
"content": "## Finalize and notify\n\nHandles the closely clustered final outcomes: logs transcripts with no extracted tasks, registers processed transcripts, sends success notifications, and reports task creation errors to Telegram."
},
"typeVersion": 1
},
{
"id": "9d2032e5-7648-4b40-903b-562f25a9f161",
"name": "When Transcript Added to Folder",
"type": "n8n-nodes-base.googleDriveTrigger",
"position": [
-16,
1376
],
"parameters": {
"event": "={{ \"fileCreated\" }}",
"options": {},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "specificFolder",
"folderToWatch": {
"__rl": true,
"mode": "id",
"value": "128dtzEuXd2XkdGZx16H1WnfMAmeyqGDt"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "5c3e26d8-470c-40fd-b256-8983ea3eb604",
"name": "Set Template Variables",
"type": "n8n-nodes-base.set",
"position": [
208,
1472
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "drive_folder_id",
"name": "drive_folder_id",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Google Drive folder ID where Tactiq saves transcripts__>"
},
{
"id": "processed_transcripts_data_table_id",
"name": "=processed_transcripts_data_table_id",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__n8n Data Table ID for processed transcript tracking__>"
},
{
"id": "telegram_chat_id",
"name": "telegram_chat_id",
"type": "string",
"value": "<__PLACEHOLDER_VALUE__Telegram chat ID for success and error notifications__>"
},
{
"id": "timezone",
"name": "timezone",
"type": "string",
"value": "America/Merida"
},
{
"id": "success_message",
"name": "success_message",
"type": "string",
"value": "Tasks were added to Google Tasks from a Tactiq transcript."
},
{
"id": "error_message",
"name": "error_message",
"type": "string",
"value": "ERROR creating one or more Google Tasks from a Tactiq transcript."
}
]
},
"includeOtherFields": true
},
"typeVersion": 3.4
},
{
"id": "8178c05c-8c00-41ca-a6ec-45b7c079ea40",
"name": "Fetch Processed Transcripts",
"type": "n8n-nodes-base.dataTable",
"position": [
432,
1472
],
"parameters": {
"operation": "get",
"returnAll": true,
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Set Template Variables').item.json.processed_transcripts_data_table_id }}"
}
},
"typeVersion": 1.1,
"alwaysOutputData": true
},
{
"id": "735bb4ee-7a53-44ed-9b35-b3a0a5ce5f20",
"name": "List Transcript Files in Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
656,
1472
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Set Template Variables').item.json.drive_folder_id }}"
},
"whatToSearch": "files"
},
"options": {
"fields": [
"id",
"name",
"mimeType",
"webViewLink"
]
},
"resource": "fileFolder",
"returnAll": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 3
},
{
"id": "e65a44b6-7ab4-4505-af1e-0f564fd3e965",
"name": "Filter Unprocessed Files",
"type": "n8n-nodes-base.code",
"position": [
880,
1472
],
"parameters": {
"jsCode": "const processedItems = $('Fetch Processed Transcripts').all();\nconst processedNames = new Set(processedItems.map(item => item.json.nombre_archivo).filter(Boolean));\nconst driveFiles = $input.all();\nconst newFiles = driveFiles.filter(item => item.json.name && !processedNames.has(item.json.name));\nif (newFiles.length === 0) return [{ json: { hasNewFiles: false, files: [] } }];\nreturn [{ json: { hasNewFiles: true, files: newFiles.map(file => file.json) } }];"
},
"typeVersion": 2
},
{
"id": "4cb1e731-3be0-4004-976e-83db3442cb6e",
"name": "Check for Unprocessed Files",
"type": "n8n-nodes-base.if",
"position": [
1104,
1472
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-has-files",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.hasNewFiles }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.3
},
{
"id": "0ce11e55-cb58-4b4f-b087-ea133d4c3e0c",
"name": "Split Transcript Files",
"type": "n8n-nodes-base.splitOut",
"position": [
1328,
1472
],
"parameters": {
"options": {},
"fieldToSplitOut": "files"
},
"typeVersion": 1
},
{
"id": "443c631e-388b-4776-995e-769b27d15be0",
"name": "Download Transcript from Drive",
"type": "n8n-nodes-base.googleDrive",
"onError": "continueRegularOutput",
"position": [
1552,
1472
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {
"fileName": "={{ $json.name }}",
"googleFileConversion": {
"conversion": {
"docsToFormat": "text/plain"
}
}
},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 3
},
{
"id": "7b995390-4201-49e8-a2fe-dd79a415f5ab",
"name": "Extract Text from Transcript",
"type": "n8n-nodes-base.code",
"position": [
1776,
1472
],
"parameters": {
"jsCode": "const items = $input.all();\nconst output = [];\nfor (let i = 0; i < items.length; i++) {\n const item = items[i];\n const fileName = item.json.name || 'unknown_transcript';\n const fileId = item.json.id || '';\n if (!item.binary) throw new Error(`Item ${i} does not include binary data`);\n const binaryKey = Object.keys(item.binary)[0];\n if (!binaryKey) throw new Error(`No binary key found for '${fileName}'`);\n const buffer = await this.helpers.getBinaryDataBuffer(i, binaryKey);\n const transcripcion = buffer.toString('utf-8').trim();\n if (!transcripcion) throw new Error(`Empty or unreadable transcript: ${fileName}`);\n output.push({ json: { transcripcion, fileName, fileId } });\n}\nreturn output;"
},
"typeVersion": 2
},
{
"id": "d446be1f-443b-435e-8a94-da1ffa815400",
"name": "AI Extract Action Items",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2000,
1472
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "id",
"value": "gpt-5-mini"
},
"options": {},
"responses": {
"values": [
{
"role": "system",
"content": "=You are an assistant specialized in extracting explicit tasks and commitments from Spanish business meeting transcripts.\n\nBase date for resolving relative dates: {{ $now.toFormat(\"yyyy-MM-dd\") }}\n\nAnalyze the transcript and return only valid JSON, with no extra text, explanation, or code block.\n\nThe output format must be exactly this:\n\n{\"tareas\":[{\"nombre_tarea\":\"Concise actionable task name\",\"descripcion_tarea\":\"Clear task description with minimal required context\",\"fecha_compromiso\":\"YYYY-MM-DD or null\",\"responsable\":\"Responsible person name\",\"evidencia\":\"Short verbatim quote where the task was agreed\",\"transcript\":\"{{ $json.fileName }}\"}]}\n\nRules:\n- Include only explicit tasks, agreements, or commitments.\n- Do not infer implicit tasks or assume owners.\n- Do not duplicate tasks that express the same commitment.\n- Convert relative dates like \"ma\u00f1ana\", \"el lunes\", or \"la pr\u00f3xima semana\" to YYYY-MM-DD only if they are unambiguous from the base date; otherwise use null.\n- \"responsable\" must contain the person name. Every task must have a responsible person.\n- \"evidencia\" must be a short representative verbatim quote.\n- If there are no identifiable tasks, return exactly: {\"tareas\":[]}\n- Use real JSON null, not the string \"null\".\n- Return only the final JSON."
},
{
"content": "=Extract the action items from this transcript:\n\n{{ $json.transcripcion }}"
}
]
},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "003dd9fa-c445-4b55-8d66-8a2bf058143d",
"name": "Split AI JSON Response",
"type": "n8n-nodes-base.splitOut",
"position": [
2272,
1472
],
"parameters": {
"options": {
"destinationFieldName": "tareas"
},
"fieldToSplitOut": "output[0].content[0].text"
},
"typeVersion": 1
},
{
"id": "4312be33-2a5b-4cff-906b-6b8f7e312f44",
"name": "Parse Tasks from JSON",
"type": "n8n-nodes-base.code",
"position": [
2496,
1472
],
"parameters": {
"jsCode": "const inputItems = $input.all();\nconst fileItems = $('Extract Text from Transcript').all();\nconst results = [];\nfor (let i = 0; i < inputItems.length; i++) {\n const item = inputItems[i].json;\n const fileName = fileItems[i]?.json?.fileName || `transcript_${i + 1}`;\n const rawText = typeof item.tareas === 'string' ? item.tareas : '';\n let tareas = [];\n if (rawText.trim()) {\n try { const parsed = JSON.parse(rawText); tareas = Array.isArray(parsed.tareas) ? parsed.tareas : []; }\n catch (error) {\n const start = rawText.indexOf('{');\n const end = rawText.lastIndexOf('}');\n if (start !== -1 && end > start) {\n try { const parsed = JSON.parse(rawText.slice(start, end + 1)); tareas = Array.isArray(parsed.tareas) ? parsed.tareas : []; }\n catch (innerError) { console.error(`Error parsing AI JSON for '${fileName}': ${rawText.substring(0, 300)}`); }\n }\n }\n }\n results.push({ json: { nombre_archivo: fileName, fecha_proceso: new Date().toISOString(), total_tareas: tareas.length, tieneTareas: tareas.length > 0, tareas } });\n}\nreturn results;"
},
"typeVersion": 2
},
{
"id": "603e79ae-af19-40d8-954c-4ee96ec7386d",
"name": "Check for Tasks in JSON",
"type": "n8n-nodes-base.if",
"position": [
2720,
1472
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-has-tasks",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.tieneTareas }}",
"rightValue": true
}
]
}
},
"typeVersion": 2.3
},
{
"id": "0b0a90e7-e566-4120-aa40-649c82a4f99d",
"name": "Split Tasks into Items",
"type": "n8n-nodes-base.splitOut",
"position": [
2944,
1376
],
"parameters": {
"include": "selectedOtherFields",
"options": {},
"fieldToSplitOut": "tareas",
"fieldsToInclude": "nombre_archivo"
},
"typeVersion": 1
},
{
"id": "22659fad-568d-46c1-af31-f8c5e84e82bb",
"name": "Generate Google Task",
"type": "n8n-nodes-base.googleTasks",
"onError": "continueErrorOutput",
"position": [
3168,
1376
],
"parameters": {
"task": "={{ $('Set Template Variables').item.json.google_tasks_list_id }}",
"title": "={{ $json.tareas.nombre_tarea }}",
"additionalFields": {
"notes": "=Source: {{ $json.nombre_archivo }}\n\nDescription:\n{{ $json.tareas.descripcion_tarea }}\n\nResponsible: {{ $json.tareas.responsable || \"Not specified\" }}\n\nEvidence:\n\"{{ $json.tareas.evidencia }}\"",
"dueDate": "={{ $json.tareas.fecha_compromiso ? $json.tareas.fecha_compromiso + \"T12:00:00.000Z\" : \"\" }}"
}
},
"credentials": {
"googleTasksOAuth2Api": {
"name": "<your credential>"
}
},
"retryOnFail": true,
"typeVersion": 1
},
{
"id": "1438cce0-bd33-4dff-ba85-b3fbc3825a7f",
"name": "Summarize Tasks by Transcript",
"type": "n8n-nodes-base.code",
"position": [
3392,
1280
],
"parameters": {
"jsCode": "const items = $input.all();\nconst transcripts = new Map();\nconst config = $('Set Template Variables').first().json;\nconst timezone = config.timezone || 'America/Merida';\nfunction timestampForTimezone(timeZone) { return new Intl.DateTimeFormat('sv-SE', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).format(new Date()).replace(' ', 'T'); }\nfor (const item of items) {\n const transcriptName = item.json.nombre_archivo || item.json.notes?.match(/Source:\\s*(.*)/)?.[1]?.trim();\n if (!transcriptName) continue;\n if (!transcripts.has(transcriptName)) transcripts.set(transcriptName, { nombre_archivo: transcriptName, fecha_proceso: timestampForTimezone(timezone), procesado: true, total_tareas_creadas: 0 });\n transcripts.get(transcriptName).total_tareas_creadas += 1;\n}\nreturn Array.from(transcripts.values()).map(row => ({ json: row }));"
},
"typeVersion": 2
},
{
"id": "c19e10ad-3896-4b46-a8d5-c29b451c198f",
"name": "Log Processed Transcript",
"type": "n8n-nodes-base.dataTable",
"position": [
3568,
1728
],
"parameters": {
"columns": "{{ { nombre_archivo: $json.nombre_archivo, fecha_proceso: $json.fecha_proceso, total_tareas: $json.total_tareas_creadas } }}",
"options": {},
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Set Template Variables').item.json.processed_transcripts_data_table_id }}"
}
},
"typeVersion": 1.1
},
{
"id": "5e22c950-2141-44d1-aa22-e10b03a4e8bc",
"name": "Alert Telegram: Tasks Created",
"type": "n8n-nodes-base.telegram",
"position": [
3792,
1728
],
"parameters": {
"text": "={{ $('Set Template Variables').item.json.success_message }}",
"chatId": "={{ $('Set Template Variables').item.json.telegram_chat_id }}",
"additionalFields": {
"appendAttribution": true
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 1.2
},
{
"id": "8bf52a67-c3eb-4596-b176-4f3114674d2b",
"name": "Alert Telegram: Task Error",
"type": "n8n-nodes-base.telegram",
"position": [
3344,
1728
],
"parameters": {
"text": "={{ $('Set Template Variables').item.json.error_message }}",
"chatId": "={{ $('Set Template Variables').item.json.telegram_chat_id }}",
"additionalFields": {
"appendAttribution": true
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 1.2
},
{
"id": "40cccfd5-7f7b-44da-b473-f58cfd0d1d22",
"name": "Tag Transcript with No Tasks",
"type": "n8n-nodes-base.code",
"position": [
3344,
1920
],
"parameters": {
"jsCode": "const config = $('Set Template Variables').first().json;\nconst timezone = config.timezone || 'America/Merida';\nconst fechaProceso = new Intl.DateTimeFormat('sv-SE', { timeZone: timezone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).format(new Date()).replace(' ', 'T');\nreturn [{ json: { nombre_archivo: $json.nombre_archivo, fecha_proceso: fechaProceso, procesado: true, total_tareas_creadas: 0 } }];"
},
"typeVersion": 2
},
{
"id": "b9524242-b791-4ec4-b1c9-e6292d149b39",
"name": "Every 12 Hours Fallback Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"disabled": true,
"position": [
-16,
1568
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 12
}
]
}
},
"typeVersion": 1.3
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"callerPolicy": "workflowsFromSameOwner",
"timeSavedMode": "fixed",
"availableInMCP": false,
"executionOrder": "v1",
"timeSavedPerExecution": 10
},
"versionId": "68db9bdd-3698-4293-824c-cf3285e1dfd5",
"connections": {
"Generate Google Task": {
"main": [
[
{
"node": "Summarize Tasks by Transcript",
"type": "main",
"index": 0
}
],
[
{
"node": "Alert Telegram: Task Error",
"type": "main",
"index": 0
}
]
]
},
"Parse Tasks from JSON": {
"main": [
[
{
"node": "Check for Tasks in JSON",
"type": "main",
"index": 0
}
]
]
},
"Set Template Variables": {
"main": [
[
{
"node": "Fetch Processed Transcripts",
"type": "main",
"index": 0
}
]
]
},
"Split AI JSON Response": {
"main": [
[
{
"node": "Parse Tasks from JSON",
"type": "main",
"index": 0
}
]
]
},
"Split Tasks into Items": {
"main": [
[
{
"node": "Generate Google Task",
"type": "main",
"index": 0
}
]
]
},
"Split Transcript Files": {
"main": [
[
{
"node": "Download Transcript from Drive",
"type": "main",
"index": 0
}
]
]
},
"AI Extract Action Items": {
"main": [
[
{
"node": "Split AI JSON Response",
"type": "main",
"index": 0
}
]
]
},
"Check for Tasks in JSON": {
"main": [
[
{
"node": "Split Tasks into Items",
"type": "main",
"index": 0
}
],
[
{
"node": "Tag Transcript with No Tasks",
"type": "main",
"index": 0
}
]
]
},
"Filter Unprocessed Files": {
"main": [
[
{
"node": "Check for Unprocessed Files",
"type": "main",
"index": 0
}
]
]
},
"Log Processed Transcript": {
"main": [
[
{
"node": "Alert Telegram: Tasks Created",
"type": "main",
"index": 0
}
]
]
},
"Check for Unprocessed Files": {
"main": [
[
{
"node": "Split Transcript Files",
"type": "main",
"index": 0
}
]
]
},
"Fetch Processed Transcripts": {
"main": [
[
{
"node": "List Transcript Files in Drive",
"type": "main",
"index": 0
}
]
]
},
"Extract Text from Transcript": {
"main": [
[
{
"node": "AI Extract Action Items",
"type": "main",
"index": 0
}
]
]
},
"Tag Transcript with No Tasks": {
"main": [
[
{
"node": "Log Processed Transcript",
"type": "main",
"index": 0
}
]
]
},
"Summarize Tasks by Transcript": {
"main": [
[
{
"node": "Log Processed Transcript",
"type": "main",
"index": 0
}
]
]
},
"Download Transcript from Drive": {
"main": [
[
{
"node": "Extract Text from Transcript",
"type": "main",
"index": 0
}
]
]
},
"List Transcript Files in Drive": {
"main": [
[
{
"node": "Filter Unprocessed Files",
"type": "main",
"index": 0
}
]
]
},
"Every 12 Hours Fallback Trigger": {
"main": [
[
{
"node": "Set Template Variables",
"type": "main",
"index": 0
}
]
]
},
"When Transcript Added to Folder": {
"main": [
[
{
"node": "Set Template Variables",
"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.
googleDriveOAuth2ApigoogleTasksOAuth2ApiopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow monitors a Google Drive folder for new Tactiq transcript files, uses OpenAI to extract explicit action items, creates matching Google Tasks, sends a Telegram notification, and logs each processed transcript in an n8n Data Table to prevent duplicate processing.…
Source: https://n8n.io/workflows/16664/ — 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.
The Problem That it Solves
Voice Note -> Veo 3 AD. Uses telegramTrigger, telegram, openAi, httpRequest. Event-driven trigger; 49 nodes.
Content creators, YouTubers, and social media managers who want to repurpose long form videos into short clips without doing it manually. Works on self hosted n8n instances.
This workflow automatically turns any audio file uploaded to Google Drive into a complete podcast episode. It handles transcription, content generation, blog drafting, social copy creation, thumbnail
Transcript Audio To Text. Uses googleDocs, googleDrive, openAi, gmail. Event-driven trigger; 31 nodes.