Chatwoot self-hosted costs nothing per agent: the MIT-licensed Community Edition runs from the official Docker Compose file as four containers (a Rails web app, a Sidekiq background worker, PostgreSQL and Redis) on a Linux VPS with 4 GB of RAM, the minimum in Chatwoot's docs. In our lab on 18 October 2026, Chatwoot v4.18.0 used 1.1 GiB of memory at idle and 1.2 GiB with 20 website visitors chatting at once on 2 vCPUs, and it still ran when we cut the server to 2 GiB.
Chatwoot is an open-source support inbox: website live chat, email, WhatsApp, Telegram and social messages land in one dashboard that your agents answer, much like Intercom. For a business inbox we would buy the documented minimum, 4 vCPUs and 4 GB, which is our VPS Mini. Specs and availability by city are on our VPS hosting plans page.
Key facts, checked on 18 October 2026:
- The latest release is v4.18.0, published on 18 September 2026; v4.17.0 came on 20 August and v4.16.0 on 18 July (GitHub releases).
- Code outside the
enterprise/folder is MIT-licensed (LICENSE). Self-hosted, the Community Edition costs $0 per agent, Premium Support $19 and Enterprise $99 per agent per month (self-hosted plans). - The docs call 4 GB of RAM "the required minimum" and 4 cores the recommended minimum, for up to 10,000 conversations a day; 8 GB and 8 cores cover 20,000. They ask for at least 1 GB of swap during upgrades (system requirements).
- Intercom Essential costs $29 per seat per month billed annually or $39 billed monthly, and its Fin AI agent adds $0.99 per outcome (Intercom pricing).
Chatwoot system requirements: official minimum vs our measurements
We ran the official Compose file on 18 October 2026 on our Amsterdam test server, in a Debian 13 container limited to 2 vCPUs and 4 GiB of RAM, without swap. Other labs shared the host, so treat CPU figures as a guide. 1 GiB is 1,024 MiB, about 1.07 GB.
| Item | Chatwoot docs | Our lab, v4.18.0 |
|---|---|---|
| RAM | 4 GB minimum, up to 10,000 conversations a day | 1,147 MiB in use at idle, 1,267 MiB peak with 20 visitors at once |
| CPU | 4 cores recommended minimum | 2 vCPUs ran full at about 9 messages per second |
| Swap | At least 1 GB for upgrades | None; the upgrade database step peaked at 1,383 MiB in a 2 GiB test |
| Disk | At least 5 to 10 GB for PostgreSQL | 4.8 GB for the whole server, 3.5 GB of it images; database 27 MB after 937 conversations |
| Software | Docker 20.10.10 or newer, Redis 7.0 or newer | Docker 29.9.1, PostgreSQL 16.15, Redis 8.10.2 |
Why ask for 4 GB when Chatwoot idles at 1.1 GiB? The official minimum covers a busy inbox: agent dashboards open all day, mailboxes polled over IMAP, attachments resized. The same page warns that Sidekiq alone can pass 1 GB on a very active server. Read our numbers as the floor, not the target.
What the Chatwoot Docker Compose file runs
The official Docker guide uses one Compose file that starts the chatwoot/chatwoot image twice, as web app and worker, next to pgvector/pgvector:pg16 and redis:alpine. Every published port listens on 127.0.0.1 only, so nothing is reachable from the internet until you add a reverse proxy.
| Container | What it does | Idle, docker stats | Process memory only |
|---|---|---|---|
| rails | Web app, API and chat widget on 127.0.0.1:3000; one Puma process (the Ruby web server) with 5 threads | 443 MiB | 398 MiB |
| sidekiq | Background jobs: notifications, emails, webhooks, reports | 544 MiB | 491 MiB |
| postgres | The database; the pgvector image adds vector search, which Chatwoot 4 expects | 67 MiB | 16 MiB |
| redis | Job queue, cache and rate-limit counters | 10 MiB | 7 MiB |
| base | A template the two Chatwoot services copy their settings from; it has no job and stops right after start | Not running | 0 |
Readings 12 minutes after start. "Process memory" is the anon value from each container's cgroup, without the file cache that docker stats partly counts; our RAM guide for 34 self-hosted apps explains the gap.
How much chat traffic can 2 vCPUs handle?
On 18 October 2026, self-hosted Chatwoot v4.18.0 on 2 vCPUs and 4 GiB handled 8.4 to 9.1 messages per second with 1 to 20 widget visitors at once, and not one request failed. Each simulated visitor opened the widget, which creates a contact, and sent three messages from its own client address; an agent answered twice through the API. Nobody paused to type, so this is a worst case. Each step lasted 60 seconds.
| Visitors at once | Messages per second | New conversations in 60 s | Visitor message, p95 | Agent reply, p95 | Peak RAM in use |
|---|---|---|---|---|---|
| 1 | 8.4 | 102 | 0.17 s | 0.13 s | 1,228 MiB |
| 2 | 8.7 | 105 | 0.33 s | 0.25 s | 1,237 MiB |
| 5 | 9.1 | 110 | 0.82 s | 0.55 s | 1,259 MiB |
| 10 | 8.9 | 110 | 1.40 s | 1.17 s | 1,265 MiB |
| 20 | 8.6 | 120 | 2.71 s | 2.47 s | 1,267 MiB |
A p95 of 0.17 s means 95 out of 100 messages were saved within 0.17 seconds. Memory barely moved; CPU was the limit. Rails used 74 to 83% of one vCPU, Sidekiq 81 to 85% and PostgreSQL 14 to 16%, about 1.8 of the 2 vCPUs. Sidekiq ended each step with 500 to 1,060 jobs waiting and cleared them within 9 seconds.
For scale, 10,000 conversations a day is about 7 a minute; we pushed more than 100 a minute. Bursts make answers slower, not lost. A second Puma process (WEB_CONCURRENCY=2, see the tuning guide) cut throughput to 7.8 messages per second on 2 vCPUs and grew the rails container to 783 MiB, so it only pays when you have spare cores.
Can Chatwoot run on 2 GB of RAM?
Yes, for a trial. We cut the same container to 2 GiB, the size of a VPS Micro, and cold-started the stack: 889 MiB in use at idle, 9.0 messages per second with 20 visitors, 1,140 MiB at peak. The database step that every upgrade runs, started next to the live stack, peaked at 1,383 MiB. Nothing was killed for lack of memory and no container restarted.
That leaves about 660 MiB for everything we did not test: email polling, attachments, a whole team online. A VPS Micro (2 vCPU, 2 GB, 40 GB NVMe) suits a trial; a business inbox belongs on a VPS Mini (4 vCPU, 4 GB, 80 GB NVMe), which meets the official minimum. You can move from one to the other later in the client area with a short reboot. Both are on the VPS plans page.
How to install Chatwoot with Docker on Debian 13
Steps 1 to 5 follow the official Docker guide; for HTTPS we used Caddy, where the guide shows nginx. Every command below ran in our lab, which used a test name and Caddy's internal certificate. New to containers? Start with our Docker on a VPS guide. Before you start, have ready:
- A Debian 13 server with root SSH access: 4 GB of RAM for real use, 2 GB for a trial.
- A domain name such as
chat.example.compointing to the server. - Ports 22, 80 and 443 open and the rest closed, as in our Debian 13 hardening guide.
- SMTP login details from a mail provider (SMTP is how servers send email); without them, agent invites fail.
- At least 10 GB of free disk: our lab server used 4.8 GB, and the docs want 5 to 10 GB for PostgreSQL.
1. Install Docker
# as root
apt-get update
apt-get install -y curl ca-certificates openssl wget
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
docker --version
docker compose version
We saw Docker version 29.9.1 and Docker Compose version v5.6.0.
2. Download the two official files
# as root
mkdir -p /opt/chatwoot && cd /opt/chatwoot
wget -O .env https://raw.githubusercontent.com/chatwoot/chatwoot/develop/.env.example
wget -O docker-compose.yaml https://raw.githubusercontent.com/chatwoot/chatwoot/develop/docker-compose.production.yaml
3. Set passwords, the secret key and your address
Run this in one session, because the database password sits in a shell variable until it is written to both files. Replace chat.example.com with your name. The last sed pins the version.
# as root, in /opt/chatwoot
PG_PASS=$(openssl rand -hex 16)
REDIS_PASS=$(openssl rand -hex 16)
sed -i "s|^SECRET_KEY_BASE=.*|SECRET_KEY_BASE=$(openssl rand -hex 64)|" .env
sed -i "s|^FRONTEND_URL=.*|FRONTEND_URL=https://chat.example.com|" .env
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=$PG_PASS|" .env
sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=$REDIS_PASS|" .env
echo "DISABLE_TELEMETRY=true" >> .env
sed -i "s|POSTGRES_PASSWORD=$|POSTGRES_PASSWORD=$PG_PASS|" docker-compose.yaml
sed -i "s|chatwoot/chatwoot:latest|chatwoot/chatwoot:v4.18.0|" docker-compose.yaml
chmod 600 .env
grep -n "image:" docker-compose.yaml
Expect three lines: chatwoot/chatwoot:v4.18.0, pgvector/pgvector:pg16 and redis:alpine. Chatwoot writes FRONTEND_URL into your website's widget code, so it must be the public HTTPS address. DISABLE_TELEMETRY=true stops the usage counts sent to Chatwoot (telemetry docs).
4. Create the database
# as root, in /opt/chatwoot
docker compose pull
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
The pull took 29 seconds and the database step 16. Look for Created database 'chatwoot_production' near the end. Two messages look alarming but are harmless on a first run: Did you not create the database, or did you delete it?, printed just before Chatwoot creates it, and a warning that the attribute `version` is obsolete, which Docker Compose prints for the official file.
5. Start Chatwoot
# as root, in /opt/chatwoot
docker compose up -d
curl -s localhost:3000/api
Ours answered after 33 seconds with {"version":"4.18.0",...,"queue_services":"ok","data_services":"ok"}. If curl reports a refused connection, wait and retry.
6. Put Caddy in front for HTTPS
A reverse proxy is a web server that sits in front of Chatwoot, handles HTTPS and passes each request on. Debian 13 ships Caddy 2.6.2. On a real domain it fetches a free Let's Encrypt certificate by itself; our lab had no public name, so it used Caddy's internal certificate (tls internal) instead.
# as root
apt-get install -y caddy
Replace the contents of /etc/caddy/Caddyfile with:
# /etc/caddy/Caddyfile, edited as root
chat.example.com {
reverse_proxy 127.0.0.1:3000
}
# as root
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
systemctl reload caddy
ss -tlnp | grep -E ':(80|443|3000|5432|6379) '
Expect Valid configuration, then ports 3000, 5432 and 6379 on 127.0.0.1 and only Caddy on 80 and 443. Keep it that way: never publish Chatwoot's ports on all addresses "to test quickly", because Docker's published ports bypass ufw (Docker docs). Through Caddy our lab got 200 on the API and login page, and 101 Switching Protocols on /cable, the WebSocket that pushes new messages to agents. For nginx or Traefik, see our reverse proxy comparison.
7. Create the admin account and the website inbox
Open https://chat.example.com. A fresh install shows an onboarding page for your name, company, email and password; that first user becomes the super admin. Then go to Settings, Inboxes, Add Inbox, Website, and paste the script Chatwoot gives you just before </body> on your site. We created ours through the API, which returns the same script.
Two Chatwoot errors to avoid: HTTP 429 and failed invites
HTTP 429 when every visitor shares one address
HTTP 429 "Too Many Requests" is what a rate limiter answers when one client sends too much. Our first load run got 8,605 of them. Chatwoot limits the widget per client address: in v4.18.0, 200 new widget sessions per hour and 60 messages per minute per website (rack_attack.rb in the v4.18.0 source; the rate limiting docs still list older, lower numbers). The log showed every request coming from 172.18.0.1, Docker's bridge. Through Caddy, Rails logged the real client address, which Caddy passes in X-Forwarded-For. A proxy that drops that header makes all visitors look like one, and the 201st new visitor in an hour gets an error.
Agent invites fail without SMTP
We invited a second agent before setting up email. The invite failed with Mail::Sendmail::DeliveryError ... /usr/sbin/sendmail: with SMTP_ADDRESS empty, Chatwoot falls back to a sendmail program the image does not contain. Fill in SMTP_ADDRESS, SMTP_PORT, SMTP_USERNAME, SMTP_PASSWORD and MAILER_SENDER_EMAIL (default accounts@chatwoot.com) from your mail provider, then run docker compose up -d. Outbound port 25 is blocked on new RS Computers servers and opened on request via Telegram; a provider's port 587 does not need it.
Which channels work on self-hosted Chatwoot?
Live chat works on day one; every other channel needs an account with its platform.
| Channel | What you need besides Chatwoot | Tested by us |
|---|---|---|
| Website live chat | A public HTTPS address | Yes |
| SMTP and IMAP logins, a forwarding rule, or a Google or Microsoft OAuth app (email docs) | No | |
| A WhatsApp Business account and a Meta developer app whose keys a super admin enters; Meta may require app review (signup docs). A Twilio WhatsApp number is the other route. | No | |
| Telegram | A bot token from @BotFather; Telegram posts updates only to HTTPS on port 443, 80, 88 or 8443 (Bot API) | No |
| Facebook, Instagram, SMS, Line, TikTok | An account and app with each platform; SMS via Twilio or Bandwidth | No |
Platform rules come along: 24 hours after the customer's last message, WhatsApp accepts only approved templates, and on Facebook and Instagram the customer must write first (supported features). For CRM sync, Chatwoot's webhooks pair well with n8n hosting on the same server. If you still need the CRM itself, see our Odoo or Dolibarr comparison.
Chatwoot self-hosted vs Intercom and Zendesk: five agents priced
As a self-hosted Intercom alternative, Chatwoot turns a per-seat bill into a server bill. Vendor list prices in US dollars, checked on 18 October 2026, before tax. "Annual" is the monthly price when you pay for a year.
| Option | Per agent per month | Five agents per month | AI answers |
|---|---|---|---|
| Chatwoot Community, self-hosted | $0 | $0 plus your server | Not included |
| Chatwoot Premium Support, self-hosted | $19 | $95 plus your server | Captain AI included |
| Chatwoot Cloud Startups / Business | $19 / $39 | $95 / $195 | 300 / 500 Captain credits |
| Intercom Essential | $29 annual, $39 monthly | $145 / $195 | Fin, $0.99 per outcome |
| Intercom Advanced | $85 annual, $99 monthly | $425 / $495 | Fin, $0.99 per outcome |
| Zendesk Suite Team | $55 annual, $69 monthly | $275 / $345 | 5 per agent included, then $1.50 to $2.00 each |
Sources: Chatwoot self-hosted, Chatwoot Cloud, Intercom and Zendesk.
Self-hosted Chatwoot is the better deal when:
- you want a shared inbox with the customer data on your own server;
- someone will run the upgrades and backups shown below;
- per-seat prices would grow with every agent you add.
Intercom or Zendesk is the honest answer when you want a polished AI agent from day one and nobody will look after a server. The free edition leaves out Captain AI, custom branding, roles and permissions, SSO and SLA policies. Not sure yet? Chatwoot Cloud's free Hacker plan (live chat, 2 agents, 500 conversations a month) lets you try the interface before you install anything.
Which plan and city for self-hosted live chat
| Your situation | Plan | City | Why |
|---|---|---|---|
| A trial, or one person answering a small shop | VPS Micro: 2 vCPU, 2 GB, 40 GB NVMe, 1 Gb/s | The one closest to you | Passed our 2 GiB test, but below the official minimum |
| A business inbox with a few agents, customers in Kosovo and the Balkans | VPS Mini: 4 vCPU, 4 GB, 80 GB NVMe, 1 Gb/s | Prishtina | Meets the official minimum; Skopje is about 3 ms away on our network, Vienna 18.6 ms |
| A business inbox with a few agents, customers across Western and Central Europe | VPS Mini: 4 vCPU, 4 GB, 80 GB NVMe, 1 Gb/s | Amsterdam | Meets the official minimum; 6.6 ms from Frankfurt, 6.7 ms from London |
| Irish or British customers, data to stay in Ireland | VPS Mini, or VDS Small for a team | Dublin | Conversations and uploads stay in an EU country close to the UK |
| A support team, several channels, n8n alongside | VDS Small: 4 dedicated vCPU, 8 GB, 240 GB NVMe, 10 Gb/s | Where most of your customers are | Dedicated cores for Sidekiq bursts and room for more Puma workers |
| Around 20,000 conversations a day | VDS Medium: 8 dedicated vCPU, 16 GB, 480 GB NVMe, 10 Gb/s | Where most of your customers are | The docs size this at 8 cores and 8 GB |
VPS plans have shared vCPUs and VDS plans dedicated ones; our VPS vs VDS comparison explains the difference. All are KVM servers with NVMe, unmetered traffic and their own IPv4 and IPv6. Chat does not care about a few milliseconds, so pick the city for your customers and their data. The Vienna, Frankfurt and London figures are our own ping.pe tests of 6 October 2026, published on our city pages; the Skopje figure is measured on our own network. Availability by city is on the plans page.
How to back up and upgrade self-hosted Chatwoot
The data lives in PostgreSQL and in the storage_data volume with uploads (backup docs). Docker prefixes volume names with the folder name, here chatwoot_.
# as root, in /opt/chatwoot
mkdir -p /root/backup
docker compose exec -T postgres pg_dump -U postgres -Fc chatwoot_production > /root/backup/chatwoot-db.dump
docker run --rm -v chatwoot_storage_data:/data -v /root/backup:/backup alpine tar czf /backup/chatwoot-storage.tgz -C /data .
ls -lh /root/backup
Our dump of 937 conversations and 6,385 messages took 1 second and came to 712 KB; restored into a scratch database, it held all 6,385 messages. Copy both files off the server, for example with restic offsite backups. To upgrade, read the release notes, change the image tag, then run these three commands in the order the official Docker guide gives:
# as root, in /opt/chatwoot, after changing the image tag
docker compose pull
docker compose up -d
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
Old installs should step through intermediate versions (upgrade guide). On a 2 GB server, follow the docs and add 1 GB of swap before you upgrade, even though our 2 GiB test got through without it.
Frequently asked questions
Is Chatwoot free to self-host?
Yes. The Community Edition is MIT-licensed and costs $0 per agent. On 18 October 2026, self-hosted Premium Support cost $19 per agent per month (adds Captain AI, branding and roles) and Enterprise $99 (adds SSO and SLA policies).
What are the minimum requirements for self-hosted Chatwoot?
Chatwoot's docs call 4 GB of RAM the required minimum and 4 CPU cores the recommended minimum, for up to 10,000 conversations a day, plus at least 1 GB of swap during upgrades. In our lab, Chatwoot v4.18.0 used 1,147 MiB at idle and 1,267 MiB at peak with 20 visitors chatting at once, and the whole server took 4.8 GB of disk.
Can Chatwoot run on 2 GB of RAM?
In our test it did: limited to 2 GiB, Chatwoot v4.18.0 peaked at 1,140 MiB under load and 1,383 MiB during the upgrade database step, without crashing. That is below the official 4 GB minimum, so keep 2 GB for a trial.
How do I install Chatwoot with Docker?
Download the official .env.example and docker-compose.production.yaml, set the passwords, secret key and FRONTEND_URL, run db:chatwoot_prepare, then docker compose up -d. The stack binds to 127.0.0.1 only, so a reverse proxy such as Caddy publishes it over HTTPS.
Is Chatwoot a good self-hosted Intercom alternative?
For a shared inbox, yes. Five agents on Intercom Essential cost $145 a month on annual billing (checked 18 October 2026); Chatwoot's Community Edition costs nothing beyond a server. Intercom is ahead with its Fin AI agent and needs no server work.
Does self-hosted Chatwoot support WhatsApp and Telegram?
Yes, through official integrations that need platform accounts: a WhatsApp Business account with a Meta developer app (or a Twilio WhatsApp number), and a Telegram bot token from BotFather plus a public HTTPS address. 24 hours after the customer's last message, WhatsApp allows only approved templates.
Put the support inbox on your own server
Chatwoot idles at about 1.1 GiB, yet the official 4 GB is where a real support team should start. RS Computers runs KVM VPS and VDS servers in Amsterdam, Dublin and Prishtina. Pick a size on the VPS hosting plans page, or ask us on Telegram for a quote if you want us to install Chatwoot for you.