Google Sheets to Google Drive, ad images ready fast
Your ad creative process probably breaks in the most annoying place. Not in the “big idea” part, but in the endless middle: downloading images, renaming files, pasting links into a sheet, and trying to keep every product visual consistent.
This Sheets Drive automation hits performance marketers first, honestly. But ecommerce owners and agency teams feel it too when “we need 10 new creatives by tomorrow” turns into a messy scavenger hunt across Google Drive folders.
This workflow turns a simple Google Sheets row into an ad-ready product image in Google Drive, then updates your tracking sheet so you always know what’s ready to publish (and what isn’t).
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Google Drive, ad images ready fast
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "download_influencer_image", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "upload_image", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Analyze image", pos: "b", h: 48 }
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "Download Product Image", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Convert Binary to Text", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Get the Raw", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "influencer_image_Convert_to_..", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Image Generation"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>base64 cleanup"]
n10@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Update Spreadsheet with Resu..", pos: "b", h: 48 }
n6 --> n4
n1 --> n11
n2 --> n8
n9 --> n10
n10 --> n1
n8 --> n9
n3 --> n6
n5 --> n0
n4 --> n5
n4 --> n2
n0 --> n7
n7 --> n8
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3 trigger
class n2 ai
class n6,n11 database
class n8 api
class n9 code
classDef customIcon fill:none,stroke:none
class n8,n9 customIcon
The Problem: Ad Creatives Get Stuck in Production
Making “one good ad image” is doable. Making 10 of them every day, across different products, models, and campaign angles is where things fall apart. You end up copying links from Google Drive into a spreadsheet, downloading images just to re-upload them, and trying to keep lighting and styling consistent with whatever your last winning creative looked like. Then someone asks, “Is this ready?” and you’re not even sure which version is the latest because the folder has three files called final_final_2.png. It’s exhausting, and it quietly slows down testing.
The friction compounds. Here’s where it usually breaks down.
- You spend about 10 minutes per product just gathering the right product and influencer photos from Drive.
- Creative consistency becomes guesswork, so you lose time in revisions and “make it match the last one” back-and-forth.
- Status tracking lives in people’s heads, which means launches slip because nobody knows what’s publishable.
- Manual file handling leads to wrong uploads, broken links, or missing assets right when a campaign needs speed.
The Solution: Turn Sheet Rows Into Ad-Ready Images
This workflow turns your Google Sheet into a production queue for ad creatives. On a schedule, it pulls the next row of product and model/influencer image URLs, downloads both images from Google Drive, and prepares them for AI processing. Then it uses OpenAI to analyze the product photo and generate a practical, ad-focused description (think lighting, mood, styling cues). With that guidance, it calls an OpenRouter image model to generate a polished composite that looks like a real campaign asset, not a rough mockup. Finally, the workflow saves the finished image back into a target Google Drive folder and updates the original Google Sheet row with the Drive link and a ready-to-publish status.
It starts with a scheduled trigger and a single source of truth (your sheet). AI handles the creative transformation in the middle. Google Drive and Google Sheets then get updated automatically, so your “production system” stays clean without extra admin work.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you create 8 ad images each morning for new product angles. Manually, you might spend about 10 minutes finding and downloading the right product shot, another 10 minutes locating a matching influencer image, then 5 minutes uploading and pasting links back into your sheet. That’s roughly 3 hours of handling files and tracking. With this workflow, you update (or add) 8 rows in Google Sheets, let the scheduled run generate the images, and come back to a sheet full of Drive links marked ready-to-publish. Most days, your “time spent” drops to about 15 minutes of review.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to hold your creative production queue.
- Google Drive to store inputs and finished creatives.
- OpenAI API key (get it from your OpenAI account dashboard).
Skill level: Intermediate. You’ll connect Google credentials, paste API keys, and map a few fields in the sheet.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled run kicks things off. The workflow starts on a timer so your creatives can be generated daily (or a few times a day) without anyone remembering to press a button.
Google Sheets becomes the source of truth. n8n fetches the relevant row(s) for “today’s” items, including the Google Drive URLs for the product photo and the influencer/model photo you want to combine.
Images are pulled from Google Drive and prepared for AI. The workflow downloads each image, converts the files into a base64 format (basically a way to send images through an API), and then uses OpenAI to analyze the product photo so the final output follows a consistent ad style.
An OpenRouter request generates the new ad visual. The workflow sends the inputs and styling guidance to an image model, cleans up the response, converts it back into a proper image file, and uploads it right where your team expects it in Google Drive.
You can easily modify the “ready-to-publish” status to match your naming (or add a review step) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Workflow Trigger
Set the schedule that kicks off the image creation process.
- Add and open Scheduled Workflow Trigger.
- Define your schedule under Rule so the workflow runs when new rows should be processed.
- Connect Scheduled Workflow Trigger to Fetch Sheet Row.
Step 2: Connect Google Sheets
Pull the scheduled row that contains the product and model image URLs.
- Open Fetch Sheet Row and select your spreadsheet in Document, e.g.
[YOUR_ID]. - Set Sheet Name to
Sheet1(gid=0). - In Filters, set Lookup Column to
Dateand Lookup Value to={{ $json.Month }} {{ $json['Day of month'] }}, {{ $json.Year }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials for Fetch Sheet Row.
Step 3: Connect Google Drive and Prepare Images
Download the product and model images and convert them to base64 for AI processing.
- In Retrieve Product Photo, set File ID to
={{ $json['Product url'] }}and keep Operation asdownload. - Credential Required: Connect your
googleDriveOAuth2Apicredentials for Retrieve Product Photo. - In Convert Product Binary, set Operation to
binaryToPropery. - In Fetch Model Image, set File ID to
={{ $('Fetch Sheet Row').item.json['Model url'] }}and keep Operation asdownload. - Credential Required: Connect your
googleDriveOAuth2Apicredentials for Fetch Model Image. - In Convert Model Binary, set Operation to
binaryToPropery.
Retrieve Product Photo outputs to both Convert Product Binary and Evaluate Product Photo in parallel.
Step 4: Set Up AI Processing and Image Generation
Analyze the product and generate an ad-ready composite image.
- Open Evaluate Product Photo and keep Resource as
image, Input Type asbase64, and Operation asanalyze. - Credential Required: Connect your
openAiApicredentials for Evaluate Product Photo. - In Generate Ad Visual, set URL to
https://openrouter.ai/api/v1/chat/completionsand Method toPOST. - Set JSON Body to:
={ "model": "google/gemini-2.5-flash-image-preview", "prompt": "{{ $json.content }}", "image_inputs": [ { "image": "{{ $json.data }}", "mime_type": "image/png" }, { "image": "{{ $('Convert Product Binary').item.json.data }}", "mime_type": "image/jpeg" } ] } - In Generate Ad Visual headers, set Authorization to
Bearer [CONFIGURE_YOUR_TOKEN]and Content-Type toapplication/json. - In Clean Base64 Output, keep the provided JS Code to strip the
data:image/png;base64,prefix. - In Build Image File, set Operation to
toBinaryand Source Property tochoices[0].images[0].image_url.url.
Step 5: Configure Output and Sheet Updates
Store the generated image in Drive and log the result back to the spreadsheet.
- In Store Ad Visual, set Name to
=Ad Image {{ $runIndex + 1 }}. - Select the target folder in Store Ad Visual using Folder ID (e.g.
[YOUR_ID]). - Credential Required: Connect your
googleDriveOAuth2Apicredentials for Store Ad Visual. - Open Update Results Sheet and keep Operation as
appendOrUpdate. - Map Date to
={{ $('Fetch Sheet Row').item.json.Date }}, Publish toPublish, and Ad Image Ready To Post to={{ $json.webContentLink }}. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials for Update Results Sheet.
Step 6: Test and Activate Your Workflow
Run a controlled test to confirm images are generated and logged correctly.
- Click Execute Workflow to run a manual test with your current sheet row.
- Confirm that Store Ad Visual creates a file in your Drive folder and returns a
webContentLink. - Verify Update Results Sheet writes the image URL and status to the correct row.
- Turn on the workflow with the Active toggle to enable scheduled runs.
Common Gotchas
- Google Drive credentials can expire or need specific permissions. If things break, check the connected Google account in n8n’s Credentials and confirm it can access the exact folder first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your Google accounts and API keys are ready.
No. You’ll mostly connect accounts and map your sheet columns to the right fields in n8n.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI and OpenRouter usage, which is usually a few cents per image depending on settings.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s a smart tweak. Most teams add a “Needs review” status in the Update Results Sheet node, then only mark “Ready” after someone checks the Drive output. You can also split outputs into two folders by changing the Store Ad Visual upload destination, like /Review and /Approved. If you’re using HubSpot later for campaign logging, you can also branch after upload and create a record only when status equals Approved.
Usually it’s permission-related. Make sure the connected Google account can access the specific Drive folder and that the file URLs in your sheet point to files that aren’t restricted. If you recently changed passwords or security settings, re-authenticate the Google Drive credential in n8n. Also check that shared drive files are supported by your chosen Drive node settings.
On a typical n8n Cloud plan, teams run a few hundred to a few thousand executions a month, and self-hosting removes execution limits (your server is the limiter). In practice, most of the wait is the AI generation step, so throughput is usually “a few images at a time” unless you add batching and concurrency controls.
Often, yes. This workflow needs multi-step file handling (download, convert, send to AI, clean base64, rebuild a file, upload) and conditional logic, which n8n handles without feeling like you’re fighting the platform. Zapier or Make can work, but costs can climb once you’re doing lots of AI calls and file steps, and some “advanced” branching patterns are simply more awkward there. If you only generate a couple of creatives a week, you might not care. If you’re trying to scale daily production, n8n is usually the calmer choice. Talk to an automation expert if you want help deciding.
Once this is running, your spreadsheet stops being “admin” and starts being your creative engine. The workflow handles the repetitive parts so you can focus on what actually moves performance.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.