Google Sheets + Google Calendar, daily content plan
Your content calendar shouldn’t depend on someone remembering to “check trends” and “draft captions” before the morning standup. But that’s how it goes. One missing idea turns into a rushed post, then a late approval, then a skipped day.
This is where Sheets Calendar automation pays off fast. Marketing managers feel it when approvals pile up, and agency owners feel it when client campaigns run “active” but the plan is still blank. Even a solo creator running a few offers ends up doing the same repetitive work.
This workflow turns your active campaigns into a ready-to-review daily plan in Google Sheets, then puts the right reminders on your Google Calendar. You’ll see what it does, what you get, and how to put it into production without getting lost in the weeds.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + Google Calendar, daily content plan
flowchart LR
subgraph sg0["Daily 8 AM Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Daily 8 AM Trigger1", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Workflow Configuration1", pos: "b", h: 48 }
n2@{ icon: "mdi:cog", form: "rounded", label: "Fetch News RSS1", pos: "b", h: 48 }
n3["<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/>Fetch Reddit Popular1"]
n4["<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/merge.svg' width='40' height='40' /></div><br/>Merge Trends1"]
n5["<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/>Format Trending Topics1"]
n6@{ icon: "mdi:database", form: "rounded", label: "Read Active Campaigns1", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Campaign Status1", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Enrich with Trends1", pos: "b", h: 48 }
n9@{ icon: "mdi:brain", form: "rounded", label: "Groq Chat Model1", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Generate Content Ideas1", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format for Sheets1", pos: "b", h: 48 }
n13@{ icon: "mdi:database", form: "rounded", label: "Append to Daily Content Plan1", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format for Calendar1", pos: "b", h: 48 }
n15@{ icon: "mdi:location-exit", form: "rounded", label: "Create Calendar Event1", pos: "b", h: 48 }
n16["<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/>Calculate Performance Metrics1"]
n17@{ icon: "mdi:cog", form: "rounded", label: "Aggregate Daily Summary1", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format Email Content1", pos: "b", h: 48 }
n19@{ icon: "mdi:message-outline", form: "rounded", label: "Send Gmail Summary1", pos: "b", h: 48 }
n4 --> n5
n2 --> n4
n9 -.-> n10
n12 --> n13
n12 --> n14
n12 --> n16
n0 --> n1
n8 --> n10
n14 --> n15
n3 --> n4
n18 --> n19
n7 --> n8
n6 --> n7
n5 --> n8
n10 --> n12
n1 --> n2
n1 --> n3
n1 --> n6
n17 --> n18
n11 -.-> n10
n16 --> n17
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 n10,n11 ai
class n9 aiModel
class n7 decision
class n6,n13 database
class n5,n16 code
classDef customIcon fill:none,stroke:none
class n3,n4,n5,n16 customIcon
The Problem: Daily Content Planning Turns Into Daily Firefighting
Most teams don’t struggle because they “lack creativity.” They struggle because planning happens in fragments. Someone checks Reddit, someone else skims a news feed, another person guesses a posting time, and the final caption gets written in a hurry inside the scheduling tool. Then the client (or your boss) asks, “Where’s the plan for this week?” and you’re stitching together screenshots and half-finished ideas. It’s exhausting, and it quietly drains a couple hours from your week that should go to strategy, creative testing, or actually shipping campaigns.
The friction compounds. Here’s where it breaks down in the real world.
- You end up generating content ideas for campaigns that are paused, which wastes time and creates confusion later.
- Trend research gets repeated by multiple people, and the “insight” still doesn’t make it into the final caption.
- Captions and hashtags vary wildly because there’s no consistent structure, so reviews take longer than they should.
- Reminders live in someone’s head, so posts slip when the day gets busy.
The Solution: A Daily Plan Generated From Active Campaigns
This workflow runs automatically every morning at 8 AM and builds a practical content plan from what’s already true in your business: which campaigns are active, who you’re targeting, and which platform you’re posting on. It first pulls fresh context from external sources like news RSS feeds and Reddit hot posts, then merges and summarizes those signals into something usable. Next, it reads your “Active Campaigns” Google Sheet and filters to campaigns marked active so you’re not generating posts for paused work. For each active campaign, an AI step (Groq in this workflow) creates a caption, creative direction, hashtags, and a suggested posting time, then scores the idea for quality. Finally, it appends everything to your “Daily Content Plan” sheet and creates a matching Google Calendar event so someone is prompted to review or publish.
The workflow starts with a scheduled trigger at 8 AM. Then it combines trend sources, enriches each active campaign with that trend context, and generates structured content ideas. It finishes by writing your plan to Google Sheets and adding calendar events (plus an optional email summary via Gmail).
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you run 6 active campaigns across Instagram, LinkedIn, and X. Manually, you might spend about 10 minutes checking trends, then another 10 minutes writing and formatting a draft per campaign, plus 5 minutes scheduling reminders, which is roughly 2 hours each morning. With this workflow, you spend maybe 10 minutes keeping the “Active Campaigns” sheet accurate, then review what appears in the “Daily Content Plan” sheet after 8 AM. Calendar events are created automatically, so you’re not chasing people for approvals.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store active campaigns and the plan.
- Google Calendar to create review/publishing reminders.
- Groq API key (get it from the Groq developer console).
Skill level: Beginner. You’ll connect Google accounts, map a few fields, and paste one API key.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled morning trigger kicks things off. At 8 AM, n8n starts the run automatically, so nobody needs to remember to “build the plan.”
Trend context gets collected and cleaned up. The workflow pulls items from a news RSS feed and Reddit hot posts, merges them, then summarizes them into a short trend brief you can actually use in prompts.
Your active campaigns are read from Google Sheets. It loads rows from the “Active Campaigns” sheet and uses an IF filter so only campaigns with Status set to “active” move forward.
AI generates structured content ideas. Groq produces a caption, creative direction, hashtags (5–10), and a recommended posting time per platform, then the workflow scores the output and formats it for saving.
The plan is delivered to Sheets and Calendar. Each idea is appended to the “Daily Content Plan” sheet, and a Google Calendar event is created so review and publishing don’t slip.
You can easily modify the trend sources to match your niche based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Scheduled Trigger
Set the daily schedule that kicks off the workflow and loads the settings map.
- Open Scheduled Morning Trigger and set the schedule rule to run at
8(Trigger At Hour). - Confirm the node connects to Workflow Settings Map as the first step in the flow.
Step 2: Connect Google Sheets
Provide sheet identifiers and ensure the campaign and content plan sheets are connected.
- In Workflow Settings Map, set activeCampaignsSheet to
Active Campaignsand dailyContentPlanSheet toDaily Content Plan. - Set newsRssFeedUrl to a valid RSS URL value (replace
<__PLACEHOLDER_VALUE__News RSS Feed URL (e.g., https://news.google.com/rss)__>). - Set gmailRecipient to your target email address (replace
<__PLACEHOLDER_VALUE__Email recipient address__>). - Open Read Active Campaign List and set documentId to your Google Sheets document ID (replace
<__PLACEHOLDER_VALUE__Google Sheets Document ID__>). - Open Append Content Plan and set documentId to the same Google Sheets document ID.
- Credential Required: Connect your Google Sheets credentials in both Read Active Campaign List and Append Content Plan.
Workflow Settings Map outputs to Retrieve News Feed, Retrieve Reddit Hot, and Read Active Campaign List in parallel.
Step 3: Set Up Trend Collection and Campaign Filtering
Pull trending topics, merge the sources, and filter to active campaigns only.
- In Retrieve News Feed, set URL to
={{ $('Workflow Settings Map').first().json.newsRssFeedUrl }}. - In Retrieve Reddit Hot, set Subreddit to
={{ $('Workflow Settings Map').first().json.redditSubreddit }}and keep Limit at10. - Ensure Combine Trend Streams is set to Mode
combineand Combine BycombineAllso both sources merge. - Keep Shape Trend Summary as-is to generate the trending summary from both sources.
- In Validate Campaign Status, confirm the condition uses
={{ $json.status }}equalsactive. - In Add Trend Context, set trendingTopics to
={{ $('Shape Trend Summary').first().json.trendingSummary || 'No trends available' }}.
Step 4: Set Up AI Content Generation
Configure the Groq model and structured output parsing to generate campaign-ready ideas.
- Open Groq Chat Engine and set Model to
llama-3.3-70b-versatile. - In Generate Content Concepts, set Text to
={{ $json }}and keep Prompt Type asdefine. - Ensure Generate Content Concepts has Has Output Parser enabled and that Parse Structured Output is connected as its parser.
- Credential Required: Connect your Groq credentials in Groq Chat Engine.
Note: Parse Structured Output is an AI sub-node; credentials must be added to Groq Chat Engine, not the parser.
Step 5: Configure Output to Sheets, Calendar, and Stats
Prepare structured fields, append rows to Sheets, create Calendar events, and compute metrics.
- In Prepare Sheet Fields, set fields to the expressions: date
={{ $now.format('yyyy-MM-dd') }}, postCaption={{ $json.output.postCaption }}, creativeDirection={{ $json.output.creativeDirection }}, hashtags={{ $json.output.hashtags }}, bestPostingTime={{ $json.output.bestPostingTime }}. - Prepare Sheet Fields outputs to Append Content Plan, Prepare Calendar Fields, and Compute Performance Stats in parallel.
- In Prepare Calendar Fields, set summary to
={{ $json.projectName + ' - ' + $json.platform }}and description to={{ 'Post Caption: ' + $json.postCaption + '\n\nCreative Direction: ' + $json.creativeDirection + '\n\nHashtags: ' + $json.hashtags }}. - In Create Calendar Entry, set Start to
={{ $json.start }}and End to={{ $json.end }}, and replace the calendar ID placeholder<__PLACEHOLDER_VALUE__Google Calendar ID (e.g., primary)__>. - Credential Required: Connect your Google Calendar credentials in Create Calendar Entry.
⚠️ Common Pitfall: If bestPostingTime is not in HH:mm:ss format, Create Calendar Entry may fail. Ensure the AI output uses a valid time format.
Step 6: Configure Email Reporting
Aggregate daily stats and email the summary to stakeholders.
- Keep Compute Performance Stats and Aggregate Daily Overview connected as-is to build the stats dataset.
- In Compose Email Summary, confirm emailSubject is set to
={{ '📊 Daily Content Plan Summary - ' + $now.format('MMMM dd, yyyy') }}. - In Dispatch Gmail Report, set Send To to
={{ $('Workflow Settings Map').first().json.gmailRecipient }}, Subject to={{ $json.emailSubject }}, and Message to={{ $json.emailBody }}. - Credential Required: Connect your Gmail credentials in Dispatch Gmail Report.
Step 7: Test & Activate Your Workflow
Run a controlled test to confirm data flows through all branches before enabling the schedule.
- Click Execute Workflow to run a manual test from Scheduled Morning Trigger.
- Verify that Retrieve News Feed and Retrieve Reddit Hot both output items, then check Shape Trend Summary for a populated
trendingSummary. - Confirm Append Content Plan writes a new row to Google Sheets and Create Calendar Entry creates a calendar event.
- Check your inbox for the Dispatch Gmail Report email with the daily summary HTML.
- When the test succeeds, set the workflow to Active to enable the daily schedule.
Common Gotchas
- Google Sheets and Google Calendar credentials can expire or need specific permissions. If things break, check the n8n credentials screen and the Google OAuth consent permissions 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 an hour if your Google accounts are ready.
No. You’ll mostly connect accounts and map fields from Sheets into the AI prompt and the output 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 Groq API usage costs (usually small for daily text generation).
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 it’s a smart tweak. You can replace the RSS and Reddit steps with other sources by changing the HTTP Request or RSS feed nodes that supply the trend stream, then keeping the merge and summary logic the same. Common customizations include adding an industry newsletter RSS, swapping Reddit for a specific subreddit, and limiting trends to a few keywords so the AI doesn’t drift.
Usually it’s expired Google OAuth access or a permission mismatch on the spreadsheet. Reconnect the Google Sheets credential in n8n, then confirm the account has edit access to both the “Active Campaigns” file and the “Daily Content Plan” file. If you changed the sheet name or column headers after connecting, update the mapping in the read/append nodes so fields still match. Rate limiting is rare at this scale, but it can happen if you suddenly process a big backlog of campaigns.
On most setups, dozens per day is fine; the practical limit is your n8n execution quota (on Cloud) and how fast your AI step responds.
It depends on how “smart” you want the workflow to be. n8n is better when you need branching logic (only process active campaigns), merging multiple sources (RSS + Reddit), and structured AI output that gets parsed cleanly into columns. Self-hosting also means you’re not paying more just because the workflow runs every day. Zapier or Make can be quicker for a simple “row added → create event” use case, honestly. Talk to an automation expert if you want help picking the cleanest setup.
Once this is running, your day starts with a plan instead of a blank page. Set it up, review what matters, and let the workflow handle the repetitive parts.
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.