twenty-crm
Salesforceの代替となるオープンソースのCRM、Twentyを使って、顧客管理や営業プロセスを自動化し、API連携も可能な柔軟なCRM環境を構築するSkill。
📜 元の英語説明(参考)
Build custom CRM workflows with Twenty — open-source CRM alternative to Salesforce. Use when someone asks to "set up a CRM", "Twenty CRM", "open-source Salesforce alternative", "customer relationship management", "self-hosted CRM", or "CRM with API access". Covers contacts, companies, pipelines, custom objects, automations, and API integration.
🇯🇵 日本人クリエイター向け解説
Salesforceの代替となるオープンソースのCRM、Twentyを使って、顧客管理や営業プロセスを自動化し、API連携も可能な柔軟なCRM環境を構築するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o twenty-crm.zip https://jpskill.com/download/15503.zip && unzip -o twenty-crm.zip && rm twenty-crm.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15503.zip -OutFile "$d\twenty-crm.zip"; Expand-Archive "$d\twenty-crm.zip" -DestinationPath $d -Force; ri "$d\twenty-crm.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
twenty-crm.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
twenty-crmフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Twenty CRM
概要
Twenty はコミュニティによって形作られたオープンソースの CRM で、Salesforce や HubSpot の現代的な代替手段です。連絡先、会社、およびカスタマイズ可能なパイプラインを持つ取引を保存します。違いは、完全にオープンソースであり、自己ホスト可能であり、強力な GraphQL/REST API を持ち、カスタムオブジェクト(独自のデータ型を定義)をサポートすることです。React、Node.js、および PostgreSQL で構築されています。
どのような時に使うか
- Salesforce の価格設定(月額 1 ユーザーあたり $75〜300)なしで CRM が必要な場合
- データ主権のために自己ホスト型 CRM が必要な場合
- API 経由でカスタム CRM 統合を構築する場合
- 標準の連絡先/取引を超えたカスタムオブジェクトが必要な場合
- 小規模から中規模の営業チーム(1〜50 ユーザー)
手順
セットアップ
# Docker Compose (推奨)
curl -fsSL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml -o docker-compose.yml
docker compose up -d
# http://localhost:3000 でアクセス
GraphQL API
// crm-client.ts — GraphQL 経由で Twenty CRM と対話
const TWENTY_URL = "http://localhost:3000/api/graphql";
const API_KEY = process.env.TWENTY_API_KEY;
async function graphql(query: string, variables?: Record<string, any>) {
const res = await fetch(TWENTY_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${API_KEY}`,
},
body: JSON.stringify({ query, variables }),
});
return res.json();
}
// 会社を作成
const company = await graphql(`
mutation CreateCompany($input: CompanyCreateInput!) {
createCompany(data: $input) {
id
name
domainName
}
}
`, {
input: {
name: "Acme Corp",
domainName: "acme.com",
employees: 50,
idealCustomerProfile: true,
},
});
// 連絡先(個人)を作成
const person = await graphql(`
mutation CreatePerson($input: PersonCreateInput!) {
createPerson(data: $input) {
id
name { firstName lastName }
email
}
}
`, {
input: {
name: { firstName: "Kai", lastName: "Chen" },
email: "kai@acme.com",
phone: "+1234567890",
companyId: company.data.createCompany.id,
jobTitle: "CTO",
},
});
// 取引パイプラインをクエリ
const deals = await graphql(`
query GetDeals {
opportunities(filter: { stage: { eq: NEGOTIATION } }) {
edges {
node {
id
name
amount
stage
closeDate
company { name }
pointOfContact { name { firstName lastName } }
}
}
}
}
`);
REST API
// rest-example.ts — より単純な操作のための REST API
// すべての会社をリスト
const companies = await fetch("http://localhost:3000/api/rest/companies", {
headers: { Authorization: `Bearer ${API_KEY}` },
}).then(r => r.json());
// 連絡先を検索
const contacts = await fetch(
"http://localhost:3000/api/rest/people?filter[email][contains]=acme.com",
{ headers: { Authorization: `Bearer ${API_KEY}` } }
).then(r => r.json());
カスタムオブジェクト
// custom-objects.ts — 独自のデータ型を定義
// API 経由でカスタムの「Support Ticket」オブジェクトを作成
const customObject = await graphql(`
mutation CreateCustomObject {
createOneObject(input: {
nameSingular: "supportTicket"
namePlural: "supportTickets"
labelSingular: "Support Ticket"
labelPlural: "Support Tickets"
icon: "IconHeadset"
}) {
id
}
}
`);
// カスタムオブジェクトにフィールドを追加
await graphql(`
mutation AddField {
createOneField(input: {
objectId: "${customObject.data.createOneObject.id}"
name: "priority"
label: "Priority"
type: SELECT
options: [
{ value: "low", label: "Low", color: "green" },
{ value: "medium", label: "Medium", color: "yellow" },
{ value: "high", label: "High", color: "red" }
]
}) { id }
}
`);
例
例 1:営業チーム向けの CRM のセットアップ
ユーザープロンプト:「10 人の営業チーム向けの CRM をセットアップしてください。連絡先、会社、取引パイプライン、および活動追跡が必要です。」
エージェントは Docker 経由で Twenty をデプロイし、営業パイプラインのステージを構成し、既存の連絡先をインポートし、チームアクセスをセットアップします。
例 2:既存のツールとの CRM の統合
ユーザープロンプト:「CRM の連絡先をアプリのユーザーデータベースと同期し、取引ステージの変更時に Slack 通知を送信してください。」
エージェントは Twenty の GraphQL API を使用して連絡先を同期し、取引イベントの Webhook をセットアップし、通知を Slack に転送します。
ガイドライン
- 複雑なクエリには GraphQL — 関係、フィルター、ネストされたデータ
- 単純な CRUD には REST — リスト、作成、更新操作
- カスタムオブジェクト — データが適合しない場合は、連絡先/会社に無理にデータを入れないでください
- データ主権のために自己ホスト — データはサーバー上に保持されます
- 統合のための API キー — 設定 > API で生成
- パイプラインステージはカスタマイズ可能 — 実際の販売プロセスに合わせてください
- リアルタイム同期のための Webhook — レコードの変更時にアクションをトリガー
- CSV 経由でインポート — 既存の CRM/スプレッドシートから一括インポート
- 基盤となる PostgreSQL — 必要に応じてカスタムクエリを実行できます
- 活発なコミュニティ — 25,000 以上の GitHub スター、毎週リリース
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Twenty CRM
Overview
Twenty is an open-source CRM shaped by the community — a modern alternative to Salesforce and HubSpot. It stores contacts, companies, and deals with customizable pipelines. The difference: it's fully open-source, self-hostable, has a powerful GraphQL/REST API, and supports custom objects (define your own data types). Built with React, Node.js, and PostgreSQL.
When to Use
- Need a CRM without Salesforce pricing ($75-300/user/month)
- Want self-hosted CRM for data sovereignty
- Building custom CRM integrations via API
- Need custom objects beyond standard contacts/deals
- Small-to-medium sales team (1-50 users)
Instructions
Setup
# Docker Compose (recommended)
curl -fsSL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml -o docker-compose.yml
docker compose up -d
# Access at http://localhost:3000
GraphQL API
// crm-client.ts — Interact with Twenty CRM via GraphQL
const TWENTY_URL = "http://localhost:3000/api/graphql";
const API_KEY = process.env.TWENTY_API_KEY;
async function graphql(query: string, variables?: Record<string, any>) {
const res = await fetch(TWENTY_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${API_KEY}`,
},
body: JSON.stringify({ query, variables }),
});
return res.json();
}
// Create a company
const company = await graphql(`
mutation CreateCompany($input: CompanyCreateInput!) {
createCompany(data: $input) {
id
name
domainName
}
}
`, {
input: {
name: "Acme Corp",
domainName: "acme.com",
employees: 50,
idealCustomerProfile: true,
},
});
// Create a contact (person)
const person = await graphql(`
mutation CreatePerson($input: PersonCreateInput!) {
createPerson(data: $input) {
id
name { firstName lastName }
email
}
}
`, {
input: {
name: { firstName: "Kai", lastName: "Chen" },
email: "kai@acme.com",
phone: "+1234567890",
companyId: company.data.createCompany.id,
jobTitle: "CTO",
},
});
// Query deals pipeline
const deals = await graphql(`
query GetDeals {
opportunities(filter: { stage: { eq: NEGOTIATION } }) {
edges {
node {
id
name
amount
stage
closeDate
company { name }
pointOfContact { name { firstName lastName } }
}
}
}
}
`);
REST API
// rest-example.ts — REST API for simpler operations
// List all companies
const companies = await fetch("http://localhost:3000/api/rest/companies", {
headers: { Authorization: `Bearer ${API_KEY}` },
}).then(r => r.json());
// Search contacts
const contacts = await fetch(
"http://localhost:3000/api/rest/people?filter[email][contains]=acme.com",
{ headers: { Authorization: `Bearer ${API_KEY}` } }
).then(r => r.json());
Custom Objects
// custom-objects.ts — Define your own data types
// Create a custom "Support Ticket" object via API
const customObject = await graphql(`
mutation CreateCustomObject {
createOneObject(input: {
nameSingular: "supportTicket"
namePlural: "supportTickets"
labelSingular: "Support Ticket"
labelPlural: "Support Tickets"
icon: "IconHeadset"
}) {
id
}
}
`);
// Add fields to the custom object
await graphql(`
mutation AddField {
createOneField(input: {
objectId: "${customObject.data.createOneObject.id}"
name: "priority"
label: "Priority"
type: SELECT
options: [
{ value: "low", label: "Low", color: "green" },
{ value: "medium", label: "Medium", color: "yellow" },
{ value: "high", label: "High", color: "red" }
]
}) { id }
}
`);
Examples
Example 1: Set up CRM for a sales team
User prompt: "Set up a CRM for our 10-person sales team. We need contacts, companies, deal pipeline, and activity tracking."
The agent will deploy Twenty via Docker, configure the sales pipeline stages, import existing contacts, and set up team access.
Example 2: Integrate CRM with existing tools
User prompt: "Sync our CRM contacts with our app's user database and send Slack notifications on deal stage changes."
The agent will use Twenty's GraphQL API to sync contacts, set up webhooks for deal events, and forward notifications to Slack.
Guidelines
- GraphQL for complex queries — relations, filters, nested data
- REST for simple CRUD — list, create, update operations
- Custom objects — don't force data into contacts/companies if it doesn't fit
- Self-host for data sovereignty — your data stays on your servers
- API keys for integrations — generate in Settings > API
- Pipeline stages are customizable — match your actual sales process
- Webhooks for real-time sync — trigger actions on record changes
- Import via CSV — bulk import from existing CRM/spreadsheets
- PostgreSQL underneath — can run custom queries if needed
- Active community — 25K+ GitHub stars, weekly releases