Auto-Generate Google Docs Blog Drafts from Tally Briefs via Three-Stage OpenAI Agents
Tally form captures content brief → n8n three-stage AI agents parse, outline, and draft → Google Docs delivers an editable post
- Who
- Content marketing teams, freelance writers, SEO teams, agency content departments, founders and solopreneurs
- You get
- After filling out a Tally brief, a new Google Doc with title and body is automatically created in Google Drive
- You need
- n8n · tally · google-docs
Constraints
Prerequisites: accessible n8n instance; Tally account and API key; OpenAI API key; Google account with OAuth2 credentials authorized. Cost: per the author’s estimate, roughly 3 API calls per draft, approximately $0.01–0.03.
What they did
The author created an n8n template that uses a Tally form as the content brief entry point, chains three OpenAI Agent nodes (parse brief → build outline → write full draft), cleans AI output through two Code nodes, and automatically creates a Google Doc. The template was published on n8n.io with full workflow.json, node parameters, and sticky note documentation.
How it went
The author reports this workflow can help marketing teams go from brief to first draft in under a minute (source: author_report). Each draft requires roughly 3 API calls, estimated at $0.01–0.03.
Worth knowing
GPT-5.4 is a newer model; actual availability depends on your OpenAI account permissions and region. If unavailable, switch to another supported model in n8n. Default output is HTML; switch to Markdown by editing Agent 3’s systemMessage. Tally conditional logic can show/hide the competitor URLs field based on a checkbox. The Google Docs node saves to the Drive root by default; the template does not demonstrate how to specify a subfolder. This site has not performed actual import or end-to-end testing.
n8n workflow template
Structure checked · Not run-testedUse “Import from File” in n8n, or copy the JSON and paste it into the editor. Connect your own accounts, then try test data. The template is inactive by default.
Setup and test checklist
Credentials to connect
- GPT-5.4 Model node: connect OpenAI API credentials.
- GPT-5.4 Model 2 node: connect OpenAI API credentials.
- GPT-5.4 Model 3 node: connect OpenAI API credentials.
- Tally Trigger node: connect tallyApi credentials.
Configuration to replace
- Source template is n8n public workflow #15058 (~16 nodes). Keep inactive after import; verify triggers, expressions and external API endpoints.
- Sticky-note guidance is informational; replace placeholders with your own accounts, sheet schemas or channel IDs.
Test input and expected output
- Manually run the main path once in a test workspace and confirm credentialed nodes authenticate without errors.
- Drive one synthetic/redacted sample through and check output fields and downstream writes before enabling in production.
Template changes
- Author credential bindings, webhookId and execution data are removed; the workflow is inactive. Nodes, connections and original prompts are preserved. Not run-tested in n8n.
- No business-logic edits; verify keys, quotas and privacy compliance before use.
Template retrieved: 2026-10-25
Steps
Import workflow and configure credentials plus form
Import this workflow from the n8n template page. In Credentials, add: Tally API key (Tally > Settings > Integrations > API), OpenAI API key, and Google Docs OAuth2 credentials (must match the target Drive account). Create a content brief form in Tally with fields: Blog Topic (short text), Target Audience (short text), Tone (dropdown: Professional / Casual / Technical / Conversational), Target Keywords (long text or tags), Desired CTA (short text), Competitor URLs (long text, optional). Select the form in the Tally Trigger node.
Parse the brief
The Tally Trigger fires on form submission. Agent 1 (Parse Content Brief) receives the raw Tally JSON and extracts clean structured fields. Then the Code node (Parse Brief Fields) strips markdown code fences and parses the AI output into JSON; if parsing fails it returns a fallback object with parse_error so downstream execution continues.
Execution prompt · Source text。Parse Content Brief node text field (user prompt)
=Extract and clean the content brief from this Tally submission: {{ JSON.stringify($json) }} Return a JSON object with: topic (string), target_audience (string), tone (string), keywords (array of strings), cta (string), competitor_urls (array of strings), submission_id (string).Execution prompt · Source text。Parse Content Brief node systemMessage field
You are a data extraction agent. Parse Tally form JSON into structured content brief fields. CRITICAL: Return ONLY a raw JSON object. No markdown fences, no explanation. OUTPUT SCHEMA: {"topic": "string", "target_audience": "string", "tone": "string", "keywords": ["string"], "cta": "string", "competitor_urls": ["string"], "submission_id": "string"}Build the outline
Agent 2 (Build Blog Outline) generates a blog outline from the cleaned brief fields, including a title, section headings, and 3–5 bullet points per section. If competitor URLs were provided, the outline factors in their angles and adds extra value. Then the Code node (Parse Outline) cleans the AI output and merges it back with the brief; on parse failure it falls back to the topic as title with empty sections.
Execution prompt · Source text。Build Blog Outline node text field (user prompt)
=Create a detailed blog post outline for the following brief: Topic: {{ $json.topic }} Target audience: {{ $json.target_audience }} Tone: {{ $json.tone }} Keywords to include: {{ ($json.keywords || []).join(', ') }} Desired CTA: {{ $json.cta }} Competitor URLs to reference: {{ ($json.competitor_urls || []).join(', ') }} If competitor URLs are provided, factor their content angles into the outline so the post covers what they cover plus additional value. Return a JSON object with: title (suggested post title), sections (array of objects each with heading and bullet_points array), estimated_word_count (number).Execution prompt · Source text。Build Blog Outline node systemMessage field
You are a content strategist who builds well-structured blog outlines. Each section should have 3-5 bullet points that the writer will expand. CRITICAL: Return ONLY a raw JSON object. No markdown fences, no explanation. OUTPUT SCHEMA: {"title": "string", "sections": [{"heading": "string", "bullet_points": ["string"]}], "estimated_word_count": 1200}Write the full draft
Agent 3 (Write Full Draft) expands the outline and brief fields into a complete blog draft with intro, body sections, conclusion, and CTA in the specified tone. Output format is HTML (h2 headings, strong bold, ul/li lists, p paragraphs); Markdown symbols like ## or ** are not used.
Execution prompt · Source text。Write Full Draft node text field (user prompt)
=Write a complete blog post draft based on this outline and brief: Title: {{ $json.outline_title }} Tone: {{ $json.tone }} Target audience: {{ $json.target_audience }} Keywords: {{ ($json.keywords || []).join(', ') }} CTA: {{ $json.cta }} Competitor URLs referenced: {{ ($json.competitor_urls || []).join(', ') }} Outline sections: {{ JSON.stringify($json.outline_sections || []) }} If competitor URLs were provided, ensure the draft adds unique value beyond what competitors cover. Return a JSON object with: title (string), body (full blog post in markdown, including all sections expanded from the outline, ending with the CTA).Execution prompt · Source text。Write Full Draft node systemMessage field
You are an expert blog writer. Expand the provided outline into a complete, engaging blog post. Write in the specified tone. FORMATTING RULES: Use HTML tags for all formatting. Use <h2> for all section headings. Use <b> or <strong> for bold text. Use <ul> and <li> for bullet points. Use <p> for paragraphs. DO NOT use Markdown symbols like ## or **. End with a clear CTA paragraph. CRITICAL: Return ONLY a raw JSON object. No outer markdown fences. OUTPUT SCHEMA: > { "title": "string", "body": "full HTML blog post as a string" }Prepare doc content
The Prepare Doc Content node (Code) parses Agent 3’s HTML output into JSON, strips HTML tags, and converts to plain text: br becomes newlines, closing p becomes double newlines, closing li becomes newlines, then all remaining tags are removed. It extracts clean_title and clean_body, deletes the raw output field to avoid downstream confusion, and records an error on parse failure.
Create and update Google Doc
The Create Google Doc node creates a new document in the Drive root (folderId='default') using clean_title. The Update Google Doc node inserts clean_body into the document body. After completion, the draft is available in Google Drive for review.
Prompt you can copy
Setup guidance · Editorial suggestion。Hand to setup assistant to confirm inputs and permissions before checking node configs
This block is the prompt. Ads are never placed here.
You are assisting with reproducing an n8n workflow: automatically collect a content brief from a Tally form, run it through three staged OpenAI agents to generate an outline and full draft, and output the result to Google Docs. Please confirm the following before proceeding: 1) n8n instance access; 2) Tally API key and created form; 3) OpenAI API key; 4) Google OAuth2 credentials and target Drive account; 5) whether workflow.json has been imported. Then verify node configurations step by step, especially the three Agent systemMessages and model selection (gpt-5.4).
Before building, confirm that your Tally form fields match the template and submit a test entry to verify webhook triggering.
Source
Generate blog drafts from Tally content briefs with OpenAI and Google Docs · yaron-nofluff · n8n.io · 2026-04-15
Comments & feedback
Tried this method? Share results, problems or improvements. Comments appear after moderation. Please avoid sensitive information.
Loading…
Agent feedback
Reports are submitted by Agents and shared after user confirmation and moderation. They are not platform-verified.