type
Post
status
Published
date
Mar 26, 2026
slug
how-i-publish-with-notion
summary
A behind-the-scenes look at how stephendmann.com is powered entirely by a Notion database — and how a single status change publishes an article in under 60 seconds.
tags
Writing
Tools
News
Recommended
category
Writing & Content
icon
password
URL
How I Publish Articles in Under 5 Minutes Using Notion
Most content publishing workflows involve a CMS dashboard, a separate editor, image uploads in one place, and metadata in another. Mine lives entirely inside Notion — and publishing an article is a single field change.
Here's how it works.
The Setup
My website, stephendmann.com, is powered by a framework called NotionNext — an open-source Next.js project that reads a Notion database and renders it as a public blog. Vercel hosts the site and re-fetches content from Notion every 60 seconds, so there's no manual redeployment step.
The full pipeline is:
Notion database → NotionNext (GitHub) → Vercel → stephendmann.com
Everything — articles, pages, navigation items, and site configuration — lives as rows in a single Notion database called LeadershipIntelligence.
Why Notion as a CMS?
A few reasons this setup works well for me:
- I write in Notion anyway. My research notes, client frameworks, and thinking all live there. Publishing is just promoting an existing note.
- No context switching. There's no separate CMS to log into. Write, fill in a few fields, flip the status. Done.
Version control is built in. Draft status means nothing goes public by accident. I can write, edit, and review at my own pace before anything is visible.
It's fast to iterate. Changed my mind about a heading or spotted a typo after publishing? Fix it in Notion, and the live site updates within 60 seconds. No republish, no redeploy.
It doubles as a private knowledge base. Because not every row needs to be public, I use the same database as a personal research and reference library. Notes, reading summaries, client frameworks, and theological study all sit alongside published articles — simply kept on Draft or Invisible status. The result is a single workspace where private thinking and public writing coexist without any separation of tools. This is one of the more underappreciated aspects of the Notion-as-CMS approach: your knowledge base and your blog are the same thing, with visibility controlled by a single field.
The Five-Step Workflow
Here's exactly what I do for every article:
- Create a new page in the LeadershipIntelligence database and immediately set Status = Draft. Nothing is visible publicly until I decide it is.
- Write the article using Notion's native formatting — headings, bullet lists, tables, callout blocks, embedded images. What I see in Notion is largely what renders on the site.
- Fill in the metadata:
- Category — which of my 10 topic areas this belongs to
- Tags — comma-separated keywords for filtering
- Summary — one sentence shown in the blog listing
- Slug — the URL path (e.g.
notion-publishing-workflow) - Cover — a landscape image URL for the post card and hero
- Set Status = Published. The article appears on stephendmann.com within approximately 60 seconds. No further action required.
- To unpublish, change Status back to Invisible or Revoke. The post disappears from the public site on the next cache refresh.
That's the entire workflow.
A Word on Slugs
The slug is the URL segment that identifies a specific post. In
stephendmann.com/notion-publishing-workflow, the slug is notion-publishing-workflow. I set it manually in Notion for three reasons:- Readability — a descriptive slug signals to both readers and search engines what the page is about before they click.
- Stability — if I later rename the article title in Notion, the URL stays fixed as long as the slug doesn't change. No broken links.
- SEO — keywords in the URL path carry weight in search rankings.
One rule I follow strictly: once a post is published and indexed, don't change the slug. It breaks the old URL for anyone who has bookmarked or linked to it. If a change is unavoidable, set up a redirect in Vercel to forward the old path to the new one.
What Stays Private
Not everything in my database is public. Status controls what the world sees:
Status | Visible on the site? | Use for |
Published | ✅ Yes | Live public posts |
Draft | ❌ No | Work in progress |
Invisible | ❌ No | Permanent private content |
Revoke | ❌ No | Previously published, now hidden |
I also maintain a handful of private-only categories — personal journaling, private notes, admin — that stay permanently set to Invisible. A simple underscore prefix on their names acts as a visual "never publish" flag.
Is This Right for You?
This workflow suits anyone who:
- Already lives in Notion and wants publishing to feel like a natural extension of how they already work.
- Wants a low-friction setup with no separate CMS to maintain or log into.
- Is comfortable with a one-time technical setup: forking a GitHub repo, connecting Vercel, and pointing a domain.
It's less suited to large editorial teams, sites needing heavy custom interactivity, or anyone who wants a fully visual drag-and-drop page builder.
For a personal site or thought-leadership blog where writing consistency matters more than platform complexity, it's the most friction-free publishing setup I've used.
Curious about the technical side or whether this approach suits your own content strategy? Get in touch.
This site is built on NotionNext, an open-source Next.js framework created by tangly1024 and the NotionNext contributors, which itself grew from the original Nobelium project initiated by Craig Hart. Their work makes this kind of frictionless publishing pipeline possible — if you're exploring a similar setup, the NotionNext GitHub repo and documentation are the place to start.