Felo API PlatformFelo API Platform

리서치

영업팀이 바로 쓰는 경쟁사 분석 만들기

경쟁사 자체 페이지, 주변 보도, X의 구매자 반응을 모아 모든 주장에 출처, 날짜, 상태를 붙인 분석을 만듭니다.

소요 시간30분난이도중급업데이트2026-10-30
대상제품 마케팅경쟁 인텔리전스세일즈 이네이블먼트

프롬프트 복사

대괄호 항목을 바꾼 뒤 Claude Code, Codex 또는 터미널에 접근할 수 있는 AI에 붙여넣으세요. Felo 스킬을 설치하고 크레딧을 쓰기 전에 확인한 뒤 워크플로를 실행합니다.

[우리 제품]을 위한 [경쟁사 이름] 경쟁 분석을 작성해 주세요.

범위: [세그먼트], [지역], [언어]. 기간: [최근 90일 / 최근 12개월]. 이 분석이 지원하는 결정: [가격 변경 / 출시 포지셔닝 / 반론 대응].
시작할 출처: [경쟁사 도메인], [가격 페이지 URL], [체인지로그 URL].

Markdown 분석에 다음을 포함해 주세요.
1. 경쟁사가 스스로를 어떻게 포지셔닝하는지, 그들의 표현으로.
2. 근거 표: 주장, 출처 제목, URL, 날짜, 상태(Verified / Vendor claim / Third-party / Signal / Inference / Not verified).
3. 가격: 페이지에 적힌 내용, 링크, 확인 날짜. 페이지와 날짜 없이 요금을 본문에 옮기지 마세요.
4. 구매자가 반발하는 지점, X 계정과 날짜를 붙여 신호로 표시.
5. 우리가 다음에 해야 할 일, 권고로 표시.
6. 전체 출처 목록.

규칙:
- 경쟁사의 포지셔닝은 인용하고, 더 강한 주장으로 바꿔 쓰지 마세요.
- 벤더 주장, 제3자 보도, 당신의 추론을 구분하고 모든 행에 라벨을 붙여 주세요.
- 가격, 지표, 고객 이름, 벤치마크를 지어내지 마세요. 데이터가 없으면 "데이터 없음"이라고 쓰세요.
- 기간과 지역을 명시적인 값으로 확정해 주세요.
- 크레딧을 쓰기 전에 실행할 API 호출을 보여 주고 제 승인을 기다려 주세요.
- 게시, 전송, 예약, CRM 쓰기를 하지 마세요.
- 결과를 ./competitor-teardown.md에 쓰고 채팅에서 요약해 주세요.

복사 내용에는 설치 단계와 안전 규칙도 포함됩니다.

완성되는 것

실행 시 예제 출력입니다. 실시간 생성이 아닙니다.

경쟁 분석 예시(발췌)

경쟁 분석 — [경쟁사], 2026-10-30 확인

자기 포지셔닝

홈페이지 헤드라인: “성장하는 지원 팀을 위한 플랫폼.” 카테고리 페이지: “지원 팀에 필요한 모든 것.” 둘 다 벤더 주장이며 적힌 그대로 인용.

증거 표

주장출처날짜상태
단일 도구가 아닌 플랫폼으로 포지셔닝https://example.com/competitor/home2026-10-30Verified
매주 변경 사항 배포https://example.com/competitor/changelog2026-10-28Verified
독립 라운드업에 소개됨https://example.com/roundup2026-10-27Third-party
구매자가 온보딩 지연을 언급아래 인용한 X 게시물2026-10-14Signal
엔터프라이즈가 최대 세그먼트데이터 없음—Not verified

가격

가격 페이지에는 단계형과 사용량 기반 요금제가 있다. 여기서 요금을 반복하지 않는다. 실시간 페이지와 날짜를 확인: https://example.com/competitor/pricing (2026-10-30).

구매자가 반발하는 지점

@example_dev, 2026-10-14: “설치가 데모에서 말한 것보다 오래 걸렸다.” 날짜가 있는 게시물 하나이며, 빈도 추정이 아니다.

권고

비교 페이지에서 ‘첫 결과까지 걸리는 시간’을 앞세운다. 이것은 우리의 추론이지 경쟁사 주장이 아니다.

출처

  • https://example.com/competitor/home
  • https://example.com/competitor/pricing
  • https://example.com/competitor/changelog

실제 호출

개발자용: 같은 워크플로를 실행 순서대로 담은 복사 가능한 코드.

실제 API 호출 보기
  1. 출처 있는 기준에서 시작하기

    Chat은 답변과 사용한 페이지를 반환하므로 경쟁사가 어디서 논의되는지 지도를 얻습니다. 답변은 단서이고 출처는 링크입니다. 링크를 남겨 증거 표의 제3자 행에 씁니다. 아래 helper는 키를 한 번 보내고 2xx가 아니면 예외를 던집니다.

    competitor.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 competitor = "Example Competitor";
    const segment = "mid-market support teams";
    
    const baseline = await felo<ChatData>("/v2/chat", {
      query: `How does ${competitor} position itself for ${segment}? Include pricing and recent launches.`,
    });
    
    const seedSources = baseline.data.resources.slice(0, 5);

    예제 출력

    {
      "answer": "The competitor positions itself as …",
      "sources": [
        { "link": "https://example.com/competitor", "title": "…", "snippet": "…" }
      ]
    }
  2. 경쟁사가 통제하는 페이지 가져오기

    제3자 보도는 세상의 시각을, 경쟁사 페이지는 그들의 주장을 알려줍니다. readability를 켜고 홈페이지, 가격 페이지, changelog를 Markdown으로 추출하고 가져온 날짜를 남깁니다. 날짜 없는 가격 페이지는 함정입니다.

    competitor.ts
    type ExtractData = { data: { content: string } };
    
    const ownedPages = [
      { url: "https://example.com/competitor/home", title: "Homepage" },
      { url: "https://example.com/competitor/pricing", title: "Pricing" },
      { url: "https://example.com/competitor/changelog", title: "Changelog" },
    ];
    
    const fetched = await Promise.all(
      ownedPages.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/competitor/pricing",
      "checkedAt": "2026-10-30",
      "content": "# Pricing\n\nExtracted page text…"
    }
  3. X에서 구매자 반응 확인하기

    경쟁사에 대한 불만과 우회 방법을 X에서 검색합니다. 게시물마다 핸들과 날짜를 남깁니다. 날짜 있는 인용 하나는 “불만이 있었다”는 증거이지 “얼마나 흔한지”의 증거가 아닙니다. 분석은 이를 신호로 표시하고 몇 개 게시물을 비율로 바꾸지 않습니다.

    competitor.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 buyerSignal = await felo<XData>("/v2/x/tweet/search", {
      query: `"${competitor}" (pricing OR onboarding OR migration)`,
      limit: 25,
      since_time: since,
    });
    
    const objections = buyerSignal.data.tweets.slice(0, 5);

    예제 출력

    { "data": { "tweets": [
      {
        "content": "setup took longer than the demo suggested",
        "author": { "username": "example_dev" },
        "created_at": "2026-10-14T09:20:00Z",
        "metrics": { "retweet_count": 3, "favorite_count": 24 }
      }
    ] } }
  4. 증거 표로 분석 조립하기

    편집 단계입니다. 가져온 페이지와 X 게시물을 주장으로 바꾸고 각 주장에 출처, 날짜, 상태를 붙입니다. 상태 열이 문서를 정직하게 유지합니다. 페이지에 적힌 것은 Verified, 공급업체 마케팅은 Vendor claim, 외부 보도는 Third-party, 날짜 있는 게시물은 Signal, 당신의 해석은 Inference, 증거 없음은 Not verified입니다.

    competitor.ts
    const today = new Date().toISOString().slice(0, 10);
    
    const row = (claim: string, source: string, date: string, status: string) =>
      `| ${claim} | ${source} | ${date} | ${status} |`;
    
    const teardown = [
      `# Competitor teardown — ${competitor}`,
      `Scope: ${segment}. Checked ${today}.`,
      "",
      "| Claim | Source | Date | Status |",
      "| --- | --- | --- | --- |",
      row("Free tier listed on the pricing page", ownedPages[1].url, fetched[1].checkedAt, "Verified"),
      row("Positions as a platform, not a point tool", ownedPages[0].url, fetched[0].checkedAt, "Vendor claim"),
      row("Discussed in independent coverage", seedSources[0]?.link ?? "Not available", today, "Third-party"),
      row("Buyers report onboarding friction", "X post, quoted below", today, "Signal"),
      row("Most revenue comes from enterprise", "Not available", "—", "Not verified"),
      "",
      "## Recommendation",
      "Lead with time-to-first-result on the comparison page. Inference, not a competitor claim.",
    ].join("\n");
    
    console.log(teardown);

    예제 출력

    | Free tier listed on the pricing page | https://example.com/competitor/pricing | 2026-10-30 | Verified |
  5. 다음 갱신을 위해 LiveDoc에 저장하기

    경쟁사마다 LiveDoc을 하나 만들고 가져온 페이지를 URL 리소스로, 분석 자체를 문서 리소스로 추가합니다. URL 재추가는 중복 제거되어 다음 분기에는 바뀐 부분만 가져오고 지난 분석도 같은 아카이브에 남습니다.

    competitor.ts
    type LiveDocData = { data: { short_id: string } };
    
    const teardownDoc = await felo<LiveDocData>("/v2/livedocs", {
      name: `Teardown: ${competitor}`,
      description: `Sources and teardown checked ${today}`,
    });
    
    await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/urls`, {
      urls: fetched.map((page) => ({ url: page.url, title: page.title })),
    });
    
    await felo(`/v2/livedocs/${teardownDoc.data.short_id}/resources/doc`, {
      title: `Teardown ${today}`,
      content: teardown,
    });
    
    console.log(teardownDoc.data.short_id); // the next refresh reuses this LiveDoc

    예제 출력

    { "short_id": "PvyKouzJirXjFdst4uKRK3" }

포함되는 것

  • Chat API의 출처 있는 기준과 그 근거 페이지
  • 경쟁사 홈페이지, 가격, changelog의 Markdown 추출
  • 증거가 아닌 신호로 표시한 날짜 있는 X 구매자 댓글
  • 검증된 사실, 공급업체 주장, 추론을 구분하는 증거 표
  • 다음 갱신을 처음부터 시작하지 않게 하는 LiveDoc

하지 않는 것

  • 공개 출처만. 승패 인터뷰, CRM 메모, 비공개 대시보드는 다루지 않음
  • 가격은 링크와 날짜만. 확인 날짜 없는 표에 요금을 고정하지 않음
  • X 커버리지는 불완전하며 구매자의 대표 표본이 아님
  • 포지셔닝을 대신 정하지 않음. 권고는 추론으로 표시
  • 분석을 게시하거나 battlecard 도구에 쓰지 않음

자주 묻는 질문

증거는 어디서 오나요?

Chat API가 출처 있는 기준과 사용한 페이지를 반환하고, Web Fetch가 경쟁사 페이지를 Markdown으로 만들며, X Search가 날짜 있는 구매자 게시물을 더합니다. 각 행은 출처와 날짜를 유지하고 추론은 별도 상태를 갖습니다.

여러 경쟁사를 다룰 수 있나요?

네. 경쟁사마다 같은 프롬프트를 한 번 실행하고 회사마다 LiveDoc을 하나씩 유지합니다. 비교 페이지는 “검증됨” 행만 결합하고 두 실행의 증거를 섞지 않습니다.

경쟁사 가격을 인용할 수 있나요?

워크플로는 가격 페이지에 적힌 내용을 링크와 확인 날짜로 기록합니다. 요금을 글에 고정하지 않습니다. 공급업체 가격은 바뀌므로 오래된 숫자는 숫자가 없는 것보다 나쁩니다.

자체 승패 메모도 쓸 수 있나요?

공개 출처만 읽습니다. 내부 메모는 LiveDoc에 별도 문서 리소스로 추가하고 내부용으로 표시하세요. 고객 대면 자료에는 인용되지 않습니다.

얼마나 자주 갱신해야 하나요?

달력이 아니라 트리거로 갱신하세요. 가격 변경, 큰 출시, 영업 주기 시작 시점입니다. 같은 LiveDoc에 다시 실행해 지난 분기 분석을 새 분석 옆에 남깁니다.

분석 하나 비용은 얼마인가요?

각 chat, 추출, X 검색은 사용량 기반 크레딧을 씁니다. 현재 요금은 가격 페이지에 있고 프롬프트는 쓰기 전에 승인을 요청합니다.

관련 워크플로

내 방식으로 바꾸기

같은 레시피를 실제 배포 방식에 맞게 조정합니다.

달력이 아니라 트리거로 갱신하기

경쟁사가 가격을 바꾸거나 큰 출시를 하거나 큰 영업 주기 전에 같은 워크플로를 다시 실행합니다. 각 분석을 같은 LiveDoc의 날짜 있는 문서 리소스로 남겨 지난 분기와 나란히 둡니다.

분석을 battlecard로 바꾸기

같은 증거 표에서 경제적 구매자, 챔피언, 기술 리뷰어별로 한 페이지씩 쓰고 `Verified` 행만 사용하며 링크를 붙입니다. 고객 대면 자료에는 `Inference`를 넣지 않습니다.

두 경쟁사 나란히 비교하기

경쟁사마다 별도 LiveDoc으로 한 번씩 실행하고 두 실행 모두 `Verified`인 행만 결합한 비교 페이지를 만듭니다. 상태 열 없이 두 실행을 하나의 증거 표로 합치지 않습니다.

이 레시피의 배경이 되는 참고 페이지와 다음에 볼 곳.