How to Migrate from Zendesk to Chatwoot 2026
How to Migrate from Zendesk to Chatwoot
Zendesk starts at $19/agent/month and quickly climbs to $55-115/agent for useful features. A 10-agent team pays $2,280-13,800/year. Chatwoot is the open source alternative — omnichannel support (chat, email, social, WhatsApp) with no per-agent fees.
What Transfers
| Zendesk Feature | Chatwoot Status |
|---|---|
| ⚠️ Ticket history | Manual export/import via API |
| ✅ Contact list | CSV export → import |
| ✅ Live chat widget | Chatwoot widget (similar) |
| ✅ Email support | Email channel |
| ✅ Social channels | Facebook, Twitter, WhatsApp, Telegram |
| ⚠️ Macros/canned responses | Recreate as canned responses |
| ❌ Automations/Triggers | Rebuild in Chatwoot |
| ❌ Knowledge base | Use separate tool (BookStack) |
| ❌ Community forums | Not available |
Step 1: Deploy Chatwoot
# Docker Compose
git clone https://github.com/chatwoot/chatwoot.git
cd chatwoot
cp .env.example .env
# Edit .env:
# FRONTEND_URL=https://support.yourdomain.com
# RAILS_ENV=production
# SECRET_KEY_BASE=$(openssl rand -hex 64)
docker compose up -d
Create your admin account at the setup page.
Step 2: Set Up Channels
Website live chat:
- Settings → Inboxes → Add Inbox
- Select Website
- Configure name, greeting, and widget color
- Copy the widget code into your website:
<script>
window.chatwootSettings = { position: "right", type: "standard" };
(function(d,t) {
var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g.src="https://support.yourdomain.com/packs/js/sdk.js";
g.defer=true; g.async=true;
s.parentNode.insertBefore(g,s);
g.onload=function(){
window.chatwootSDK.run({ websiteToken: 'YOUR_TOKEN', baseUrl: 'https://support.yourdomain.com' })
}
})(document,"script");
</script>
Email channel:
- Add inbox → Email
- Configure forwarding from support@yourdomain.com to Chatwoot
- Set SMTP for outgoing email
Social channels:
- WhatsApp → Twilio or 360dialog integration
- Facebook → Connect Facebook Page
- Twitter → Connect Twitter account
- Telegram → Bot token
Step 3: Import Contacts
Export from Zendesk:
- Zendesk → Customers → Export
- Download CSV
Import to Chatwoot: Use the API to import contacts:
curl -X POST https://support.yourdomain.com/api/v1/accounts/1/contacts \
-H "api_access_token: YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"email": "john@example.com",
"phone_number": "+1234567890"
}'
Or build a script to batch-import from CSV.
Step 4: Set Up Canned Responses
Recreate Zendesk macros as Chatwoot canned responses:
- Settings → Canned Responses → Add
- Set a shortcode (e.g.,
/greeting,/refund,/escalate) - Write the response template
Example:
- Shortcode:
/greeting - Response: "Hi {{contact.name}}! Thanks for reaching out. How can I help you today?"
Step 5: Configure Automations
Chatwoot automation rules replace Zendesk triggers:
- Settings → Automation → Add Rule
- Set conditions (e.g., "message contains 'refund'")
- Set actions (e.g., "assign to Billing team", "add label 'refund'")
Step 6: Set Up Teams and Agents
- Settings → Teams → Create teams (Sales, Support, Billing)
- Settings → Agents → Invite agents
- Assign agents to teams
- Configure auto-assignment rules
Cost Comparison
| Agents | Zendesk Suite Team | Chatwoot Self-Hosted | Savings |
|---|---|---|---|
| 5 | $275/month | $15/month (VPS) | $3,120/year |
| 10 | $550/month | $30/month | $6,240/year |
| 25 | $1,375/month | $50/month | $15,900/year |
| 50 | $2,750/month | $80/month | $32,040/year |
Full Chatwoot Production Deployment
The Docker Compose quickstart gets Chatwoot running but needs additional configuration to be reliable in a production support context. Support tools are customer-facing — downtime directly affects customer experience.
Environment Configuration
Chatwoot's .env file contains a large number of configuration options. The critical ones for production are SECRET_KEY_BASE (generate with openssl rand -hex 64), FRONTEND_URL (your public HTTPS URL), RAILS_ENV set to production, and SMTP configuration for outgoing email.
For SMTP, Chatwoot sends transactional emails: new conversation notifications, agent invitation emails, and account confirmation emails. Amazon SES is cost-effective. Configure the MAILER_SENDER_EMAIL with a verified SES identity and the SMTP_ variables with your SES credentials.
Active Storage configuration determines where file attachments in conversations are stored. The default is local disk storage, which is fine for a single-server deployment but doesn't work if you ever want to run multiple Chatwoot instances. Configure S3-compatible storage from the start — MinIO on the same server or a cloud object storage bucket. Set ACTIVE_STORAGE_SERVICE to "amazon" and configure the AWS_ credentials and S3 bucket name.
Redis and Action Cable
Chatwoot uses Redis for real-time features — the live chat widget's instant message delivery depends on Action Cable, which uses Redis as the backend. The Docker Compose configuration includes Redis, but make sure Redis has enough memory to hold the active connection state without eviction. For a 10-agent team with moderate chat volume, 512 MB Redis is sufficient. Monitor Redis memory usage and set a maxmemory policy to prevent unbounded growth.
Scaling Considerations
Chatwoot's most resource-intensive operation is the Sidekiq job processor, which handles email processing, webhook delivery, and background tasks. The default Docker Compose configuration runs Sidekiq with a limited number of workers. Under high message volume, the Sidekiq queue can back up, causing delayed email notifications and webhook deliveries. Monitor the Sidekiq queue depth in the admin panel under Settings → Reports and increase the worker count in the docker-compose.yml if queues are consistently backlogged.
For teams comparing Chatwoot to other self-hosted customer support options, the best open source alternatives to Intercom guide covers how Chatwoot's omnichannel approach compares to tools like Papercups and Zammad, which have different strengths depending on whether you're prioritizing live chat, ticketing, or help desk workflows.
Security and Operational Hardening
Customer support tools process sensitive customer communications — shipping addresses, account credentials, billing inquiries, and personal identifiable information appear regularly in support conversations. The security posture of your Chatwoot deployment is as important as any other customer-facing system.
HTTPS is mandatory: Never run Chatwoot over plain HTTP in production. The live chat widget loads JavaScript from your Chatwoot instance into your customers' browsers — an unencrypted connection exposes both the widget code and customer messages to interception. Configure Caddy or Nginx with automatic Let's Encrypt certificates. Caddy is the lower-friction option: add a Caddyfile and it handles certificate provisioning and renewal without additional configuration.
Database security: Chatwoot uses PostgreSQL. The database password should be a randomly generated string of at least 32 characters, stored only in the .env file and not embedded in Docker Compose YAML files that might be committed to a repository. The PostgreSQL container should be on a Docker internal network only — never expose port 5432 to the public internet.
API token management: Chatwoot's REST API uses agent API access tokens for authentication. These tokens have the same permissions as the agent they belong to. Treat them as passwords: rotate them periodically, revoke tokens when agents leave the team, and don't embed them in client-side code. For integrations that need API access, create a dedicated agent account with the minimum necessary permissions rather than using a real agent's credentials.
Conversation data retention: Chatwoot stores the full history of all customer conversations. Define a data retention policy and implement it — Zendesk has this built in; self-hosted Chatwoot requires you to schedule cleanup jobs or archive old conversations manually. For GDPR compliance, you need a process to respond to right-to-erasure requests by deleting a contact and their conversation history.
Monitoring and uptime: Customer support downtime means customers who reach out get no response. Set up uptime monitoring on the Chatwoot frontend URL and configure alerts with a short detection window (1-2 minutes). For agent availability, Chatwoot's built-in reports show when agents were online and what response times looked like — review these weekly to identify staffing gaps.
Backup discipline: Back up the Chatwoot PostgreSQL database daily. Conversation history with customers is valuable operational data — it contains support patterns, customer complaints, and product feedback. A 90-day backup retention window is appropriate for support tools. Test the restore process quarterly.
What Doesn't Transfer: Rebuilding Key Workflows
The migration table at the top of this article identifies several Zendesk features that don't have a direct Chatwoot equivalent. Here's how to address each one practically.
Ticket history migration: Zendesk allows exporting ticket data via the API. For teams with significant ticket history they need to preserve, build a migration script that reads Zendesk tickets via the Zendesk API and creates corresponding conversations in Chatwoot via the Chatwoot API. This is significant engineering effort but produces a continuous conversation history in Chatwoot. For most teams, the more practical approach is to archive Zendesk ticket history in a separate system (a simple PostgreSQL table or even a CSV archive) and start Chatwoot fresh with a clean slate.
Knowledge base: Zendesk's Guide (knowledge base) has no Chatwoot equivalent. You'll need a separate tool for customer-facing documentation. BookStack is the most common self-hosted option for help center-style documentation — it supports categories, pages, and public access without authentication. Configure BookStack alongside Chatwoot and link to it from the chat widget's pre-chat form or agent canned responses.
Automations and triggers: Zendesk's trigger system handles complex automation logic — routing tickets based on keywords, escalating based on response time, tagging based on channel. Chatwoot's automation rules are simpler: they support conditions on conversation attributes and a set of actions. For Zendesk triggers that fit within Chatwoot's automation model, recreate them directly. For more complex logic, use Chatwoot's webhook output to trigger an external automation tool that performs the logic and calls back to Chatwoot via the API to take action.
Satisfaction ratings (CSAT): Zendesk includes post-conversation customer satisfaction surveys. Chatwoot has a basic CSAT feature that can be enabled per inbox — it sends a satisfaction survey link when a conversation is resolved. Enable it under inbox settings. For more detailed feedback collection beyond simple thumbs up/down ratings, connect a self-hosted survey tool like Formbricks to the conversation resolution webhook.
Reporting and analytics: Zendesk's reporting suite includes volume trends, resolution times, agent performance, and CSAT trends. Chatwoot's built-in reports cover conversation volume, agent response time, and CSAT scores at a basic level. For teams that relied on Zendesk's detailed operational analytics, supplement Chatwoot's reports with a self-hosted analytics stack. Chatwoot's webhook events can feed into a data pipeline for custom reporting.
Migration Timeline
| Week | Task |
|---|---|
| Week 1 | Deploy Chatwoot, set up channels, import contacts |
| Week 2 | Create canned responses, configure automations |
| Week 3 | Train agents, run both platforms for incoming tickets |
| Week 4 | Switch live chat widget, redirect email |
| Month 2 | Full cutover, cancel Zendesk |
Chatwoot vs Other Open Source Support Tools
Chatwoot is the most feature-complete open source customer support platform, but it's worth knowing where it sits relative to alternatives before committing to a migration.
Zammad is the closest Chatwoot competitor with similar breadth — email, chat, social channels, ticket management, and a knowledge base. Zammad has a more traditional ticketing interface that Zendesk users find immediately familiar. If your team relied heavily on Zendesk's ticket-centric workflow rather than its chat capabilities, Zammad may feel more natural. Zammad is also more established, with a longer track record in production deployments.
Papercups is a lighter-weight option focused specifically on live chat. It lacks email and social channel support but has a simpler deployment story and a cleaner interface for teams whose support workflow is purely chat-based. If you're replacing only Zendesk Chat rather than the full Zendesk Suite, Papercups is worth evaluating.
For teams who want to keep customer support data integrated with CRM contact records, combining Chatwoot with a self-hosted CRM creates a more complete customer operations stack. The best open source CRM software guide covers tools like Twenty, EspoCRM, and SuiteCRM that store contact history, deal pipelines, and support context in a way that Chatwoot's contact system alone doesn't provide.
The best open source alternatives to Intercom guide rounds out the picture for teams that used Zendesk primarily for its chat widget and product tours rather than as a ticketing system — the Intercom alternatives overlap significantly with Zendesk alternatives for that use case. Teams using Chatwoot alongside Zammad for a complete support stack should see the Chatwoot vs Zammad comparison for the specific decision between live-chat-first and ticket-first approaches.
Compare customer support tools on OSSAlt — channel support, agent features, and self-hosting options side by side.
See open source alternatives to Zendesk on OSSAlt.