Google Sheets + Gmail: SEO drafts ready for approval
Your content calendar looks fine… until you try to execute it. Topics sit in a spreadsheet, drafts live in random Docs, feedback gets buried in email threads, and somehow the same topic gets written twice.
This is where SEO draft approval automation helps. Marketing managers feel it first, because “publish consistently” becomes a weekly scramble. Agency leads and small business owners feel it too, because they’re the ones chasing drafts and approvals instead of doing strategy.
This workflow turns a simple Google Sheets topic queue into SEO blog drafts, then routes approval through Gmail so you can approve, request a revision, or cancel. You’ll see how it works, what you need, and where teams usually get tripped up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Gmail: SEO drafts ready for approval
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n1@{ icon: "mdi:robot", form: "rounded", label: "Copywriter AI Agent", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n3@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "Copywriter Revision Agent", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Data", pos: "b", h: 48 }
n6@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Add Generated Content to Goo..", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Update Topic Status on Googl..", pos: "b", h: 48 }
n9@{ icon: "mdi:database", form: "rounded", label: "Get Topic from Google Sheets", pos: "b", h: 48 }
n10@{ icon: "mdi:message-outline", form: "rounded", label: "Send Content for Approval", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Approval Result", pos: "b", h: 48 }
n5 --> n10
n3 -.-> n1
n3 -.-> n4
n11 --> n8
n11 --> n4
n0 --> n9
n2 -.-> n1
n2 -.-> n4
n1 --> n5
n6 -.-> n1
n6 -.-> n4
n4 --> n5
n10 --> n11
n9 --> n1
n8 --> n7
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 n1,n4,n6 ai
class n2 aiModel
class n3 ai
class n11 decision
class n7,n8,n9 database
The Problem: SEO content stalls between “topic” and “published”
Most teams don’t actually have a writing problem. They have a workflow problem. Topics are “tracked” in Google Sheets, but nothing enforces status. Someone has to notice what’s pending, assign it, follow up, review it, request changes, then remember where the latest version lives. Meanwhile, deadlines slip quietly. You also lose the paper trail: what was approved, what got revised, what was abandoned, and why. When you finally look back, you don’t have a content system. You have a pile of half-finished conversations.
It adds up fast. Here’s where it breaks down in real life.
- Someone has to manually pull “Pending” topics from the sheet, which turns into a weekly ritual that eats about an hour.
- Drafts get sent for review with no clear approve/revise/cancel path, so approvals stall in inboxes.
- Duplicate content happens because statuses are inconsistent, especially when multiple people touch the same sheet.
- Feedback arrives as unstructured notes, which means revisions take longer than they should and SEO guidelines drift.
The Solution: Google Sheets topics to drafted posts, approved in Gmail
This n8n workflow starts with the simplest input you can maintain: a Google Sheet that holds your topic list and a status column. On a schedule you control, it pulls the next “Pending” topic, then uses an OpenAI writing agent (GPT-4 via n8n’s AI nodes) to generate a structured SEO draft in the 800–1200 word range. n8n maps the output into clean fields (title, headings, body, meta ideas, and other useful bits depending on your prompt), then sends the draft to Gmail for human review. You decide what happens next by replying/choosing an approval outcome: approve, request revisions with feedback, or cancel. Approved content is appended into a “Generated Content” sheet and the topic row is marked complete, so nothing gets processed twice.
The flow begins with a scheduled trigger and a Google Sheets lookup. AI creates the draft, Gmail sends it for approval, and a routing decision decides the next step. If you request revisions, the revision agent incorporates your notes and sends the updated draft back through the same approval loop.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you publish 3 SEO posts per week. Manually, it’s often 20 minutes to pick topics and brief them, about 10 minutes to format a draft for review, and another 20 minutes chasing approvals and status updates, per post. That’s roughly 2.5 hours a week before you even talk about editing. With this workflow, you mark topics as Pending in Google Sheets, then spend about 10 minutes reviewing each draft in Gmail and replying with “approve” or a quick revision note. The admin work shrinks to about 30 minutes total.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store topics and archives.
- Gmail to send approvals and capture decisions.
- OpenAI API key (get it from the OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, paste an API key, and adjust a prompt and a couple of sheet column names.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Scheduled topic pickup. On your chosen schedule, n8n looks in Google Sheets for a topic marked “Pending” in your “Topic List” sheet. If nothing is pending, nothing runs.
Draft generation with guardrails. The AI writing agent uses a structured prompt to produce a blog draft in the 800–1200 word range, written to your SEO requirements. A memory and parser layer helps keep outputs consistent and easier to map into fields.
Approval routing in Gmail. n8n emails the draft to Gmail for review, then routes your decision using a switch. Approve goes one way, revision feedback goes another, and cancel stops the run.
Archiving and status updates. Approved drafts are appended into your “Generated Content” sheet, and the original topic row gets marked complete so it won’t be processed again.
You can easily modify the prompt and the sheet columns to match your content standards and tracking habits. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Start Trigger
Set the workflow to run on your desired schedule and kick off the content pipeline.
- Add and open Scheduled Start.
- Set the scheduling rule under Rule → Interval to your preferred cadence (the workflow currently uses an interval rule with defaults).
- Confirm the trigger connects to Retrieve Topic Row as the first action in the execution flow.
Step 2: Connect Google Sheets
Configure all Google Sheets nodes to read topics, mark completion, and store generated content.
- Open Retrieve Topic Row and set Document to
[YOUR_ID]and Sheet toTopic List(gid=0). - In Retrieve Topic Row, set Filters so Status equals
Pendingand enable Return First Match. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Topic Row.
- Open Mark Topic Complete and confirm Operation is
update, Document is[YOUR_ID], and Sheet isTopic List(gid=0). - Set Status to
Completedand row_number to={{ $('Retrieve Topic Row').item.json.row_number }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Mark Topic Complete.
- Open Append Content to Sheets and confirm Operation is
append, Document is[YOUR_ID], and Sheet isGenerated Content(gid=1579104486). - Map fields to
Title = {{ $('Map Output Fields').item.json['Topic Title'] }},Content = {{ $('Map Output Fields').item.json.Content }}, andGeneration Date = {{ $now }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Content to Sheets.
Status, Topic, or row_number, updates and lookups will fail. Align headers before testing.Step 3: Set Up SEO Writing Agent
Configure the AI generation and revision logic, including the parser and memory components.
- Open OpenAI Chat Engine and set the Model to
gpt-4o-mini. - Credential Required: Connect your openAiApi credentials in OpenAI Chat Engine.
- Open SEO Writing Agent and confirm the prompt uses the topic input
{{ $json.Topic }}and outputs JSON withtitleandcontent. - Open Revision Writing Agent and confirm it references
{{ $('Retrieve Topic Row').item.json.Topic }},{{ $('Email for Approval').item.json.data['Content Feedback'] }}, and{{ $('SEO Writing Agent').item.json.output }}. - Ensure Structured JSON Parser is connected as the output parser for both SEO Writing Agent and Revision Writing Agent with schema
{"title":"Improved SEO-Optimized Title","content":"Full blog post content in markdown format"}. - Ensure Buffer Memory is connected as memory for both agents with Session Key set to
={{ $('Retrieve Topic Row').item.json.Topic }}and Context Window Length set to10.
Step 4: Configure Output and Approval Logic
Map generated content fields, send approval emails, and route decisions based on user feedback.
- Open Map Output Fields and set Topic Title to
={{ $json.output.title }}and Content to={{ $json.output.content }}. - Open Email for Approval and set Send To to
[YOUR_EMAIL]. - Set the email Subject to
Approval Required for Blog Contentand Message to=Generated Title: {{ $json['Topic Title'] }} Generated Content: {{ $json.Content }}. - Set Operation to
sendAndWaitand Response Type tocustomFormwith form fieldsApprove Content?(dropdown) andContent Feedback(textarea). - Credential Required: Connect your gmailOAuth2 credentials in Email for Approval.
- Open Approval Routing and confirm rules route
Yes,No, andCancelusing={{ $json.data['Approve Content?'] }}.
[YOUR_EMAIL] in Email for Approval or approvals will never be delivered.Step 5: Configure Output Destinations
Finalize the publishing workflow by updating the topic status and appending generated content.
- Confirm execution flow: Approval Routing routes Yes to Mark Topic Complete, and No routes to Revision Writing Agent which then sends output to Map Output Fields.
- Verify Mark Topic Complete outputs to Append Content to Sheets to store the approved content.
- Check the full critical path: Scheduled Start → Retrieve Topic Row → SEO Writing Agent → Map Output Fields → Email for Approval → Approval Routing → Mark Topic Complete → Append Content to Sheets.
Step 6: Test and Activate Your Workflow
Run a manual test to ensure content generation, approval routing, and sheet updates work end-to-end.
- Click Execute Workflow to trigger Scheduled Start manually.
- Confirm Retrieve Topic Row returns a
Pendingtopic and SEO Writing Agent generates JSON output parsed by Structured JSON Parser. - Check that Email for Approval sends an approval email and that Approval Routing follows your selection (Yes/No/Cancel).
- Verify successful completion: Mark Topic Complete updates
Status = Completedand Append Content to Sheets writes the title, content, and date. - Enable the workflow by toggling Active once the test completes successfully.
Common Gotchas
- Google Sheets credentials can expire or need specific permissions. If things break, check your n8n credential connection and that the spreadsheet is shared with the right Google account 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.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your sheet and Gmail are ready.
No. You’ll mostly connect accounts and edit a few prompts and sheet field names.
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 API costs, which are usually a few cents per draft depending on length and model.
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 plan the decision logic. You can duplicate the Gmail approval email and adjust the Approval Routing switch so it waits for the right person (or routes based on who replied). Common tweaks include adding a second reviewer for legal/compliance, requiring “approve” from two people before archiving, and changing the revision prompt so feedback gets categorized (SEO, tone, claims) instead of one big paragraph.
Usually it’s an expired OAuth connection or the wrong Google account is connected. Reconnect the Gmail credential in n8n, then confirm the workflow is allowed to send email from that inbox. If it still fails, check your Google security settings and any workspace restrictions that block third-party access.
A lot.
It depends on how strict you want your process to be. n8n is better when you need branching logic (approve vs revise vs cancel), a clean loop for revisions, and tight control over what gets written back to Google Sheets. It also gives you a self-hosted option, which is handy if you’re generating lots of drafts and don’t want to pay per task forever. Zapier or Make can be quicker for a simple “topic in, email out” flow, but revision loops and structured parsing get fiddly. If you want a recommendation based on volume and review complexity, Talk to an automation expert.
Once this is running, your spreadsheet stops being a graveyard of “ideas” and becomes a production line with receipts. The workflow handles the repeatable parts so you can focus on what actually moves rankings.
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.