AI

OSSセールスCRM比較:SuiteCRM vs EspoCRM vs Twenty でセールスを管理する

オープンソースラボ編集部2026年6月14日

OSSセールスCRM比較:SuiteCRM vs EspoCRM vs Twenty でセールスを管理する

Salesforce($25/ユーザー/月〜)・HubSpot($45/ユーザー/月〜)などの高額SaaS CRMに依存せず、セルフホストでリード管理・商談追跡・営業自動化・顧客データを完全にコントロールできるOSS CRMツールが進化しています。SuiteCRM(SugarCRM後継・最大シェアOSS CRM)・EspoCRM(軽量・モダンUI・API充実)・Twenty(Linear/Notion風・新世代GraphQL・最注目)の3つが2026年のOSSセールスCRMデファクトスタンダードです。

OSSセールスCRMを使う理由

  • コスト削減: Salesforce($25〜/ユーザー/月)→セルフホストで月$20のVPS費用のみ
  • データ所有権: 顧客情報・商談履歴・メールをサードパーティに渡さずに管理
  • カスタマイズ: 独自の営業プロセス・カスタムフィールド・ワークフローを完全制御
  • GDPR・個人情報保護: 顧客データを自社サーバー内に完全保持してコンプライアンス対応

主要ツールの概要

SuiteCRM

2013年公開(SalesAgility)、PHP製のOSSです。GitHubスター5k+。SugarCRMのフォークとして世界最大のOSS CRMコミュニティを持ち、アカウント・コンタクト・リード・商談(Opportunities)・ケース(サポートチケット)・レポートが統合されています。大量の既存プラグインとSalesforce的なフル機能が特徴です。

# docker-compose.yml: SuiteCRM
version: "3.8"
services:
  suitecrm:
    image: bitnami/suitecrm:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
      - "8443:8443"
    environment:
      SUITECRM_HOST: crm.example.com
      SUITECRM_DATABASE_HOST: mariadb
      SUITECRM_DATABASE_PORT_NUMBER: 3306
      SUITECRM_DATABASE_NAME: suitecrm
      SUITECRM_DATABASE_USER: suitecrm
      SUITECRM_DATABASE_PASSWORD: ${DB_PASS}
      SUITECRM_USERNAME: admin
      SUITECRM_PASSWORD: ${ADMIN_PASS}
      SUITECRM_EMAIL: admin@example.com
      SUITECRM_SMTP_HOST: smtp.example.com
      SUITECRM_SMTP_PORT: 587
      SUITECRM_SMTP_USER: ${SMTP_USER}
      SUITECRM_SMTP_PASSWORD: ${SMTP_PASS}
    depends_on: [mariadb]
    volumes:
      - suitecrm_data:/bitnami/suitecrm

  mariadb:
    image: mariadb:10.11
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS}
      MYSQL_DATABASE: suitecrm
      MYSQL_USER: suitecrm
      MYSQL_PASSWORD: ${DB_PASS}
    volumes:
      - mariadb_data:/var/lib/mysql

volumes:
  suitecrm_data:
  mariadb_data:
# Python: SuiteCRM REST API v8(JWT認証)でリードを自動作成
import requests
from typing import Optional

SUITE_URL = 'https://crm.example.com/api/v8'
CLIENT_ID = 'your-client-id'
CLIENT_SECRET = 'your-client-secret'

def get_access_token() -> str:
    '''SuiteCRM OAuth2トークン取得'''
    resp = requests.post(f'{SUITE_URL}/access_token', data={
        'grant_type': 'client_credentials',
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
    })
    return resp.json()['access_token']

def create_lead(token: str, first_name: str, last_name: str, email: str,
                company: str, phone: Optional[str] = None) -> dict:
    '''SuiteCRMにリードを作成(Webフォームからの問い合わせを自動登録)'''
    headers = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'}
    payload = {
        'data': {
            'type': 'Leads',
            'attributes': {
                'first_name': first_name,
                'last_name': last_name,
                'email1': email,
                'account_name': company,
                'phone_work': phone or '',
                'lead_source': 'Web Site',
                'status': 'New',
                'assigned_user_id': 'default-sales-user-id',
            }
        }
    }
    resp = requests.post(f'{SUITE_URL}/module/Leads', json=payload, headers=headers)
    return resp.json()

def get_opportunities_pipeline(token: str) -> list:
    '''商談パイプラインを取得してステージ別に集計'''
    headers = {'Authorization': f'Bearer {token}'}
    resp = requests.get(
        f'{SUITE_URL}/module/Opportunities',
        params={'filter[sales_stage][eq]': 'Prospecting', 'page[size]': 100},
        headers=headers,
    )
    data = resp.json()['data']
    by_stage = {}
    for opp in data:
        stage = opp['attributes']['sales_stage']
        amount = float(opp['attributes']['amount'] or 0)
        if stage not in by_stage:
            by_stage[stage] = {'count': 0, 'total': 0}
        by_stage[stage]['count'] += 1
        by_stage[stage]['total'] += amount
    return by_stage

EspoCRM

2014年公開(EspoCRM LLC)、PHP製のOSSです。GitHubスター2k+。軽量でモダンなUIと豊富なAPIが特徴のOSS CRMで、アカウント・コンタクト・リード・商談・活動(メール・電話・ミーティング)・レポート・カレンダーをすっきりしたUIで管理できます。

# docker-compose.yml: EspoCRM
version: "3.8"
services:
  espocrm:
    image: espocrm/espocrm:latest
    restart: unless-stopped
    ports:
      - "80:80"
    environment:
      ESPOCRM_DATABASE_HOST: espocrm-mysql
      ESPOCRM_DATABASE_NAME: espocrm
      ESPOCRM_DATABASE_USER: espocrm
      ESPOCRM_DATABASE_PASSWORD: ${DB_PASS}
      ESPOCRM_ADMIN_USERNAME: admin
      ESPOCRM_ADMIN_PASSWORD: ${ADMIN_PASS}
      ESPOCRM_SITE_URL: https://crm.example.com
    volumes:
      - espocrm_vol:/var/www/html
    depends_on: [espocrm-mysql]

  espocrm-daemon:
    image: espocrm/espocrm:latest
    command: ['daemon']
    environment:
      ESPOCRM_DATABASE_HOST: espocrm-mysql
      ESPOCRM_DATABASE_NAME: espocrm
      ESPOCRM_DATABASE_USER: espocrm
      ESPOCRM_DATABASE_PASSWORD: ${DB_PASS}
    volumes:
      - espocrm_vol:/var/www/html

  espocrm-websocket:
    image: espocrm/espocrm:latest
    command: ['websocket']
    ports:
      - "8080:8080"
    volumes:
      - espocrm_vol:/var/www/html

  espocrm-mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASS}
      MYSQL_DATABASE: espocrm
      MYSQL_USER: espocrm
      MYSQL_PASSWORD: ${DB_PASS}
    volumes:
      - mysql_vol:/var/lib/mysql

volumes:
  espocrm_vol:
  mysql_vol:

Twenty

2023年公開(Twenty)、TypeScript/NestJS製のOSSです。GitHubスター24k+。Linear・NotionライクなモダンなデザインとオープンなGraphQL APIが特徴の次世代OSSセールスCRMです。People・Company・Deal・Activity・NotesをリレーションDB(PostgreSQL)とGraphQLで管理し、カスタムオブジェクト・カスタムフィールドをノーコードで追加できます。

# docker-compose.yml: Twenty CRM
version: "3.8"
services:
  twenty-server:
    image: twentycrm/twenty:latest
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      SERVER_URL: https://crm.example.com
      FRONT_BASE_URL: https://crm.example.com
      PG_DATABASE_URL: postgresql://twenty:${DB_PASS}@twenty-db:5432/twenty
      REDIS_URL: redis://twenty-redis:6379
      STORAGE_TYPE: local
      APP_SECRET: ${APP_SECRET}
      ACCESS_TOKEN_SECRET: ${ACCESS_SECRET}
      REFRESH_TOKEN_SECRET: ${REFRESH_SECRET}
    depends_on: [twenty-db, twenty-redis]

  twenty-db:
    image: twentycrm/twenty-postgres:latest
    environment:
      POSTGRES_USER: twenty
      POSTGRES_PASSWORD: ${DB_PASS}
      POSTGRES_DB: twenty
    volumes:
      - twenty_pg:/var/lib/postgresql/data

  twenty-redis:
    image: redis:7-alpine

volumes:
  twenty_pg:
# Python: Twenty GraphQL APIで商談・会社を操作
import httpx

TWENTY_URL = 'https://crm.example.com/api'
API_KEY = 'your-twenty-api-key'

async def create_company_and_deal(company_name: str, deal_name: str, amount: float) -> dict:
    '''Twentyに会社と商談をGraphQL Mutationで作成'''
    headers = {'Authorization': f'Bearer {API_KEY}', 'Content-Type': 'application/json'}
    mutation = '''
        mutation CreateCompanyWithDeal($companyName: String!, $dealName: String!, $amount: CurrencyInput) {
          createCompany(data: { name: $companyName }) {
            id
            name
          }
          createOpportunity(data: {
            name: $dealName
            amount: $amount
            stage: NEW
          }) {
            id
            name
            amount { amountMicros currencyCode }
          }
        }
    '''
    async with httpx.AsyncClient() as client:
        resp = await client.post(TWENTY_URL, json={
            'query': mutation,
            'variables': {
                'companyName': company_name,
                'dealName': deal_name,
                'amount': {'amountMicros': int(amount * 1_000_000), 'currencyCode': 'JPY'},
            },
        }, headers=headers)
    return resp.json()['data']

機能比較表

比較項目SuiteCRMEspoCRMTwenty
機能の豊富さ✅ 最多
モダンUI✅ 最高
GraphQL API中(REST)
カスタムオブジェクト✅(プラグイン)✅(ノーコード)
GitHub Stars5k+2k+24k+

CRMツールはその他カテゴリ/categories/miscのプロジェクト管理ツールとWebhookで連携してセールスタスクをプロジェクト管理システムに自動同期できます。マーケティングカテゴリ/categories/marketingのオープンソースマーケティングオートメーションとメール配信基盤と統合してリードナーチャリング(見込み客育成)フローを構築します。

FAQ

Q. Twenty CRMをGitHubからセルフホストにデプロイする最短手順は?

A. Docker Composeを使えば15分以内にTwenty CRMをセルフホストに立ち上げられます。手順: ①git clone https://github.com/twentyhq/twenty.git && cd twenty.env.exampleをコピーして.envに必要な変数を設定(APP_SECRETACCESS_TOKEN_SECRETREFRESH_TOKEN_SECRETopenssl rand -hex 32で生成)③docker-compose up -dhttp://localhost:3000にアクセスして管理者アカウントを作成⑤Settings→WorkspaceでWorkspace名を設定。リバースプロキシ: nginx/Caddyでcrm.example.comに443(HTTPS)でプロキシ→http://localhost:3000。データバックアップ: PostgreSQLのDockerボリュームtwenty_pgpg_dumpで定期バックアップ。

Q. SuiteCRMのワークフロー自動化でリード登録時にメールを自動送信するには?

A. SuiteCRMのプロセス自動化(Business Process Manager)でリード作成トリガーのメール自動送信を設定します。設定: ①Admin→Process Audit Log→Create Process②条件: Module=LeadsTrigger=On SaveCondition=Is New③Actions: Send Email→メールテンプレートを選択(リード向けウェルカムメール)→To: {leads_email}④Active=Yesで保存。メールテンプレート作成: Admin→Emails→Email Templates→New→$lead_first_nameなどのSuiteCRM変数を使ってパーソナライズメールを作成。Webフォームとの統合: Lead CaptureウィジェットをWebサイトに埋め込み→フォーム送信がSuiteCRMにリードを自動作成→ワークフローでメール自動送信(5分以内)。

Q. EspoCRMのAPIでHubSpotから移行するには?

A. EspoCRM REST APIを使って、HubSpotからエクスポートしたCSVを自動的にEspoCRMに取り込みます。手順: ①HubSpot→Settings→Data Management→Export→Contacts/Companies/Deals/Activities をCSVエクスポート②Python移行スクリプト: HubSpot CSVを読み込んでEspoCRM REST APIでPOST /api/v1/ContactPOST /api/v1/AccountPOST /api/v1/Opportunityを実行③EspoCRMのAPI認証: Settings→API Users→New API User→APIキーを生成→Authorization: ApiKey YOUR_API_KEYヘッダー使用。フィールドマッピング: HubSpotのhs_lifecyclestage→EspoCRMのstatus(Custom Field)に変換。関係性: HubSpotのCompany-Contactのアソシエーション→EspoCRMのaccountIdでアカウントとコンタクトを紐付け。

Q. TwentyのGraphQL APIはどのような機能を提供していますか?

A. TwentyのGraphQL APIは会社・人物・商談・カスタムオブジェクトのフルCRUD・リアルタイムサブスクリプション・Webhookによるイベントストリーミングを提供します。エンドポイント: https://crm.example.com/apiでGraphQL Playground(Introspection)をブラウザから確認可能。Mutation: createCompanyupdateOpportunitycreateAttachmentなどフルCRUD。Query: companies(filter: {name: {like: "%株式会社%"}})でフィルター・ソート・ページネーション対応。Subscription: GraphQL Subscriptionでリアルタイム商談ステータス変更通知(WebSocket)。Webhook: Settings→Webhooks→New Webhook→URL設定→record.createdrecord.updatedrecord.deletedイベントでCustom Objectの変更をSlack・n8n・Zapierに通知。

まとめ

ユースケース推奨ツール
Salesforce代替・フル機能・プラグインSuiteCRM
軽量・シンプル・REST API充実EspoCRM
モダンUI・GraphQL・新規構築・開発者向けTwenty

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。