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']
機能比較表
| 比較項目 | SuiteCRM | EspoCRM | Twenty |
|---|---|---|---|
| 機能の豊富さ | ✅ 最多 | 中 | 中 |
| モダンUI | △ | 中 | ✅ 最高 |
| GraphQL API | ❌ | 中(REST) | ✅ |
| カスタムオブジェクト | ✅(プラグイン) | ✅ | ✅(ノーコード) |
| GitHub Stars | 5k+ | 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_SECRET・ACCESS_TOKEN_SECRET・REFRESH_TOKEN_SECRETはopenssl rand -hex 32で生成)③docker-compose up -d④http://localhost:3000にアクセスして管理者アカウントを作成⑤Settings→WorkspaceでWorkspace名を設定。リバースプロキシ: nginx/Caddyでcrm.example.comに443(HTTPS)でプロキシ→http://localhost:3000。データバックアップ: PostgreSQLのDockerボリュームtwenty_pgをpg_dumpで定期バックアップ。
Q. SuiteCRMのワークフロー自動化でリード登録時にメールを自動送信するには?
A. SuiteCRMのプロセス自動化(Business Process Manager)でリード作成トリガーのメール自動送信を設定します。設定: ①Admin→Process Audit Log→Create Process②条件: Module=Leads、Trigger=On Save、Condition=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/Contact・POST /api/v1/Account・POST /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: createCompany・updateOpportunity・createAttachmentなどフルCRUD。Query: companies(filter: {name: {like: "%株式会社%"}})でフィルター・ソート・ページネーション対応。Subscription: GraphQL Subscriptionでリアルタイム商談ステータス変更通知(WebSocket)。Webhook: Settings→Webhooks→New Webhook→URL設定→record.created・record.updated・record.deletedイベントでCustom Objectの変更をSlack・n8n・Zapierに通知。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| Salesforce代替・フル機能・プラグイン | SuiteCRM |
| 軽量・シンプル・REST API充実 | EspoCRM |
| モダンUI・GraphQL・新規構築・開発者向け | Twenty |