Back to articles
Technology Insight

Building a Custom Freelancer CRM with Twenty.com on a VPS: A Step-by-Step Guide

June 1, 2026

Introduction: Why Freelancers Need a Robust CRM Architecture

As a freelancer or independent consultant, scaling your business requires more than just exceptional technical skills; it demands rigorous operational efficiency. Managing pipeline velocity, tracking client communication histories, and organizing contract milestones in fragmented spreadsheets quickly becomes unsustainable. While commercial Customer Relationship Management (CRM) platforms offer sophisticated solutions, their high recurring subscription fees and rigid data governance policies often hinder independent professionals.

Enter Twenty.com, a modern, open-source CRM designed to challenge established SaaS monopolies. By deploying Twenty.com on your own Virtual Private Server (VPS), you achieve the ideal operational equilibrium: complete data sovereignty, infinite customization, and fixed, predictable infrastructure costs. This guide provides a comprehensive, technical walkthrough to help you self-host your CRM and elevate your professional workflow.

---

Why Twenty.com and a VPS Make the Perfect Match

Before diving into the deployment configuration, it is crucial to understand why this specific technology stack serves freelancers so effectively compared to traditional options:

  • Data Sovereignty and Compliance: Your client list, financial projections, and communication logs reside entirely on your isolated server instance, mitigating third-party data leaks.
  • Cost Efficiency: Instead of paying per-user monthly fees that scale poorly, you pay a nominal, flat monthly rate for your VPS provider (such as DigitalOcean, Linode, or Hetzner).
  • API and Integration Freedom: Being open-source, Twenty.com allows you to connect custom webhooks, automated invoicing scripts, and portfolio tracking without hitting artificial payload restrictions.
---

Prerequisites and Environment Setup

To ensure a seamless deployment, verify that your local environment and target server meet the following baseline requirements:

  1. A VPS Instance: At least 2 vCPUs, 4GB RAM, and 40GB SSD running an Ubuntu 24.04 LTS clean installation.
  2. Domain Name: A registered domain or subdomain (e.g., crm.yourdomain.com) with A records pointed to your VPS IP address.
  3. Docker and Docker Compose: The modern standard for containerized application deployments.
  4. SSL/TLS Certificate: Handled automatically via Let's Encrypt and an Nginx Reverse Proxy or Caddy.
System Resource Note: While Twenty.com can technically run on 2GB of RAM during low-concurrency idle states, compiling assets and running background worker queues requires a stable 4GB overhead for optimal responsiveness.
---

Step-by-Step Deployment Guide

Follow these structured steps to initialize your self-hosted CRM environment. Connect to your VPS via SSH before proceeding.

Step 1: System Update and Dependency Installation

First, update your core operating system packages and install the requisite Docker engine components:

sudo apt update && sudo apt upgrade -y
sudo apt install curl git docker.io docker-compose-plugin -y

Ensure the Docker daemon is enabled and initialized upon system boot:

sudo systemctl enable --now docker

Step 2: Cloning the Twenty Repository and Configuring Environment Variables

Navigate to your preferred deployment directory, clone the official open-source repository, and configure your localized environment variables:

cd /opt
sudo git clone [https://github.com/twentyhq/twenty.git](https://github.com/twentyhq/twenty.git)
cd twenty/packages/twenty-docker

Copy the sample environment file to create your production configuration:

cp .env.example .env

Open the .env file using a text editor like Nano to modify critical variables. Ensure you specify secure, randomized passwords for the PostgreSQL database, generate a robust application secret key, and input your exact domain name:

PG_DATABASE_PASSWORD=YourSecurePasswordHere
ACCESS_TOKEN_SECRET=YourGeneratedSuperLongSecretKey
SERVER_URL=[https://crm.yourdomain.com](https://crm.yourdomain.com)

Step 3: Orchestrating the Containers

With your environment variables accurately defined, initialize the multi-container architecture using Docker Compose. This command pulls the official images for Twenty, PostgreSQL, and Redis, assembling them within an isolated virtual bridge network:

sudo docker compose up -d

To verify that all services are executing without runtime errors, audit the container status logs:

sudo docker compose ps

Step 4: Configuring the Reverse Proxy and SSL

To safely expose your containerized CRM to the public internet via HTTPS, configure an Nginx reverse proxy block. Direct traffic arriving at port 443 down to internal container port 3000. Secure the traffic by invoking Certbot to provision an automatic Let's Encrypt SSL certificate:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d crm.yourdomain.com
---

Tailoring Twenty.com for Freelance Operations

Once you navigate to your domain and complete the initial administrator setup wizard, it is time to structure the schema to reflect independent business realities. Twenty.com allows you to create custom fields and relationships effortlessly.

1. Structuring the Pipeline for Client Acquisition

Modify the default sales pipeline stages to match a freelance service lifecycle:

  • Discovery Call: Initial consultation to establish project scope and qualitative fit.
  • Proposal Submitted: Formal statement of work and commercial terms sent.
  • Negotiation: Refining contract details, delivery milestones, and SLA terms.
  • Active Project: Closed-won state where engineering or creative execution occurs.
  • Retainer / Maintenance: Transition into post-launch support structures.

2. Custom Object Creation: Project Trackers and Invoices

Unlike generic platforms, Twenty.com enables you to build custom objects. Create a new object titled Projects and establish a one-to-many relationship linked back to your Companies or People objects. Add metadata custom fields such as Project Budget, Start Date, Target Delivery Date, and GitHub/Figma Repository Links.

---

Maintenance, Backups, and Security Best Practices

Self-hosting shifts data governance responsibility onto your shoulders. Implement these maintenance habits to ensure maximum availability:

Automated Database Backups

Create a automated cron job that executes a pg_dump database snapshot every midnight, packaging your core database records and compressing them to an offsite secure storage bucket (such as AWS S3 or Backblaze B2):

0 2 * * * docker exec -t twenty-db-container pg_dumpall -U twenty_user | gzip > /backups/crm_$(date +\%F).sql.gz

Regular Image Upgrades

Keep your setup secure against software vulnerabilities by pulling upstream updates quarterly. Simply navigate to your deployment folder, pull the newest docker tags, and rebuild the container architecture without data loss, as data persists out in external volumes:

sudo docker compose pull
sudo docker compose up -d --remove-orphans
---

Conclusion: The Long-Term ROI of Self-Hosting

Transitioning from decentralized tools to a unified, self-hosted CRM built with Twenty.com on a VPS is an operational milestone. It shifts your digital infrastructure from an ongoing liability into a proprietary business asset. By investing an hour into proper configuration, you establish a professional command center that streamlines client relationships, secures historical data, and demonstrates operational maturity to enterprise partners. Take control of your workflow, eliminate arbitrary user fees, and scale your freelance business on your own terms.

Building a Custom Freelancer CRM with Twenty.com on a VPS: A Step-by-Step Guide | DPTCloud