Skip to main content
Building a Self-Hosted CRM Stack with Twenty
Back to BlogTechnology

Building a Self-Hosted CRM Stack with Twenty

Drew Brosnan
April 3, 2026
12 min read

Building a Self-Hosted CRM Stack with Twenty

Your CRM is the single most important system in your revenue operation. It holds your pipeline, your customer history, your forecasts, and the data that drives every go-to-market decision. So why are most businesses renting access to it from a vendor who charges by the seat and makes it painful to leave?

The average mid-market company spends $1,200 to $3,000 per month on CRM licensing alone. That number climbs with every new sales rep, every SDR, every customer success manager who needs access. And the data -- your data -- lives on someone else's infrastructure, behind API rate limits, subject to pricing changes you have no control over.

We built our entire CRM stack on Twenty, an open-source CRM that runs on your own infrastructure. Here is exactly how we did it, what it cost, and where the trade-offs are.

Why Twenty Over Other Open-Source CRMs

The open-source CRM landscape has options. SuiteCRM has been around for years. EspoCRM is solid for simple use cases. But Twenty stands out for three reasons:

Modern architecture. Twenty is built on a modern stack -- Node.js backend, React frontend, PostgreSQL database. It feels like a product built in 2024, not a fork of a codebase from 2004. The UI is clean and fast. Your sales team will actually use it.

GraphQL API. Unlike most open-source CRMs that offer limited REST endpoints, Twenty provides a full GraphQL API. This matters enormously when you need to integrate with other tools. You can query exactly the data you need without over-fetching or chaining multiple API calls.

Data model flexibility. Twenty lets you create custom objects and fields without modifying source code. Need a custom entity for partnerships, referral sources, or deal stages specific to your business? You can build it from the admin UI.

The Architecture

Our self-hosted CRM stack runs on a single Hetzner VPS with 4 vCPUs, 8 GB RAM, and 160 GB NVMe storage. Total infrastructure cost: roughly $30/month.

The stack includes:

  • Twenty CRM for pipeline management, contact records, and deal tracking
  • n8n for automation workflows (lead routing, notifications, data sync)
  • Kimai for time tracking tied to client accounts
  • Umami for website analytics feeding lead source attribution into the CRM
  • DocuSeal for contract generation and e-signatures linked to deals

Everything runs in Docker containers orchestrated by Docker Compose. Caddy handles reverse proxying and automatic HTTPS via Let's Encrypt. Each service gets its own subdomain.

Setting Up Twenty

Deploying Twenty takes under an hour with Docker Compose. The official documentation provides a compose file that includes the application server, worker processes, and a PostgreSQL database.

The key configuration decisions:

Authentication. Twenty supports SSO via OpenID Connect. For small teams, the built-in email/password auth works fine. For larger deployments, connect it to your identity provider.

Email integration. Twenty syncs with Gmail and Outlook via OAuth. Calendar events and email threads appear directly on contact and company records. Set this up immediately -- a CRM without email context is a glorified spreadsheet.

Custom objects. Before importing data, define your custom objects. We created objects for Partnerships, Service Agreements, and Referral Sources. Getting the data model right before importing saves painful migration work later.

Migrating from Salesforce

Most CRM migrations fail because they try to replicate the old system exactly. Do not do that. Instead:

Phase 1: Export and clean your data. Export contacts, companies, deals, and activities from Salesforce. Use the Data Export Service, not the API, for bulk exports. Clean the data before importing -- deduplicate contacts, standardize field values, remove test records.

Phase 2: Map fields thoughtfully. Not every Salesforce field needs a Twenty equivalent. Map the fields your team actually uses. If nobody has looked at "Lead Source Detail" in two years, drop it.

Phase 3: Import in stages. Import companies first, then contacts linked to companies, then deals linked to contacts. Verify each stage before proceeding. Twenty's API makes programmatic imports straightforward for large datasets.

Phase 4: Run parallel for two weeks. Keep Salesforce read-only while your team uses Twenty as the primary system. This catches data gaps and workflow issues before you fully cut over.

Integrating with the Rest of Your Stack

A standalone CRM is a contact database. A connected CRM is a revenue intelligence system. Here is how we wired Twenty into our broader stack:

Lead capture to CRM. Website form submissions flow through n8n, which creates or updates contacts in Twenty via the GraphQL API. Lead source and UTM parameters are captured and stored as custom fields.

Deal stage automation. When a deal moves to "Proposal Sent" in Twenty, n8n triggers DocuSeal to generate a contract from a template, pre-filled with deal data. When the contract is signed, n8n updates the deal stage to "Closed Won."

Time tracking integration. When a deal closes, n8n creates a project in Kimai linked to the client. All billable hours are tracked against the client record, giving us real-time visibility into project profitability from within the CRM.

Analytics attribution. Umami tracks website visitors and their conversion paths. When a lead converts, the attribution data is pushed to the contact record in Twenty. We can see which blog posts, landing pages, and referral sources drive actual revenue.

The Cost Comparison

| Item | Salesforce | Self-Hosted Twenty | |---|---|---| | CRM License (10 users) | $1,500/mo | $0 | | Automation (Zapier) | $600/mo | $0 (n8n) | | Analytics (GA360) | $1,040/mo | $0 (Umami) | | Doc Signing (DocuSign) | $250/mo | $0 (DocuSeal) | | Infrastructure | $0 | $30/mo | | Monthly Total | $3,390 | $30 | | Annual Total | $40,680 | $360 |

Annual savings: $40,320. And the savings grow with every user you add, because there is no per-seat cost.

Where Self-Hosted CRM Falls Short

Honesty matters more than advocacy. Here is where Twenty and self-hosted CRM stacks have real limitations:

App marketplace. Salesforce has thousands of third-party integrations. Twenty has an API. You can build any integration, but you have to build it. For companies that rely heavily on pre-built connectors, this is a real trade-off.

Enterprise reporting. Salesforce's reporting and dashboard builder is mature and powerful. Twenty's built-in reporting is functional but basic. We supplement it with direct SQL queries against the PostgreSQL database, which is actually more flexible but requires technical capability.

Support and SLA. Salesforce offers enterprise support with guaranteed response times. With open-source, your support is the community, the documentation, and your own team. For mission-critical issues at 2 AM, you need internal capability or a managed services partner.

The Bottom Line

A self-hosted CRM stack is not for everyone. It requires infrastructure capability, a willingness to build integrations, and comfort with operational responsibility. But for businesses that want to own their customer data, eliminate per-seat licensing, and build a revenue stack tailored to how they actually work, it is a compelling alternative to writing increasingly large checks to Salesforce every month.


Want to explore a self-hosted CRM? Our digital transformation team can assess whether Twenty is the right fit for your business and handle the migration. Start with a free stack audit to understand your current costs.

Tags:

CRMTwentySelf-HostingOpen Source
Share:

Drew Brosnan

Drew is a Co-Founder & Managing Partner at Emergent Solutions, helping clients build technology stacks they own.