Self-Hosted CMS for Agencies: Multiple Client Sites (2026)
The honest operational guide to per-client installs, bulk deploys, and licensing math
TL;DR: A self-hosted CMS lets an agency run every client site on the same codebase without paying a SaaS vendor per-seat or per-site forever. The trade-off: each site is a separate install on the client's own hosting, not a multi-tenant dashboard. This guide covers the install pattern, the licensing math, the day-to-day workflow, and the parts agencies actually find painful.
Most agencies running on a SaaS CMS hit the same wall around year two. The 15-site Webflow bill creeps past $500/month. The Contentful Growth plan jumps because one client's marketing team wanted four extra users. The DatoCMS contract renews 28% higher than last year. None of these costs map to value the agency is creating — they map to vendor revenue growth.
A self-hosted CMS flips that math. One license, unlimited installs, hosted on the client's own server. Below is how to actually make it work — install pattern, deployment, updates, and where the rough edges still are.
What "Self-Hosted CMS for Agencies" Actually Means
A self-hosted CMS for agencies is the same CMS code installed separately on each client's hosting, with the agency holding one license that covers all installs. Each client site has its own database, own admin login, own files. There is no central multi-tenant dashboard that shows all 30 sites in one place — that's a different product category called multi-tenant SaaS.
This distinction matters because most "agency CMS" comparison articles blur it. SaaS platforms like Webflow give you one dashboard with all client sites listed. Self-hosted platforms give you 30 separate Laravel installs you log into individually. Both can work for agencies. They're just different operational models.
The self-hosted model wins on cost and ownership. SaaS wins on centralized visibility. Pick based on which problem hurts more.
Why Agencies Are Looking at Self-Hosted CMS in 2026
Three things changed in the last 18 months. First, SaaS CMS pricing got worse — Webflow's per-site costs increased twice in 2025, Contentful repriced their Business tier upward, and Sanity capped free document counts more aggressively. Second, Laravel and shadcn/ui made self-hosted admin UIs look as polished as the SaaS competition. Third, agencies discovered that monthly SaaS bills are the easiest line item to cut when client retainers shrink.
The hidden driver is client ownership conversations. When a client asks "where is my content stored?" or "what happens if you raise rates?" — those are now sales questions on RFPs. Agencies that can answer "your hosting, your database, your control" close deals against SaaS-locked competitors.
What the Math Looks Like for 10 Client Sites
| Platform | Year 1 | Year 3 | Year 5 |
|---|---|---|---|
| Webflow CMS (10 sites, Business plan) | $4,680 | $14,040 | $23,400 |
| Contentful Team (10 sites est.) | $7,800 | $23,400 | $39,000 |
| Hygraph Growth (10 sites) | $35,880 | $107,640 | $179,400 |
| Self-hosted (one Agency license + $15/mo per-site hosting) | $2,799 | $6,399 | $9,999 |
Numbers above assume agency-style usage: 10 sites, light editor seats per site, no premium add-ons. Your math will be different — but the shape of the curve is consistent. SaaS scales linearly with your client roster. Self-hosted scales with hosting only, which is a near-flat per-site commodity cost.
How the Install Pattern Works
Every client gets their own Laravel install. The structure looks like this:
/var/www/
├── client-acme.com/ # ACME Corp — Laravel install
│ ├── .env
│ ├── database/sqlite or external MySQL
│ └── storage/uploads
├── client-beta.com/ # Beta Inc — Laravel install
│ ├── .env
│ └── ...
└── client-gamma.com/ # Gamma LLC — Laravel install
└── ...
Each .env file holds that client's database credentials, mail config, and admin URL. Each install is independent — restoring a backup for ACME Corp does not touch Beta Inc. The CMS code is identical across all of them, but the content, users, and uploads are fully isolated.
This is the safest tenancy model for an agency because there is zero data-leak risk between clients. A bug in one install cannot expose another client's drafts. A compromised admin account at one client cannot pivot to another. Compliance-conscious clients (healthcare, finance, EU/GDPR) prefer this isolation in writing.
Where the Sites Live
You have three reasonable hosting setups:
- Client's existing hosting — they already pay $15/month for PHP hosting somewhere. Install there. They own the bill, you handle the deployment. Zero infrastructure cost to your agency.
- Shared VPS you own — one $40/month Hetzner box runs 15-20 client sites under Nginx server blocks. Agency owns hosting, bills clients flat-rate. Higher margin, higher operational burden if a server goes down.
- Per-client cloud account — DigitalOcean droplet per client under the client's billing. Middle ground: agency builds + maintains, client owns the bill and the box.
Pattern #1 is the path of least resistance for most agencies. Pattern #2 is where agencies build a recurring-revenue tier on top of the CMS. Pattern #3 is what enterprise clients with procurement teams want.
Day-to-Day Agency Workflow
The repeating loop for an agency running multiple client sites looks something like this:
- Initial deploy — clone the CMS, set up
.env, runphp artisan migrate, seed first admin user, configure DNS, ship. - Content handoff — give the client editor accounts, walk them through publishing once, hand over the login URL.
- Updates — when a new CMS version ships,
git pull+composer install --no-dev+php artisan migrateon each install. Most agencies batch this monthly. - Support — client breaks something, you SSH in, fix it. Or you have a runbook of common fixes the junior dev can follow.
The honest pain point here is step 3. Updating 15 sites one by one is tedious. Agencies typically solve this in one of two ways:
- A shared deploy script that loops through a list of client SSH targets and runs the update commands. Two hours to write, saves dozens of hours per year.
- A meta-repo that holds the CMS as a git submodule or subtree, and a
deploy-all.shthat pushes updates to a registered list of client servers.
UnfoldCMS ships an opinionated php artisan deploy command — single-target by default, but the source is short enough to wrap in a loop. There's no built-in fleet management dashboard, and most agencies do fine without one.
Bulk Updates Without Multi-Tenancy
You don't need a fancy admin to update 15 sites. A 20-line bash script over SSH does it:
#!/bin/bash
CLIENTS=(acme.com beta.com gamma.com)
for site in "${CLIENTS[@]}"; do
echo "Updating $site..."
ssh deploy@$site "cd /var/www/$site && \
git pull && composer install --no-dev && \
php artisan migrate --force && \
php artisan config:clear"
done
This works because every install is the same Laravel app. The script is dumb on purpose — when something breaks on client #7, the script stops, you fix it, you re-run from #7. That predictability is more valuable than a slick dashboard.
What Self-Hosted CMS Cannot Do for Agencies (Honest Version)
Three things SaaS does that self-hosted does not. Read these before you make a switch.
No central editor view across clients. If a client emails you saying "the homepage hero is broken," you log into their admin, not a multi-site dashboard. Webflow can show you all 30 sites at once. Self-hosted cannot, by design — each install is sandboxed. Some agencies build a small internal tool that pings each site's API for status, which is enough.
No vendor uptime guarantee. If your shared VPS goes down at 2am, you fix it — not Contentful's SRE team. Most agencies offload this to managed hosting providers (Forge, Ploi, Cloudways) for a small per-site fee. You still own the relationship; you just outsource the pager.
No vendor-paid feature roadmap. If a client asks for a feature the CMS doesn't have, you either build it (Laravel extensibility is fine for this) or wait for upstream. SaaS CMS roadmaps are funded by vendor revenue — they move faster on big-ticket features like AI tooling, ecommerce integrations, and visual builders.
If any of these three are dealbreakers, stay on SaaS. The cost math doesn't matter if the operational model doesn't fit your team.
Licensing — How Per-Site Math Works
The way self-hosted CMS vendors price agencies varies a lot. Three patterns dominate:
- Per-site annual — Statamic charges per-site, renewable. Roughly $259/site/year for the Pro tier. Predictable, but scales linearly.
- Per-developer seat — Craft CMS pricing is per-project but offers Solo/Pro Studio tiers. Pro Studio is around $299/site one-time + $99/site/year for updates.
- Unlimited under one agency license — UnfoldCMS Agency tier is a one-time $999 for unlimited client installs, including white-label and resale rights.
For agencies past 5-7 client sites, the "unlimited" pattern wins on math. Below that, per-site can be cheaper depending on how aggressive your renewals are. Run the 3-year and 5-year numbers before signing — sticker price is a poor indicator at year 4.
If you want a worked example of the licensing comparison, Best Self-Hosted CMS Platforms in 2026 breaks down five common platforms with current pricing.
Migrating an Agency Off SaaS — Where to Start
Don't migrate all 15 clients at once. Pick one. Specifically:
- The client whose contract is up for renewal in 30-60 days. They're already thinking about cost.
- A client with simple content — blog, marketing pages, no e-commerce, no per-region content. Easy first migration.
- A client who has asked about data ownership. They'll buy into the story.
Run the first migration end-to-end. Document every step. The second migration takes half the time. By the fifth, you have a repeatable playbook and a 1-week migration estimate you can confidently quote.
The two reference posts for the actual migration work: How to Migrate from WordPress to UnfoldCMS for content-heavy sites, and CMS Migration Guide for Developers for the broader playbook.
What Clients Usually Get Wrong During Migration
Three predictable issues:
- They under-estimate the editor retraining. A client team that's lived in Webflow's visual builder for three years will be uncomfortable with any block-based editor for the first two weeks. Build a 1-hour onboarding into your migration quote.
- They forget about scheduled content. Posts queued for the next two weeks need to be re-scheduled in the new CMS, not lost.
- They miss the SEO/redirect work. Slugs change. Old URLs need 301s. Skip this and organic traffic dips for 60 days. Every migration quote should include a redirect map deliverable.
Soft CTA — When This Fits Your Agency
A self-hosted CMS works for agencies that have at least three of these traits: 5+ active client sites, a developer in-house (or contractor on retainer) who knows Laravel or PHP, clients who care about data ownership, and at least one client whose SaaS bill has become a sore point. If you have those, the math will work out.
UnfoldCMS ships an Agency license tier specifically for this pattern — one-time $999, unlimited installs, white-label admin, resale rights. The pricing page has the current tier breakdown. The cms-for-agencies page covers the sales-side comparison vs Webflow and Contentful.
This guide is about how the operational model actually works day-to-day. The pricing page is about whether the cost makes sense. Both are useful — read both before you decide.
FAQ
Can I run multiple client sites from one CMS install?
Not safely. Each client should have a separate install with their own database and .env. Sharing one install means a bug or compromised admin account can leak data across clients. The cost of running separate installs is marginal — a few minutes per deploy. The risk reduction is significant.
How do agencies handle CMS updates across 20 client sites?
Most write a small bash script that loops over SSH targets and runs the update commands sequentially. Some use Laravel Forge, Ploi, or Cloudways for managed deploys. Both approaches work. The script approach is free and transparent. The managed-host approach costs a few dollars per site per month and reduces operational burden.
Is self-hosted CMS GDPR-compliant for EU agencies?
Yes, more easily than SaaS. Each client install runs on hosting the client controls. Data residency is whatever the client picks. No third-party data processor agreement is needed because there is no third-party data processor — the agency is acting on the client's hosting. Self-Hosted CMS and GDPR covers the full compliance picture.
Can clients log in and edit content directly, or does the agency edit for them?
Both are common. Most agencies give clients editor-role accounts so non-technical staff can publish posts, edit pages, and manage media. The agency handles structural changes (new content types, theme tweaks, integrations). The CMS supports role-based permissions out of the box.
What happens to client sites if the agency closes?
This is the strongest argument for self-hosted in client conversations. The client owns their hosting, their database, their code (under the agency license terms). If the agency disappears, the client hires another developer to take over. With a SaaS CMS, the client is locked into the vendor's pricing and roadmap regardless of who builds the site.
Methodology
Pricing numbers above pulled from Webflow, Contentful, Hygraph, Statamic, and Craft CMS public pricing pages as of May 2026. UnfoldCMS Agency pricing from unfoldcms.com/pricing. Migration workflow steps based on the standard Laravel deploy pattern and observations from agencies that have moved 3+ client sites off SaaS in the last 12 months. Where exact numbers were unavailable, I marked them "estimated" and used the lowest reasonable tier for the use case.
If anything in the above is wrong or out of date, the pricing pages take precedence over this article. SaaS vendors reprice without notice.
Free & Open Source
Own your CMS. No subscriptions.
Unfold CMS is free to download and self-host. Built on Laravel + React, full source code included.
Share this post: