Content Calendar Template for Blogs: A Free Sheet Built for SEO
A blog content calendar is a spreadsheet where each row is one article: publish date, status, primary keyword, search intent, topic hub, internal links in and out, call to action and the next review date. Most free templates are built for social media posts and miss the SEO columns, which is why blogs end up with duplicate topics and orphan posts. Below is a copy-paste template for Google Sheets, Excel or Notion, what each column is for, a filled example and a simple weekly routine for a one-person blog.

Why a blog calendar is not a social media calendar
Social calendars track channels, captions and posting times. A blog calendar has a different job: making sure every article targets a query no other post on your site already targets, sits in a topic cluster, links to and from related posts, and gets revisited when it ages. Those four things decide whether a small blog builds topical authority or a pile of disconnected posts.
So the template below has fewer "channel" columns and more SEO ones. If you also post on social networks, keep that in a separate tab and link rows by URL.
The template (copy and paste)
Copy the block below and paste it into cell A1 of a new Google Sheet or Excel workbook. The columns are tab-separated, so they split automatically. For Notion, save it as a .csv file (replace tabs with commas) and import it as a database.
Publish date Status Working title Primary keyword Intent Hub Slug Links in (from) Links out (to) CTA Owner Published URL Last updated Next review Notes
2026-11-03 Idea How to repot a snake plant repot snake plant How-to Houseplant care repot-snake-plant snake-plant-care best-potting-mix Newsletter Me 2027-05-03 Example row: delete it
Add data validation to two columns to keep the sheet clean: Status (Idea, Brief, Draft, Edit, Scheduled, Published, Update) and Intent (Informational, How-to, Comparison, Transactional). In Google Sheets that is Data → Data validation → Dropdown.
What each column is for
| Column | Why it's there |
|---|---|
| Publish date | A planned date, not a promise. Keep a realistic cadence you can sustain. |
| Status | One word, from a dropdown, so you can filter "what's in progress". |
| Working title | Phrased like the query, not a clever headline. You can polish later. |
| Primary keyword | One per row. Before adding a row, search this column: if the keyword or a close variant is already there, update that post instead. This is your main defense against keyword cannibalization. |
| Intent | Tells you the format: a how-to needs steps, a comparison needs a table. |
| Hub | The topic cluster the post belongs to. Filter by hub to see which clusters are thin. |
| Slug | Decide the URL up front so other rows can link to it before it's live. |
| Links in / Links out | Which existing posts will link to this one, and which it will link to. Fill both before writing. See our internal linking strategy for how many and where. |
| CTA | The one action you want readers to take: subscribe, try a tool, read the hub page. |
| Owner | Even on a solo blog, useful once you work with guest authors or editors. |
| Published URL | Filled on publish day; makes the sheet your content inventory. |
| Last updated / Next review | When you last made a real change, and when to check the post again. |
| Notes | Sources to cite, angle, what competitors miss. |
How to fill it: from keyword list to schedule
- Dump ideas into rows with status "Idea": reader questions, Search Console queries with impressions but no matching post, keyword research. Our guide to low-competition keywords covers free ways to find them.
- Assign a hub to each idea. If an idea fits no hub, ask whether it belongs on your blog at all.
- Deduplicate. Sort by Primary keyword and merge rows that target the same intent.
- Prioritize. First the hub pages and the posts that hub pages will link to, then supporting posts. Alternate hubs so one cluster doesn't stall while another grows.
- Write a brief for the next two or three rows. The SEO content brief template plugs straight into this sheet: one brief per row.
- Set dates last. Count backward from how many posts you actually finished in the last month, not from what you hope to write.
A filled example (for illustration)
Imagine a houseplant blog with about 30 posts. Before using a calendar, it had three posts targeting "snake plant care" variants and several posts nobody linked to. A month of rows might look like this:
| Date | Title | Hub | Links in | Links out | Status |
|---|---|---|---|---|---|
| Nov 3 | How to repot a snake plant | Houseplant care | snake-plant-care | best-potting-mix | Draft |
| Nov 10 | Best potting mix for succulents (tested) | Soil & supplies | repot-snake-plant, succulent-care | soil-hub | Brief |
| Nov 17 | Snake plant care (merge of 3 old posts) | Houseplant care | houseplant-care-hub | repot-snake-plant, yellow-leaves | Update |
| Nov 24 | Why are my plant's leaves turning yellow? | Problems | snake-plant-care | overwatering-signs | Idea |
Notice the third row: an update counts as a calendar slot. Merging three weak posts into one strong one is often worth more than a new article.
Plan updates, not just new posts
The Last updated and Next review columns turn the calendar into a maintenance plan. A practical rule for a small blog: review evergreen posts every 6 to 12 months, and sooner for anything with prices, tools or rules. When you update, change the date only if the content really changed: Google's helpful content guidance asks site owners whether they are "changing the date of pages to make them seem fresh when the content has not substantially changed". Our guide to updating old blog posts explains what counts as a real update.
The same guidance also says Google has no preferred word count, so there is no "target length" column here. Length follows intent.
A weekly routine for a one-person blog
- Monday (15 minutes): move rows forward one status, check what's due this week.
- Writing days: work only on rows marked Brief or Draft.
- Publish day: fill Published URL, then add the "links in" from older posts immediately. This is the step most people skip.
- Monthly: sort by Next review and schedule one or two updates.
Add promotion to the plan
Publishing is half the work; the other half is getting a new post seen. Add a "Promotion" column if you like: newsletter, community, partner site. One way to get relevant mentions for new posts is an article exchange with sites at your level. In Satelo, you publish partner articles on your blog, earn satellites, and spend them on articles about your site from other members (in a circle, not a direct swap, with every link marked rel="sponsored"). Joining is free and takes a few minutes; Satelo is a public beta with a small network, so treat it as one channel in your plan, not the whole plan.
FAQ
What should a blog content calendar include?
At minimum: publish date, status, working title, one primary keyword, search intent, topic hub, internal links in and out, call to action, published URL and a next review date. The SEO columns are what separate a blog calendar from a social media calendar.
Is there a free content calendar template for Google Sheets?
Yes. Copy the tab-separated template in this article and paste it into cell A1 of a new Google Sheet. The columns split automatically, and you can add dropdowns for Status and Intent with Data validation.
Can I use this template in Notion?
Yes. Save the template as a CSV file by replacing tabs with commas, then import it into Notion as a database. Status and Intent work well as select properties, and you can add a calendar view on the Publish date column.
How far ahead should a small blog plan content?
Four to eight weeks of dated rows is enough for most solo bloggers, plus an unscheduled list of ideas. Set dates based on how many posts you actually finished recently, not on an ideal cadence.
How do I avoid writing two posts on the same topic?
Give every row exactly one primary keyword and search that column before adding a new row. If a close variant is already planned or published, update or expand that post instead of creating a new one.
Should updates to old posts go in the content calendar?
Yes. Treat an update as a calendar slot with status Update. Use the Next review column to schedule them, and change the visible date only when the content has substantially changed.
How many posts a week should I schedule?
There is no required number. Pick a cadence you can keep for months, even one post a week or every two weeks, and fill the remaining time with updates and internal linking. Google says it has no preferred word count, and quality matters more than volume.
What is the difference between a content calendar and a content brief?
The calendar is the list of all planned articles with dates and status. A brief is the detailed plan for one article: angle, headings, sources and links. Typically each calendar row gets a brief a week or two before writing.
Read next




Check your site's Quality Score
Free, no sign-up: a 0–100 score from mostly open data. Then add your site to Satelo and get partner articles from sites of your level.
Enter a domain like example.com
Add my site