Felo API PlatformFelo API Platform

研究

把市場問題變成一份 go-to-market 簡報

向市場提出一個精確的問題,讀答案背後的品類和定價頁面,收集買家在 X 上怎麼描述問題,再保存一份有來源主張和開放問題的 GTM 簡報。

建置時間30 分鐘難度進階更新於2026-10-30
適合誰創辦人與營運者產品行銷業務負責人

複製 prompt

把方括號裡的欄位替換掉,然後貼到 Claude Code、Codex 或任何能存取終端機的 AI。它會安裝 Felo skill、在花額度前詢問,並執行這套工作流程。

為[產品]進入[地區]的[細分市場或 ICP]製作一份 go-to-market 研究簡報,語言為[語言]。

模式:[自助 / 業務主導 / 通路]。它支援的決策:[發布 / 定價 / 重新定位]。時間範圍:[過去 90 天 / 過去 12 個月]。

輸出一份 Markdown 簡報,包含:
1. 細分市場定義:他們是誰、今天用什麼、來源對規模怎麼說——引用來源,或寫「暫無資料」。
2. 買家語言:他們如何描述問題,附連結和日期。
3. 替代方案:他們從什麼切換過來,包括試算表和「什麼都不做」。
4. 異議,以及買家要求的證明。
5. 公開來源無法回答的開放問題。
6. 完整來源清單。

規則:
- 每個市場主張都需要連結和日期。不要憑感覺估算市場規模、成長或預算。
- 區分獨立來源、廠商頁面和你自己的推論。
- X 只用於語言和異議,不作為市場規模的證據。
- 把時間範圍和地區落實為明確值。
- 消耗額度前,先展示預計執行的 API 呼叫並等待我批准。
- 不要發布、傳送、排程,或寫入任何 CRM。
- 將結果寫入 ./gtm-brief.md,並在對話中總結。

複製的內容也包含安裝步驟和安全規則。

你會得到什麼

一次執行的範例輸出,不是即時生成。

GTM 簡報範例(節錄)

GTM 簡報 — [地區] 的 [細分]

細分定義

用試算表排程的小型營運團隊。規模:所查閱的公開來源暫無資料——沒有來源就不要在簡報裡寫數字。

買家語言

  • 「我們還在用試算表做這件事」 — X 貼文,2026-10-18
  • 「最難的是設定」 — X 貼文,2026-10-02

標示為語言,不作為普遍性證據。

買家提到的替代方案

試算表、現有套件,以及什麼都不做。來源:https://example.com/thread(2026-10-18)。

異議與所需證明

安全審查與遷移路徑。買家要求可具名的參考客戶;我們目前沒有公開的,所以這仍是開放問題。

開放問題

  • 這個細分裡有多少已有專門預算項?
  • 異議會隨公司規模變化嗎?

來源

  • https://example.com/category-page
  • https://example.com/pricing-page
  • https://example.com/thread

實際呼叫

給開發者:同一套工作流程的可複製程式碼,依執行順序排列。

展開實際 API 呼叫
  1. 框定市場問題

    Chat 會回傳答案和用過的頁面,所以從一個窄到能回答的問題開始:誰在買、他們今天用什麼、會遇到什麼異議。把資源保留為線索連結;答案是線索,連結才是證據,它們最後會組成來源列表。下方的 helper 只送出一次 Key,非 2xx 回應會拋錯。

    gtm.ts
    const BASE = "https://openapi.felo.ai";
    const headers = {
      Authorization: `Bearer ${process.env.FELO_API_KEY}`,
      "Content-Type": "application/json",
    };
    
    async function felo<T>(path: string, body?: unknown): Promise<T> {
      const res = await fetch(`${BASE}${path}`, {
        method: body ? "POST" : "GET",
        headers,
        body: body ? JSON.stringify(body) : undefined,
      });
      if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`);
      return res.json() as Promise<T>;
    }
    
    type ChatData = {
      data: {
        answer: string;
        resources: { link: string; title: string; snippet: string }[];
      };
    };
    
    const product = "scheduling tool"; // replace with your product
    const segment = "operations teams at 50-200 person companies";
    const region = "DACH";
    
    const market = await felo<ChatData>("/v2/chat", {
      query: `Who buys ${product} for ${segment} in ${region}, what do they use today, and what objections come up?`,
    });
    
    const seedSources = market.data.resources.slice(0, 5);

    範例輸出

    {
      "answer": "Buyers in this segment usually start from spreadsheets and …",
      "sources": [
        { "link": "https://example.com/category-page", "title": "…", "snippet": "…" }
      ]
    }
  2. 讀品類頁面本身

    抓取框定市場的頁面:品類概覽、對比頁和定價頁。用 readability 抽成 Markdown,並給每頁蓋上抓取日期,因為市場閱讀的品質取決於背後的頁面。

    gtm.ts
    type ExtractData = { data: { content: string } };
    
    const marketPages = [
      { url: "https://example.com/category", title: "Category overview" },
      { url: "https://example.com/comparison", title: "Comparison page" },
      { url: "https://example.com/pricing", title: "Pricing page" },
    ];
    
    const pages = await Promise.all(
      marketPages.map(async (page) => {
        const res = await felo<ExtractData>("/v2/web/extract", {
          url: page.url,
          output_format: "markdown",
          with_readability: true,
          with_cache: true,
        });
        const checkedAt = new Date().toISOString().slice(0, 10);
        return { ...page, checkedAt, content: res.data.content };
      }),
    );

    範例輸出

    {
      "url": "https://example.com/category",
      "checkedAt": "2026-10-30",
      "content": "# Category overview\n\nExtracted page text…"
    }
  3. 收集買家怎麼描述問題

    在 X 搜尋買家遇到問題時使用的詞,而不是你的產品名。保留帳號和日期;簡報用這些貼文取得語言和異議,絕不把它們當作市場規模或異議普遍程度的度量。

    gtm.ts
    type XData = {
      data: {
        tweets: {
          content: string;
          author: { username: string };
          created_at: string;
          metrics: { retweet_count: number; favorite_count: number };
        }[];
      };
    };
    
    const since = Math.floor((Date.now() - 90 * 24 * 60 * 60 * 1000) / 1000);
    
    const language = await felo<XData>("/v2/x/tweet/search", {
      query: `(spreadsheet OR "scheduling tool") (alternative OR "looking for")`,
      limit: 25,
      since_time: since,
    });
    
    const quotes = language.data.tweets.slice(0, 5);

    範例輸出

    { "data": { "tweets": [
      {
        "content": "we are still doing this in a spreadsheet",
        "author": { "username": "example_ops" },
        "created_at": "2026-10-18T11:05:00Z",
        "metrics": { "retweet_count": 1, "favorite_count": 18 }
      }
    ] } }
  4. 圍繞決策寫簡報

    把細分定義、買家語言、替代方案、異議和開放問題拼成一段 Markdown。每條主張保留來源和日期,市場規模只有來源提供時才寫,公開來源回答不了的內容放進開放問題,而不是推論。

    gtm.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const sourceLine = (title: string, url: string, date: string) =>
      `- ${title}: ${url} (checked ${date})`;
    
    const brief = [
      `# GTM brief — ${segment} in ${region}`,
      "",
      "## Segment definition",
      "See the category page for how the segment is described. Market size: Not available from public sources reviewed.",
      "",
      "## Buyer language",
      ...quotes.map((post) => `- @${post.author.username}, ${post.created_at.slice(0, 10)}: ${post.content}`),
      "",
      "## Alternatives buyers mention",
      "Spreadsheets, an incumbent suite, and doing nothing. Treated as language until a source ranks them.",
      "",
      "## Objections and proof required",
      "Migration path and a named reference. Marked open: whether the objection changes by company size.",
      "",
      "## Open questions",
      "- How much of the segment already has a dedicated budget line?",
      "- Which objection blocks a pilot most often?",
      "",
      "## Sources",
      ...pages.map((page) => sourceLine(page.title, page.url, page.checkedAt)),
      ...seedSources.map((source) => `- ${source.title}: ${source.link}`),
    ].join("\n");
    
    console.log(brief);

    範例輸出

    # GTM brief — operations teams at 50-200 person companies in DACH
  5. 把證據留給下一個市場

    每個細分和地區建一個 LiveDoc,把抓到的頁面作為 URL 資源加進去,再把簡報本身作為文件資源加進去。下一個市場從同一批來源開始,不用重新抓品類頁,重複 URL 會自動去重。

    gtm.ts
    type LiveDocData = { data: { short_id: string } };
    
    const briefDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `GTM: ${segment} — ${region}`,
      description: `Market evidence checked ${today}`,
    });
    
    await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/urls`, {
      urls: pages.map((page) => ({ url: page.url, title: page.title })),
    });
    
    await felo(`/v2/livedocs/${briefDoc.data.short_id}/resources/doc`, {
      title: `GTM brief ${today}`,
      content: brief,
    });
    
    console.log(briefDoc.data.short_id); // reuse for the next region

    範例輸出

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

包含什麼

  • 來自 Chat API 的有來源市場閱讀,以及背後的頁面
  • 品類、對比和定價頁面的 Markdown 擷取
  • X 上帶帳號和日期的買家語言與異議
  • 圍繞發佈決策而不是話題組織的簡報
  • 讓下一個地區或發佈重複使用證據的 LiveDoc

不做什麼

  • 只涵蓋公開來源;沒有付費市場報告、panel 或客戶訪談
  • 絕不估算市場規模或成長——缺失資料寫「暫無資料」
  • X 貼文提供語言和訊號,不代表買家的有代表性樣本
  • 它不會替你選擇細分或定價
  • 它不會發佈簡報,也不會寫進 CRM

常見問題

需要買付費市場研究報告嗎?

不需要。工作流程讀公開來源並標出空白。如果你已經有報告,把它作為文件資源加進 LiveDoc,像其他來源一樣引用。

可以研究其他語言的市場嗎?

可以。設定地區和語言佔位符。引語保留原文,並在旁邊附翻譯,方便本地 reviewer 檢查措辭。

它會給我市場規模嗎?

只有當某個來源明確給出時才會,並附連結和日期。否則簡報寫「暫無資料」,不會編數字,也不會從一則貼文外推。

它能和客戶對話嗎?

不能。它只讀公開來源。把訪談筆記作為文件資源加進去並標為內部;簡報不會把私人筆記當成公開證據。

它和研究簡報工作流程有什麼區別?

研究簡報回答一個問題。這套工作流程把證據組織成 go-to-market 決策——細分、買家語言、替代方案、異議和買家要求的證明——輸出可以直接餵給發佈計畫。

一份簡報要花多少?

每次 chat、擷取和 X 搜尋都會消耗按用量計費的額度;目前費率在價格頁面。prompt 會在花額度之前請求確認。

相關工作流程

改成你的版本

同一套配方,依你實際的交付方式調整。

依地區各跑一次

保持章節結構不變,只改地區和語言佔位符。每個地區一個 LiveDoc、同樣的問題,這樣幾份簡報可以對比,而不是變成三份互不相關的文件。

加入你自己的訪談筆記

把客戶通話筆記貼成文件資源並標為內部。簡報可以把它們放在公開證據旁邊引用,但絕不會把私人筆記當成公開來源。

餵給發佈 deck

把異議和證明部分交給 deck 工作流程,並保留來源列表。簡報是證據層,deck 是它的展示,不是第二個真相來源。

這套配方背後的參考頁面,以及下一步可以看什麼。