Community程式設計與開發github.com

keinsaasforever/gtm-pipeline-skills

B2B 銷售的 Claude 技能

gtm-pipeline-skills 是什麼?

這項技能旨在為 B2B 銷售團隊提供一個完整的 Go-to-Market (GTM) 管線自動化流程,從潛在客戶生成、ICP 篩選、資料豐富化,到個人化訊息產生,一應俱全。它支援 Claude Code 等 AI Agent 平台,可透過 webhook 觸發,自動執行從解析提示、建立工作目錄、搜尋潛在客戶、基於 ICP 排名、電子郵件豐富化(可選訊號搜尋)到最後產生高品質訊息樣本的整個流程。其核心價值在於透過結構化的步驟與嚴格的品質規則,確保 AI 產出的 outreach 內容真實且不流於形式,而非僅是泛泛的樣板訊息。此外,此技能還包含了成本閘門機制,在首次呼叫付費供應商前會估算並確認花費,適合需要高度自動化與品質控管的銷售開發場景。

相容平台✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add keinsaasforever/gtm-pipeline-skills

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

示範

產生約 10 筆包含豐富資訊的示範潛在客戶清單,並附上個人化訊息範例,透過 webhook 提示觸發。

在執行前,請先閱讀 ~/.claude/skills/gtm-pipeline/_shared/conventions.md。


使用時機

  • Webhook 觸發:使用者提交免費示範表單,描述其目標受眾
  • 目標:證明 AI 代理能使用真實的潛在客戶,寫出真實、非制式化的 outreach 訊息
  • 範圍:約 10 位聯絡人,包含 LinkedIn 與電子郵件豐富化資訊,2–4 則訊息範例

示範限制

  • 不進行電話號碼豐富化 — 僅限電子郵件
  • 約 10 位聯絡人(要求 10–15 位,考量到豐富化過程中的資料耗損)
  • 訊息產生為選用但建議
  • 訊號搜尋為選擇性加入 — 預設關閉。可透過 --with-signals 旗標或使用者明確要求啟用。請參閱步驟 5.5。
  • 成本閘門: 在首次呼叫付費供應商前,說明預期花費(People-Source Cadence 中的 Finder 搜尋大多免費;約 10–15 個電子郵件豐富化點數;若啟用訊號搜尋則低於 $0.50 美元)。互動模式:先與使用者確認。無頭模式:將預估值記錄在 run_log.md 中並繼續執行,切勿中斷。

步驟 1 — 解析提示並建立 ICP

Webhook 提示描述使用者的目標受眾。請提取以下資訊:

必須有:

  • 您銷售 / 提供的產品或服務是什麼?
  • 誰是您的理想客戶?(產業、職位、公司規模、地點)
  • 您的價值主張是什麼?
  • 語氣為何?(正式 vs. 休閒,若有範例更佳)
  • 這是用於招募還是銷售給客戶?

若提示中未提供,請推斷(不要停滯):

  • 目標職稱、地點、公司規模 / 類型

在解讀受眾之前,先自動解析請求者(解決反覆出現的「他們到底賣什麼 / 為什麼想要這個受眾」的資訊缺口):

  1. 解析請求者自己的網域(例如 [email protected] → acme.de),抓取 / 豐富其資訊,並確定他們 銷售 什麼。對於提供多種產品的公司:確認此次示範是針對 哪個產品線 — 提示中聲稱的產品可能與實際產品不符。
  2. 確定與目標受眾的關係 — 目標術語(例如「客服中心」)通常是他們 銷售 的對象,而非他們本身。分類:銷售給 / 從...購買 / 收購 / 合作 / 招募。人物誌關鍵字由此衍生,而非猜測。

互動模式 vs. 部署模式(無頭模式):

  • 互動模式: 如果在自動解析後,某個必須項目仍有模糊之處,請提出一個簡潔的釐清問題。否則繼續進行。
  • 部署 / 無頭模式(透過 webhook 使用 claude -p 調用 — 請參閱部署章節):切勿因問題而停滯不前。 根據提示和請求者網域研究推斷每個欄位,將假設記錄在 context/icp.md 的「假設」標題下,並完整執行從頭到尾的流程。

在 ICP 足夠清晰以建立有意義的篩選條件之前,請勿繼續搜尋。

將 ICP 儲存至: {client-slug}-gtm/context/icp.md(包含提供的產品、關係分類以及任何無頭模式下的假設)。


步驟 2 — 建立工作目錄

依照 conventions.md 中的定義建立 {client-slug}-gtm/ 目錄結構。將 ICP 定義寫入 context/icp.md。


步驟 3 — 人員搜尋(10 位聯絡人)

使用 people-search 技能尋找約 10–15 位聯絡人。

示範用供應商選擇: 遵循 conventions.md 中的 Finder 節奏 → People-Source Cadence — FullEnrich Finder → BetterContact → Pipe0 → Amplemarket/Crustdata(最後手段),每個來源最多嘗試 2 次,中小企業 / 所有者領導 / 非英語市場優先使用 FE。FE 和 BC 都會直接回傳 LinkedIn 網址(電子郵件豐富化所需)。如果沒有公司清單(基於人物誌的提示),請使用 Parallel FindAll 或 BC Search。對於來自目錄 / 爬蟲的公司清單,請按公司 名稱 + 地點搜尋,切勿使用精確網域搜尋(慣例 #11)。

要收集的關鍵欄位:

full_name, first_name, last_name,
job_title, company_name, company_domain,
linkedin_profile_url, location

遵循人員搜尋的執行協議:沙盒 → 測試 → 審查 → 執行。


步驟 4 — 聯絡人篩選(ICP 排名)

對找到的 10–15 位聯絡人執行 contact-filter 操作。即使是小批量,ICP 排名也很有幫助 — 它能確保豐富化步驟專注於最符合條件的聯絡人。

  • 套用職位層級、產業層級、地點層級和公司規模分類
  • 拒絕明顯不符合 ICP 的聯絡人
  • 根據優先級對通過的聯絡人進行排名
  • 輸出:csv/intermediate/contacts_filtered.csv

對於示範:使用寬鬆的硬性拒絕門檻(允許層級 1–5 通過),優先考量排名而非篩選。


步驟 5 — 人員豐富化(僅限電子郵件)

對篩選後的聯絡人執行 people-enrichment 操作。示範模式:僅限電子郵件,不含電話。

建議流程:

  1. FullEnrich v2(電子郵件)— 所有聯絡人
  2. Pipe0 waterfall — 僅針對 FE 未找到的聯絡人

為訊息個人化而進行的額外豐富化(若可用):

  • LinkedIn 標題和摘要(透過 PhantomBuster 爬取 LinkedIn)
  • 近期的 LinkedIn 貼文(每位聯絡人 2–3 篇)— 能顯著提升訊息品質

用於訊息產生的最低必要欄位:

name, job_title, company_name, linkedin_profile_url,
headline (optional), summary (optional), recent_posts (optional)

低產出率: 如果經過篩選和豐富化後,存活下來的聯絡人少於 8 位,請在繼續產生訊息前,再執行一次額外的 Finder 步驟(People-Source Cadence 中的下一個來源)。


步驟 5.5 — 訊號搜尋(選擇性)

預設:關閉。 在以下情況啟用:

  • 使用者明確要求以訊號為依據的訊息
  • Webhook 提示提及購買觸發因素(募資、招聘、轉型、近期新聞)
  • 客戶提供的產品依賴於時機訊號才有意義(例如「我們幫助後 A 輪融資公司擴展營運規模」)
  • 示範調用時傳遞了 --with-signals 旗標

成本說明: 每家獨特公司約增加 $0.01–0.05 美元(網路搜尋 + 評分)。對於 10 位聯絡人的示範,通常是 5–10 家獨特公司,因此低於 $0.50 美元。

訊號搜尋的必要輸入

訊號搜尋需要三個上下文檔案:

  • context/icp.md — 已在步驟 1 中收集
  • context/offering.md — 步驟 1 中的價值主張區塊(如果尚未儲存,現在就寫入)
  • context/signal_criteria.md — 與提供的產品相關的訊號類型清單(條列式)

如果 signal_criteria.md 不存在,請詢問使用者:「什麼樣的公司活動可能暗示他們需要您提供的服務?」 — 收集 5–10 個要點並儲存。

執行

# 從豐富化後的聯絡人中建立獨特公司清單
python3 -c "
import csv, sys
seen = set()
with open('csv/output/contacts_enriched.csv') as f, open('csv/input/companies_raw.csv', 'w', newline='') as out:
    reader = csv.DictReader(f)
    writer = csv.DictWriter(out, fieldnames=['company_name', 'company_domain', 'company_website'])
    writer.writeheader()
    for row in reader:
        c = row.get('company_name') or row.get('company') or ''
        if c and c not in seen:
            seen.add(c)
            writer.writerow({
                'company_name': c,
                'company_domain': row.get('company_domain') or '',
                'company_website': row.get('company_website') or row.get('website') or '',
            })
"

# 對獨特公司執行訊號搜尋
source "$HOME/.claude/skills/gtm-pipeline/_shared/resolve_env.sh" && \
export $(grep -E '^(PARALLEL_API_KEY|OPENROUTER_API_KEY|FIRECRAWL_API_KEY|GEMINI_API_KEY)=' "$GTM_ENV_PATH" | xargs) && \
  python3 ~/.claude/skills/gtm-signal-search/signal_search.py \
    --client-dir {client-slug}-gtm

resolve_env.sh 的來源行確保即使在全新的 Shell 中也能設定 $GTM_ENV_PATH(請參閱 signal-search SKILL.md / 慣例)。對於示範,請將 Firecrawl 和 Parallel 豐富化功能保持 關閉 — 對於約 10 位聯絡人的潛在客戶清單,網路搜尋 + 評分已足夠。僅在網站內容(徵才頁面、部落格)是主要訊號來源時啟用 Firecrawl;如果此機器僅透過 MCP 使用 Firecrawl(沒有 FIRECRAWL_API_KEY),請使用 signal-search 技能文件中記載的 --firecrawl-pages-dir 路徑。

將訊號合併回聯絡人資料

import csv, json
signals = {}
with open('csv/intermediate/signals.csv') as f:
    for row in csv.DictReader(f):
        signals[row['company_name']] = {
            'overall_score': row.get('overallScore', ''),
            'scored_signals': row.get('scoredSignals', ''),
            'overall_summary': row.get('overallSummary', ''),
        }

rows_out = []
with open('csv/output/contacts_enriched.csv') as f:
    for row in csv.DictReader(f):
        s = signals.get(row.get('company_name') or row.get('company') or '', {})
        row['company_overall_score'] = s.get('overall_score', '')
        row['company_scored_signals'] = s.get('scored_signals', '')
        row['company_overall_summary'] = s.get('overall_summary', '')
        rows_out.append(row)

with open('csv/output/contacts_enriched.csv', 'w', newline='') as f:
    w = csv.DictWriter(f, fieldnames=list(rows_out[0].keys()))
    w.writeheader()
    w.writerows(rows_out)

步驟 6 的訊息產生步驟將為每位聯絡人提供 company_overall_summary 和 company_scored_signals — 使用得分最高的訊號作為訊息鉤子。


步驟 6 — 產生訊息範例

在開始大量產生之前,先產生 2–4 則樣本訊息。

訊息結構

每則訊息必須遵循:鉤子 → 橋樑 → 提案 → 軟性行動呼籲

部分目的長度
鉤子提及與此人相關的具體內容(貼文、職涯變動、公司訊號)1 句
橋樑將他們的處境與您的提案連結起來1 句
提案清楚說明您能提供什麼1 句
CTA軟性請求 — 不要用「我們來約個時間通話吧」1 句

總計:320–450 個字元。 稱呼後不要空行。段落之間用單行分隔。

品質規則

必須有:

  • 具體的鉤子(引用貼文、職涯洞察或評分過的購買訊號 — 不得是泛泛之談)
  • 清晰的價值主張
  • 自然、對話式的語氣
  • 軟性行動呼籲

必須避免:

  • 重複他們已知的個人檔案資訊(「您在 X 公司擔任 Y 職位」)
  • 泛泛的觀察(「令人印象深刻背景」、「我注意到您在 [產業]」)
  • 企業行話或流行詞
  • 強迫式的行動呼籲(「我們這週約個時間通話吧」)

如果步驟 5.5 已執行: 對於每位聯絡人,優先使用 company_scored_signals 中得分最高的訊號作為鉤子,而非一般的 LinkedIn 貼文引用。得分 >= 70 且基於近期真實新聞的訊號,是此示範能產生的最強鉤子。

產生流程

  1. 撰寫客戶專屬的系統提示(儲存至 prompts/message_prompt.md)
  2. 產生 2–4 則樣本 — 應包含有 LinkedIn 貼文和沒有 LinkedIn 貼文的聯絡人
  3. 根據上述品質檢查清單進行審查
  4. 若發現問題,修正系統提示並重新產生
  5. 僅在品質通過後才進行批次產生

系統提示範本(關鍵部分)

- 客戶背景:他們銷售什麼、目標對象、價值主張、語氣
- 禁止規則:不得重複個人檔案資訊、不得使用泛泛的奉承
- 訊息結構:鉤子 → 橋樑 → 提案 → CTA
- 鉤子範例:有貼文 / 無貼文
- 字元限制:320–450

步驟 7 — 清理與輸出

步驟 7a — 清理(強制性、確定性、無需 LLM)。 csv/intermediate/ 保留所有欄位。 在建立任何面向潛在客戶的內容之前,先執行共享的清理程式,以便處理重複出現的手動清理工作 (供應商標籤、空白欄位、無效電子郵件、過時訊號)。

相關技能