Create Custom PDF Documents from Templates with Gemini & Google Drive
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
1 — What Does It Do / Which Problem Does It Solve?
This workflow turns Google Docs-based contract & form templates into ready-to-sign PDFs in minutes—all from a single chat flow.
Automates repetitive document creation.** Instead of copying a rental, sales, or NDA template and filling it by hand every time, the bot asks for the required values and fills them in. Eliminates human error.** It lists every mandatory field so nothing is missed, and removes unnecessary clauses via conditional blocks. Speeds up approvals.** The final draft arrives as a direct PDF link—one click to send for signing. One template → unlimited variations.* Every new template you drop in Drive is auto-listed with *zero workflow edits—it scales effortlessly. 100 % no-code. Runs on n8n + Google Apps Script—no extra backend, self-hosted or cloud.
2 — How It Works (Detailed Flow)
📝 Template Discovery
📂 The TemplateList node scans the Drive folder you specify via the ?mode=meta endpoint and returns an id / title / desc list. The bot shows this list in chat.
🎯 Selection & Metadata Fetch
The user types a template name.
🔍 GetMetaData opens the chosen Doc, extracts META_JSON, placeholders, and conditional blocks, then lists mandatory & optional fields.
🗣 Data-Collection Loop The bot asks for every placeholder value. For each conditional block it asks 🟢 Yes / 🔴 No.
Answers are accumulated in a data JSON object.
✅ Final Confirmation
The bot summarizes the inputs → when the user clicks Confirm, the DocProcess sub-workflow starts.
⚙️ DocProcess Sub-Workflow
| 🔧 Step | Node | Task |
| --- | --- | --- |
| 1 | User Choice Match Check | Verifies name–ID match; throws if wrong |
| 2 | GetMetaData (renew) | Gets the latest placeholder list |
| 3 | Validate JSON Format | Checks for missing / unknown fields |
| 4 | CopyTemplate | Copies the Doc via Drive API |
| 5 | FillDocument | Apps Script fills placeholders & removes blocks |
| 6 | Generate PDF Link | Builds an export?format=pdf URL |
📎 Delivery
The master agent sends 🔗 Download PDF & ✏️ Open Google Doc links.
🚫 Error Paths status:"ERROR", missing:[…] → bot lists missing fields and re-asks. unknown:[…] → template list is outdated; rerun TemplateList. Any Apps Script error → the returned message is shown verbatim in chat.
3 — 🚀 Setup Steps (Full Checklist)
> Goal: Get a flawless PDF on the first run. > > > Mentally tick the ☑️ in front of every line as you go. >
☁️ A. Google Drive Preparation
| Step | Do This | Watch Out For | | --- | --- | --- | | 1 | Create a Templates/ folder → put every template Doc inside | Exactly one folder; no sub-folders | | 2 | Placeholders in every Doc are {{UPPER_CASE}} | No Turkish chars or spaces | | 3 | Wrap optional clauses with [[BLOCK_NAME:START]]…[[BLOCK_NAME:END]] | The START tag must have a blank line above | | 4 | Add a META_JSON block at the very end | Script deletes it automatically after fill | | 5 | Right-click Doc > Details ▸ Description = 1-line human description | Shown by the bot in the list | | 6 | Create a second Generated/ folder (for copies) | Keeps Drive tidy |
> 🔑 Folder ID (long alphanumerical) = <TEMPLATE_PARENT_ID> > > > We’ll paste this into the TemplateList node next. >
Simple sample template → Template Link
🛠 B. Import the Workflow into n8n
Settings ▸ Import Workflow ▸ DocAgent.json
If nodes look Broken afterwards → no community-node problem; you only need to select credentials.
📑 C. Customize the TemplateList Node
Open Template List node ⚙️ → replace
'%3CYOUR_PARENT_ID%3E' in parents
with the real folder ID in the URL.
Right-click node > Execute Node. Copy the entire JSON response. In the editor paste it into: DocAgent → System Prompt (top) User Choice Match Check → System Prompt (top)
Save.
> ⚠️ Why manual? Caching the list saves LLM tokens. Whenever you add a template, rerun the node and update the prompts. >
🔗 D. Deploy the Apps Script
| Step | Screen | Note | | --- | --- | --- | | 1 | Open Gist files GetMetaData.gs + FillDocument.gs → File ▸ Make a copy | Both files may live in one project | | 2 | Project Settings > enable Google Docs API ✔️ & Google Drive API ✔️ | Otherwise you’ll see 403 errors | | 3 | Deploy ▸ New deployment ▸ Web app | | | • Execute as | Me | | | • Who has access | Anyone | | | 4 | On the consent screen allow scopes:• …/auth/documents• …/auth/drive | Click Advanced › Go if Google warns | | 5 | Copy the Web App URL (e.g. https://script.google.com/macros/s/ABC123/exec) | If this URL changes, update n8n |
Apps Script source code → Notion Link
🔧 E. Wire the Script URL in n8n
| Node | Field | Action | | --- | --- | --- | | GetMetaData | URL | <WEB_APP_URL>?mode=meta&id={{ $json["id"] }} | | FillDocument | URL | <WEB_APP_URL> |
> 💡 Prefer using an .env file? Add GAS_WEBAPP_URL=… and reference it as {{ $env.GAS_WEBAPP_URL }}. >
🔐 F. Add Credentials
Google Drive OAuth2* → Drive API (v3) Full Access Google Docs OAuth2* → same account LLM key** (OpenAI / Gemini) (Optional) Postgres Chat Memory credential for the corresponding node
🧪 G. First Run (Smoke Test)
Switch the workflow Active. In the chat panel type /start. Bot lists templates → pick one. Fill mandatory fields, optionally toggle blocks → Confirm. 🔗 Download PDF link appears → ☑️ setup complete.
❌ H. Common Errors & Fixes
| 🆘 Error | Likely Cause | Remedy | | --- | --- | --- | | 403: Apps Script permission denied | Web app access set to User | Redeploy as Anyone, re-authorize scopes | | placeholder validation failed | Missing required field | Provide the listed values → rerun DocProcess | | unknown placeholders: … | Template vs. agent mismatch | Check placeholder spelling (UPPER_CASE ASCII) | | Template ID not found | Prompt list is old | Rerun TemplateList → update both prompts | | Cannot find META_JSON | No meta block / wrong tag | Add [[META_JSON_START]] … [[META_JSON_END]], retry |
✅ Final Checklist
[ ] Drive folder structure & template rules ready [ ] Workflow imported, folder ID set in node [ ] TemplateList output pasted into both prompts [ ] Apps Script deployed, URL set in nodes [ ] OAuth credentials & LLM key configured [ ] /start test passes, PDF link received
🙋♂️ Need Help with Customizations?
Reach out for consulting & support on LinkedIn: Özgür Karateke
Full Documentation → Notion
Simple sample template → Template Link
Apps Script source code → Notion Link
Tags
Related Templates
Send structured logs to BetterStack from any workflow using HTTP Request
Send structured logs to BetterStack from any workflow using HTTP Request Who is this for? This workflow is perfect for...
Provide latest euro exchange rates from European Central Bank via Webhook
What is this workflow doing? This simple workflow is pulling the latest Euro foreign exchange reference rates from the E...
Automate Daily Keyword Research with Google Sheets, Suggest API & Custom Search
Who's it for This workflow is perfect for SEO specialists, marketers, bloggers, and content creators who want to automa...
🔒 Please log in to import templates to n8n and favorite templates
Workflow Visualization
Loading...
Preparing workflow renderer
Comments (0)
Login to post comments