
Should I self-host Intercom?
YESworth it
Intercom starts at $35/seat and climbs fast; Chatwoot does the messenger widget, inbox and campaigns without the per-seat meter. Same replacement and evidence as the Zendesk verdict.
The math (nothing hidden, including your time)
| Intercom (Copilot, per seat) | $35.00/mo |
| VPS share + storage | −$2.00/mo |
| Your maintenance: 45 min/mo at $20/h | −$15.00/mo |
| Net saving | $18.00/mo |
| Setup: 42 min measured (one-time) | $14.00 |
| Break-even | 0.8 months |
| Markup Index (price ÷ real self-host cost) | 2.1× |
Price: source, checked 2026-08-06. Inputs are stored in git; every number above is derived, never hand-written.
What you lose
- Intercom's product-tour and outbound-message machinery
- Fin AI agent — their answer bot is genuinely ahead
What you're paying Intercom for
- in-app messenger
- shared inbox
- outbound messages
- help articles

Ranked alternatives
A website chat widget feeding a shared agent inbox you run yourself, with no per-seat meter and no per-resolution bill.
Hardware
Runs comfortably on a real VPS (2 GB+).
The tested compose file (our evidence, CI-booted)
# Chatwoot — support inbox; rails web + sidekiq + postgres(pgvector) + redis
x-cw-env: &cw-env
SECRET_KEY_BASE: 0123456789abcdef0123456789abcdef0123456789abcdef
FRONTEND_URL: http://localhost:3006
POSTGRES_HOST: cw-db
POSTGRES_USERNAME: chatwoot
POSTGRES_PASSWORD: chatwoot
POSTGRES_DATABASE: chatwoot
REDIS_URL: redis://cw-cache:6379
RAILS_ENV: production
NODE_ENV: production
INSTALLATION_ENV: docker
services:
chatwoot-web:
image: chatwoot/chatwoot:latest
container_name: chatwoot-web
restart: unless-stopped
depends_on:
cw-db:
condition: service_healthy
cw-cache:
condition: service_healthy
environment: *cw-env
entrypoint: docker/entrypoints/rails.sh
command: sh -c 'bundle exec rails db:chatwoot_prepare && bundle exec rails s -p 3000 -b 0.0.0.0'
ports:
- "3006:3000"
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:3000/api >/dev/null || exit 1"]
interval: 10s
timeout: 10s
retries: 60
start_period: 120s
chatwoot-worker:
image: chatwoot/chatwoot:latest
container_name: chatwoot-worker
restart: unless-stopped
depends_on:
cw-db:
condition: service_healthy
cw-cache:
condition: service_healthy
environment: *cw-env
entrypoint: docker/entrypoints/rails.sh
command: sh -c 'bundle exec sidekiq -C config/sidekiq.yml'
healthcheck:
test: ["CMD-SHELL", "ps aux | grep -q '[s]idekiq' || exit 1"]
interval: 10s
timeout: 5s
retries: 30
start_period: 60s
cw-db:
image: pgvector/pgvector:pg16
restart: unless-stopped
environment:
POSTGRES_USER: chatwoot
POSTGRES_PASSWORD: chatwoot
POSTGRES_DB: chatwoot
volumes:
- cw-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U chatwoot"]
interval: 5s
timeout: 5s
retries: 12
cw-cache:
image: redis:7-alpine
restart: unless-stopped
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 12
volumes:
cw-db:
Want a guided install instead? caniselfhostit.com/intercom has AI-agent prompts that assume a bare machine — that's their half of the stool, and it's good.
Verification
Protocol v1 · verified by zernonia on 2026-08-10 · setup measured at 42 min · AI assistant: claude-code (allowed & stated)
Full timed log
# Intercom — verdict log - **Date:** 2026-08-10 - **Verdict:** YES — worth it - **Protocol:** v1 (2GB reference env, Docker preinstalled, AI assistant: claude-code) ## Setup evidence (shared) - This verdict rides on the same replacement verified for `zendesk-chatwoot` — see `compose/zendesk-chatwoot.yml` and its log. ## The call Intercom starts at $35/seat and climbs fast; Chatwoot does the messenger widget, inbox and campaigns without the per-seat meter. Same replacement and evidence as the Zendesk verdict.
Verdict history
- 2026-08-10: unscored → YES — Initial verdict: Intercom starts at $35/seat and climbs fast; Chatwoot does the messenger widget, inbox and campaigns without t.