Getting Started with WriteCMS

Base URL: https://api.writecms.com/api/v1

All endpoints require an API Key sent via the x-api-key header.

Your Project ID and API Key can be found in your dashboard: open your project, then go to Settings click on API Access.

Projects

Access and retrieve project information.

GET /projects (Auth Required)

Fetch a list of all projects

GET /projects/:projectId (Auth Required)

Retrieve details of a single project by its unique ID

Categories

Retrieve categories within a given project and posts under category.

GET /projects/:projectId/categories (Auth Required)

Fetch all categories belonging to a specific project

GET /projects/:projectId/categories/:categoryId (Auth Required)

Retrieve category details by ID and its posts

GET /projects/:projectId/categories/:categorySlug (Auth Required)

Retrieve category details by slug and its posts

Posts

Access posts published under a project.

GET /projects/:projectId/posts (Auth Required)

Fetch all posts available in a given project

GET /projects/:projectId/posts/:postId (Auth Required)

Retrieve details of a post by its ID

GET /projects/:projectId/posts/slug/:postSlug (Auth Required)

Retrieve details of a post by its slug

Research

Access AI-powered research content ideas.

GET /projects/:projectId/research-content-ideas (Auth Required)

Integration Example (JavaScript)

const PROJECT_ID = '<PROJECT_ID>';
const API_KEY = '<YOUR_API_KEY>';

const res = await fetch(`https://api.writecms.com/api/v1/projects/${PROJECT_ID}/posts`, {
  headers: { 'x-api-key': API_KEY }
});
const data = await res.json();
console.log(data);

UI Components

All UI components are built with shadcn/ui and are fully customizable.

Blog Card

Displays a blog post summary with title, author, date and excerpt.

BlogCard Props

PropTypeDefaultDescription
titlestringPost title displayed prominently on the card.
thumbnailLinkstring | nullnullOptional image URL shown as the card thumbnail.
authorstring | nullnullAuthor name shown in the meta line.
datestring | Date | nullnullDate of publication. Strings are formatted to a readable date.
categorystring | nullnullCategory or tag label displayed above the title.
timeToReadnumber | string | nullnullEstimated read time (minutes). A string is rendered as-is.
excerptstring | nullnullShort summary of the post displayed under the title.
hrefstring | nullnullLink to the full post. Renders the card as an anchor when provided.
classNamestring""Additional classes to customize spacing or layout in your app.
variant"minimal" | "elegant" | "carded" | "overlay" | "border" | "ghost""minimal"Visual style of the card. Choose the design that fits your UI.

Installation

To use this component, you need to install shadcn and add the blog card component to your project.

npx shadcn@latest add https://writecms.com/registry/blog-card.json

Blog Detail Page

Detail page for a blog post.

How to Build a SaaS Product from Scratch in 2025

How to Build a SaaS Product from Scratch in 2025

✍️ Sophie Nguyen📅 9/10/2025 4 min read

Building a successful SaaS product today requires more than good code — it needs tight validation, rapid iteration, and a lightweight but resilient architecture. This guide walks through the practical steps I use when launching SaaS products: idea validation, minimum viable product (MVP) planning, core architecture, metrics to watch, and growth tips that actually work in 2025.

1. Validate the idea before you start

Too many founders fall in love with features instead of a problem. Spend 2–4 weeks validating the problem and willingness to pay. Simple tactics:

  • Talk to 20 potential customers (15–30 minute calls).
  • Create a one-page landing page describing the solution and an email CTA.
  • Run a small ad test or post in niche communities to measure interest.

Quick validation checklist

  1. Can you clearly explain the problem in one sentence?
  2. Do 20%+ of visitors sign up for early access?
  3. Are at least 5 people willing to talk in-depth?

2. Define the MVP

Your MVP should solve the core problem with the minimum number of features. Resist the urge to add bells and whistles. Example of a simple MVP breakdown:

Area What to include Why
Auth & Accounts Email/password + OAuth (Google) Essential for user data and trust
Core Feature One primary workflow that solves the main problem Provides immediate value and testable hypothesis
Billing Stripe integration (single plan) Tests willingness to pay
Analytics Basic events + GA/Amplitude Measure activation & engagement

3. Technical architecture (lean but scalable)

Choose technologies that let you move fast but don’t block scaling later. A common 2025 stack I recommend:

  • Frontend: Next.js (app router) with React Server Components for fast first paint.
  • Backend: Node.js + Fastify/Express or a serverless API (Vercel / AWS Lambda) depending on traffic expectations.
  • Database: PostgreSQL (primary), Redis for caching/short-lived state.
  • Auth & Billing: Auth0 or Clerk for auth; Stripe for billing.
  • Storage: S3-compatible (Backblaze/Cloudflare R2) for file storage.

Sample minimal infra diagram

Client (Next.js) --> CDN (Vercel/Cloudflare) --> API (Serverless) --> DB (Postgres)
                       \--> Redis (cache)
                       \--> S3 (uploads)

4. Key metrics to track (startup north stars)

Measure these early and often. Set dashboards and check them daily for the first 90 days.

  • Acquisition: Organic visits, paid conversions, referral sources.
  • Activation: % of users who complete the core workflow.
  • Retention: D1/D7 retention — does your product stick?
  • Revenue: MRR, average revenue per user (ARPU), churn.

5. Launch and early growth

Launch to a small, targeted audience first. Tactics that work:

  1. Beta invites to people who validated the idea.
  2. Secure one or two niche partnerships (blogs, communities, tools).
  3. Content marketing: high-signal articles + practical examples.
  4. Product Hunt or Indie Hackers launch if your audience is product-oriented.

6. Post-launch: iterate based on signals

Use qualitative calls and quantitative data. Prioritize fixes that move the metrics, not your vanity features. A simple prioritization matrix:

Impact Effort Priority
High Low Do it now
High High Plan & schedule
Low Low Do if time

7. Practical checklist for your first 90 days

  • Week 0–2: Validate & build landing page
  • Week 3–6: Build MVP core feature + auth + billing
  • Week 7–10: Invite beta users, collect feedback
  • Week 11–12: Launch public beta + marketing push

Conclusion

Launching a SaaS in 2025 is about speed, data-informed decisions, and focusing on the core problem you solve. Keep the tech simple, instrument everything, and iterate quickly based on real users. If you consistently optimize for activation and retention, revenue will follow.

Good luck — ship fast, listen hard, and iterate.

BlogDetail Props

PropTypeDefaultDescription
thumbnailstring | nullnullOptional image URL shown as the blog post header thumbnail.
titlestringMain title of the blog post.
authorstring | nullnullName of the blog post author displayed under the title.
datestring | nullnullPublication date of the blog post. Should be a formatted string.
breadcrumb{ homeLabel?: string; categoryLabel: string; categoryHref: string; titleLable: string }Breadcrumb navigation data for the post (Home › Category › Title).
isUpdatedbooleanfalseIndicates whether the post has been recently updated.
contentstringThe full HTML content of the blog post.
timeToReadnumber | nullnullEstimated time to read the post in minutes.
classNamestring""Additional CSS classes to customize the layout or styling.
tableOfContentsbooleanfalseIf true, renders a table of contents based on headings in content.
shareButtons{ url: string; title: string }Data used to configure social share buttons for the post.

Installation

To use this component, you need to install shadcn and add the blog card component to your project.

npx shadcn@latest add https://writecms.com/registry/blog-detail.json