Google Drive + Sheets for Meta ad creative research
Ad research sounds simple until you’re three tabs deep, downloading images one-by-one, and trying to remember why that “winner” looked good in the first place. Then the Slack pings start, the spreadsheet is half-filled, and your “swipe file” turns into a messy folder called final_v7_FINAL.
This Meta ad research problem hits performance marketers first. But agency owners trying to scale creative testing and e-commerce teams moving fast feel it too. The outcome you want is obvious: competitor winners captured, organized, and ready to turn into your next batch of tests without losing half a day.
This n8n workflow pulls active ads from the Facebook Ad Library, saves the source creatives into Google Drive, generates a few fresh variations with AI, and logs everything into Google Sheets. You’ll see what it does, what you need, and how to use it without turning your process into a science project.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Drive + Sheets for Meta ad creative research
flowchart LR
subgraph sg0["OpenAI Flow"]
direction LR
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n3["<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/>Run Ad Library Scraper"]
n4@{ icon: "mdi:cog", form: "rounded", label: "Limit", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Google Drive1", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "OpenAI", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Google Drive2", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Variables", pos: "b", h: 48 }
n9@{ icon: "mdi:robot", form: "rounded", label: "Spin Prompts", pos: "b", h: 48 }
n10["<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/>Generate Image Using GPT Ima.."]
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n15["<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/>Download Static Image Ad1"]
n16@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Google Drive3", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Create Asset Parent Folder", pos: "b", h: 48 }
n19@{ icon: "mdi:cog", form: "rounded", label: "Create Child Source Folder", pos: "b", h: 48 }
n20@{ icon: "mdi:cog", form: "rounded", label: "Create Child Spun Folder", pos: "b", h: 48 }
n21["<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/>Download Static Image Ad"]
n22@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", pos: "b", h: 48 }
n12 --> n11
n4 --> n18
n2 --> n4
n6 --> n9
n13 --> n14
n14 --> n11
n9 --> n13
n5 --> n7
n7 --> n6
n17 --> n22
n22 --> n12
n8 --> n3
n16 --> n17
n11 --> n15
n3 --> n2
n20 --> n21
n21 --> n5
n15 --> n10
n18 --> n19
n19 --> n20
n10 --> n16
end
subgraph sg1["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Google Drive", pos: "b", h: 48 }
n23@{ icon: "mdi:database", form: "rounded", label: "Google Sheets1", pos: "b", h: 48 }
n24@{ icon: "mdi:database", form: "rounded", label: "Google Sheets2", pos: "b", h: 48 }
n25@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n25 --> n24
n1 --> n23
n23 --> n25
n0 --> n1
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 n0 trigger
class n6,n9 ai
class n2 decision
class n22,n23,n24 database
class n3,n10,n15,n21 api
classDef customIcon fill:none,stroke:none
class n3,n10,n15,n21 customIcon
The Problem: Creative Research Turns Into Busywork
When you find a promising ad in the Meta Ad Library, you don’t just need the image. You need the page name, the copy, the angle, and the context that made it work. And you need it in a place your team can actually reuse. Manually, that means screenshots, downloads, messy Drive folders, and a spreadsheet that’s always missing “one more detail.” Worse, research gets repeated because nobody trusts the archive. So you keep re-finding the same ads every week. Honestly, it’s exhausting.
It adds up fast. Here’s where it breaks down when you keep it manual.
- You spend about 10 minutes per ad just saving the basics (image, copy, URL, notes) and it’s still inconsistent.
- Teams lose track of “why this won,” so the next creative round starts from vibes, not evidence.
- Folders grow without structure, which means your best inspiration is effectively buried.
- Even when you do find winners, turning them into variations takes another hour of repetitive briefs and back-and-forth.
The Solution: Meta Winners to Drive + Sheets, Automatically
This workflow runs a full “research to ready-to-test” pipeline inside n8n. You launch it, and it queries the Facebook Ad Library via an Apify-powered scrape (using your keywords, industries, or competitor targets). It filters out ads that won’t help (like missing images or video-only results), then creates a clean folder structure in Google Drive for each ad archive ID. Next, it downloads the source image, uploads it to Drive, and shares it so you can link to it reliably. Then AI steps in: OpenAI Vision analyzes the creative (layout, colors, design patterns, messaging), and a second AI step drafts variation prompts based on your brand change request. Finally, the workflow generates multiple edited image variations, uploads them, and logs every detail to Google Sheets with direct links.
The workflow starts with a manual run in n8n, which is perfect when you want control over what you’re pulling. It moves from ad discovery to asset storage, then into analysis and image spinning. Google Sheets becomes the searchable database your team actually uses, while Google Drive stays clean and predictable.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you pull 20 competitor ads for a new campaign angle. Manually, if it takes about 10 minutes per ad to download the creative, capture the copy, file it into Drive, and log it into Sheets, that’s roughly 3 hours. Then you still need briefs for variations, which can easily add another hour. With this workflow, you run one job, wait for the scraping and AI generation, and review the finished Drive folders and Sheet links in one place. The human time drops to more like 20 minutes of setup plus quick QA.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Drive to store source and spun creatives.
- Google Sheets to track ads, notes, and links.
- Apify API key (get it from your Apify account settings).
- OpenAI API key (get it from the OpenAI dashboard).
Skill level: Advanced. You’ll be comfortable setting API keys, editing a JSON request body, and troubleshooting a few moving parts.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
You trigger a run in n8n. This workflow is launched manually, which is useful for controlled research sprints (for example, “pull 20 ads for this competitor set”). It also makes initial setup safer since you can test in small batches.
The workflow fetches ads and filters them. n8n sends an HTTP request to pull Ad Library results (via Apify), then removes items with missing images and limits the count so you don’t accidentally run up costs during testing.
Drive and Sheets are prepared, then assets are organized. It creates a parent Drive folder per ad archive ID, plus separate subfolders for “Source Assets” and “Spun Assets.” In parallel, it initializes a Google Sheet with the right headers so every run logs the same fields.
AI analyzes the creative and produces variations. The source image is downloaded and uploaded, then OpenAI Vision describes what’s happening in the ad. Another AI step turns that analysis into prompts, and the workflow iterates through them to generate a few edited image variations.
Everything is logged for reuse. The workflow uploads the variant images to Drive and appends a row in Google Sheets with timestamps, IDs, copy, prompts, and direct links. You can easily modify the search terms and the brand “change request” to match different clients or offers based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually and confirm the initial flow into the folder and spreadsheet setup.
- Add the Manual Launch Trigger node as the workflow start.
- Confirm the execution flow begins with Manual Launch Trigger → Initialize Drive Folder.
- Keep Flowpast Branding as a documentation note (no configuration required).
Step 2: Connect Google Drive & Google Sheets
Provision a Drive folder and a spreadsheet to store scraped ads and generated asset links.
- In Initialize Drive Folder, set Name to
PPC Thieveryand Resource tofolder. Credential Required: Connect your Google Drive credentials. - In Create Spreadsheet File, set Title to
PPC Thieveryand create a sheet namedscraped_ads. Credential Required: Connect your Google Sheets credentials. - In Prepare Sheet Fields, keep the field assignments for timestamp, ad_archive_id, page_id, original_image_url, page_name, ad_body, date_scraped, spun_prompts, asset_folder, source_folder, spun_folder, and direct_spun_image_link (all empty strings).
- In Append Sheet Headers, set Operation to
append, Sheet Name toscraped_ads, and Document ID to={{ $('Create Spreadsheet File').item.json.spreadsheetId }}. Credential Required: Connect your Google Sheets credentials. - Group Google Drive credentials across all Drive nodes (7 nodes total including Generate Parent Asset Folder, Create Source Subfolder, Create Variant Subfolder, Upload Source Image, Share Source File, and Upload Variant Image). Credential Required: Connect your Google Drive credentials.
Step 3: Set Up Configuration & Ad Fetching
Provide configuration values and fetch ads from the library with filtering and limits.
- In Map Config Values, replace googleDriveFolderId and spreadsheetId values
[YOUR_ID]with your actual folder and spreadsheet IDs, and edit changeRequest as needed. - In Execute Ad Library Fetch, set URL to
https://api.apify.com/v2/acts/XtaWFhbtfxyzqrFmd/run-sync-get-dataset-items, Method toPOST, and JSON Body to the provided payload. Update the Authorization header toBearer [CONFIGURE_YOUR_TOKEN]. - In Remove Missing Images, keep the condition that checks
={{ $json.snapshot.images[0].original_image_url }}exists. - In Restrict Item Count, set Max Items to
2to limit processing per run.
maxItems in Restrict Item Count after validating the pipeline to scale safely.Step 4: Configure Asset Foldering & Source Image Handling
Create per-ad Drive folders, download the original creative, and share it for AI vision analysis.
- In Generate Parent Asset Folder, set Name to
={{ $json.ad_archive_id }}and Folder ID to={{ $('Map Config Values').item.json.googleDriveFolderId }}. - In Create Source Subfolder, set Name to
=1. Source Assetsand Folder ID to={{$json.id}}. - In Create Variant Subfolder, set Name to
=2. Spun Assetsand Folder ID to={{ $('Generate Parent Asset Folder').item.json.id }}. - In Retrieve Source Image, set URL to
={{ $('Execute Ad Library Fetch').item.json.snapshot.images[0].original_image_url }}. - In Upload Source Image, set Name to
={{ $binary.data.fileName }}and choose the target Drive folder (preferably the Source subfolder). Credential Required: Connect your Google Drive credentials. - In Share Source File, set Operation to
sharewith Rolewriterand Typeanyoneto allow the vision model to access the image.
Step 5: Set Up AI Analysis & Prompt Variations
Use vision analysis and prompt rewriting to generate multiple creative variants.
- In Analyze Image Vision, set Resource to
image, Operation toanalyze, Text toWhat's in this image? Describe it extremely comprehensively. Leave nothing out., and Image URLs to=https://drive.google.com/uc?export=download&id={{ $('Upload Source Image').item.json.id }}. Credential Required: Connect your OpenAI credentials. - In Draft Variation Prompts, enable JSON Output and keep the message template that uses
={{ $json.content }}and={{ $('Map Config Values').item.json.changeRequest }}. Credential Required: Connect your OpenAI credentials. - In Separate Prompt Variants, set Field to Split Out to
message.content.variantsand includeallOtherFields. - In Map Variant Fields, map variant to
={{ $json["message.content.variants"] }}and imageAdUrl to={{ $('Remove Missing Images').item.json.snapshot.images[0].original_image_url }}. - In Iterate Variations, keep batch processing enabled to feed the image edit loop.
Step 6: Configure Image Editing, Uploads, and Logging
Generate new images, store them, and log results into Google Sheets with pacing between batches.
- In Fetch Image For Edit, set URL to
={{ $json.imageAdUrl }}. - In Generate Edited Image, set URL to
https://api.openai.com/v1/images/edits, Method toPOST, Content Type tomultipart-form-data, and keep the prompt value containing{{ $('Iterate Variations').item.json.variant }}. Credential Required: Connect your openAiApi credentials. - In Convert Image Binary, set Operation to
toBinaryand Source Property todata[0].b64_json. - In Upload Variant Image, set Name to
={{ $('Upload Source Image').item.json.name }}and choose the variant subfolder as the destination. Credential Required: Connect your Google Drive credentials. - In Log Results to Sheet, keep Operation as
appendand Document ID as={{ $('Map Config Values').item.json.spreadsheetId }}, with column mappings such as={{ $now.toSeconds() }}and={{ $json.webViewLink }}. Credential Required: Connect your Google Sheets credentials. - In Pause Between Batches, set Amount to
1to throttle requests before Iterate Variations continues.
Step 7: Test and Activate Your Workflow
Run a manual test, validate outputs, and then activate for ongoing use.
- Click Execute Workflow to trigger Manual Launch Trigger and watch each node complete in sequence.
- Confirm new folders appear in Drive, a spreadsheet called
PPC Thieveryis created, and rows are appended in thescraped_adssheet. - Verify that variant images are uploaded and that Log Results to Sheet writes valid links and metadata.
- Once validated, toggle the workflow to Active for production runs (or keep manual execution if only on-demand).
Common Gotchas
- Google Drive credentials can expire or need specific permissions. If things break, check the n8n credential settings and Drive sharing permissions 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
Plan on about 2–3 hours, mostly for credentials and testing.
No coding required, but it’s not “one click.” You will edit a few settings like API keys and the scraper request.
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 image/vision usage and Apify runs, which often lands around $100/month for active use.
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 you should. Update the “changeRequest” value in the Set Variables node to include your brand voice, compliance rules, and what must change in every variation (colors, fonts, CTA style, claims). You can also adjust the Apify search terms in the HTTP request body to target specific competitors, regions, or keywords. If you want more or fewer variants per source ad, change how the prompt variants are split and iterated.
Usually it’s permissions or an expired token. Reconnect the Google Drive credential in n8n, then confirm the connected Google account can create folders and share files in the target Drive location. If the workflow creates folders but can’t share links, check domain restrictions in Google Workspace. Rate limits can show up too if you’re uploading lots of images quickly, so the Wait node matters.
If you self-host, there’s no execution limit (it mostly depends on your server and API quotas).
For this specific use case, n8n is usually the better fit because you’re chaining scraping, file handling, AI vision analysis, image generation, and structured logging. That’s a lot of branching and iteration, and those scenarios get expensive fast on Zapier or Make. n8n also gives you a self-host route, which matters when you’re running frequent research sprints. The flip side is setup complexity. If you only need “save ad link to a sheet,” Zapier is quicker. Talk to an automation expert if you want help choosing.
Once this is running, creative research stops being a scavenger hunt and becomes a repeatable system. The workflow handles the collecting and organizing so you can focus on testing what matters.
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.