This workflow follows the Gmail Trigger → Google Drive 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 →
{
"nodes": [
{
"id": "deafa2e8-af41-4f11-92e0-09992f6c6970",
"name": "Read PDF",
"type": "n8n-nodes-base.readPDF",
"position": [
860,
1420
],
"parameters": {},
"typeVersion": 1
},
{
"id": "8e3ddbb1-83a1-4f79-9464-61d5a20f0427",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-760,
1300
],
"parameters": {
"width": 444.034812880766,
"height": 599.5274151436035,
"content": "## Envie anexos PDF espec\u00edficos do Gmail para o Google Drive usando OpenAI\n\n_**AVISO**: Voc\u00ea pode ter resultados vari\u00e1veis ao usar este fluxo, ent\u00e3o esteja preparado para validar a corre\u00e7\u00e3o dos resultados da OpenAI._\n\nEste fluxo l\u00ea o conte\u00fado textual de PDFs e envia o texto para a OpenAI. Anexos de interesse ser\u00e3o ent\u00e3o enviados para uma pasta espec\u00edfica do Google Drive. Por exemplo, voc\u00ea pode querer enviar notas fiscais recebidas por e-mail para uma pasta de entrada no Google Drive, para processamento posterior. Este fluxo foi desenhado para que voc\u00ea possa facilmente mudar o termo de busca conforme sua necessidade. Veja o fluxo para mais detalhes.\n\n### Como funciona\n1. Dispara no node `On email received`.\n2. Itera sobre os anexos do e-mail.\n3. Usa o node `OpenAI` para filtrar os anexos que n\u00e3o correspondem ao termo de busca definido no node `Configure`. Voc\u00ea pode buscar por v\u00e1rios tipos de PDF (ex.: nota fiscal, recibo ou contrato).\n4. Se o anexo PDF corresponder ao termo de busca, o fluxo usa o node `Google Drive` para enviar o anexo PDF para uma pasta espec\u00edfica do Google Drive.\n\n\nFluxo escrito por [David Sha](https://davidsha.me)."
},
"typeVersion": 1
},
{
"id": "fb2c3697-a92f-4be1-b9a6-0326f87de70b",
"name": "Configure",
"type": "n8n-nodes-base.set",
"position": [
-20,
1520
],
"parameters": {
"values": {
"number": [
{
"name": "maxTokenSize",
"value": 4000
},
{
"name": "replyTokenSize",
"value": 50
}
],
"string": [
{
"name": "Match on",
"value": "payslip"
},
{
"name": "Google Drive folder to upload matched PDFs",
"value": "https://drive.google.com/drive/u/0/folders/1SKdHTnYoBNlnhF_QJ-Zyepy-3-WZkObo"
}
]
},
"options": {}
},
"typeVersion": 1
},
{
"id": "792c49f4-06e3-4d77-a31f-1513f70abf32",
"name": "Is PDF",
"type": "n8n-nodes-base.if",
"position": [
640,
1520
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $binary.data.fileExtension }}",
"value2": "pdf"
}
]
}
},
"typeVersion": 1
},
{
"id": "82be9111-665d-41c6-8190-2247acdb749b",
"name": "Not a PDF",
"type": "n8n-nodes-base.noOp",
"position": [
860,
1620
],
"parameters": {},
"typeVersion": 1
},
{
"id": "c2ac155f-38ee-46f2-8a24-5614e3c32ff5",
"name": "Is matched",
"type": "n8n-nodes-base.if",
"position": [
1720,
1480
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json[\"text\"] }}",
"value2": "true"
}
]
}
},
"typeVersion": 1
},
{
"id": "4a8f15b8-c153-493d-9a2a-d63d911d642d",
"name": "This is a matched PDF",
"type": "n8n-nodes-base.noOp",
"position": [
1940,
1380
],
"parameters": {},
"typeVersion": 1
},
{
"id": "89601591-5c7b-461c-859b-25c7c1f0c2e6",
"name": "This is not a matched PDF",
"type": "n8n-nodes-base.noOp",
"position": [
1940,
1580
],
"parameters": {},
"typeVersion": 1
},
{
"id": "ac517c4a-83b8-441f-b14c-c927c18f8012",
"name": "Iterate over email attachments",
"type": "n8n-nodes-base.code",
"position": [
420,
1420
],
"parameters": {
"jsCode": "// https://community.n8n.io/t/iterating-over-email-attachments/13588/3\nlet results = [];\n\nfor (const item of $input.all()) {\n for (key of Object.keys(item.binary)) {\n results.push({\n json: {},\n binary: {\n data: item.binary[key],\n }\n });\n }\n}\n\nreturn results;"
},
"typeVersion": 1
},
{
"id": "79fdf2de-42fe-4ebb-80fb-cc80dcd284f9",
"name": "OpenAI matches PDF textual content",
"type": "n8n-nodes-base.openAi",
"position": [
1300,
1340
],
"parameters": {
"prompt": "=Este arquivo PDF parece ser um(a) {{ $(\"Configure\").first().json[\"Match on\"] }}? Retorne \"true\" se for um(a) {{ $(\"Configure\").first().json[\"Match on\"] }} e \"false\" caso contr\u00e1rio. Responda apenas com letras min\u00fasculas \"true\" ou \"false\".\n\nEste \u00e9 o nome do arquivo PDF:\n```\n{{ $binary.data.fileName }}\n```\n\nEste \u00e9 o conte\u00fado textual do PDF:\n```\n{{ $json.text }}\n```",
"options": {
"maxTokens": "={{ $('Configure').first().json.replyTokenSize }}",
"temperature": 0.1
}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1,
"alwaysOutputData": false
},
{
"id": "8bdb3263-40f2-4277-8cc0-f6edef90a1cd",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1500,
1480
],
"parameters": {
"mode": "combine",
"options": {
"clashHandling": {
"values": {
"resolveClash": "preferInput1"
}
}
},
"combinationMode": "mergeByPosition"
},
"typeVersion": 2
},
{
"id": "8e68e725-b2df-4c0c-8b17-e0cd4610714d",
"name": "Upload file to folder",
"type": "n8n-nodes-base.googleDrive",
"position": [
2160,
1380
],
"parameters": {
"name": "={{ $binary.data.fileName }}",
"options": {},
"parents": [
"={{ $('Configure').first().json[\"Google Drive folder to upload matched PDFs\"].split(\"/\").at(-1) }}"
],
"binaryData": true
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "bda00901-5ade-471c-b6f9-a18ef4d71589",
"name": "On email received",
"type": "n8n-nodes-base.gmailTrigger",
"position": [
-240,
1520
],
"parameters": {
"simple": false,
"filters": {},
"options": {
"downloadAttachments": true,
"dataPropertyAttachmentsPrefixName": "attachment_"
},
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
}
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "b2ff4774-336b-47a3-af3f-ada809ed9b8a",
"name": "Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-100,
1440
],
"parameters": {
"width": 259.0890718059702,
"height": 607.9684549079709,
"content": "### Configura\u00e7\u00e3o\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n__`Match on`(obrigat\u00f3rio)__: Qual deve ser o termo de busca da OpenAI? Exemplos: invoice, callsheet, receipt, contract, payslip.\n__`Google Drive folder to upload matched PDFs`(obrigat\u00f3rio)__: Cole o link da pasta do GDrive; um exemplo foi fornecido, mas voc\u00ea precisar\u00e1 alter\u00e1-lo para uma pasta sua.\n__`maxTokenSize`(obrigat\u00f3rio)__: O tamanho m\u00e1ximo de tokens para o modelo escolhido. Veja modelos dispon\u00edveis da OpenAI [aqui](https://platform.openai.com/docs/models/gpt-3).\n__`replyTokenSize`(obrigat\u00f3rio)__: O tamanho m\u00e1ximo de tokens da resposta. O padr\u00e3o \u00e9 300. Isso determina o tamanho do texto da resposta da IA."
},
"typeVersion": 1
},
{
"id": "beb571fe-e7a3-4f3c-862b-dc01821e5f3f",
"name": "Ignore large PDFs",
"type": "n8n-nodes-base.noOp",
"position": [
1300,
1620
],
"parameters": {},
"typeVersion": 1
},
{
"id": "f3c4f249-08a7-4e5e-8f46-e07393ac10b5",
"name": "Is text within token limit?",
"type": "n8n-nodes-base.if",
"position": [
1080,
1520
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.text.length() / 4 <= $('Configure').first().json.maxTokenSize - $('Configure').first().json.replyTokenSize }}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "93b6fb96-3e0e-4953-bd09-cf882d2dc69c",
"name": "Has attachments?",
"type": "n8n-nodes-base.if",
"position": [
200,
1520
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $('On email received').item.binary.isNotEmpty() }}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "554d415e-a965-46be-8442-35c4cb6b005c",
"name": "There are no attachments",
"type": "n8n-nodes-base.noOp",
"position": [
420,
1620
],
"parameters": {},
"typeVersion": 1
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Is matched",
"type": "main",
"index": 0
}
]
]
},
"Is PDF": {
"main": [
[
{
"node": "Read PDF",
"type": "main",
"index": 0
}
],
[
{
"node": "Not a PDF",
"type": "main",
"index": 0
}
]
]
},
"Read PDF": {
"main": [
[
{
"node": "Is text within token limit?",
"type": "main",
"index": 0
}
]
]
},
"Configure": {
"main": [
[
{
"node": "Has attachments?",
"type": "main",
"index": 0
}
]
]
},
"Is matched": {
"main": [
[
{
"node": "This is a matched PDF",
"type": "main",
"index": 0
}
],
[
{
"node": "This is not a matched PDF",
"type": "main",
"index": 0
}
]
]
},
"Has attachments?": {
"main": [
[
{
"node": "Iterate over email attachments",
"type": "main",
"index": 0
}
],
[
{
"node": "There are no attachments",
"type": "main",
"index": 0
}
]
]
},
"On email received": {
"main": [
[
{
"node": "Configure",
"type": "main",
"index": 0
}
]
]
},
"This is a matched PDF": {
"main": [
[
{
"node": "Upload file to folder",
"type": "main",
"index": 0
}
]
]
},
"Is text within token limit?": {
"main": [
[
{
"node": "OpenAI matches PDF textual content",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 1
}
],
[
{
"node": "Ignore large PDFs",
"type": "main",
"index": 0
}
]
]
},
"Iterate over email attachments": {
"main": [
[
{
"node": "Is PDF",
"type": "main",
"index": 0
}
]
]
},
"OpenAI matches PDF textual content": {
"main": [
[
{
"node": "Merge",
"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.
gmailOAuth2googleDriveOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
24-Pdf-Anexo-Google-Drive. Uses readPDF, openAi, googleDrive, gmailTrigger. Event-driven trigger; 18 nodes.
Source: https://github.com/mascenaa/AutoPronto/blob/d3dafe08d296506b85c3bd29aba5d98df9c9906a/pacotes/kit-completo/24-pdf-anexo-google-drive.json — 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.
Send Specific Pdf Attachments From Gmail To Google Drive Using Openai. Uses readPDF, stickyNote, noOp, openAi. Event-driven trigger; 18 nodes.
This workflow reads PDF textual content and sends the text to OpenAI. Attachments of interest will then be uploaded to a specified Google Drive folder. For example, you may wish to send invoices recei
This workflow converts emailed timesheets into structured invoice rows in Google Sheets and stores them in the correct Google Drive folder structure.
Overview
Small teams, solo operators, and security-conscious individuals who receive email attachments from external senders. Useful for freelancers, agencies, HR teams, and anyone handling CVs, invoices, or d