This workflow corresponds to n8n.io template #7062 — 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": "7W7d0YwVNAq2e1ia",
"name": "Template to extract PDFs",
"tags": [],
"nodes": [
{
"id": "e8790514-92e0-4f1f-bf17-94833512d86e",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-400,
-96
],
"parameters": {},
"typeVersion": 1
},
{
"id": "8dea3c26-0cb2-4607-8135-d45963200c6a",
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
-192,
-240
],
"parameters": {
"url": "PUT THE URL OF THE WEBSITE YOU WANT TO EXTRACT PDFS FROM",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "aacd88bc-e89b-47fc-af70-7c85f5e6c4f8",
"name": "HTML",
"type": "n8n-nodes-base.html",
"position": [
-48,
-96
],
"parameters": {
"options": {},
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "pdf",
"attribute": "href",
"cssSelector": "a[href$=\".pdf\"]",
"returnArray": true,
"returnValue": "attribute"
},
{
"key": "tittle",
"cssSelector": "a[href$=\".pdf\"]",
"returnArray": true
}
]
}
},
"typeVersion": 1.2
},
{
"id": "963ff0ab-af77-4e66-8339-11b7d105c318",
"name": "Code",
"type": "n8n-nodes-base.code",
"notes": "Lista los pdfs",
"position": [
96,
-96
],
"parameters": {
"jsCode": "const baseUrl = \"https://www.playway.com\";\n\nreturn $input.first().json.pdf.map(link => {\n return {\n json: {\n url: `${baseUrl}${link}`\n }\n };\n});"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "e305771c-6ad1-43ea-a8c1-61ba61be5df7",
"name": "HTTP Request1",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
-416,
208
],
"parameters": {
"url": "={{ $json.url }}",
"options": {
"response": {
"response": {
"neverError": true,
"responseFormat": "file"
}
}
}
},
"retryOnFail": true,
"typeVersion": 4.2
},
{
"id": "1306f74c-cf7a-4f4b-897a-abc15281eac2",
"name": "Extract from File",
"type": "n8n-nodes-base.extractFromFile",
"onError": "continueRegularOutput",
"position": [
-176,
208
],
"parameters": {
"options": {},
"operation": "pdf"
},
"typeVersion": 1
},
{
"id": "ddaba8bb-676b-4c1e-9986-47b55503520d",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"notes": "Ejecuci\u00f3n semanal",
"position": [
-400,
-288
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks"
}
]
}
},
"notesInFlow": true,
"typeVersion": 1.2
},
{
"id": "f56b233d-f303-4845-be9e-7cde10110f87",
"name": "Discord",
"type": "n8n-nodes-base.discord",
"position": [
1024,
144
],
"parameters": {
"content": "={{ $json.message }}",
"options": {},
"authentication": "webhook"
},
"typeVersion": 2
},
{
"id": "4c946a75-11bd-4c5e-9e29-9b95b56b342b",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
336,
-80
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA/edit?usp=drivesdk",
"cachedResultName": "PlayWay_BabelBots"
}
},
"executeOnce": true,
"typeVersion": 4.6,
"alwaysOutputData": true
},
{
"id": "792b65d0-3e97-44d2-994b-7ddbb765c9dd",
"name": "OpenRouter Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
-464,
592
],
"parameters": {
"model": "meta-llama/llama-4-maverick",
"options": {}
},
"typeVersion": 1
},
{
"id": "377311e1-ee99-48a9-8b23-fc9b09b4abbf",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
32,
208
],
"parameters": {
"text": "=Analyze the following company report and provide an executive summary in English, highlighting:\n\n* Key financial information (if available)\n* Relevant actions announced by the company\n* Changes in the board of directors or other important decisions\n* Any potential impact for investors\n\nReport text:\n{{ \\$json.text }}\n",
"options": {},
"promptType": "define"
},
"typeVersion": 2.1
},
{
"id": "73691e8d-3eb0-4918-8f57-e42ffda2ff1e",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
144,
432
],
"parameters": {
"sessionKey": "playway-agent",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "f6a43984-cc3f-4a02-aadc-575ba322778f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-192,
160
],
"parameters": {
"color": 3,
"width": 768,
"height": 400,
"content": "This is the AI process \u2014 go in and change the prompt to your liking.\n"
},
"typeVersion": 1
},
{
"id": "1928302e-8082-4d28-a553-4a7bb295547e",
"name": "Edit Fields1",
"type": "n8n-nodes-base.set",
"position": [
656,
496
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "657129da-9b3f-43c2-ac71-a41799949ff1",
"name": "url",
"type": "string",
"value": "={{ $('HTTP Request1').item.json.url }}"
},
{
"id": "a3583044-d67b-4576-a9b9-b87181ce34c1",
"name": "enviado_discord",
"type": "string",
"value": "true"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "bfd92648-dc17-4dec-b1a0-089b949b990e",
"name": "Update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
864,
496
],
"parameters": {
"columns": {
"value": {
"url": "={{ $json.url }}",
"enviado_discord": "={{ $json.enviado_discord }}"
},
"schema": [
{
"id": "url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "enviado_discord",
"type": "string",
"display": true,
"required": false,
"displayName": "enviado_discord",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"url"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA/edit#gid=0",
"cachedResultName": "PDFs"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA/edit?usp=drivesdk",
"cachedResultName": "PlayWay_BabelBots"
}
},
"typeVersion": 4.6
},
{
"id": "2996662d-4710-4340-96d0-3f6272a756ea",
"name": "Append or update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
672,
-80
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "enviado_discord",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "enviado_discord",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"url"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA/edit#gid=0",
"cachedResultName": "PDFs"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1eJVTi79GRuz05MRn55KsQGKnn9R3yX8BBH212POrcKA/edit?usp=drivesdk",
"cachedResultName": "PlayWay_BabelBots"
}
},
"typeVersion": 4.6
},
{
"id": "3bf5e883-58dc-4035-b0fd-a87a00702da8",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
512,
-128
],
"parameters": {
"mode": "combine",
"options": {},
"joinMode": "keepNonMatches",
"fieldsToMatchString": "url"
},
"typeVersion": 3.2
},
{
"id": "570fdfd2-e438-4b5c-86d2-e0729389b653",
"name": "Filtro caracteres max",
"type": "n8n-nodes-base.code",
"position": [
416,
192
],
"parameters": {
"jsCode": "const input = $input.all();\nconst chunkSize = 1900;\nconst result = [];\n\nfor (const item of input) {\n const text = item.json.output;\n for (let i = 0; i < text.length; i += chunkSize) {\n result.push({\n json: {\n message: text.slice(i, i + chunkSize)\n }\n });\n }\n}\n\nreturn result;\n\n"
},
"typeVersion": 2
},
{
"id": "23a4e1dc-5535-43a9-8f5e-0e4e7f757044",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-704,
-400
],
"parameters": {
"width": 432,
"height": 448,
"content": "## Start\n\nThese blocks trigger the flow \u2014 one is manual, and one is scheduled. Open them and set the frequency you want.\n"
},
"typeVersion": 1
},
{
"id": "807096dc-8460-4ce2-80e8-d08ce64e4141",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-368
],
"parameters": {
"color": 2,
"width": 480,
"height": 432,
"content": "## Website Access and PDF Search\n\nOpen the first node that connects to the website and set it to the one you want.\n"
},
"typeVersion": 1
},
{
"id": "2eac5cae-923f-49c3-8897-ffc22801c882",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
304,
-272
],
"parameters": {
"width": 496,
"height": 336,
"content": "## Google Connection\n\nHere you need to connect to the Google Cloud API: [https://cloud.google.com/](https://cloud.google.com/) and enable both Drive and Sheets.\nThen, create a sheet in Drive \u2014 this will be the one you use.\n"
},
"typeVersion": 1
},
{
"id": "b03fe146-3fce-464e-9f91-5edff8c9b769",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-576,
384
],
"parameters": {
"color": 6,
"width": 320,
"height": 368,
"content": "## Model Connection\nHere you need to register on OpenRouter and enter the API key. You can choose any model you like, as long as it\u2019s free.\n"
},
"typeVersion": 1
},
{
"id": "446111cd-3794-4812-a379-9b69ea2ebf85",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
624,
368
],
"parameters": {
"color": 4,
"width": 448,
"height": 288,
"content": "## Marking the Registered URLs\n\nWith this, I simply receive which URLs I\u2019ve downloaded the PDF from, and we mark them in the Google Sheet we created.\n"
},
"typeVersion": 1
},
{
"id": "511215dc-2ba6-4e62-a622-565e765d4244",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
16
],
"parameters": {
"color": 4,
"width": 448,
"height": 288,
"content": "## Sending to Discord\n\nIn a private Discord server, create a channel. In the channel settings, create an integration via webhook and paste it here.\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "b3ef412b-aeec-4a6e-89e3-f03acdc1e845",
"connections": {
"Code": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"HTML": {
"main": [
[
{
"node": "Code",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Filtro caracteres max",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields1": {
"main": [
[
{
"node": "Update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "HTML",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
},
{
"node": "Edit Fields1",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Filtro caracteres max": {
"main": [
[
{
"node": "Discord",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Append or update row in sheet": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
How it works: Accesses a target website, searches for new PDFs, and downloads them automatically. Extracts content from each PDF and sends it to an AI for summarization. Delivers the AI-generated summary directly to a Discord channel. Marks processed URLs in Google Sheets to…
Source: https://n8n.io/workflows/7062/ — 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 workflow contains community nodes that are only compatible with the self-hosted version of n8n.
The Shopify AI Product Description Factory is a production-grade n8n workflow that converts product images and metadata into refined, SEO-aware descriptions—fully automated and region-agnostic. It ble
This workflow automates the process of recording financial transactions from photos of receipts or shopping receipts. Users simply send an image of the receipt via Telegram. The image is processed usi
[](https://www.youtube.com/watch?v=RCwFc57V6oo)
The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C