Google Docs to Google Slides, decks built from transcripts
You finish a great call, you have a transcript, and then the real time-waster starts. Copying “the good parts” into slides, rewriting for clarity, hunting for the right layout, fixing spacing, re-fixing spacing. It is slow, and it is weirdly exhausting.
This Docs to Slides automation hits sales teams hard, but consultants building proposals and agency leads turning discovery calls into client decks feel it too. The outcome is simple: a client-ready Google Slides deck built from a Google Docs transcript using your own template, with text and images already in place.
Below you’ll see exactly what this n8n workflow system does, what you need to run it, and what to watch out for when you customize it.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Docs to Google Slides, decks built from transcripts
flowchart LR
subgraph sg0["On form submission Flow"]
direction LR
n0["<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/form.svg' width='40' height='40' /></div><br/>On form submission"]
n1["<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/>Create Presentation"]
n2@{ icon: "mdi:database", form: "rounded", label: "Append in Main Sheet", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Append in Images Sheet", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Append in Client Sheet", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n6@{ icon: "mdi:database", form: "rounded", label: "Get Pending Row", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Get Transcript", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Generate Presentation Plan", pos: "b", h: 48 }
n9@{ icon: "mdi:cog", form: "rounded", label: "Update PPT Plan Doc", pos: "b", h: 48 }
n10@{ icon: "mdi:cog", form: "rounded", label: "Create PPT Plan Doc", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Update row in Main Sheet + T..", pos: "b", h: 48 }
n12@{ icon: "mdi:cog", form: "rounded", label: "Get a document", pos: "b", h: 48 }
n13@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", 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/>HTTP Request1"]
n16@{ icon: "mdi:cog", form: "rounded", label: "Upload file", pos: "b", h: 48 }
n17@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n18@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model", pos: "b", h: 48 }
n19@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n20@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "Convert to File1", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n23["<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/>HTTP Request2"]
n24@{ icon: "mdi:cog", form: "rounded", label: "Upload file1", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet1", pos: "b", h: 48 }
n26@{ icon: "mdi:cog", form: "rounded", label: "Convert to File2", pos: "b", h: 48 }
n27@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n28["<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/>HTTP Request"]
n29@{ icon: "mdi:cog", form: "rounded", label: "Upload file2", pos: "b", h: 48 }
n30@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet2", pos: "b", h: 48 }
n31@{ icon: "mdi:cog", form: "rounded", label: "Convert to File3", pos: "b", h: 48 }
n32@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields3", pos: "b", h: 48 }
n33["<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/>HTTP Request3"]
n34@{ icon: "mdi:cog", form: "rounded", label: "Upload file3", pos: "b", h: 48 }
n35@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet3", pos: "b", h: 48 }
n36@{ icon: "mdi:cog", form: "rounded", label: "Convert to File4", pos: "b", h: 48 }
n37@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields4", pos: "b", h: 48 }
n38["<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/>HTTP Request4"]
n39@{ icon: "mdi:cog", form: "rounded", label: "Upload file4", pos: "b", h: 48 }
n40@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet4", pos: "b", h: 48 }
n41@{ icon: "mdi:cog", form: "rounded", label: "Convert to File5", pos: "b", h: 48 }
n42@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields5", pos: "b", h: 48 }
n43["<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/>HTTP Request5"]
n44@{ icon: "mdi:cog", form: "rounded", label: "Upload file5", pos: "b", h: 48 }
n45@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet5", pos: "b", h: 48 }
n46["<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"]
n47@{ icon: "mdi:database", form: "rounded", label: "Update row Presentation Deta..", pos: "b", h: 48 }
n48@{ icon: "mdi:database", form: "rounded", label: "Update row in Images Sheet", pos: "b", h: 48 }
n49@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet2", pos: "b", h: 48 }
n50@{ icon: "mdi:cog", form: "rounded", label: "Get a presentation1", pos: "b", h: 48 }
n51@{ icon: "mdi:cog", form: "rounded", label: "Get a document1", pos: "b", h: 48 }
n52@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet3", pos: "b", h: 48 }
n53@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n54["<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/>Code"]
n55@{ icon: "mdi:cog", form: "rounded", label: "Replace text in a presentation", pos: "b", h: 48 }
n56@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet6", pos: "b", h: 48 }
n57["<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/>Upload to Imgbb"]
n58["<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/>Replace Image"]
n59["<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/>Upload to Imgbb1"]
n60["<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/>Replace Image1"]
n61["<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/>Upload to Imgbb2"]
n62["<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/>Replace Image2"]
n63["<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/>Upload to Imgbb3"]
n64["<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/>Replace Image3"]
n65["<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/>Upload to Imgbb4"]
n66["<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/>Replace Image4"]
n67["<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/>Upload to Imgbb5"]
n68["<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/>Replace Image5"]
n69@{ icon: "mdi:cog", form: "rounded", label: "Download file 1", pos: "b", h: 48 }
n70@{ icon: "mdi:cog", form: "rounded", label: "Download file 2", pos: "b", h: 48 }
n71@{ icon: "mdi:cog", form: "rounded", label: "Download file 3", pos: "b", h: 48 }
n72@{ icon: "mdi:cog", form: "rounded", label: "Download file 4", pos: "b", h: 48 }
n73@{ icon: "mdi:cog", form: "rounded", label: "Download file 5", pos: "b", h: 48 }
n74@{ icon: "mdi:cog", form: "rounded", label: "Download file 6", pos: "b", h: 48 }
n75@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base64", pos: "b", h: 48 }
n76@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base641", pos: "b", h: 48 }
n77@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base642", pos: "b", h: 48 }
n78@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base643", pos: "b", h: 48 }
n79@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base644", pos: "b", h: 48 }
n80@{ icon: "mdi:cog", form: "rounded", label: "Convert to Base645", pos: "b", h: 48 }
n81@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet4", pos: "b", h: 48 }
n82@{ icon: "mdi:cog", form: "rounded", label: "Get a presentation", pos: "b", h: 48 }
n83@{ icon: "mdi:cog", form: "rounded", label: "Get a document2", pos: "b", h: 48 }
n84@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet5", pos: "b", h: 48 }
n85@{ icon: "mdi:database", form: "rounded", label: "Update row in sheet7", pos: "b", h: 48 }
n86["<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/>Merge1"]
n87@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n88@{ icon: "mdi:cog", form: "rounded", label: "Wait1", pos: "b", h: 48 }
n89@{ icon: "mdi:cog", form: "rounded", label: "Wait2", pos: "b", h: 48 }
n90@{ icon: "mdi:cog", form: "rounded", label: "Wait3", pos: "b", h: 48 }
n91@{ icon: "mdi:robot", form: "rounded", label: "Final Text Content Formatting", pos: "b", h: 48 }
n92@{ icon: "mdi:robot", form: "rounded", label: "Illustrations & Image Prompt..", pos: "b", h: 48 }
n93@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model1", pos: "b", h: 48 }
n94@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n95@{ icon: "mdi:brain", form: "rounded", label: "Google Gemini Chat Model2", pos: "b", h: 48 }
n54 --> n55
n87 --> n6
n46 --> n47
n88 --> n19
n89 --> n81
n90 --> n49
n86 --> n85
n14 --> n13
n16 --> n20
n22 --> n21
n27 --> n26
n32 --> n31
n37 --> n36
n42 --> n41
n28 --> n27
n24 --> n25
n29 --> n30
n34 --> n35
n39 --> n40
n44 --> n45
n15 --> n14
n23 --> n22
n33 --> n32
n38 --> n37
n43 --> n42
n58 --> n86
n7 --> n8
n12 --> n92
n60 --> n86
n62 --> n86
n64 --> n86
n66 --> n86
n68 --> n86
n13 --> n16
n69 --> n75
n70 --> n76
n71 --> n77
n72 --> n78
n73 --> n79
n74 --> n80
n6 --> n7
n51 --> n50
n83 --> n82
n57 --> n58
n21 --> n24
n26 --> n29
n31 --> n34
n36 --> n39
n41 --> n44
n59 --> n60
n61 --> n62
n63 --> n64
n65 --> n66
n67 --> n68
n75 --> n57
n5 -.-> n8
n76 --> n59
n77 --> n61
n78 --> n63
n79 --> n65
n80 --> n67
n82 --> n70
n82 --> n71
n82 --> n72
n82 --> n73
n82 --> n74
n82 --> n69
n0 --> n1
n53 -.-> n91
n94 -.-> n92
n10 --> n9
n1 --> n2
n50 --> n91
n19 --> n12
n9 --> n11
n20 --> n46
n2 --> n3
n49 --> n52
n52 --> n51
n81 --> n84
n84 --> n83
n25 --> n46
n30 --> n46
n35 --> n46
n40 --> n46
n45 --> n46
n56 --> n89
n4 --> n87
n3 --> n4
n18 -.-> n92
n17 -.-> n92
n93 -.-> n91
n95 -.-> n8
n8 --> n10
n48 --> n90
n91 --> n54
n55 --> n56
n47 --> n48
n92 --> n15
n92 --> n23
n92 --> n28
n92 --> n33
n92 --> n38
n92 --> n43
n11 --> n88
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 n8,n17,n91,n92 ai
class n5,n18,n53,n93,n94,n95 aiModel
class n2,n3,n4,n6,n11,n19,n20,n25,n30,n35,n40,n45,n47,n48,n49,n52,n56,n81,n84,n85 database
class n1,n15,n23,n28,n33,n38,n43,n57,n58,n59,n60,n61,n62,n63,n64,n65,n66,n67,n68 api
class n54 code
classDef customIcon fill:none,stroke:none
class n0,n1,n15,n23,n28,n33,n38,n43,n46,n54,n57,n58,n59,n60,n61,n62,n63,n64,n65,n66,n67,n68,n86 customIcon
The Problem: Transcripts Don’t Turn Into Decks by Themselves
A transcript is a messy asset. It has repetition, tangents, half-sentences, and a lot of “context” that makes sense on a call but falls flat in a slide. So someone has to translate it into a storyline, shape it into a deck, then make it look like your brand. That “someone” is often you, late afternoon, trying to ship a follow-up before the prospect cools off. If you do this a few times a week, it becomes a quiet tax on your best work: selling, advising, or leading delivery.
It’s not one big task. It’s dozens of tiny ones, and they stack up fast.
- You end up rewriting the same types of slides over and over (problem, impact, recommendation, next steps).
- Deck formatting drifts, especially when multiple people touch the file across versions.
- Important details get missed because you are scanning long transcripts under time pressure.
- Even when you “template it,” you still spend about an hour per deck on assembly work.
The Solution: Build Slides From a Transcript Using Your Template
This automation is a connected 5-workflow system in n8n that turns a Google Docs meeting transcript into a polished Google Slides presentation. It starts with a simple intake (client name, transcript URL, submission time), clones your existing Slides template, and creates a tracking record in Google Sheets so every deck has a home. Then AI reads the transcript, pulls out pain points and goals, and writes a structured presentation plan you can quickly review in Google Docs. Once the plan looks right, the workflow generates custom illustrations (via an image model), stores them in Google Drive, and finally fills your Slides template with personalized text and the right images in the right places.
The flow begins with your form submission and a transcript link in Google Docs. From there, planning and content generation happen automatically, then the system updates Google Slides using Object IDs (unique identifiers inside your template) so it edits the correct text boxes and image placeholders. The result is a client-ready deck you can tweak and send without starting from a blank file.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you create 5 client follow-up decks a week. Manually, it’s usually about 2 hours each: 30 minutes pulling highlights from the transcript, about an hour building and formatting slides, then another 30 minutes finding or making visuals. That’s roughly 10 hours weekly. With this workflow, intake is about 5 minutes, AI planning and generation runs in the background, and you usually spend 20–30 minutes reviewing the plan and deck. You get most of that day back.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Workspace for Docs, Drive, Slides access.
- Google Sheets to track decks and assets.
- OpenAI API key (get it from the OpenAI API dashboard).
- OpenRouter API key (get it from your OpenRouter account) for Flux image generation.
- ImgBB API key (get it from ImgBB API settings) for reliable image URLs.
Skill level: Intermediate. You’ll connect accounts, copy a template, and paste a few IDs/keys, but you don’t need to write code unless you want deeper customization.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Intake triggers the process. A form submission captures the client name, the Google Docs transcript URL, and a timestamp. n8n uses that to kick off the system and keep everything tied to one “job.”
Your template becomes a new deck. The workflow clones a Google Slides presentation you already designed, then writes the new presentation ID into a Google Sheets database so you can track status and assets over time.
AI turns raw transcript into a plan. An AI agent reads the transcript and produces a structured presentation outline (pain points, goals, recommendations, proof, next steps). The plan is saved to Google Docs so it’s easy to review, comment on, and audit later.
Text and visuals get inserted automatically. Another AI agent generates slide-ready copy, while the image workflow generates illustrations and stores them in Drive. Because Google Drive image links can be finicky in API calls, the workflow uploads images to ImgBB so Slides can pull them reliably. Then n8n updates specific text boxes and image placeholders using Object IDs from your template.
You can easily modify the template structure to match your deck style based on your needs. See the full implementation guide below for customization options.
Common Gotchas
- Google Workspace credentials can expire or need specific permissions. If things break, check the n8n credentials screen and your Google Cloud OAuth consent settings 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.
- ImgBB links are the difference between “works once” and “works every time.” If images are missing, verify the ImgBB API key and confirm the workflow is saving the returned hosted URL, not the original Google Drive link.
Frequently Asked Questions
Plan on about 60–90 minutes the first time, mostly to prep your template and credentials.
No. You will connect tools and paste a few API keys. If you want to change the JSON parsing or add special logic, a little JavaScript helps, but it’s optional.
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 (for many teams, it’s a few dollars per deck depending on length and images).
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, but the template needs consistent Object IDs. Most teams duplicate their best deck, label text and image placeholders, then update the “clone template” step to point at the new Slides file. Common customizations include changing the slide order, swapping the AI model (OpenAI vs. Gemini), and adjusting the company profile so recommendations match your offer.
Usually it’s expired OAuth access or missing scopes for Drive/Docs/Slides. Reconnect Google in n8n, confirm the Google Cloud project has the right APIs enabled, and double-check that the account you authorized actually has access to the transcript Doc and the Slides template. If it fails only on some clients, it’s often a permissions issue on the transcript file (shared to the wrong email). Rate limits can also show up when you generate a lot of decks back-to-back.
A lot.
Often, yes, if you care about control. This workflow has multiple stages, branching logic, and heavy API work (Slides object IDs, file handling, image hosting). n8n handles that kind of “real workflow” better, and self-hosting avoids per-task pricing that gets pricey once you generate decks every day. Zapier or Make can be fine for simple routing, but you’ll likely hit limits once you start updating Slides programmatically. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation.
Once this is running, decks stop being a “rebuild from scratch” chore and become a review step. Honestly, that’s the whole win.
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.