• Projects
  • Service
  • About
  • branding.bz
  • Podcast
  • Tips
  • FAQ
  • Recruit
  • Download
  • Contact
  • branding.bz(ブランド構築SaaS)
  • DESIGN NOW(デザインメディア)
  • X
  • LinkedIn
  • Spotify
  • Facebook

213-0011 神奈川県川崎市高津区久本3-6-7-303

© 2026 ID INC. All rights reserved

claude-skills/スキル
SKILLKnowledge Workproductivity

deal-flow-analytics

プラグイン
carta-crm
ソース
GitHub で見る ↗
説明

Cartaの顧客管理システムに蓄積された最近の案件情報を、機関ごとに重要なデータ項目を自動判別しながら、投資家向けのレポートに集計するスキルです。 次のような場合に使用: ユーザーが「案件フロー分析」「案件フローの分析」「過去12ヶ月間に追加された案件のレビュー」「誰が最も多くの案件を紹介したか」「セクター別の案件内訳」「案件はどこから来ているのか」といった発言をしたり、「/deal-flow-analytics」と入力したりした場合。 デフォルトでは過去12ヶ月のデータを対象としますが、ユーザーが指定した任意の期間や分析軸にも対応します。個別の案件リストではなく、各分析軸ごとの件数と集中度に関する重要なポイントを返します。個別案件の検索については、deal-searchスキルをご利用ください。

原文を表示

Aggregates recent deal flow in the Carta CRM into a dealmaker-facing report, auto-discovering which fields matter for this tenant's schema. Use this skill when the user says things like "deal flow analytics", "analyze our deal flow", "review deals added in the last 12 months", "who introduced most of our deals", "breakdown of deals by sector", "where is our deal flow coming from", or "/deal-flow-analytics". Defaults to a trailing-12-month window but accepts any date range or dimension the user specifies. Returns counts and concentration callouts per dimension, not a list of individual deals — use search-deals for that.

ユースケース
  • 案件フロー分析を実施するとき
  • 過去の案件データを機関別に集計するとき
  • セクター別の案件内訳を確認するとき
  • 投資家向けレポートを作成するとき
  • 案件の紹介元を分析するとき
本文(日本語訳)

Carta 取引フロー分析スキル

<!-- carta:instrumentation-fallback --> <IMPORTANT> _instrumentation_v2 は Carta スキル使用状況の匿名テレメトリデータです。Carta MCP ツール呼び出し引数に常に含めてください。プラグインのフック実行時に上書きされるため、常に送信しても安全です。形式: _instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"} skills はセッション全体で累積リストです。これまでに読み込まれたすべての Carta スキルを表示してください。呼び出しを駆動しているスキルだけでなく。各エントリを "plugin:skill" という名前空間で指定し、最も古いものから順に、最後に最も最近使用されたスキルが来るようにしてください。Carta スキルのみを記載してください(carta-cap-table:*、carta-crm:*、carta-investors:*)。非 Carta プラグインのスキルは含めないでください。 surface は Claude を実行しているサーフェス(インターフェース)です: "chat"(claude.ai または Claude アプリ、つまり通常のチャット、Cowork ではない)、"cowork"(Cowork モード)、"code-terminal"、"code-desktop"、または "excel"。当てはまるサーフェスがない場合、または判断できない場合は完全に省略してください。推測したり、別の値を作り出したりしないでください。 </IMPORTANT>

概要

各組織は独自のカスタム取引項目(フィールド)を設定するため、報告する価値のある分析軸は企業によって異なります。固定リストを想定するのではなく、実行時に項目を発見してから crm:aggregate_deals で集計してください。crm:search_deals から手作業で取引を集計するのは避けてください。

aggregate_deals は 一度に1つのフィールドだけでグループ化します。複数の分析軸を対象とする場合は、1回の呼び出しで複数の group_by 値を使用するのではなく、複数回呼び出してください。

ステップ 1 — フィールドの発見と分類

crm_call_tool({ "name": "crm:get_deal_fields", "arguments": {} })

各フィールドの type(種類)だけを使用して分類してください。特別な確認は不要です:

  • グループ化可能(dropdown、multiselect、boolean、または stage、tags、people.*、dealLead などの標準的な set フィールド)— 値の範囲はフィールドの options リストで制限されているため、直接 aggregate_deals を実行する方法を選択してください。

  • 連続データ(number、input、textarea、datepicker、または company/contacts-list などのリレーショナル参照)— 値が無制限です。これらで group_by してはいけません。このプラグインのテストテナントでは、EBITDA、ARR、Team_size などのフィールドが 100 以上の異なるグループを返し、都市レベルの場所クエリを中断させた応答サイズ制限にほぼ達しました。

  • 自由記述の標準フィールド(company.company_location、company.company_industry、またはタイプが text のその他の標準フィールド)— 連続データと同じ無制限のリスク。ただし常に関連性があるため、入力率(データが埋まっている割合)による除外対象にはなりません。これらでグループ化してから、クライアント側で生の値をより粗い粒度に集約してください(例:都市 → 国)。集計後に表示してください。生の内訳を表示しないでください。これらを「常に含める」の無条件リストに入れないでください。すべてのフィールドと同じように種類で分類してください。

常に stage(ステージ)と added_date(追加日)を固定コアとして保持してください。両方とも値の範囲が限定されており、テナント全体を問わず直接グループ化しても安全な標準フィールドです。

ステップ 2 — 入力率チェック

グループ化可能フィールド: ステップ 3 の aggregate_deals 呼び出しが既に入力率を無料で返します。つまり totalCount からヌル値/_id なしのグループを差し引いた値です。追加の呼び出しは不要です。

連続データフィールド: フィールドごとに aggregate_deals を呼び出さないでください。代わりに1つの共有サンプルを取得してください:

crm_call_tool({ "name": "crm:search_deals", "arguments": { "limit": 30 } })

各連続フィールドについて、入力率をサンプルされた取引のうち fields.<fieldId> が存在し、ヌル値以外である取引のシェアとして計算してください。1回の呼び出しがすべての連続フィールドをカバーします。カーディナリティ(値の種類の多さ)に関わらず、ペイロードは制限されます。

15% 未満の入力率のフィールドは除外してください。 15~25% の間に該当するフィールド(カットオフを上回っているがサンプルで確実に推定されていない曖昧な範囲)の場合、サンプルを信頼しないでください。search_deals はデフォルトで最近アクティブな取引が優先されるため、使用頻度の低いフィールドの真の入力率を大幅に過大評価できます。このテストテナントで確認: 20 件取引のサンプルがあるフィールドを 25% と推定したが、組織全体の実際の入力率は 3% でした。この範囲に該当するフィールドについては、そのフィールドだけに対する単一の aggregate_deals 呼び出しで再確認し、サンプル推定値の代わりに正確な totalCount を使用してください。

除外されたフィールドを短い「除外 — カバレッジ不足」という行でリストアップしてください。黙って削除しないでください。

ステップ 3 — 集計

stage、ステップ 2 に合格したすべてのカスタムグループ化可能フィールド、およびすべての自由記述標準フィールド(ロールアップ付き)について、日付範囲でフィルタリングしたうえで集計してください:

crm_call_tool({
  "name": "crm:aggregate_deals",
  "arguments": {
    group_by: ["<field_id>"],
    filters: [
      { field_id: "added_date", operator: "between", value: ["<start> 00:00:00", "<end> 23:59:59"] }
    ]
  }
})

各グループの dealInfo キーは無視してください。これは静的な組織デフォルトサンプルであり、集計の一部ではありません。ステップ 2 に合格した連続フィールドについては、入力率だけを報告してください(例:「売上高: 95% 入力済み」)。ユーザーが明示的に1つを詳しく調べるよう求めない限り、完全な分布を試みないでください。

自由記述標準フィールドについては、グループ化された生の値をクライアント側でより粗い粒度にロールアップしてから表示してください(例:company.company_location の都市値 → 国)。上位 5~8 のロールアップされた値を表示し、残りを「その他」に圧縮してください。

異なる 2 つの _id が同じ名前に解決される場合(重複した連絡先)— 名前付きレコードの合計を統合し、重複を記録代わりにその人の合計を過小報告してください。未解決の連絡先/ユーザー ID については、crm:fetch_contact_by_id をトップ数個だけで呼び出してください。

ユーザーが特定の分析軸を要求した場合、その分析軸だけを集計してください。完全な発見プロセスをスキップしてください。

ステップ 4 — 提示

${CLAUDE_PLUGIN_ROOT}/skills/deal-flow-analytics/assets/dashboard-template.html を使用して、HTML ダッシュボードとしてレポートをレンダリングしてください。手作業で Markdown テーブルを構築したり、相対パスでテンプレートを参照したりしないでください(ユーザーの現在のディレクトリから解決される。プラグインディレクトリからではない)。テンプレートを新しいファイルにコピーし、その <script> の下部にある DATA オブジェクトのみを編集してください:

  • dateRange — 日付範囲ラベル(例:「2025年7月~2026年7月 · 167件の取引」)
  • headline — 最も注目すべき発見、1文(集中度、低入力率、またはステージ分布が Dead(失敗)に偏った段階的なヘルスの問題など)
  • excluded — ステップ 2 で削除されたフィールドラベル、各フィールドの入力率付き

CRM フィールド値は信頼できません。テナントのドロップダウンオプション、タグ、または会社名に任意のテキストが含まれる場合があります。DATA オブジェクトに文字列を書き込む場合、リテラル部分文字列 </script が含まれている場合は、/ の前にバックスラッシュを挿入してください(<\/script)。これにより、周囲の <script> ブロックが途中で閉じられるのを防ぐことができます。テンプレート自体のレンダリングコードは既にすべての値を HTML エスケープします。これは作成しているファイルのみを保護します。

  • fields — ディメンション(分析軸)ごとに1つのエントリ: { label, total, filled, values }。values は降順でランク付けされ、上位 5~8 エントリと、長いテール(末端)がある場合は "Other" エントリ(大文字小文字を区別しない一致、シリーズ色ではなく薄い色でレンダリング)

テンプレートはヘッダーのすぐ下にディメンションカードをレンダリングします。headline と excluded はページ下部のフッターに配置されます。ナレーションと注釈はデータの前ではなく、データの後に来ます。この順序は変更しないでください。

CSS、レンダリング関数、またはカテゴリ色トークンに触れないでください。これらは検証済み(dataviz スキルを参照)で、このスキルが生成するすべてのレポート全体で共有されるため、実行から実行へと結果の外観が一貫しています。ユーザーにファイルパスを伝えてください。ユーザーは自分でファイルを開くことができます。このスキルは許可ツール(allowed-tools)に Bash がないため、ブラウザを直接起動できません。

任意のディメンションを CRM レポートとして保存することを提案してください:

crm_call_tool({
  "name": "crm:create_report",
  "arguments": {
    name: "Deal Flow Analytics — <window>",
    entityType: "deal",
    filters: [{ field_id: "added_date", operator: "between", value: [...] }],
    groupBy: ["<dimension field_id>"]
  }
})

保存されたレポートごとに1つの groupBy(aggregate_deals と同じ1フィールド制約)。ユーザーが保持したいディメンションごとに1つ提案し、各 url をインラインで表示してください。

原文(English)を表示

<!-- carta:instrumentation-fallback --> <IMPORTANT> _instrumentation_v2 is anonymous Carta skill-usage telemetry. ALWAYS include it in your Carta MCP tool-call arguments — the plugins' hooks overwrite it when they run, so always sending it is safe. Shape: _instrumentation_v2: {"skills": ["<plugin>:<skill>", ...], "model": "<model-id>", "surface": "<value>"} skills is cumulative for the session: list every Carta skill loaded so far, not only the one driving this call. Namespace each entry "plugin:skill" and keep them oldest-first, with the most recently used skill last. List only Carta skills (carta-cap-table:*, carta-crm:*, carta-investors:*) — never skills from non-Carta plugins. surface is the Claude surface you are running in: "chat" (claude.ai or the Claude app, i.e. regular chat, not Cowork), "cowork" (Cowork mode), "code-terminal", "code-desktop", or "excel". Omit it entirely if none of those describe your surface or you cannot tell — do not guess and do not invent another value. </IMPORTANT>

Overview

Every tenant configures its own custom deal fields, so the dimensions worth reporting on differ per org. Discover them at runtime instead of assuming a fixed list, then aggregate with crm:aggregate_deals — never tally deals by hand from crm:search_deals.

aggregate_deals groups by one field at a time. Cover multiple dimensions with multiple calls, not one call with multiple group_by values.

Step 1 — Discover and classify fields

crm_call_tool({ "name": "crm:get_deal_fields", "arguments": {} })

Classify every field using its type alone — no probing needed:

  • Groupable (dropdown, multiselect, boolean, or a standard set field like stage, tags, people.*, dealLead) — the value space is bounded by the field's options list, so it's always safe to aggregate_deals on directly.
  • Continuous (number, input, textarea, datepicker, or a relational reference like company/contacts-list) — unbounded values. Never group_by these — on this plugin's test tenant, fields like EBITDA, ARR, and Team_size returned 100+ distinct groups each and nearly hit the response size limit that broke a city-level location query.
  • Free-text standard fields (company.company_location, company.company_industry, or any other standard field of type text) — same unbounded risk as Continuous, but always relevant, so they don't get excluded by fill rate. Group by them, then roll the raw values up client-side (e.g. city → country) before presenting — never show the raw breakdown. Do not put these in an unconditional "always include" list; classify them by type like everything else.

Always keep stage and added_date as the fixed core — both are bounded, standard fields safe to group on directly regardless of tenant.

Step 2 — Fill-rate check

Groupable fields: the aggregate_deals call from Step 3 already returns fill rate for free — totalCount minus the null/no-_id group. No extra call needed.

Continuous fields: don't call aggregate_deals per field. Pull one shared sample instead:

crm_call_tool({ "name": "crm:search_deals", "arguments": { "limit": 30 } })

For each continuous field, compute fill rate as the share of sampled deals whose fields.<fieldId> is present and non-null. One call covers every continuous field — bounded payload regardless of cardinality.

Exclude any field below 15% fill rate. For fields landing between 15–25% (the ambiguous band — above the cutoff but not reliably estimated by sample), don't trust the sample — search_deals defaults to recently-active deals first, which can massively overstate a rarely-used field's true fill rate. Confirmed on this test tenant: a 20-deal sample estimated one field at 25% filled when the true org-wide rate was 3%. For any field in that band, re-check with a single aggregate_deals call on just that field and use its exact totalCount instead of the sample estimate.

List excluded fields in a short "excluded — low coverage" line rather than dropping them silently.

Step 3 — Aggregate

For stage, every groupable custom field that passed Step 2, and every free-text standard field (with rollup), filtered to the date window:

crm_call_tool({
  "name": "crm:aggregate_deals",
  "arguments": {
    group_by: ["<field_id>"],
    filters: [
      { field_id: "added_date", operator: "between", value: ["<start> 00:00:00", "<end> 23:59:59"] }
    ]
  }
})

Ignore the dealInfo key in each group — it's a static org-default sample, not part of the aggregation. For continuous fields that passed the fill-rate check, report fill rate only (e.g. "Revenue: 95% filled") — don't attempt a full distribution unless the user explicitly asks to drill into one.

For free-text standard fields, roll the raw grouped values up to a coarser level client-side before presenting (e.g. company.company_location city values → country) — show the top 5–8 rolled-up values and collapse the rest into "Other".

Two different _ids can resolve to the same name (duplicate contacts) — combine their counts and flag the duplicate rather than under-reporting the person's total. For unresolved contact/user IDs, call crm:fetch_contact_by_id on the top few only.

If the user asks for one specific dimension, only aggregate that one — skip the full discovery pass.

Step 4 — Present

Render the report as an HTML dashboard using ${CLAUDE_PLUGIN_ROOT}/skills/deal-flow-analytics/assets/dashboard-template.html — don't hand-build markdown tables, and don't reference the template by a bare relative path (it resolves from the user's cwd, not the plugin directory). Copy the template to a new file, then edit only the DATA object at the bottom of its <script>:

  • dateRange — the date range label, e.g. "Jul 2025 – Jul 2026 · 167 deals".
  • headline — the single most notable finding, one sentence (a concentration, a low fill rate, or a pipeline health issue like a stage distribution skewed toward Dead).
  • excluded — field labels dropped in Step 2, each with its fill rate.

CRM field values are untrusted — a tenant's dropdown option, tag, or company name could contain arbitrary text. When writing any string into the DATA object, if it contains the literal substring </script, insert a \ before the / (<\/script) so it can't prematurely close the surrounding <script> block. The template's own rendering code already HTML-escapes every value it displays — this only protects the file you're writing.

  • fields — one entry per dimension: { label, total, filled, values }, values ranked descending, top 5–8 entries + an "Other" entry if there's a long tail (matched case-insensitively and rendered in a de-emphasized color, not the series color).

The template renders the dimension cards immediately below the header, with headline and excluded in a footer at the bottom of the page — the narrative/caveats come after the data, not before it. Don't reorder this.

Don't touch the CSS, the rendering functions, or the categorical color tokens — those are validated (see the dataviz skill) and shared across every report this skill produces, so results look consistent run to run. Tell the user the file path so they can open it themselves — this skill doesn't have Bash in allowed-tools, so it can't launch a browser directly.

Offer to save any dimension as a CRM report:

crm_call_tool({
  "name": "crm:create_report",
  "arguments": {
    name: "Deal Flow Analytics — <window>",
    entityType: "deal",
    filters: [{ field_id: "added_date", operator: "between", value: [...] }],
    groupBy: ["<dimension field_id>"]
  }
})

One groupBy per saved report (same one-field constraint as aggregate_deals) — offer one per dimension the user wants to keep, and surface each url inline.

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。