Deployment guide

Leaving HubSpot for self-hosted Twenty CRM on a VPS

Deploy on a VPS Cloud →

Self-hosting12 min read

Leaving HubSpot for self-hosted Twenty CRM on a VPS

HubSpot raised its Professional plan to $100 per seat per month in 2026, pushing a five-person agency's monthly bill above $500. Twenty CRM, released under the AGPL-3.0 licence and backed by more than 22,000 GitHub stars, covers the same core features — sales pipeline, contacts, companies, activity tracking — with no recurring subscription. This guide walks you through the full process: exporting your HubSpot data, deploying Twenty CRM on a VPS via Docker Compose, importing your records, and verifying the result. By the end, you will have a working environment and a concrete savings estimate over three years.

Why HubSpot costs more in 2026

HubSpot has restructured its offerings in recent years, The Starter plan, often cited as a reasonable entry point, now sits at $20 per seat per month but excludes advanced workflow automation, lead scoring, and custom reporting — features most sales teams rely on daily. For a five-person agency on Professional, the annual bill reaches $6,000, before adding Service Hub or Marketing Hub modules, each billed separately. HubSpot's pricing mechanics compound the issue: increases arrive with 30-to-60-day notice, annual contracts renew automatically, and exported data rarely arrives in a directly reusable format. The nominal cost therefore conceals an exit cost that few teams anticipate. Meanwhile, the open-source ecosystem has closed much of the functional gap. Twenty CRM, Formbricks for forms, and Chatwoot for support now cover most of the HubSpot footprint without contractual lock-in.

What you lose with HubSpot

  • Captive data — HubSpot stores contacts, deals, and activities on its own infrastructure; CSV export is available but incomplete for custom properties and object associations.
  • Annual price increases — since 2020, the Professional plan has increased by roughly 18% per year on average; nothing in the terms caps future revisions.
  • Vendor dependency — automations, sequences, and reports are encoded in HubSpot's proprietary syntax and cannot be exported to another tool.
  • Strict per-seat billing — adding a freelance collaborator or intern immediately triggers a full seat charge, with no proration for occasional access.
  • No control over sensitive data — prospects, open deals, and contact data reside on US servers, complicating GDPR compliance for European clients.
  • Tight coupling between hubs — Marketing Hub, Sales Hub, and Service Hub share a database but are billed separately; removing one breaks workflows in the others.
  • Support limited to higher tiers — phone support and a dedicated account manager are only available from the Enterprise plan ($150+/seat/month) upward.

Twenty CRM at a glance — what it covers

Twenty CRM is an open-source CRM developed by Twenty HQ, published under the AGPL-3.0 licence, and available on GitHub with more than 22,000 stars at the time of writing. It uses a modern architecture: a GraphQL backend in Node.js, a React frontend, and a PostgreSQL database. The interface borrows visual conventions from Notion — blocks, list or Kanban board views, global search — which shortens the learning curve for teams already comfortable with contemporary tools. Functionally, Twenty covers the core use cases of a commercial CRM: contact and company management, customisable sales pipeline, activity tracking (calls, emails, meetings), object-linked notes, webhooks, and an open GraphQL API. Workflow automations are progressively landing in the 2025-2026 releases, with a triggers-and-actions system that handles the most common scenarios — automatic assignment, Slack notifications, field updates. However, Twenty does not replace HubSpot Marketing Hub: mass email campaigns, predictive lead scoring, and landing pages are not in scope today. Being clear about this matters: if your HubSpot use is primarily Marketing, migrating to Twenty alone will not be sufficient and will need a complementary tool such as Mautic or Listmonk.

HubSpot vs Twenty CRM — feature comparison

CriteriaHubSpot ProfessionalTwenty CRM (self-hosted)
Monthly cost (5 seats)$500/monthVPS cost only
LicenceProprietary SaaSAGPL-3.0, open source
Data hostingHubSpot servers (US)Your VPS, your jurisdiction
APIREST + GraphQL (plan limits)GraphQL, no request caps
Sales pipelineYes, customisableYes, customisable
AutomationsAdvanced workflows (Professional)Triggers/actions (maturing)
Email marketingMarketing Hub (add-on)Not included — third-party tool required
GitHub communityProprietary project22,000+ stars, active contributions

VPS requirements for Twenty CRM

Twenty CRM installs via Docker Compose on any Linux VPS. The prerequisites are deliberately modest for a five-to-ten-person team: 2 vCPU and 4 GB of RAM provide a comfortable baseline for normal daily usage; 4 vCPU and 8 GB of RAM leave headroom for peak load or large imports. Recommended storage is 40 GB minimum for PostgreSQL data, attachments, and logs, with the ability to attach an additional volume later. On the software side, you need Docker Engine 24+ and Docker Compose v2 (the plugin built into Docker, not the standalone Python version), plus a reverse proxy — nginx or Caddy — to terminate TLS. A domain name pointing to the VPS and a valid HTTPS certificate (Let's Encrypt via Certbot or native Caddy) are essential to secure access. TCP ports 80 and 443 must be open inbound; it is not necessary to expose the application ports directly (3000 for the frontend, 3000 for the API) since all traffic flows through the reverse proxy.

Deploy Twenty CRM on a VPS — full procedure

01

Verify Docker Engine and Compose

Connect to your VPS via SSH and verify that Docker Engine and Docker Compose v2 are installed: docker --version and docker compose version. If Docker is missing, install it via the official get.docker.com script or your distribution's packages.

02

Download docker-compose.yml

Clone the official Twenty CRM repository or download only the production docker-compose.yml: curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml.

03

Create .env file

Create a .env file alongside the docker-compose.yml. Set at minimum APP_SECRET (a 64-character random string generated with openssl rand -hex 32), FRONT_DOMAIN (your domain, for example crm.your-domain.com), SERVER_URL (https://crm.your-domain.com), STORAGE_TYPE (local to start), and the database variables if you want to customise PostgreSQL credentials.

04

Start containers

Start the containers in the background: docker compose up -d. Twenty launches three services: twenty-front (React interface), twenty-server (GraphQL API + backend), and twenty-db (PostgreSQL). Wait about twenty seconds, then confirm all three services are healthy with docker compose ps.

05

Configure nginx

Configure nginx as a reverse proxy. Create a server block for the domain crm.your-domain.com, with proxy_pass http://localhost:3000 for the frontend. Obtain a Let's Encrypt certificate via certbot --nginx -d crm.your-domain.com and verify that the HTTP-to-HTTPS redirect works.

06

First launch and wizard setup

Open https://crm.your-domain.com in your browser. Twenty displays a first-run setup wizard: create the administrator account, set your workspace name, and invite the first team members by email.

07

Set up automatic backups

Set up automatic PostgreSQL backups. The simplest approach is a daily pg_dump script run via cron inside the twenty-db container, with transfer to remote storage (S3-compatible object storage or SFTP). Test a restore before migrating production data.

08

Update Twenty CRM

Update Twenty by pulling the new image and restarting the services: docker compose pull && docker compose up -d. Twenty applies database migrations automatically at startup.

Exporting your HubSpot data

HubSpot offers a native export from the account settings. Go to Settings → Data Management → Export Data. You can export each object separately: Contacts, Companies, Deals, Activities (calls, emails, meetings). The export produces UTF-8-encoded CSV files, typically delivered by email within minutes of the request. Be aware of several known friction points. Custom property names are exported but may be truncated or normalised in column headers, which complicates mapping to Twenty. Associations between objects (a contact linked to multiple companies, a deal linked to multiple contacts) are not always captured in a single CSV file and may require intermediate processing. Volumetric activity exports (years of email history) can take several hours to generate. Plan for this lead time and trigger the export at least 24 hours before your migration window.

Importing your data into Twenty CRM

01

Clean HubSpot CSV files

Clean your HubSpot CSV files before importing: remove empty or redundant columns, verify UTF-8 encoding, and normalise date fields to ISO 8601 format (YYYY-MM-DD). A spreadsheet or a tool like Miller (mlr) is sufficient for this step.

02

Import via Twenty interface

From the Twenty interface, navigate to the target object (People, Companies, or Opportunities), click the CSV import menu, and manually map each source column to the corresponding Twenty field. Twenty validates the mapping before executing the import and flags unrecognised columns.

03

Respect import order

Import in this order to respect dependencies: Companies first, then Contacts (linked to companies), then Opportunities (linked to contacts and companies). Importing in reverse order creates orphaned records that are difficult to correct later.

04

Verify imported records

Verify a sample of records after each import: open ten to twenty records at random and compare them with HubSpot to detect truncated fields, missing associations, or incorrectly converted dates.

05

Recreate pipelines and custom fields

Recreate your pipelines, stages, and custom fields in Twenty before switching the team over: the object configuration interface is accessible from Settings → Data Model. Then invite each team member and assign permissions matching their role.

Run both systems in parallel for one week before switching

Do not shut down HubSpot on the day of the import. Keep both systems active for five to seven business days: ask the team to log new interactions in Twenty while keeping HubSpot accessible in read-only mode to retrieve older history. This overlap surfaces missing workflows, fields you thought were unused but someone checks daily, and automations to recreate. It is also the window to train the team without pressure. At the end of the parallel period, export one final time the week's new data from HubSpot, import the delta into Twenty, and then cancel your HubSpot subscription from the billing settings.

Three-year cost estimate — five-person agency

This cost estimate uses conservative assumptions. On the HubSpot Professional side, the published rate is $100 per seat per month in 2026. For five seats, that is $500 per month, $6,000 per year, and $18,000 over three years — without accounting for future increases or add-on modules. On the self-hosted Twenty CRM side, spending reduces to the VPS cost and, optionally, initial setup time. A 4 vCPU / 8 GB RAM VPS handles a five-to-ten-person team comfortably; check the corresponding configuration in our catalogue for a precise figure. Over three years, gross savings land in a wide range depending on the VPS selected, but the order of magnitude is significant: between $15,000 and $17,000 for a small agency, while retaining full ownership of the data. Add to this the migration cost (a few days of internal work) and the cost of a complementary email marketing tool if your team actively uses HubSpot Marketing Hub. The balance remains strongly positive from the first year for teams whose usage is centred on commercial CRM.

What Twenty CRM does not yet cover

An honest presentation requires naming the current limitations. Twenty CRM is a young project in active development, and some features that HubSpot Professional offers in mature form are not yet available or are still stabilising. Workflow automations work for simple cases (trigger on status change, notification, field update) but do not yet cover complex multi-branch conditional scenarios that HubSpot Workflows allows you to build visually. Integrated email marketing does not exist in Twenty: you will need to connect a dedicated tool (Listmonk, Mautic, Brevo in API mode) via webhooks or the GraphQL API. iOS and Android mobile apps are available but less complete than the web interface; if your sales team works primarily on mobile, evaluate the experience before committing. Finally, automated lead scoring, AI-based sales forecasting, and lead-qualification chatbots are not on the immediate roadmap. These advanced features correspond to use cases that Twenty can cover via third-party integrations, but not natively. For teams whose sales process relies on these automations, migration warrants a serious proof-of-concept phase before any definitive commitment.

Deploy Twenty CRM from the ServOrbit Marketplace

If you prefer to skip the manual configuration described above, our Marketplace offers Twenty CRM as a one-click deployment on VPS. The pre-configured image includes Twenty CRM, PostgreSQL, an nginx reverse proxy, and a Let's Encrypt certificate, with critical environment variables generated automatically at installation. You get a ready-to-use environment in minutes, hosted on our European infrastructure, with full data ownership — no third party has access to your contact database. Updates are at your initiative: you control the timing of version upgrades, without surprises imposed by a SaaS vendor. Our support team is available for integration, backup, or sizing questions as your team grows beyond the initial five people.

Migrate to Twenty CRM on VPS today

Deploy Twenty CRM on a European VPS in minutes and take back control of your sales data. No per-seat subscription, no vendor lock-in, your contacts stay in your jurisdiction.

Need help?

Browse our help center and FAQ, or reach our team — callback, WhatsApp or email. Support in French, English and Arabic.

Message us on WhatsAppopens in a new tab