Google Drive to Google Slides, decks filled from CSV
Building “just a quick personalized deck” turns into a slow copy-paste marathon. One wrong company name on slide two, one missed metric, and suddenly you’re doing damage control instead of outreach.
Sales ops usually gets stuck cleaning the lead list. Demand gen needs the decks yesterday. And the agency team doing outbound for clients feels the same pressure. This CSV slides automation takes a CSV in Google Drive and produces a fresh Google Slides deck per lead, then logs the deck link back to Google Sheets.
Below, you’ll see exactly how the workflow runs, what it replaces, and where the real time savings show up once you’re doing this at volume.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Drive to Google Slides, decks filled from CSV
flowchart LR
subgraph sg0["Lead File Flow"]
direction LR
n0@{ icon: "mdi:cog", form: "rounded", label: "Retrieve File by ID", pos: "b", h: 48 }
n1@{ icon: "mdi:cog", form: "rounded", label: "Relocate Lead Sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Update Lead with Deck ID", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Fetch Lead List", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Generate Lead Sheet", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Append Lead Records", pos: "b", h: 48 }
n6@{ icon: "mdi:play-circle", form: "rounded", label: "Lead File Trigger", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route by File Format", 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/merge.svg' width='40' height='40' /></div><br/>Merge Sheet with CSV"]
n9@{ icon: "mdi:cog", form: "rounded", label: "Personalize Slide Deck", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Parse CSV Content", pos: "b", h: 48 }
n11@{ icon: "mdi:cog", form: "rounded", label: "Duplicate Slide Template", pos: "b", h: 48 }
n7 --> n0
n3 --> n1
n0 --> n10
n0 --> n4
n4 --> n8
n6 --> n7
n1 --> n11
n11 --> n9
n9 --> n2
n5 --> n3
n10 --> n8
n8 --> n5
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 n6 trigger
class n7 decision
class n2,n3,n4,n5 database
classDef customIcon fill:none,stroke:none
class n8 customIcon
The Challenge: Personalizing Slide Decks at Scale Without Errors
If you’ve ever personalized decks from a lead list, you know the trap. The first few are fine. Then you’re juggling a CSV, a Slides template, a naming convention, a folder structure, and a “where did we put the link?” spreadsheet that’s never updated consistently. It’s not just slow. It’s mentally exhausting, because every deck is a chance to mix up names, paste the wrong stat, or forget to update the doc link before you move on.
It adds up fast. Here’s where it breaks down once you move beyond a handful of prospects.
- Copying a master deck for every lead turns into an hour-long task the moment you have a decent list.
- Placeholder replacement is easy to mess up when you’re switching tabs, especially when two companies have similar names.
- Links to finished decks end up scattered across Slack messages, emails, and half-updated spreadsheets.
- Manual processes don’t leave an audit trail, so you can’t quickly answer “Which leads already got a deck?”
The Fix: Auto-Generate a Deck Per CSV Row (and Log Every Link)
This workflow watches a specific Google Drive folder for new lead CSV uploads. When a new file arrives, it checks that it’s actually a .csv (so you don’t accidentally trigger on random attachments), downloads it, and parses the rows into structured lead data. Next, it creates a fresh Google Sheet to act as the run log and source-of-truth for that batch, then writes the CSV rows into the sheet so you have clean columns to map against. From there, it loops through each lead, duplicates your master Google Slides template, replaces placeholders like {{Name}} and {{Company}} with that lead’s values, and finally writes the finished deck URL back into the sheet. The output is simple: one generated Slides deck per lead, plus a spreadsheet that shows exactly what was created and where it lives.
The workflow starts with a CSV landing in Drive. Google Sheets becomes the tracking layer and the data map. Google Slides does the personalization work on a copied template, and the final deck link gets written back to the lead row so nothing gets lost.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you’re running a list of 40 leads and you want a personalized deck for each. Manually, a typical flow is: copy the template (2 minutes), replace fields (6 minutes), name and file it correctly (2 minutes), then log the link (2 minutes). That’s about 10 minutes per lead, or roughly 6 hours for the batch. With this workflow, you upload one CSV, then wait for processing while n8n generates decks and writes the URLs back to Google Sheets. Your “hands-on” time is closer to 10 minutes total.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Drive for CSV intake and deck storage
- Google Sheets to log leads and deck URLs
- Google Slides to duplicate and personalize decks
Skill level: Beginner. You’ll connect Google accounts, set a folder, and map a few placeholders to CSV column names.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A CSV hits your Drive folder. The Google Drive trigger monitors an “incoming leads” folder, then routes files through a quick file-type check so only .csv uploads continue.
The workflow turns the CSV into usable lead rows. n8n downloads the file by ID, extracts the CSV content, and merges it into a structured format that matches what Google Sheets and your Slides placeholders expect.
Google Sheets becomes the tracking spine. It creates a new sheet for that run, appends lead records, then fetches all rows so the workflow can iterate cleanly without missing anyone.
Slides are duplicated and personalized one lead at a time. For each row, the workflow copies your master Slides template in Drive, replaces tokens like {{Company}} with real values, then updates the corresponding sheet row with the final presentation URL.
You can easily modify which CSV columns map to which slide tokens based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Google Drive Trigger
Set up the workflow to start when a new lead file is created in a specific Google Drive folder.
- Add and open Lead File Trigger.
- Set Event to
fileCreatedand Trigger On tospecificFolder. - Set Folder To Watch to the target lead upload folder (replace
[YOUR_ID]). - Credential Required: Connect your
googleDriveOAuth2Apicredentials.
⚠️ Common Pitfall: If [YOUR_ID] isn’t replaced with a real folder ID, Lead File Trigger will never fire.
Step 2: Connect Google Drive and Google Sheets
Ensure all Google Drive and Google Sheets nodes are authorized for file download, sheet creation, and updates.
- Open Retrieve File by ID and confirm Operation is
downloadwith File ID set to={{ $json.id }}. - Credential Required: Connect your
googleDriveOAuth2Apicredentials for Retrieve File by ID, Relocate Lead Sheet, and Duplicate Slide Template. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials for Generate Lead Sheet, Append Lead Records, Fetch Lead List, and Update Lead with Deck ID. - In Relocate Lead Sheet, set Folder ID to the destination folder (replace
[YOUR_ID]). - In Duplicate Slide Template, set File ID and Folder ID to your template and output folder IDs (replace
[YOUR_ID]).
Tip: Keep all Drive/Sheets credentials under the same Google account to avoid cross-permission issues when files are copied and moved.
Step 3: Set Up File Routing and Data Extraction
Route the uploaded lead file by MIME type, download it, then parse the CSV content for import.
- Open Route by File Format and confirm rules compare Left Value
={{ $json.mimeType }}againsttext/csvandapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet. - Verify Retrieve File by ID receives the trigger output from Route by File Format.
- Open Parse CSV Content and set Encoding to
utf-8, Delimiter to,, and Header Row totrue. - Retrieve File by ID outputs to both Parse CSV Content and Generate Lead Sheet in parallel.
Step 4: Create and Populate the Lead Sheet
Create a new Google Sheet, merge it with the parsed CSV, append records, then fetch the full lead list.
- In Generate Lead Sheet, set Resource to
spreadsheetand Title to=Leads_{{ $now.setZone('Europe/Berlin').toFormat('yyyy-dd-MM') }}. - In Merge Sheet with CSV, set Mode to
chooseBranchand Use Data Of Input to2. - In Append Lead Records, keep Operation set to
appendand Options → Use Append totrue. - In Fetch Lead List, confirm Document ID is
={{ $('Generate Lead Sheet').first().json.spreadsheetId }}and Sheet Name is={{ $('Generate Lead Sheet').first().json.sheets[0].properties.sheetId }}. - In Relocate Lead Sheet, set File ID to
={{ $('Generate Lead Sheet').first().json.spreadsheetId }}and select the destination folder.
Tip: The sheet title uses Berlin time. If you want local time, update Europe/Berlin in Generate Lead Sheet.
Step 5: Configure Slide Duplication and Personalization
Duplicate the slide template, replace placeholder text with lead details, and store the presentation ID back in the sheet.
- In Duplicate Slide Template, set Operation to
copyand Name to={{ $('Fetch Lead List').item.json.Company }} X MYCOMPANYNAME_{{ $now.setZone('Europe/Berlin').toFormat('yyyy-dd-MM') }}. - Set Folder ID in Duplicate Slide Template to the output presentations folder (replace
[YOUR_ID]). - In Personalize Slide Deck, set Operation to
replaceTextand Presentation ID to={{ $json.id }}. - Confirm text replacements in Personalize Slide Deck use lead data:
={{ $('Fetch Lead List').item.json.Company }},={{ $('Fetch Lead List').item.json['Full Name'] }}, and={{ $('Fetch Lead List').item.json['First Name'] }}. - In Update Lead with Deck ID, set Operation to
updateand map Email to={{ $('Fetch Lead List').item.json.Email }}and PresentationID to={{ $json.presentationId }}. - Credential Required: Connect your
googleSlidesOAuth2Apicredentials in Personalize Slide Deck.
⚠️ Common Pitfall: If the placeholders in your slide template don’t exactly match {COMPANYNAME}, {Testdurchgestrichen}, and {nichtdurchgestrichen}, the replacements won’t occur.
Step 6: Test and Activate Your Workflow
Run a manual test to confirm the file trigger, sheet creation, and slide personalization work end-to-end before turning it on.
- Click Execute Workflow and upload a CSV file into the watched folder for Lead File Trigger.
- Confirm a new sheet is created by Generate Lead Sheet and data is appended by Append Lead Records.
- Verify a presentation is created by Duplicate Slide Template and text is replaced by Personalize Slide Deck.
- Check that Update Lead with Deck ID writes the new PresentationID into the sheet.
- Once successful, switch the workflow to Active for production use.
Watch Out For
- Google Drive and Google Slides permissions can be picky. If deck copies fail or replacements don’t apply, check the Google connection inside n8n and confirm the account can edit the template and write to the target folder.
- If you’re processing a big CSV, Google APIs can throttle you. Processing times vary, so add throttling (like SplitInBatches) or increase waits if downstream steps sometimes run before a copy is fully available.
- Template tokens have to match your mapping exactly. If your deck uses {{CompanyName}} but your CSV header is Company, you’ll get blank fields and you won’t notice until someone opens the deck.
Common Questions
About 30 minutes if your Google accounts and template are ready.
Yes. No coding is required, but you do need to be comfortable mapping CSV column headers to slide placeholders.
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 Google Workspace access if your team requires it.
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.
You can change the mapping where the workflow merges CSV rows into the structure used for personalization (the “merge” stage) and in the Google Slides personalization step where tokens are replaced. Common tweaks include adding new variables (by adding CSV headers and matching placeholders in the template), changing how decks are named and filed in Drive, and writing extra fields back into Google Sheets like owner, segment, or campaign name.
Most of the time it’s expired OAuth access or the connected Google account losing permission to the folder or template. Reconnect the Google credential in n8n, then confirm the Drive folder ID and the Slides template are accessible to that same account. If your org uses shared drives, make sure the connection is allowed to access them.
If you self-host, there’s no fixed execution limit (it mainly depends on your server and Google API limits). On n8n Cloud, capacity depends on your plan’s monthly executions, and this workflow uses multiple steps per lead. Practically, most teams run batches of dozens to a few hundred leads smoothly, then add throttling if they go bigger.
Often, yes, because this kind of workflow needs branching, looping through rows, and more control over how data is merged into a template. n8n is also easier to self-host, which matters when you start generating lots of decks. Zapier or Make can still work for small batches, but you may hit complexity limits sooner than you expect. If your process includes enrichment, multiple templates, or approval steps, n8n usually stays cleaner. Talk to an automation expert if you want a quick recommendation based on your exact flow.
Once this is set up, “make 40 decks” becomes a background process instead of a calendar-blocking chore. The workflow handles the repetitive parts, and you keep your attention for the conversations that actually close deals.
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.