We earn commissions when you shop through the links below. Full disclosure →
A self-hosted Intercom and Zendesk alternative built around one shared inbox for website live chat, email, WhatsApp, Facebook, Instagram, Telegram, LINE, SMS and API channels, with a help center portal, canned responses, automations and CSAT reports. MIT core; SLA policies, Captain AI, custom roles and SSO are in a separately licensed enterprise directory.
Pick Chatwoot when your support happens in real-time conversations: one shared inbox for website live chat, email, WhatsApp, Facebook, Instagram, Telegram, LINE, SMS, TikTok and an API channel, with private notes, canned responses, auto-assignment, campaigns, a help center portal and CSAT reports. It is a Rails and Vue app on PostgreSQL, Redis and Sidekiq, and the official Docker Compose file runs four services. Everything outside the `enterprise/` directory is MIT. Upstream's requirements page calls 4 GB of RAM the required minimum, good for up to 10,000 conversations a day. If you need SLAs, custom roles and SSO without a per-agent licence, Zammad is the catalog's other helpdesk; for a plain shared email inbox, FreeScout is lighter.
What you need
Any VPS with at least 4096 MB of RAM
A domain you control — most self-hosted setups need HTTPS in front of them
About an afternoon — budget time for troubleshooting
Paid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# Chatwoot — official Docker Compose (rails, sidekiq, pgvector Postgres 16, Redis), per developers.chatwoot.com/self-hosted/deployment/dockerwget -O .env https://raw.githubusercontent.com/chatwoot/chatwoot/v4.18.0/.env.examplewget -O docker-compose.yaml https://raw.githubusercontent.com/chatwoot/chatwoot/v4.18.0/docker-compose.production.yaml# the compose file uses chatwoot/chatwoot:latest — change both image lines to chatwoot/chatwoot:v4.18.0 (or v4.18.0-ce for the MIT-only build)# in .env set SECRET_KEY_BASE, FRONTEND_URL, POSTGRES_PASSWORD and REDIS_PASSWORD; put the same Postgres password in docker-compose.yamlnano .env && nano docker-compose.yamldocker compose run --rm rails bundle exec rails db:chatwoot_preparedocker compose up -d# rails listens on 127.0.0.1:3000 only — put Nginx or another reverse proxy with HTTPS in front; the first visit creates the super admin
Chatwoot's licence and its own deployment docs set out what to decide before it holds customer data:
non-negotiableSLA policies, custom roles, audit logs, custom branding, agent capacity, SSO/SAML and the Captain AI agent live in the enterprise/ code, which may only be used in production with a paid Chatwoot licence "for the correct number of user seats". The self-hosted pricing page lists Premium Support at $19 and Enterprise at $99 per agent per month; SLA policies and SSO are Enterprise only. Upstream's -ce image tags (for example v4.18.0-ce) leave the enterprise code out.
non-negotiableThe production compose file uses chatwoot/chatwoot:latest; pin a version tag. Upgrading means pulling the new image and running rails db:chatwoot_prepare, and upstream says a very old install should step through intermediate tags rather than jump to the newest one.
non-negotiableRails binds to 127.0.0.1:3000 only, so you need Nginx or another reverse proxy for HTTPS. Set SECRET_KEY_BASE, FRONTEND_URL and the Postgres and Redis passwords before the first start, and create the super admin straight away: the first visit shows an onboarding screen that creates it. Two-factor authentication needs the Active Record encryption keys from .env.example to be set.
non-negotiableUpstream calls 4 GB of RAM the required minimum and 4 CPU cores the recommended minimum, asks for at least 1 GB of swap so upgrades don't run out of memory, and warns that Sidekiq "can use 1GB+ of memory" on a busy server. Attachments go to the storage_data volume unless you configure S3-compatible storage, so include it in backups with PostgreSQL.