Why agencies are re-evaluating their SaaS stack in 2026
Three signals are converging in 2026. First: Atlassian raised its prices twice in eighteen months and announced in March 2026 the end of Jira Server support (already effective since February 2024), forcing thousands of teams to migrate to Jira Cloud or an open-source equivalent. Second: Slack bundled AI features into the Pro plan without lowering the price, turning a value upgrade into a felt price hike. Third: VPS offers have radically bottomed out — it is now possible to spin up an 8 vCPU / 32 GB RAM server for under $80/month, which shifts the self-hosted break-even point.
The classic objection — "a developer's time costs more than the subscription" — now has an increasingly precise answer. One-click templates and pre-configured Docker images have reduced bootstrapping to under an hour per tool. Routine maintenance runs around 30 to 60 minutes per month. For a 10-person agency, the trade-off is calculable.
What self-hosting actually changes for an agency
- Data ownership: your client projects, code repositories and internal messages never leave your infrastructure — a decisive argument for agencies under strict NDA or handling sensitive GDPR data.
- Budget predictability: a fixed-cost VPS doesn't bill per seat or per usage — you know what you're paying on January 1st for the full year ahead.
- No surprise price hikes: SaaS vendors change their plans and pricing; your VPS won't send you a 30-day price-increase notice.
- Extensive customization: root access, community plugins, internal integrations — you don't wait on a vendor's roadmap for a critical feature.
- Resource sharing: a single VPS can host multiple tools in parallel, splitting infrastructure costs across Plane, GitLab, Mattermost and Uptime Kuma.
- Independence from acquisitions and EOL: Jira Server is dead, Bitbucket Server too. On your own server, you decide how long each tool lives.
The 7 tools — SaaS vs self-hosted (10 users, 1 year)
Scroll the table
| Tool | SaaS Cost (10 people/yr) | Self-hosted | Savings | Deploy time |
|---|---|---|---|---|
| Project management (Jira → Plane) | $948 (Jira Standard, ~$7.90/user/mo) | Included in shared VPS | $948 | < 30 min (Docker Compose) |
| Code & CI/CD (GitHub → GitLab CE) | $480 (GitHub Team, $4/user/mo) | Included in shared VPS | $480 | < 45 min (official image) |
| Messaging (Slack → Mattermost) | $870 (Slack Pro, $7.25/user/mo, annual) | Included in shared VPS | $870 | < 20 min (Docker) |
| Wiki / docs (Notion → Outline) | $1,200 (Notion Plus, $10/user/mo, annual) | Included in shared VPS | $1,200 | < 20 min (Docker) |
| Error monitoring (Sentry → Sentry self-hosted) | $312 (Sentry Team, $26/mo flat, annual) | Included in shared VPS | $312 | < 30 min (official Docker Compose) |
| Infra monitoring (Datadog → Uptime Kuma) | $1,800 (Datadog Infra Pro, $15/host/mo, 10 hosts) | Included in shared VPS | $1,800 | < 10 min (Docker image) |
| Web analytics (GA4 → Plausible / Umami) | $108 (Plausible Cloud Starter, ~$9/mo) | Included in shared VPS | $228 | < 15 min (Docker) |
| TOTAL annual | $5,838 / year | 299 DH/month × 12 + ~$400 estimated maintenance | Up to $4,600–$5,000 / year net |
Calculating your real TCO
The formula is straightforward:
SaaS TCO = Σ annual subscriptions (licences only, excluding overages)
Self-hosted TCO = Annual VPS cost + Maintenance cost (hours × rate) + Initial migration cost (amortised over 2 years)
Net savings = SaaS TCO − Self-hosted TCO
For a 10-person agency running all 7 tools:
- SaaS TCO: $5,838/year
- Dedicated VPS 8 vCPU / 32 GB RAM: 299 DH/month × 12
- Maintenance: 1 hour/month × $60/h = $720/year
- Initial migration amortised (1 dev day at $500, amortised over 2 years): $250/year
Net savings exceed $4,000/year in most realistic scenarios. For agencies that bill infrastructure costs to clients, the margin gain shows up directly on every project.
Requirements for a 10-person agency
The temptation is to start on an entry-level VPS. Bad idea: GitLab CE alone requires a minimum of 4 GB RAM (8 GB recommended). The configuration that keeps the full stack running smoothly:
- VPS recommended to start (3–4 tools): 4 vCPU / 8 GB RAM / 100 GB SSD — from 99 DH/month
- VPS recommended for the full stack (7 tools): 8 vCPU / 32 GB RAM / 200 GB SSD — 299 DH/month
Per tool:
- Plane: 2 GB RAM minimum, 4 GB recommended
- GitLab CE: 4 GB RAM minimum, 8 GB recommended
- Mattermost: 1 GB RAM for < 50 users
- Outline: 1 GB RAM
- Sentry self-hosted: 4 GB RAM minimum (Kafka/Clickhouse engine)
- Uptime Kuma: 256 MB RAM
- Plausible / Umami: 1–2 GB RAM depending on tracked traffic volume
Migrating the 7 tools to a ServOrbit VPS
Provision the VPS and secure access
Order an 8 vCPU / 32 GB RAM VPS from your ServOrbit agency dashboard. Enable SSH key authentication, disable password login and install Docker + Docker Compose. Estimated time: 15 minutes.
Install Plane (project management)
Clone the official Plane repository, copy
.env.example, fill in your domain and rundocker compose up -d. Configure an nginx reverse proxy with HTTPS (Let's Encrypt). Export your Jira data as CSV from Settings > Import/Export. See our detailed guide: installing-plane-vps. Time: 30 minutes.Install GitLab CE (code & CI/CD)
Use the official GitLab CE Docker image. Configure the data volume on a persistent disk, set
external_urland outbound SMTP. Import your GitHub/Bitbucket projects using the built-in migration tool (Settings > Import project). Re-enable your CI runners: GitLab provides its own runners deployable on the same VPS or a separate one. Time: 45 minutes + repository migration time.Install Mattermost (messaging)
Official Mattermost Docker Compose with 3 files (.env, docker-compose.yml, volumes). Configure SMTP and create channels matching your Slack spaces. Use the Slack Data Export tool (available on paid Slack plans) then the Mattermost import script to recover the last 90 days of history. See our guide: hosting-mattermost. Time: 20 minutes.
Install Outline (wiki / docs)
Outline requires a Postgres instance and an S3-compatible bucket (or self-hosted MinIO) for attachments. The official Docker image sets both up in Compose. Export your Notion workspace in Markdown from Settings > Export content, then use the Outline import module. Time: 20 minutes + wiki reorganisation.
Install Sentry self-hosted (error monitoring)
Sentry publishes a
getsentry/self-hostedrepository with an automatedinstall.shscript. It spins up Kafka, Redis, Postgres and Clickhouse — reserve 4 GB of RAM. Migrate your existing DSNs (API keys) by updating theSENTRY_DSNvariable in each of your applications. Time: 30 minutes.Install Uptime Kuma (uptime monitoring)
A single Docker command. Configure the same monitors as your previous Datadog dashboard (URLs, TCP ports, ping). Uptime Kuma supports Slack, email and webhook notifications — connect it to your new Mattermost. See our guide: monitoring-vps-uptime-kuma. Time: 10 minutes.
Install Plausible or Umami (web analytics)
Replace your Google Analytics / Plausible Cloud snippet with the self-hosted version. Plausible provides an official Compose (Postgres + Clickhouse); Umami is lighter (Postgres only). See our comparison to choose: plausible-vs-umami. Redirect your tracking domain and update the snippet in your CMS. Time: 15 minutes.
What to keep on SaaS — and why
Self-hosting is not the universal answer. Some tools remain more appropriate as SaaS depending on your context:
- Enterprise SSO (Okta, Azure AD): if your agency needs to integrate with an enterprise client's SSO, Jira or GitHub SaaS plans offer tested and maintained SAML/OIDC connectors. Self-hosted equivalents exist (GitLab and Plane support OIDC) but the implementation requires IdP expertise.
- HIPAA / SOC 2 compliance: if you handle US healthcare data, Jira Cloud Enterprise and GitHub Enterprise offer signed BAAs. Self-hosted gives you control but also places full compliance responsibility on you.
- Billing and signing tools: payment pipelines (Stripe, DocuSign) are risk zones where self-hosting a custom instance costs more than it saves.
- Video conferencing (Zoom, Meet): Jitsi self-hosted works but audio/video quality with 10 simultaneous participants requires dedicated bandwidth and CPU — the cost/benefit ratio is less favourable.
Troubleshooting — common migration mistakes
1. Under-sizing the VPS for GitLab. GitLab CE with Gitaly (repository storage) consumes 4 GB of RAM at idle. Sharing it with Sentry on an 8 GB VPS means flirting with swap on every large push. Solution: allocate a dedicated VPS for GitLab, or migrate lighter repositories first.
2. Forgetting backups before migration. Export all your SaaS data *before* cancelling subscriptions. Jira blocks exports if your subscription has expired. GitHub Archive Program only covers public projects. Best practice: keep the SaaS subscription active for 30 days after migration.
3. Neglecting the reverse proxy. Without nginx or Caddy in front of your containers, each service listens on a different port (3000, 8065, 9000…). Set up a reverse proxy from day one with dedicated subdomains (plane.your-agency.com, git.your-agency.com) and automatic HTTPS certificates.
4. Not testing automated backups. Each Docker tool must have a daily backup of its Postgres volume to remote storage (S3, ServOrbit bucket). Test the restore within 48 hours of going live — not during a crisis.
5. Migrating all tools at once. Migration fatigue is real. Migrate one tool, wait two weeks for the team to adapt, then move to the next. Recommended order: Plane → Mattermost → Outline → Uptime Kuma → GitLab → Sentry → Analytics.
Scenarios by agency size
Scroll the table
| Team size | Stack | ServOrbit VPS | Annual savings |
|---|---|---|---|
| 5 people | Plane + Mattermost + Uptime Kuma + Plausible | 4 vCPU / 8 GB RAM — 99 DH/month | $1,800–$2,400/year |
| 10 people | Full stack (7 tools) | 8 vCPU / 32 GB RAM — 299 DH/month | $4,000–$5,000/year |
| 25 people | Full stack + dedicated GitLab + dedicated Sentry | 2 × VPS 8 vCPU / 32 GB RAM | $10,000–$14,000/year |