This workflow corresponds to n8n.io template #10982 — we link there as the canonical source.
This workflow follows the Datatable → Gmail 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "be3e62b9-5bd4-4ea5-a48a-b034a0f164ca",
"name": "Save to Remove Background",
"type": "n8n-nodes-base.googleDrive",
"position": [
1168,
192
],
"parameters": {
"name": "={{ $('Loop Over Original Files').item.json.name }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1fHs5mRfcw5Ngd7XlWLIDAtDl-jqFwDS8",
"cachedResultUrl": "",
"cachedResultName": "Compressed"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 3
},
{
"id": "6e535295-a2b0-40cb-9ac4-0a000bf17d96",
"name": "Get all files",
"type": "n8n-nodes-base.googleDrive",
"position": [
96,
288
],
"parameters": {
"filter": {
"folderId": {
"__rl": true,
"mode": "list",
"value": "1yg0nahSLFReH5Ik-caVqO2AGC2Nll4Fx",
"cachedResultUrl": "",
"cachedResultName": "Image Compression"
},
"whatToSearch": "files"
},
"options": {},
"resource": "fileFolder"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 3
},
{
"id": "559ee1f9-6f93-4b05-8a4d-3702b68db6b6",
"name": "Daily at 08:00 am",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-272,
384
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "4726eaa0-6726-42e1-8869-d4e7ae3a11cd",
"name": "Tiny URL API Call",
"type": "n8n-nodes-base.httpRequest",
"position": [
752,
112
],
"parameters": {
"url": "https://api.tinify.com/shrink",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "binaryData",
"sendHeaders": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Accept",
"value": "image/png, application/json"
}
]
},
"inputDataFieldName": "data"
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 4.2
},
{
"id": "6c1b3c2d-9d17-4c8c-b232-6ea2c8239751",
"name": "Load Raw Image",
"type": "n8n-nodes-base.googleDrive",
"position": [
528,
112
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 3
},
{
"id": "61712bd4-7b3f-45ab-85ce-d6f389bfb98f",
"name": "Download Compressed Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
976,
112
],
"parameters": {
"url": "={{ $json.output.url }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "af8fdf34-004b-459b-98a4-c1de21dfce50",
"name": "Move Files to the Folder /Original",
"type": "n8n-nodes-base.googleDrive",
"position": [
736,
464
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.id }}"
},
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"mode": "list",
"value": "17WuxNpiiSZ6VJY1QTUcrvy5er-Neklqu",
"cachedResultUrl": "",
"cachedResultName": ""
},
"operation": "move"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 3
},
{
"id": "dba1c9be-4681-4a6c-9391-c283ae6b5232",
"name": "Loop Over Processed Files",
"type": "n8n-nodes-base.splitInBatches",
"position": [
320,
496
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "45fd4fd1-5542-461d-995f-9907fca4c91f",
"name": "Loop Over Original Files",
"type": "n8n-nodes-base.splitInBatches",
"position": [
304,
192
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "c94d5cec-5cc0-467f-a7e0-544da6e8a470",
"name": "Generate Processing Id",
"type": "n8n-nodes-base.set",
"position": [
-48,
384
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "7e591f43-a863-4cda-bb88-4ee7377b41af",
"name": "processing_id",
"type": "string",
"value": "={{ $execution.id.toString().padStart(10, '0') }}"
}
]
}
},
"notesInFlow": true,
"typeVersion": 3.4
},
{
"id": "b2cf7310-e8be-4dc9-85b1-c577d154fde5",
"name": "Processing Logs",
"type": "n8n-nodes-base.dataTable",
"position": [
1312,
80
],
"parameters": {
"columns": {
"value": {
"imageId": "={{ $('Load Raw Image').item.json.id }}",
"fileName": "={{ $('Load Raw Image').item.json.name }}",
"outputUrl": "={{ $('Tiny URL API Call').item.json.output.url }}",
"originalSize": "={{ $('Tiny URL API Call').item.json.input.size }}",
"processingId": "={{ $('Generate Processing Id').item.json.processing_id }}",
"compressedSize": "={{ $('Tiny URL API Call').item.json.output.size }}"
},
"schema": [
{
"id": "fileName",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "fileName",
"defaultMatch": false
},
{
"id": "originalSize",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "originalSize",
"defaultMatch": false
},
{
"id": "compressedSize",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "compressedSize",
"defaultMatch": false
},
{
"id": "imageId",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "imageId",
"defaultMatch": false
},
{
"id": "outputUrl",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "outputUrl",
"defaultMatch": false
},
{
"id": "processingId",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "processingId",
"defaultMatch": false
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "",
"cachedResultName": "Image Compression"
}
},
"typeVersion": 1
},
{
"id": "15145b80-ff7b-422b-ad98-9a74e748046b",
"name": "Generate Report",
"type": "n8n-nodes-base.code",
"position": [
-64,
720
],
"parameters": {
"jsCode": "const data = items.map(i => i.json);\nconst toKb = n => (Number(n) / 1024).toFixed(1);\nconst processingId = $input.first().json.processingId;\n\nconst totalSaved = data.reduce(\n (s, d) => s + (Number(d.originalSize) - Number(d.compressedSize)),\n 0\n);\n\nconst rows = data.map(d => `\n <tr>\n <td style=\"padding:8px;border-bottom:1px solid #e5e7eb;\">${d.fileName}</td>\n <td style=\"padding:8px;border-bottom:1px solid #e5e7eb;text-align:right;\">\n ${toKb(d.originalSize)} KB\n </td>\n <td style=\"padding:8px;border-bottom:1px solid #e5e7eb;text-align:right;\">\n ${toKb(d.compressedSize)} KB\n </td>\n </tr>\n`).join('');\n\nconst html = `\n <div style=\"font-family:Arial,sans-serif;max-width:600px;margin:0 auto;line-height:1.5;\">\n <h2 style=\"color:#0b7a4b;margin-bottom:4px;\">LogiGreen Image Compressor Bot</h2>\n <p style=\"margin-top:0;font-size:14px;\">\n For more details about the solution: \n <a href=\"https://logi-green.com\" style=\"color:#0b7a4b;text-decoration:none;\">\n LogiGreen\n </a>.\n </p>\n\n <p><strong>Processing ID:</strong> ${processingId}</p>\n <p><strong>Images processed:</strong> ${data.length}</p>\n\n <table style=\"width:100%;border-collapse:collapse;font-size:13px;\">\n <thead>\n <tr style=\"background:#f3f4f6;\">\n <th style=\"text-align:left;padding:8px;border-bottom:1px solid #e5e7eb;\">File</th>\n <th style=\"text-align:right;padding:8px;border-bottom:1px solid #e5e7eb;\">Original</th>\n <th style=\"text-align:right;padding:8px;border-bottom:1px solid #e5e7eb;\">Compressed</th>\n </tr>\n </thead>\n <tbody>${rows}</tbody>\n </table>\n\n <p style=\"margin-top:12px;\">\n <strong>Total saved:</strong> ${toKb(totalSaved)} KB (${totalSaved.toLocaleString()} bytes)\n </p>\n\n <p style=\"font-size:12px;color:#6b7280;\">\n This email was automatically generated by the LogiGreen Image Compressor Bot\n to help keep your product pages fast and SEO-friendly.\n </p>\n </div>\n`;\n\nreturn [\n {\n json: {\n html,\n processingId,\n },\n },\n];\n"
},
"typeVersion": 2
},
{
"id": "0e0808a0-016b-46a4-be16-a461e6fa8e7f",
"name": "Collect Logs",
"type": "n8n-nodes-base.dataTable",
"position": [
-256,
720
],
"parameters": {
"filters": {
"conditions": [
{
"keyName": "processingId",
"keyValue": "={{ $('Generate Processing Id').item.json.processing_id }}"
}
]
},
"matchType": "allConditions",
"operation": "get",
"dataTableId": {
"__rl": true,
"mode": "list",
"value": "",
"cachedResultUrl": "",
"cachedResultName": "Image Compression"
}
},
"typeVersion": 1
},
{
"id": "c2140aaa-4c2c-40b6-8568-5cb6612bc101",
"name": "Send Report",
"type": "n8n-nodes-base.gmail",
"position": [
112,
720
],
"parameters": {
"sendTo": "l<SET_YOUR_EMAIL>",
"message": "={{ $json.html }}",
"options": {
"appendAttribution": false
},
"subject": "=Image Compression Report - {{ $json.processingId }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"notesInFlow": true,
"typeVersion": 2.1
},
{
"id": "68de5d92-ff4e-434c-95a5-2f0002096e6e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
64
],
"parameters": {
"width": 544,
"height": 784,
"content": "## Image Compressor using Tinyfy API\n\n### How it works\n1. A schedule trigger runs every morning at 08:00 and generates a unique `processingId` for the execution.\n2. The workflow lists all images in your Google Drive **Input** folder that need to be compressed.\n3. Each file is downloaded and sent to the **TinyPNG/Tinify** API.\n4. The compressed image is downloaded and saved into the **Compressed** folder in Google Drive.\n5. The original files are moved to the **Original Images** archive folder.\n6. A log entry is created for each image in the **Data Table**, including: `fileName`, `originalSize`, `compressedSize`, `imageId`, `outputUrl`, and `processingId`.\n7. When all images are processed, the workflow retrieves the logs for the current `processingId` and generates an HTML report.\n8. A summary email is sent via **Gmail** with processing statistics and total memory saved.\n\n### Setup steps\n- [ ] Create three Google Drive folders: **Input**, **Original Images**, and **Compressed**, then update their folder IDs in the Google Drive nodes.\n- [ ] Create a **Data Table** (e.g. \u201cImage Compression\u201d) with fields: `fileName`, `originalSize`, `compressedSize`, `imageId`, `outputUrl`, `processingId`.\n- [ ] Generate a **TinyPNG/Tinify API key** and add it to the HTTP Basic Auth credentials used by the **Tiny URL API Call** node. - [API Documentation](https://tinypng.com/developers/reference)\n- [ ] Configure your **Gmail** credentials and the recipient address in **Send Report**.\n\n### Customisation\n- Adjust the schedule of the **Daily at 08:00 am** trigger as needed.\n- Update the HTML template in **Generate Report** to add your own branding, logo, footer, or email styling.\n"
},
"typeVersion": 1
},
{
"id": "5c938d32-7fef-4d8d-8717-bedfae691332",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
64
],
"parameters": {
"color": 7,
"width": 524,
"height": 524,
"content": "## 1. Daily trigger to fetch all the pictures to compress and generate a random processing Id"
},
"typeVersion": 1
},
{
"id": "bb35f04e-4d62-4796-b775-8b418bd2851f",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
256,
64
],
"parameters": {
"color": 7,
"width": 1180,
"height": 316,
"content": "## 2. Compress each image using Tinyfy API and log the results"
},
"typeVersion": 1
},
{
"id": "5b5b986a-6d11-4bd5-8aea-a6865563f224",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
256,
400
],
"parameters": {
"color": 7,
"width": 636,
"height": 252,
"content": "## 3. Move the images that have been compressed to the folder for processed images"
},
"typeVersion": 1
},
{
"id": "0558053c-9d5e-47cf-9ea2-af868d95165e",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
656
],
"parameters": {
"color": 7,
"width": 1180,
"height": 188,
"content": "## 4. Load all logs of the current `processingId` to generate a report sent by email"
},
"typeVersion": 1
},
{
"id": "932f6365-26b1-4d1f-89ff-b23fba9f42e2",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
912,
400
],
"parameters": {
"width": 528,
"height": 432,
"content": "## [Video Tutorial](https://youtu.be/qXQVcaJgwrA)\n@[youtube](qXQVcaJgwrA)"
},
"typeVersion": 1
}
],
"connections": {
"Collect Logs": {
"main": [
[
{
"node": "Generate Report",
"type": "main",
"index": 0
}
]
]
},
"Get all files": {
"main": [
[
{
"node": "Loop Over Original Files",
"type": "main",
"index": 0
},
{
"node": "Loop Over Processed Files",
"type": "main",
"index": 0
}
]
]
},
"Load Raw Image": {
"main": [
[
{
"node": "Tiny URL API Call",
"type": "main",
"index": 0
}
]
]
},
"Generate Report": {
"main": [
[
{
"node": "Send Report",
"type": "main",
"index": 0
}
]
]
},
"Processing Logs": {
"main": [
[]
]
},
"Daily at 08:00 am": {
"main": [
[
{
"node": "Generate Processing Id",
"type": "main",
"index": 0
}
]
]
},
"Tiny URL API Call": {
"main": [
[
{
"node": "Download Compressed Image",
"type": "main",
"index": 0
}
]
]
},
"Generate Processing Id": {
"main": [
[
{
"node": "Get all files",
"type": "main",
"index": 0
},
{
"node": "Collect Logs",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Original Files": {
"main": [
[],
[
{
"node": "Load Raw Image",
"type": "main",
"index": 0
}
]
]
},
"Download Compressed Image": {
"main": [
[
{
"node": "Save to Remove Background",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Processed Files": {
"main": [
[],
[
{
"node": "Move Files to the Folder /Original",
"type": "main",
"index": 0
}
]
]
},
"Save to Remove Background": {
"main": [
[
{
"node": "Processing Logs",
"type": "main",
"index": 0
},
{
"node": "Loop Over Original Files",
"type": "main",
"index": 0
}
]
]
},
"Move Files to the Folder /Original": {
"main": [
[
{
"node": "Loop Over Processed Files",
"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.
gmailOAuth2googleDriveOAuth2ApihttpBasicAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Tags: Image Compression, Tinify API, TinyPNG, SEO Optimisation, E-commerce, Marketing
Source: https://n8n.io/workflows/10982/ — 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.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
Client Form → Draft → Approve → Sign → Deliver, fully automated
This n8n template demonstrates how to build a Auto Lead Gen & Outreach System for Local Businesses specifically designed to help businesses that don’t have a website yet.
This workflow automates the complete end-to-end processing of daily revenue transactions for finance and accounting teams. It systematically retrieves, validates, and standardizes transaction data fro
Chase missing onboarding documents daily with Google Drive, Gmail and Slack. Uses googleDrive, dataTable, slack, gmail. Scheduled trigger; 21 nodes.