Reddit + Google Sheets: SEO drafts ready to edit
Content ideas are everywhere. But turning them into publishable drafts usually means a lot of tab-hopping, copy-paste, and “I’ll write it later” lying to yourself.
If you’re a marketing lead trying to keep a content calendar full, this Reddit SEO drafts automation is a relief. Agency owners feel it when clients want “more SEO content” without paying for more hours. And if you run a small business, you just want a backlog that doesn’t rely on your mood.
This workflow pulls real questions from Reddit and drops clean, structured blog drafts into Google Sheets. You’ll learn what it does, what you need, and how to get it running without becoming an automation engineer.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Reddit + Google Sheets: SEO drafts ready to edit
flowchart LR
subgraph sg0["When clicking ‘Test workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Test workflow’", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/reddit.svg' width='40' height='40' /></div><br/>Reddit"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code"]
n3@{ icon: "mdi:database", form: "rounded", label: "Google Sheets", pos: "b", h: 48 }
n4@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n5@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n6@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Google Sheets1", pos: "b", h: 48 }
n8@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n9@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory1", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n11@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model2", pos: "b", h: 48 }
n12@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory2", pos: "b", h: 48 }
n13@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model3", pos: "b", h: 48 }
n14@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory3", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model4", pos: "b", h: 48 }
n16@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory4", pos: "b", h: 48 }
n17@{ icon: "mdi:database", form: "rounded", label: "Google Sheets2", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n19@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields2", pos: "b", h: 48 }
n21@{ icon: "mdi:robot", form: "rounded", label: "Intro", pos: "b", h: 48 }
n22@{ icon: "mdi:robot", form: "rounded", label: "Steps", pos: "b", h: 48 }
n23@{ icon: "mdi:robot", form: "rounded", label: "Conclusion", pos: "b", h: 48 }
n24@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields3", pos: "b", h: 48 }
n25@{ icon: "mdi:robot", form: "rounded", label: "slug", pos: "b", h: 48 }
n26@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields4", pos: "b", h: 48 }
n2 --> n3
n25 --> n18
n21 --> n19
n22 --> n20
n1 --> n2
n4 --> n26
n23 --> n24
n18 --> n17
n19 --> n17
n20 --> n17
n24 --> n17
n26 --> n7
n3 --> n10
n6 -.-> n4
n7 --> n21
n7 --> n22
n7 --> n23
n7 --> n25
n17 --> n10
n9 -.-> n25
n12 -.-> n21
n14 -.-> n22
n16 -.-> n23
n10 --> n4
n5 -.-> n4
n8 -.-> n25
n11 -.-> n21
n13 -.-> n22
n15 -.-> n23
n0 --> n1
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 n4,n21,n22,n23,n25 ai
class n5,n8,n11,n13,n15 aiModel
class n6,n9,n12,n14,n16 ai
class n3,n7,n17 database
class n2 code
classDef customIcon fill:none,stroke:none
class n1,n2 customIcon
Why This Matters: Turning “Good Questions” Into Drafts Takes Forever
You already know Reddit is a goldmine for content. People ask blunt, specific questions, and they use the same phrasing your customers type into Google. The problem is what happens next. You skim posts, save a few links, maybe dump them into a doc… and then nothing ships. Or you finally sit down to write and spend the first hour just turning a messy question into a usable title, outline, and intro. It’s not hard work. It’s draining work. And it steals time from the part that actually matters: editing, adding experience, and publishing consistently.
It adds up fast. Here’s where the workflow earns its keep.
- Finding questions is easy, but organizing them into a real backlog is the part that quietly breaks your publishing rhythm.
- When the same question gets rewritten from scratch each time, your titles, slugs, and outlines end up inconsistent across your site.
- Manual drafting invites small errors, like mismatched headings or vague intros, which means more editing later.
- “We’ll write from Reddit later” usually turns into “we forgot where we saved that thread.”
What You’ll Build: Reddit Questions to Structured Google Sheets Drafts
This workflow starts when you choose to run it (a manual trigger, so you stay in control). It pulls the latest posts from a subreddit you pick, then filters down to posts that look like real questions based on common “question words” (think how, what, why). Those question-style posts get logged into a Google Sheet as raw input, so you have a clean source list. Then AI steps in: it rephrases the question into a clearer topic, generates a proper blog title and URL-friendly slug, and writes a structured draft in sections. Finally, the workflow saves the title, slug, intro, steps, and conclusion into a second Google Sheet that’s ready for editing and publishing.
In practice, you get two Sheets working together. One becomes your “question inbox.” The other becomes your “draft library,” where each row is a draft you can assign, edit, and ship.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Let’s say you want 10 fresh SEO topics a week from one subreddit. Manually, you might spend about 30 minutes scanning, selecting questions, pasting them into a doc, and writing rough outlines, so that’s about 5 hours before “real writing” even begins. With this workflow, you can run it in about 2 minutes, then let AI generate the structured sections in the background. You still edit before publishing, but you’re starting from a draft library, not an empty page.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Reddit API access to pull posts from a subreddit.
- OpenAI API to generate titles, sections, and slugs.
- Google Sheets to store questions and finished drafts.
Skill level: Beginner. You’ll connect accounts, paste API keys, and tweak a couple prompts and sheet column names.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
You trigger a run when you want new drafts. This workflow uses a manual launch, which is great if you want to review what’s coming in from Reddit and avoid daily “set-and-forget” noise.
Reddit posts are pulled and filtered into real questions. n8n retrieves the latest subreddit posts, then a filter checks titles for question phrasing. Only the likely questions make it into your “query” Google Sheet.
AI cleans up the topic and writes the structured sections. The workflow loops through each saved question, rephrases it into a cleaner blog topic, generates a URL slug, then drafts an intro, step-by-step guide section, and conclusion using OpenAI.
The finished draft lands in a separate Google Sheet. Each row becomes an editable draft record (title, slug, intro, steps, conclusion) so you can assign it, rewrite parts, and publish using your normal process.
You can easily modify the subreddit source to target a different audience based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually to pull fresh Reddit questions on demand.
- Add the Manual Launch Trigger node as the workflow entry point.
- Connect Manual Launch Trigger to Retrieve Reddit Posts to start the chain.
Step 2: Connect Reddit as the Data Source
Pull new posts from the n8n subreddit for question extraction.
- Open Retrieve Reddit Posts and set Operation to
getAll. - Set Subreddit to
n8nand Limit to30. - Credential Required: Connect your redditOAuth2Api credentials.
- Connect Retrieve Reddit Posts to Filter Question Titles.
Step 3: Filter Questions and Log to the Query Sheet
Identify question-style titles, then save them for downstream processing.
- In Filter Question Titles, set JavaScript Code to:
const questionWords = ['who', 'what', 'when', 'where', 'why', 'how', 'can', 'does', 'is', 'should', 'do', 'are', 'could', 'would'];
return $input.all().filter(item => {
const rawTitle = item.json.title;
if (!rawTitle) return false;
const title = rawTitle.trim().toLowerCase();
const isQuestion =
title.endsWith('?') ||
questionWords.some(word =>
title.startsWith(word + ' ') ||
title.includes(' ' + word + ' ')
);
// 🪵 Debug log goes here:
if (isQuestion) console.log('✅ Question found:', title);
return isQuestion;
});- Open Append Query Sheet and set Operation to
append. - Map Query to
{{ $json.selftext }}and Title to{{ $json.title }}. - Set Document to
[YOUR_ID]and Sheet toQueries. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Connect Append Query Sheet to Batch Iterator.
Step 4: Set Up AI Processing and Rephrasing
Rephrase the selected question and prepare it for content generation.
- Connect Batch Iterator to Rephrase Question Agent (main output).
- In Rephrase Question Agent, set Text to
=Here is a question: {{ $json.Title }} Rephrase it without changing the meaning. Keep it as a question. I just need the question as the output nothing else. - Ensure Primary Chat Model is connected as the language model for Rephrase Question Agent and select model
gpt-4o-mini. - Credential Required: Connect your openAiApi credentials on Primary Chat Model (not on Rephrase Question Agent).
- Attach Context Memory Buffer as AI memory and set Session Key to
{{ $json.Title }}. - Connect Rephrase Question Agent to Map Question Name and map name to
{{ $json.output }}.
Step 5: Configure the Blog Sheet Upsert and Parallel AI Drafting
Store the rephrased title and generate slug, intro, steps, and conclusion in parallel.
- In Upsert Blog Sheet, set Operation to
appendOrUpdate. - Map name to
{{ $json.name }}, set Document to[YOUR_ID], and Sheet toBlog. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Upsert Blog Sheet outputs to both Draft Intro Section and Draft Steps Section and Draft Conclusion and Generate URL Slug in parallel.
- Configure AI prompts and memory for each draft node:
• Generate URL Slug Text:=Based on {{ $json.name }} Create a website slug for it. For example: best-website-builder Just give me the slug as output nothing elsewith Slug Chat Model and Slug Memory Buffer (Session Key{{ $json.name }}).
• Draft Intro Section Text:=Write a short intro for a blog post titled: {{ $json.name }} Make it easy to read, with easy vocabulary Just give me the intro as the outputwith Intro Chat Model and Intro Memory Buffer (Session Key{{ $('Upsert Blog Sheet').item.json.name }}).
• Draft Steps Section Text:=Write a 'step by step guide' section for a blog post titled: {{ $json.name }} Make it easy to read, with easy vocabulary But make it very detailed Just give me the outputwith Steps Chat Model and Steps Memory Buffer (Session Key{{ $('Upsert Blog Sheet').item.json.name }}).
• Draft Conclusion Text:=Write a short conclusion for a blog post titled: {{ $json.name }} Make it easy to read, with easy vocabulary Just give me the conclusion as the outputwith Conclusion Chat Model and Conclusion Memory Buffer (Session Key{{ $('Upsert Blog Sheet').item.json.name }}). - Credential Required: Connect your openAiApi credentials on Slug Chat Model, Intro Chat Model, Steps Chat Model, and Conclusion Chat Model.
Step 6: Map AI Outputs and Append the Blog Record
Assign each generated section to a field, then write the full record to the blog sheet.
- In Assign Slug Field, map slug to
{{ $json.output }}. - In Assign Intro Field, map Intro to
{{ $json.output }}. - In Assign Steps Field, map Steps to
{{ $json.output }}. - In Assign Conclusion Field, map Conclusion to
{{ $json.output }}. - Each of Assign Slug Field, Assign Intro Field, Assign Steps Field, and Assign Conclusion Field should connect to Append Blog Output.
- In Append Blog Output, set Operation to
appendand map: name →{{ $json.name }}, slug →{{ $json.slug }}, Intro →{{ $json.Intro }}, Steps →{{ $json.Steps }}, Conclusion →{{ $json.Conclusion }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Connect Append Blog Output back to Batch Iterator to continue batch processing.
Step 7: Test and Activate Your Workflow
Run a manual test to confirm records and AI content are written to your sheets.
- Click Execute Workflow and trigger Manual Launch Trigger.
- Verify that Append Query Sheet adds rows to the
Queriessheet and that Upsert Blog Sheet and Append Blog Output populate theBlogsheet. - Confirm that the slug, intro, steps, and conclusion fields contain AI-generated text for each question.
- When everything looks correct, toggle the workflow to Active for production use.
Troubleshooting Tips
- Reddit credentials can expire or need specific permissions. If things break, check your Reddit app settings in the Reddit developer portal 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.
Quick Answers
About 20 minutes if your accounts are ready.
No. You’ll mostly connect credentials and adjust a couple prompts and sheet columns.
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 (often a few cents per draft, depending on length).
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, and you should. Most people swap the subreddit in the Reddit retrieval step, then adjust the AI prompts used for the intro, steps, and conclusion so the draft matches their niche and tone. You can also change the “question filter” logic to catch different phrasing (for example, “best way to” or “vs”). If you publish in multiple languages, keep the Google Translate node in the flow and route translated drafts into a separate sheet tab.
Usually it’s an OAuth issue on the Reddit app side. Double-check the redirect URL, then reconnect the Reddit credential in n8n so the token refreshes. If it works for a few runs and then dies, it can be missing scopes or the credential was created under a different Reddit account than you expected.
If you keep batches reasonable (like 10–30 questions per run), it’s smooth on most setups.
Often, yes, because this workflow isn’t just moving data between apps. You’re filtering, looping through items in batches, and generating multiple content sections with AI, which is where simpler tools can get awkward or expensive. n8n also gives you more control over branching logic, so you can route “good questions” to one place and “maybe later” questions to another. If you self-host, you’re not paying per task in the same way, which matters when you’re generating drafts in bulk. That said, Zapier or Make can be quicker for very small, two-step flows. Talk to an automation expert if you want help picking the right tool.
Once this is running, your content backlog stops being a “someday” project and starts behaving like an actual system. You edit, polish, publish, repeat.
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.