Create custom PDF documents from templates with Gemini & Google Drive
DISCOUNT 20%
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=metaendpoint and returns anid / title / desclist. 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
dataJSON 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=pdfURL📎 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
messageis 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 parentswith 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
-
/starttest passes, PDF link received
🙋♂️ Need Help with Customizations?
Reach out for consulting & support on LinkedIn: Özgür Karateke