Self-hosted CRM and GTM stack: what to run, what to skip
Seven tools cover the customer pipeline: Twenty CRM for contacts and deals, Chatwoot for support conversations, Mautic or Listmonk for email, Billionmail for sending, Cal.diy for booking links and Formbricks for surveys. All seven are free to run. The cost is one server, which is $100/month for a Liquid Web 8 GB Managed VPS (checked 2026-09-09) against $1,055/month for the HubSpot and Intercom plans that replace three of them.
What this page is not: an install guide. Each tool has its own page below with a working Compose file. This one answers which of the seven to bother with.
Which of these seven should you run?
| If you… | Run | Why |
|---|---|---|
| Need a CRM your sales team will actually open | Twenty CRM | Four containers, one required secret, 56,484 stars |
| Need a shared inbox and a website chat widget | Chatwoot | Measured 1.1 GB idle, and it replaces a per-seat Intercom bill |
| Only send newsletters | Listmonk | 512 MB idle, one Go binary, AGPL-3.0, no per-email fee |
| Need lead scoring and multi-step campaigns | Mautic | The only full automation platform here. Read its funding section first |
| Send from your own IP at volume | Billionmail | Your own SMTP, and your own deliverability problem |
| Want Calendly without the seat price | Cal.diy | MIT since April 2026, but no teams, workflows or SAML |
| Want in-product surveys | Formbricks | Good product, six services, no published minimum spec |
| Have under 1,000 contacts and two support seats | Nothing here | The SaaS bill is smaller than the server bill. See below |
Star counts read from the GitHub API on 2026-09-09.
Most teams need three of the seven, not all of them. Start with the CRM, add the inbox, add email last.
What does this cost against HubSpot and Intercom?
Same workload in both columns: three seats, 2,000 marketing contacts, one support inbox.
| Job | The SaaS you are replacing | Price, checked 2026-09-09 |
|---|---|---|
| CRM plus marketing automation | HubSpot Marketing Hub Professional | $800/mo for 3 core seats and 2,000 marketing contacts, plus a required $3,000 one-time onboarding fee |
| Support inbox | Intercom Advanced | $85 per seat/mo, so $255 for three, plus $0.99 per Fin AI resolution |
| Newsletters | Mailchimp Standard | $20/mo at 0-500 contacts is a promotional first-year rate; the undiscounted list price for your contact tier applies afterwards, and it rises with list size |
| All three, self-hosted | Twenty + Chatwoot + Mautic on one VPS | $100/mo for the server. $0 for the software |
Prices read from hubspot.com/pricing/marketing, intercom.com/pricing, mailchimp.com/pricing/marketing and liquidweb.com/vps-hosting/managed-vps on 2026-09-09.
The two headline rows add up to $1,055/month plus $3,000 to start, which is $15,660 in year one. The same three jobs on one 8 GB Managed VPS cost $1,100 in year one, taking the two-month intro price of $50/mo into account. Adding a fourth seat changes the first number and not the second.
That gap is real, and it is not free money. You are buying the software with your own time: Postgres major-version upgrades, backups you have tested by restoring them, and a 2am pager when the box fills its disk. If nobody on the team wants that job, the honest answer is to keep paying HubSpot.
What actually fits on one 8 GB server?
| Tool | Idle RAM we measured | Measured against | Do we still stand behind it? |
|---|---|---|---|
| Listmonk | 512 MB | v6.1.0, 2026-05-02 | Yes |
| Billionmail | 600 MB | 2026-05-01 | Yes |
| Chatwoot | 1.1 GB | v4.13.0, 2026-05-01 | Directional. The compose file now defaults to v4.17.1 |
| Mautic | 1.4 GB | 2026-05-01 | Yes |
| Twenty CRM | Withdrawn | — | No. Twenty's own docs state a 2 GB minimum |
| Cal.diy | Withdrawn | — | No. The fork added Redis and a separate API service |
| Formbricks | Withdrawn | — | No. Version 5 added three services |
All measurements were taken on local Docker with 4 vCPU and 8 GB of RAM. Where a project changed shape we withdrew the number rather than relabeling it, because a footprint measured against a five-container stack tells you nothing about a four-container one.
Twenty, Chatwoot and Listmonk on one 8 GB box is the combination we would deploy today. Budget 2 GB for Twenty per its own documentation, 1.1 GB for Chatwoot and 512 MB for Listmonk, then leave the rest for Postgres and Caddy. If you also want Mautic, move to the 16 GB tier.
Which of these changed shape this year?
Three of the seven changed during 2026 in ways that invalidate any guide written before them.
Cal.com is no longer the thing you self-host. On 15 April 2026 the company moved its production codebase into a private repository. The public repo became calcom/cal.diy and its license changed from AGPL-3.0 to MIT (cal.com blog, read 2026-09-09). Cal.diy ships the scheduling engine, the app store framework and the booking infrastructure, with teams, organizations, workflows and SAML SSO removed. Any tutorial describing a self-hosted Cal.com with enterprise features is describing software you can no longer clone.
Formbricks 5 is a six-service deployment. Its own Docker guide now lists the web app, PostgreSQL, Valkey, the Formbricks Hub, Cube and SpiceDB, plus four migration and bootstrap jobs. Formbricks publishes no minimum RAM or CPU figure (formbricks.com/docs, read 2026-09-09). Size that server generously or stay on their cloud.
Twenty dropped its front-end container. The documented stack is now the server, a worker, PostgreSQL and Redis, with ENCRYPTION_KEY and a Postgres password as the only required secrets, and a stated floor of 2 GB RAM (docs.twenty.com, read 2026-09-09).
One more to check before you commit. Mautic's Open Collective shows a $1,126.11 balance and an estimated annual budget of $136,562 against a stated goal of $80,000/year for one full-time developer (opencollective.com/mautic, read 2026-09-09). Its funding is an open question rather than a settled one, and the Mautic guide covers what that means for the release cadence.
How healthy is each project?
| Project | Stars | License reported by the GitHub API | Last push |
|---|---|---|---|
twentyhq/twenty | 56,484 | NOASSERTION | 2026-09-09 |
calcom/cal.diy | 48,322 | MIT | 2026-09-09 |
chatwoot/chatwoot | 36,632 | NOASSERTION | 2026-09-09 |
knadh/listmonk | 23,338 | AGPL-3.0 | 2026-09-06 |
Billionmail/BillionMail | 15,569 | AGPL-3.0 | 2026-06-11 |
formbricks/formbricks | 12,917 | NOASSERTION | 2026-09-09 |
mautic/mautic | 10,470 | NOASSERTION | 2026-09-09 |
Read from the GitHub API on 2026-09-09. NOASSERTION does not mean unlicensed. It means GitHub could not match the LICENSE file to a standard SPDX identifier, which usually signals a modified or multi-part license file rather than the absence of one. Read the file yourself before you build a business on any of them.
Billionmail is the only one of the seven with no push in the last 90 days. That is not abandonment, and 15,569 stars is a real community, but it is the row to re-check before you point your MX records at it.
When should you not self-host any of this?
- You are under about 1,000 contacts and two support seats. Entry SaaS tiers are cheap because you are small. A server costs the same whether it holds 200 contacts or 200,000, so the arithmetic only turns in your favor with scale.
- Cold outreach is the business. Running your own SMTP means IP warming, SPF, DKIM, DMARC and a sender reputation you can destroy over a weekend. Buy sending from a provider and self-host everything else.
- Procurement needs a SOC 2 report. You cannot hand your auditor a Docker Compose file. That requirement decides it before any feature comparison does.
- You need Cal.com's teams, workflows or SAML. Those features left with the closed-source move and are not coming back to cal.diy.
Where to run the stack
The obvious objection is that a self-managed VPS starts at a fraction of that price, and it does. Liquid Web's Self-Managed line is $17/mo for 4 GB. Managed buys OS patching, firewall configuration and 24/7 support, which matters here because this stack runs a database holding your customer list. Take the self-managed box if you already run servers for a living, and the managed one if this would be your first.
Email sending is the exception to one-server thinking. Billionmail wants a dedicated IP that has never sent spam, so keep it off the box that also serves your marketing site.
Guides in this category
- Twenty CRM on Docker Compose: four containers, one secret, seat math against Twenty's cloud
- Chatwoot support inbox: 1.1 GB idle measured, and the Intercom bill it replaces
- Mautic marketing automation: 1.4 GB idle, MariaDB, and the funding disclosure
- Listmonk newsletters: 512 MB idle, a single Go binary, PostgreSQL
- Billionmail SMTP: self-hosted sending, dedicated IP, warming schedule
- Cal.diy booking: the MIT fork, what it lost, and the Calendly comparison
- Formbricks surveys: what version 5 changed and what it now costs to host
No guide yet for EspoCRM, Postal or FreeScout. They are on the list; we do not write up software we have not deployed.
There isn't one product that matches HubSpot, because HubSpot bundles a CRM and a marketing automation platform. Self-hosting splits that into two: Twenty CRM for contacts, deals and pipelines, and Mautic for campaigns, lead scoring and landing pages. Both are free software; the cost is a server, at $100/mo for a Liquid Web 8 GB Managed VPS checked 2026-09-09, against $800/mo plus a $3,000 onboarding fee for HubSpot Marketing Hub Professional with 3 seats and 2,000 marketing contacts (hubspot.com/pricing/marketing, checked 2026-09-09).
Three of them, comfortably. Twenty CRM, Chatwoot and Listmonk fit on 8 GB: Twenty's own docs put its floor at 2 GB, we measured Chatwoot at 1.1 GB idle on v4.13.0 and Listmonk at 512 MB on v6.1.0, both on local Docker with 4 vCPU and 8 GB in May 2026. Adding Mautic at 1.4 GB idle takes the idle total near 5 GB, and we measured a 2.4 GB peak on Mautic alone while it processed a 5,000-contact campaign. That is tight rather than impossible. Move to the 16 GB tier for four or more.
Not as Cal.com. On 15 April 2026 Cal.com moved its production codebase to a private repository and relaunched the public one as calcom/cal.diy under the MIT license, down from AGPL-3.0 (cal.com/blog/cal-diy-open-source-to-closed-source, read 2026-09-09). Cal.diy is the version you self-host. It carries the scheduling engine, app store framework and booking infrastructure, without teams, organizations, workflows or SAML SSO.
Listmonk. It is a single Go binary next to PostgreSQL, and we measured 512 MB idle on v6.1.0 on 2026-05-02, which fits a 4 GB VPS at $72/mo regular or $36/mo for the first two months on Liquid Web's managed line (checked 2026-09-09). Billionmail is next at 600 MB idle, but it needs a dedicated IP, so its real cost is higher than its RAM suggests.
For bulk sending, yes. A shared IP inherits whatever reputation the neighbors built, and mailbox providers score the sending IP before they read your headers. You also need SPF, DKIM and DMARC records that match, plus a warming schedule that ramps volume over weeks. If you send fewer than 50,000 emails a month, a transactional provider is cheaper and far less risky than owning that problem.