Technical
Strapi vs Custom API: When to Use a Headless CMS
I have built projects with both Strapi and custom FastAPI backends. The choice between them is not about which is better. It is about what your project needs and who will maintain it after you leave.
What Strapi Gives You
Strapi is an open-source headless CMS that gives you a content management UI and a REST/GraphQL API without writing code. Define content types in the UI, and Strapi generates the API endpoints, the admin panel, and the database schema automatically.
Out of the box you get:
- Visual content type builder (no code needed)
- Admin panel with user roles and permissions
- REST and GraphQL APIs auto-generated from your content types
- Media library for images and files
- Webhook support for triggering builds
What a Custom API Gives You
A custom FastAPI (or Django, or Express) backend gives you complete control:
@router.post('/posts', status_code=201)
async def create_post(post: PostCreate) -> PostResponse:
# You control every line of logic
slug = generate_slug(post.title)
reading_time = calculate_reading_time(post.body)
item = save_to_database(post, slug, reading_time)
return format_response(item)No generated code to work around. No plugin system to navigate. No upgrade path to worry about.
The Decision Matrix
| Factor | Strapi | Custom API | |--------|--------|------------| | Non-technical editors | Built-in admin | Must build UI | | Custom business logic | Limited (plugins) | Full control | | Speed to MVP | Very fast | Moderate | | Long-term maintenance | Strapi upgrades | Your code, your timeline | | Hosting cost | Requires Node.js server | Can be serverless ($0) | | Learning curve | Low (visual UI) | Moderate (code) |
When I Choose Strapi
I use Strapi when:
- The client's team will manage content daily without developer help
- Content types are standard (blog posts, pages, FAQs, team members)
- The project needs to launch quickly with minimal custom logic
- The client can afford a small server ($5-15/month for hosting Strapi)
When I Choose Custom
I build a custom API when:
- The business logic is complex (calculated fields, custom workflows, integrations)
- Cost must be $0/month (serverless deployment on Lambda)
- I need full control over the API contract (specific response shapes, custom validation)
- The admin interface can be a separate simple app that I also control
The Hybrid Approach
For some projects, I use both: Strapi for content management (blog, pages, media) and a custom API for business logic (newsletter sending, subscriber management, analytics). The frontend consumes both APIs. This gives non-technical editors the Strapi admin while keeping complex logic in custom code.
The right choice depends on who will use the system after you hand it off.
See the Strapi documentation for the complete getting started guide.
RELATED READING
The Consulting Shift I Am Making In Year Two
After a year of writing and building, my consulting practice is changing shape. Shorter engagements. Sharper outcomes.
ReadThe Frontend Shift: Shipping Less JavaScript In Year Two
A year ago I reached for Next.js for everything. This year I often reach for nothing.
ReadThe Serverless Lesson I Would Write On A Sticky Note
After a year of shipping serverless projects, one rule explains most of the wins and all of the losses.
Read