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

0
Downloads
52
Views
8.54
Quality Score
intermediate
Complexity
Author:Ozgur Karateke(View Original →)
Created:8/13/2025
Updated:11/17/2025

🔒 Please log in to import templates to n8n and favorite templates

Workflow Visualization

Loading...

Preparing workflow renderer

Comments (0)

Login to post comments