This workflow follows the Chainllm → 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": "68c2216d-7393-4d64-a6e4-7b5e384389a4",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
420,
1020
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "849df02a-cd4c-4c1a-80c9-84852eccd7d7",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
840,
500
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.1
},
{
"id": "b1fe6bd4-f20b-4e13-83ce-58aa80372fe5",
"name": "Read Image URLs",
"type": "n8n-nodes-base.googleSheets",
"position": [
-300,
480
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17zQUytFekDK305wvgxYdEYm4N5QEQ1mrwsfccNn872I/edit#gid=0",
"cachedResultName": "Product Images"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "17zQUytFekDK305wvgxYdEYm4N5QEQ1mrwsfccNn872I",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17zQUytFekDK305wvgxYdEYm4N5QEQ1mrwsfccNn872I/edit?usp=drivesdk",
"cachedResultName": "Image Generation"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "3c69465c-e3c7-4536-80ae-70f2bac53414",
"name": "Download Images",
"type": "n8n-nodes-base.httpRequest",
"position": [
-100,
480
],
"parameters": {
"url": "={{ $json['Image-URL'] }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "8f099961-42bd-43c2-8258-64e12a2b9f4b",
"name": "Analyze Images",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
260,
820
],
"parameters": {
"text": "Briefly explain in less than 5 words what this image is about.",
"modelId": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "GPT-4O-MINI"
},
"options": {},
"resource": "image",
"inputType": "base64",
"operation": "analyze"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "9ec41380-5297-4786-8216-140255285edb",
"name": "Product Photography Prompt",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
460,
820
],
"parameters": {
"text": "=Image description: {{ $json.content }}",
"messages": {
"messageValues": [
{
"message": "=Create a short prompt for an AI image generator that receives a photo of a product to ultimately produce professional product photography.\n\nIf the product is wearable, it must be worn by a human model with visible face; if it's not wearable, it must be held or interacted with by a model.\n\nThe product must ALWAYS be shown together with a human model with the model's face visible.\n\nEnsure that instructions for optimal realism, best lighting, best angle, best colors, best model positioning, etc. are included according to the product type.\n\nAlways formulate the prompt to refer to the product as \"this [PRODUCT]\" so the AI image generator knows that an input photo of the product is being submitted.\n\nAlways add subtle grain for a cinematic look.\nThe description of the product will be sent to you. Respond exclusively with the final prompt, nothing else, not even quotation marks."
}
]
},
"promptType": "define"
},
"typeVersion": 1.6
},
{
"id": "e5fbd22f-4081-4f51-9906-4b0f2d58fa81",
"name": "Send Image with Prompt to OpenAI",
"type": "n8n-nodes-base.httpRequest",
"position": [
1100,
500
],
"parameters": {
"url": "https://api.openai.com/v1/images/edits",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-image-1"
},
{
"name": "prompt",
"value": "={{ $json.text }}"
},
{
"name": "image[]",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
},
{
"name": "quality",
"value": "high"
},
{
"name": "size",
"value": "1536x1024"
}
]
},
"nodeCredentialType": "openAiApi"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "4812c3d5-d5eb-4ee0-97cb-786d2a3a9da5",
"name": "Convert Base64 to File",
"type": "n8n-nodes-base.convertToFile",
"position": [
1300,
500
],
"parameters": {
"options": {},
"operation": "toBinary",
"sourceProperty": "data[0].b64_json"
},
"typeVersion": 1.1
},
{
"id": "b6cb024c-1f67-4df2-8bb1-1a3740212b4d",
"name": "Upload to Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
1600,
500
],
"parameters": {
"name": "={{ $('Analyze Images').item.json.content }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1mAV3g0eR5XZ2wknZTbcfZOkLlq8GZryP",
"cachedResultUrl": "https://drive.google.com/drive/folders/1mAV3g0eR5XZ2wknZTbcfZOkLlq8GZryP",
"cachedResultName": "Product Images"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7e855dc6-0a1b-44f3-83b8-64d76693de87",
"name": "Insert Image URL in Table",
"type": "n8n-nodes-base.googleSheets",
"position": [
1820,
500
],
"parameters": {
"columns": {
"value": {
"Output": "={{ $json.webViewLink }}",
"Prompt": "={{ $('Product Photography Prompt').item.json.text }}",
"Image-URL": "={{ $('Read Image URLs').item.json['Image-URL'] }}"
},
"schema": [
{
"id": "Image-URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Image-URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Prompt",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Prompt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Output",
"type": "string",
"display": true,
"required": false,
"displayName": "Output",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Image-URL"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17zQUytFekDK305wvgxYdEYm4N5QEQ1mrwsfccNn872I/edit#gid=0",
"cachedResultName": "Product Images"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "17zQUytFekDK305wvgxYdEYm4N5QEQ1mrwsfccNn872I",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/17zQUytFekDK305wvgxYdEYm4N5QEQ1mrwsfccNn872I/edit?usp=drivesdk",
"cachedResultName": "Image Generation"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "611b6d08-5a55-4085-840a-53a1b4eb24ed",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-540,
380
],
"parameters": {
"width": 600,
"height": 360,
"content": "## Extract Product Images from Template"
},
"typeVersion": 1
},
{
"id": "e27aa751-41d4-40a9-a72c-90e327388257",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
180,
720
],
"parameters": {
"color": 4,
"width": 600,
"height": 360,
"content": "## Analyze Images and Create Prompt for Product Photography"
},
"typeVersion": 1
},
{
"id": "ea5e9556-0485-4be9-a35f-32be69ed2de0",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1020,
380
],
"parameters": {
"color": 5,
"width": 460,
"height": 360,
"content": "## gpt-image-1 creates the Product Photography"
},
"typeVersion": 1
},
{
"id": "9869ab24-02db-4b88-8429-b0f7f5a5bf2d",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1520,
380
],
"parameters": {
"color": 3,
"width": 520,
"height": 360,
"content": "## Output is uploaded to Drive and the Image URLs are saved in the table"
},
"typeVersion": 1
},
{
"id": "05c2e7af-6e3e-4171-ac28-444bec1eef49",
"name": "When clicking 'Test workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-500,
480
],
"parameters": {},
"typeVersion": 1
},
{
"id": "88c861e1-6b7c-4597-899a-e0f13ad7994a",
"name": "Convert to File",
"type": "n8n-nodes-base.convertToFile",
"position": [
-80,
-120
],
"parameters": {
"options": {},
"operation": "toBinary",
"sourceProperty": "data[0].b64_json"
},
"typeVersion": 1.1
},
{
"id": "0edb4268-9e9e-41a9-9e6e-9bed3a73f0d9",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-540,
-220
],
"parameters": {
"color": 6,
"width": 660,
"height": 260,
"content": "## Simple Image Generation\n### Don't forget the manual trigger ;)"
},
"typeVersion": 1
},
{
"id": "81b1385a-4a94-475c-9ee8-31dd5efb8dc7",
"name": "Generate Image",
"type": "n8n-nodes-base.httpRequest",
"position": [
-260,
-120
],
"parameters": {
"url": "https://api.openai.com/v1/images/generations",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-image-1"
},
{
"name": "prompt",
"value": "A childrens book drawing of a veterinarian using a stethoscope to listen to the heartbeat of a baby otter."
}
]
},
"nodeCredentialType": "openAiApi"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
}
],
"connections": {
"Merge": {
"main": [
[
{
"node": "Send Image with Prompt to OpenAI",
"type": "main",
"index": 0
}
]
]
},
"Analyze Images": {
"main": [
[
{
"node": "Product Photography Prompt",
"type": "main",
"index": 0
}
]
]
},
"Generate Image": {
"main": [
[
{
"node": "Convert to File",
"type": "main",
"index": 0
}
]
]
},
"Download Images": {
"main": [
[
{
"node": "Analyze Images",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Read Image URLs": {
"main": [
[
{
"node": "Download Images",
"type": "main",
"index": 0
}
]
]
},
"Upload to Drive": {
"main": [
[
{
"node": "Insert Image URL in Table",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Product Photography Prompt",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Convert Base64 to File": {
"main": [
[
{
"node": "Upload to Drive",
"type": "main",
"index": 0
}
]
]
},
"Product Photography Prompt": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"When clicking 'Test workflow'": {
"main": [
[
{
"node": "Read Image URLs",
"type": "main",
"index": 0
}
]
]
},
"Send Image with Prompt to OpenAI": {
"main": [
[
{
"node": "Convert Base64 to File",
"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.
googleDriveOAuth2ApigoogleSheetsOAuth2ApiopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow transforms image URLs stored in Google Sheets into professionally enhanced product photographs by leveraging AI-powered analysis and generation, saving hours of manual editing for e-commerce sellers and marketers. It begins by reading URLs from your spreadsheet, downloads the images, and uses OpenAI to analyse them before crafting tailored prompts with a language model chain. The key step involves sending these prompts along with the images to OpenAI via HTTP requests, generating polished visuals that you can directly save to Google Drive, streamlining your content creation process without needing design expertise.
Use this workflow when you have batches of raw product images needing quick, consistent enhancements for online listings, especially in high-volume retail scenarios. Avoid it for non-photographic content or when precise manual control over outputs is essential, as AI results can vary. Common variations include adapting the prompt chain for different styles, like lifestyle shots, or integrating with other storage apps instead of Google Drive for broader file management.
About this workflow
Converttofile Http. Uses lmChatOpenAi, googleSheets, httpRequest, openAi. Event-driven trigger; 18 nodes.
Source: https://github.com/Zie619/n8n-workflows — 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.
Data-driven SEO Optimization. Uses formTrigger, httpRequest, googleDrive, googleSheets. Event-driven trigger; 26 nodes.
Code Http. Uses httpRequest, lmChatOpenAi, outputParserStructured, chainLlm. Event-driven trigger; 19 nodes.
Code Http. Uses httpRequest, lmChatOpenAi, outputParserStructured, chainLlm. Event-driven trigger; 19 nodes.
HR-focused automation pipeline with AI. Uses formTrigger, extractFromFile, informationExtractor, chainSummarization. Event-driven trigger; 18 nodes.
Automated Resume Review System Using OpenAI + Google Sheets. Uses formTrigger, outputParserStructured, googleSheets, informationExtractor. Event-driven trigger; 17 nodes.