What This Template Is For
Content management features sit at the intersection of editorial needs and technical architecture. A CMS that is easy for writers but hard to extend ends up limiting the product. A CMS that is flexible for engineers but confusing for editors ends up unused. This template helps PMs navigate that tension by separating the editorial experience from the content infrastructure, specifying each with enough detail that both audiences get what they need.
Use this template when you are building or extending a CMS, adding a content type, designing editorial workflows, or specifying how content moves from draft to published. It covers content modeling, authoring UX, workflow automation, permissions, versioning, and delivery APIs.
For a broader perspective on technical product specifications, the Technical PM Handbook covers architecture decision-making and engineering collaboration. If your CMS project involves evaluating third-party tools rather than building from scratch, consider using the competitive analysis template to compare CMS vendors before writing requirements.
How to Use This Template
- Start with the content model, not the UI. The most common CMS mistake is designing screens before defining the underlying content structure. Map your content types, fields, and relationships first. The UI follows from the model.
- Interview both editors and developers. Editors care about the authoring experience, preview, and publishing workflow. Developers care about the API, content delivery, and extensibility. A good spec addresses both.
- Define the workflow before building the editor. Who creates content? Who reviews it? Who publishes it? Who can unpublish? These workflow decisions shape the entire feature set.
- Plan for content reuse. Content created once should be publishable to multiple channels (web, mobile app, email, third-party). Specify how content is delivered, not just how it is authored.
- Validate scope with the RICE Calculator. CMS features often expand in scope as stakeholders add requirements. Score each capability independently to keep the MVP focused.
CMS Feature Specification Template
Feature Overview
| Field | Details |
|---|---|
| Feature Name | [CMS feature name] |
| PRD Link | [Link to parent PRD] |
| Design Link | [Link to Figma file] |
| Owner (PM) | [Name] |
| Owner (Engineering) | [Name] |
| Owner (Content/Editorial) | [Name] |
| Target Release | [Sprint or date] |
| Priority | [P0 / P1 / P2] |
| Status | [Draft / In Review / Approved / In Development] |
One-line summary: [What this CMS feature does in plain language.]
Context: [Why this feature exists. Current pain points. Editorial team size and workflow. Content volume (posts per week/month). Distribution channels.]
Content Model
Define the content types, fields, and relationships that this feature requires.
Content Type: [Name]
| Field | Type | Required | Constraints | Notes |
|---|---|---|---|---|
title | Short text | Yes | Max 200 chars | SEO title |
slug | Slug | Yes | Auto-generated from title, editable | URL path segment |
body | Rich text | Yes | Supports headings, lists, images, embeds | Main content |
excerpt | Short text | No | Max 320 chars | Meta description / card preview |
featured_image | Media (image) | No | Min 1200x630px | OG image, hero |
author | Reference (Author) | Yes | Single | Linked author profile |
category | Taxonomy | Yes | Single select from predefined list | Content classification |
tags | Taxonomy | No | Multi-select, max 10 | Discovery and filtering |
status | Enum | Yes | Draft / In Review / Scheduled / Published / Archived | Workflow state |
published_at | Datetime | No | Auto-set on publish | Public display date |
[custom_field] | [Type] | [Yes/No] | [Constraints] | [Notes] |
Content relationships:
| Relationship | Type | From | To | Notes |
|---|---|---|---|---|
| [Author] | Many-to-one | [Content] | [Author] | [Each content has one author] |
| [Related content] | Many-to-many | [Content] | [Content] | [Editorial picks, max 5] |
| [Parent/child] | One-to-many | [Collection] | [Content] | [Hierarchical organization] |
Editorial Workflow
Define the states content moves through from creation to publication.
Draft → In Review → Approved → Scheduled → Published
↑ ↓ ↓
←── Revision Requested Archived
Workflow states:
| State | Who Can Enter | Actions Available | Notifications |
|---|---|---|---|
| Draft | Author | Edit, Submit for Review, Delete | None |
| In Review | Author (submit) | Approve, Request Revision, Reassign | Notify reviewer |
| Approved | Reviewer | Schedule, Publish Immediately | Notify author |
| Scheduled | Reviewer / Admin | Edit schedule, Cancel, Publish Now | Notify at publish time |
| Published | System (auto) / Admin | Unpublish, Archive, Edit (creates new draft) | Notify subscribers |
| Archived | Admin | Restore to Draft, Delete Permanently | None |
Reviewer assignment rules:
- ☐ Manual assignment by author (pick from reviewer list)
- ☐ Automatic assignment based on content category
- ☐ Round-robin across reviewer pool
- ☐ Manager approval required for specific content types
Authoring Experience
Define the content editor UI and authoring tools.
Rich text editor capabilities:
- ☐ Headings (H2-H4)
- ☐ Bold, italic, underline, strikethrough
- ☐ Ordered and unordered lists
- ☐ Block quotes
- ☐ Code blocks with syntax highlighting
- ☐ Inline code
- ☐ Links (internal and external, open in new tab option)
- ☐ Images (upload, URL, alt text, caption)
- ☐ Tables
- ☐ Embeds (YouTube, Twitter, custom embed codes)
- ☐ Custom blocks / components (CTA, callout, accordion)
- ☐ Markdown shortcuts (e.g.,
##auto-converts to H2)
Editor UX requirements:
| Requirement | Description | Priority |
|---|---|---|
| Autosave | Save draft every 30 seconds | P0 |
| Undo/Redo | Support Cmd+Z / Cmd+Shift+Z with 50-step history | P0 |
| Word count | Display running word count in editor footer | P1 |
| Reading time | Auto-calculate estimated reading time | P1 |
| SEO preview | Show Google SERP preview (title + description + URL) | P1 |
| Social preview | Show OG card preview (Facebook, Twitter/X, LinkedIn) | P2 |
| Collaborator presence | Show which users are editing the same content | P2 |
Versioning and History
| Requirement | Details |
|---|---|
| Version creation | [Automatic on publish, manual "save version" button] |
| Version limit | [Keep last N versions / Keep all / Time-based retention] |
| Diff view | [Side-by-side or inline diff between any two versions] |
| Restore | [Restore creates a new draft with old content, does not overwrite published] |
| Author attribution | [Each version tracks who made the change and when] |
Permissions Model
Define who can do what within the CMS. Map these roles to your RACI matrix if you have one for the content team.
| Role | Create | Edit Own | Edit Any | Review | Publish | Unpublish | Delete | Manage Settings |
|---|---|---|---|---|---|---|---|---|
| Contributor | Yes | Yes | No | No | No | No | No | No |
| Editor | Yes | Yes | Yes | Yes | No | No | No | No |
| Publisher | Yes | Yes | Yes | Yes | Yes | Yes | No | No |
| Admin | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
Content Delivery API
Define how content is consumed by frontend applications and other services.
API style: [REST / GraphQL / Both]
Endpoints (REST):
GET /api/content/[type] List content (paginated, filterable)
GET /api/content/[type]/[slug] Get single content by slug
GET /api/content/[type]/[id] Get single content by ID
POST /api/content/[type] Create content (authenticated)
PUT /api/content/[type]/[id] Update content (authenticated)
DELETE /api/content/[type]/[id] Delete content (authenticated)
Query parameters:
| Parameter | Type | Description | Example |
|---|---|---|---|
status | Enum | Filter by status | ?status=published |
category | String | Filter by category slug | ?category=engineering |
author | String | Filter by author ID | ?author=user_123 |
tag | String | Filter by tag | ?tag=product-updates |
sort | String | Sort field and direction | ?sort=-published_at |
limit | Number | Results per page | ?limit=20 |
offset | Number | Pagination offset | ?offset=40 |
fields | String | Sparse fieldsets | ?fields=title,slug,excerpt |
Response format:
{
"data": [...],
"meta": {
"total": 142,
"limit": 20,
"offset": 0,
"next": "/api/content/posts?offset=20&limit=20"
}
}
Preview and Staging
| Requirement | Details |
|---|---|
| Draft preview | [Preview URL with auth token, shows unpublished content as it will appear] |
| Scheduled preview | [Preview content scheduled for future publication] |
| Preview environments | [Staging URL vs production URL, content isolation] |
| Preview sharing | [Shareable preview links with expiration for stakeholder review] |
Search and Discovery
| Feature | Details | Priority |
|---|---|---|
| Full-text search | [Search across title, body, excerpt, tags] | P0 |
| Faceted filters | [Filter by category, tag, author, date range, status] | P0 |
| Sort options | [Newest, oldest, most viewed, alphabetical] | P1 |
| Related content | [Algorithm: shared tags/category, manual override] | P1 |
| Search analytics | [Track search queries, zero-result queries] | P2 |
Analytics and Metrics
Track content performance to inform editorial decisions. These metrics belong in your team's KPI dashboard.
| Metric | Definition | Source |
|---|---|---|
| Publish velocity | Content pieces published per week | CMS |
| Time to publish | Average time from draft creation to publish | CMS |
| Review turnaround | Average time content spends in review state | CMS |
| Content views | Page views per content piece | Analytics |
| Engagement rate | Avg scroll depth or time on page | Analytics |
| Content freshness | % of published content updated in last 90 days | CMS |
Edge Cases
| # | Edge Case | Expected Behavior |
|---|---|---|
| 1 | Two editors edit the same content simultaneously | Show real-time presence indicators. On save, display conflict resolution UI if changes overlap. |
| 2 | Editor publishes then immediately finds a typo | Allow quick edit on published content without full review cycle. Log the change. |
| 3 | Scheduled content references an unpublished dependency (e.g., author page) | Validation warning at schedule time. Block publish if dependency is not resolved. |
| 4 | Content with 50+ versions | Paginate version history. Show only last 10 by default with "Load more" option. |
| 5 | API consumer requests content that was just unpublished | Return 404 with X-Content-Status: archived header. CDN cache invalidated within 60 seconds. |
Dependencies
| Dependency | Team / Service | Status | Risk |
|---|---|---|---|
| [Rich text editor library] | [Frontend] | [Status] | [Risk level] |
| [Search indexing service] | [Infrastructure] | [Status] | [Risk level] |
| [CDN for content delivery] | [DevOps] | [Status] | [Risk level] |
| [Image processing pipeline] | [Media team] | [Status] | [Risk level] |
Out of Scope
- [Features explicitly excluded]
- [Future phases]
- [Adjacent systems that belong in separate specs]
Filled Example: Blog CMS for SaaS Marketing
Feature Overview
| Field | Details |
|---|---|
| Feature Name | Marketing Blog CMS |
| Owner (PM) | Rachel Torres |
| Owner (Engineering) | David Park |
| Owner (Content) | Emily Walsh (Head of Content) |
| Target Release | Q2 2026 |
| Priority | P0 |
One-line summary: A headless CMS for the marketing blog that supports structured content, editorial review workflows, and API-first delivery to the Next.js frontend.
Context: The marketing team publishes 8-12 blog posts per month. The current WordPress setup has performance issues (3.2s average page load), limited SEO control, and no staging environment for content review. The team wants to move to a headless architecture that integrates with the existing Next.js site.
Content Model
Content Type: Blog Post
| Field | Type | Required | Constraints |
|---|---|---|---|
title | Short text | Yes | Max 70 chars (SEO optimized) |
slug | Slug | Yes | Auto-generated, unique |
body | Rich text | Yes | Supports all editor features |
excerpt | Short text | Yes | 120-160 chars |
featured_image | Media | Yes | Min 1200x630px, max 5MB |
author | Reference | Yes | Single author |
category | Taxonomy | Yes | Single: Product, Engineering, Culture, Growth |
tags | Taxonomy | No | Max 5 |
seo_title | Short text | No | Override for meta title |
seo_description | Short text | No | Override for meta description |
Out of Scope
- User comments or reactions on blog posts (use third-party like Disqus)
- Multi-language content (English only for V1)
- Content personalization based on user segments
- Video hosting within the CMS (embed from YouTube/Vimeo)
