AI

OSS CRM比較:Twenty vs SuiteCRM vs Monica でSalesforceを脱却する

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

OSS CRM比較:Twenty vs SuiteCRM vs Monica でSalesforceを脱却する

Salesforce(月18,000円/ユーザー〜)・HubSpot CRM Pro(月$890/月〜)・Pipedrive(月$14/ユーザー〜)に対して、Twenty(モダンUI搭載の新興OSSCrm)・SuiteCRM(SugarCRMフォーク・エンタープライズ機能)・Monica(個人向けCRM)は自社サーバーで顧客データを管理できます。

OSS CRMを選ぶ理由

  • コスト: Salesforce 10ユーザーは月18万円。Twentyセルフホストで0円
  • データ主権: 顧客情報・商談履歴を外部SaaSに預けない(GDPR・個人情報保護法対応)
  • カスタマイズ: SuiteCRMはモジュールとワークフローを完全カスタマイズ可能
  • API統合: TwentyはGraphQL APIで社内システムとの統合が容易

主要ツールの概要

Twenty

2023年公開、TypeScript/React/NestJS製のOSS CRMです。GitHubスター26k+。Notionライクなモダンなデータベースビューと、Salesforceに近い機能セットをOSSで提供します。GraphQL API・カスタムオブジェクト・自動化ワークフロー・AI支援機能(商談サマリー)を備えた最新鋭のCRMです。

# Twenty を Docker Compose でセルフホスト
git clone https://github.com/twentyhq/twenty.git
cd twenty

# 環境変数を設定
cat > .env << 'EOF'
# Server
SERVER_URL=https://crm.yourcompany.com
APP_SECRET=your-random-32-char-secret-here

# PostgreSQL
PG_DATABASE_URL=postgresql://twenty:twenty_password@db:5432/default
POSTGRES_ADMIN_PASSWORD=root_password

# Redis
REDIS_URL=redis://redis:6379

# ストレージ(ローカルまたはS3)
STORAGE_TYPE=local
# または S3:
# STORAGE_TYPE=s3
# STORAGE_S3_REGION=ap-northeast-1
# STORAGE_S3_NAME=your-s3-bucket
# AWS_ACCESS_KEY_ID=your-key
# AWS_SECRET_ACCESS_KEY=your-secret

# メール
EMAIL_FROM_ADDRESS=crm@yourcompany.com
EMAIL_SYSTEM_ADDRESS=system@yourcompany.com
EMAIL_DRIVER=smtp
EMAIL_SMTP_HOST=smtp.sendgrid.net
EMAIL_SMTP_PORT=587
EMAIL_SMTP_USER=apikey
EMAIL_SMTP_PASSWORD=your-sendgrid-key
EOF

docker compose up -d
// Twenty GraphQL API で商談・コンタクトを操作
// npmでGraphQLクライアントをインストール: npm install graphql-request

import { GraphQLClient, gql } from 'graphql-request'

const client = new GraphQLClient('https://crm.yourcompany.com/api', {
  headers: {
    Authorization: `Bearer ${process.env.TWENTY_API_KEY}`,
  },
})

// コンタクトを作成
const CREATE_PERSON = gql`
  mutation CreatePerson($data: PersonCreateInput!) {
    createPerson(data: $data) {
      id
      name {
        firstName
        lastName
      }
      emails {
        primaryEmail
      }
    }
  }
`

async function createContact(firstName: string, lastName: string, email: string) {
  const result = await client.request(CREATE_PERSON, {
    data: {
      name: { firstName, lastName },
      emails: { primaryEmail: email },
    },
  })
  return result.createPerson
}

// 商談(Opportunity)を作成してコンタクトと紐付け
const CREATE_OPPORTUNITY = gql`
  mutation CreateOpportunity($data: OpportunityCreateInput!) {
    createOpportunity(data: $data) {
      id
      name
      amount {
        amountMicros
        currencyCode
      }
      stage
    }
  }
`

async function createDeal(name: string, amountJpy: number, personId: string) {
  const result = await client.request(CREATE_OPPORTUNITY, {
    data: {
      name,
      amount: {
        amountMicros: amountJpy * 1000000,  // microCurrency(円×100万)
        currencyCode: 'JPY',
      },
      stage: 'NEW',
      pointOfContactId: personId,
    },
  })
  return result.createOpportunity
}

// 使用例: SaaS製品の申込フォームから自動でCRMに登録
async function onFormSubmit(formData: { firstName: string; lastName: string; email: string; plan: string }) {
  const contact = await createContact(formData.firstName, formData.lastName, formData.email)
  const deal = await createDeal(
    `${formData.plan} プラン申込 - ${formData.firstName} ${formData.lastName}`,
    formData.plan === 'pro' ? 29800 : 9800,
    contact.id,
  )
  console.log(`CRM登録完了: Contact ${contact.id}, Deal ${deal.id}`)
}
# Twenty API を Python で操作(フォーム連携・バッチ処理)
import requests
import os

TWENTY_URL = 'https://crm.yourcompany.com'
API_KEY = os.environ['TWENTY_API_KEY']

def graphql(query: str, variables: dict = None) -> dict:
    resp = requests.post(
        f'{TWENTY_URL}/api',
        headers={
            'Authorization': f'Bearer {API_KEY}',
            'Content-Type': 'application/json',
        },
        json={'query': query, 'variables': variables or {}},
    )
    resp.raise_for_status()
    data = resp.json()
    if 'errors' in data:
        raise RuntimeError(data['errors'])
    return data['data']

# コンタクト一覧を取得(フィルタ・ソート付き)
result = graphql('''
  query {
    people(
      filter: { emails: { primaryEmail: { like: "%yourcompany.com%" } } }
      orderBy: { createdAt: DescNullsLast }
      first: 50
    ) {
      edges {
        node {
          id
          name { firstName lastName }
          emails { primaryEmail }
          company { name }
        }
      }
    }
  }
''')
contacts = [edge['node'] for edge in result['people']['edges']]
print(f'{len(contacts)}件のコンタクト取得')

機能比較表

比較項目TwentySuiteCRMMonica
ターゲットB2B SaaS向けエンタープライズ個人・小規模
UIモダン(Notion風)伝統的シンプル
GraphQL API❌(REST)
ワークフロー自動化✅(高機能)
AIサポート✅(β)
GitHub Stars26k+4k+22k+

CRMはLow-Codeカテゴリ/categories/low-codeのN8N・Zapierと連携して問い合わせフォームからの自動登録・メール送信ワークフローを構築します。マーケティングカテゴリ/categories/marketingのListmonkと組み合わせてCRMの顧客セグメントにメールキャンペーンを配信する統合も実現できます。

FAQ

Q. SalesforceからTwentyへのデータ移行はどうすればいいですか?

A. ①Salesforce Data Exportでオブジェクト(Account・Contact・Opportunity)をCSVダウンロード②TwentyのCSVインポート機能(Settings → Data Model → Import)でCSVをアップロード③またはTwenty APIのcreateManyミューテーションでバッチインポート(Pythonスクリプトで自動化)。注意: SalesforceのカスタムフィールドはTwentyでカスタムオブジェクトとして再作成が必要。Salesforceの「ルックアップ関係」はTwentyの「関連付け(Relations)」として設定し直します。大規模データ(10万レコード以上)はAPIバッチ(1000件/リクエスト)で分割インポートを推奨。

Q. TwentyとHubSpot CRM Freeはどちらがスタートアップに向いていますか?

A. コンタクト数が少ない間はHubSpot CRM Free(無料SaaS)プライバシー・データ主権が重要になったらTwentyセルフホストが実用的です。HubSpot CRM Free: ①即使用可能(セットアップ不要)②メール統合(Gmail/Outlook)が標準③コンタクト数無制限。Twentyセルフホスト: ①サーバーコスト(VPS $10/月〜)が必要②GraphQL APIによる高度なカスタマイズ③データが自社サーバーに残る。移行タイミング: ①顧客データが急増してHubSpot Proへの有料アップグレードが必要になった時②セキュリティ監査でデータの所在証明を求められた時。

Q. Monicaは個人のリレーション管理にどう使いますか?

A. Monica(Personal CRM)は友人・家族・仕事の知人とのやりとりを管理します。機能: ①コンタクトのプロフィール(誕生日・住所・家族関係・会社)②インタラクション記録(いつ会った・何を話した)③リマインダー(誕生日・定期的な連絡)④タスク管理(この人に〇〇を確認する)。活用例: 業界カンファレンスで出会った人の名刺情報とメモをMonicaに記録→3ヶ月後のリマインダー設定→フォローアップを忘れない。セルフホスト版はdocker pull monicahq/monicahqで起動。データは自分のサーバーに保存され、monica.comのSaaS版(月$9)のデータが気になる場合に有効です。

Q. SuiteCRMでGmailのメールを自動でCRMに記録するには?

A. SuiteCRMのメール統合を設定します。①Admin → Email → Email Settings でGmailのIMAPを設定(App Passwordを使用)②Accounts→メールアドレスを各コンタクト/Accountと紐付け③SuiteCRMのArchive機能: メールをsales@yourcompany.comにBCCすると自動でCRMのコンタクト/Accountタイムラインに記録。より高度な方法: Google Apps ScriptまたはZapierでGmailの受信メールをSuiteCRM REST API(/api/v8/module/EmailAddress)に送信するフックを設定。

まとめ

ユースケース推奨ツール
B2B SaaS・モダンUI・GraphQL APITwenty
エンタープライズ・複雑ワークフローSuiteCRM
個人のリレーション管理Monica

関連外部リソース

他の記事も読む

Let's Build Together

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

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