리서치
첫 아웃리치 전에 타깃 계정 조사하기
상대 회사 사이트, 최근 보도, 공개 게시물을 읽고 최근 움직임, 예상 우선순위, 대화 시작점, 솔직한 미지수를 담은 계정 브리프를 씁니다.
프롬프트 복사
대괄호 항목을 바꾼 뒤 Claude Code, Codex 또는 터미널에 접근할 수 있는 AI에 붙여넣으세요. Felo 스킬을 설치하고 크레딧을 쓰기 전에 확인한 뒤 워크플로를 실행합니다.
[아웃리치 / 디스커버리 콜 / 갱신] 전에 [회사 이름 또는 도메인] 계정 브리프를 작성해 주세요. 우리 제품: [제품 또는 서비스]. 우리가 신경 쓰는 구매자: [역할]. 최근 동향 기간: [최근 90일 / 최근 12개월]. 그들의 사이트, 공개 보도, 공개 게시물을 읽어 주세요. Markdown 브리프에 다음을 포함해 주세요. 1. 그들이 무엇을 하는지, 한 문단, 출처 포함. 2. 최근 동향: 출시, 투자, 채용, 경영진, 파트너십 — 날짜와 링크 포함. 3. 이번 분기 예상 우선순위, 추론임을 분명히 표시. 4. 대화 시작점: 구체적인 관찰 세 가지, 각각 출처 포함. 5. 미확인 사항: 공개 출처로 확인할 수 없었던 것. 6. 전체 출처 목록. 규칙: - 담당자 이름, 이메일, 전화번호, 직원 수, 매출, 투자 금액을 지어내지 마세요. - 공개 출처만: 비공개 데이터, 로그인 전용 페이지, 스크래핑한 디렉터리는 사용하지 마세요. - CRM이나 다른 시스템에 쓰지 마세요. 브리프는 사람이 검토하는 파일입니다. - 모든 추론을 추론으로 표시하고, 사실에는 링크와 날짜를 붙여 주세요. - 구매자의 의도를 사실로 쓰지 마세요. - 크레딧을 쓰기 전에 실행할 API 호출을 보여 주고 제 승인을 기다려 주세요. - 전송, 예약, 게시, 메시지 발송을 하지 마세요. - 결과를 ./account-brief.md에 쓰고 채팅에서 요약해 주세요.
복사 내용에는 설치 단계와 안전 규칙도 포함됩니다.
완성되는 것
실행 시 예제 출력입니다. 실시간 생성이 아닙니다.
계정 브리프 — [회사], 2026-10-30 확인
하는 일
중형 물류사용 창고 피킹 로봇을 만든다. 출처: https://example.com/about(2026-10-30 확인).
최근 움직임
- 두 번째 조립 사이트 개설 — https://example.com/news/expansion (2026-10-24)
- “배포 운영” 팀 채용 — https://example.com/careers(2026-10-30 확인)
- 파트너 통합에 관한 자사 계정 게시물 — @example_company (2026-10-21)
가능한 우선순위(추론)
더 많은 사이트에 더 빠르게 배포. 확장 게시물과 새 배포 역할에서 나온 추론이며, 선언된 계획도 공개 확인도 아니다.
대화 시작점
- 두 번째 사이트는 새롭다: 사이트마다 다를 때 배포 플레이북이 어떻게 바뀌는지 묻는다. 출처: https://example.com/news/expansion
- 전담 배포 운영 역할은 영업과 설치 사이의 인계를 시사한다. 출처: https://example.com/careers
모르는 것
- 현재 누가 배포 운영을 맡는지: 공개 출처에서 데이터 없음.
- 차량 규모와 계약 금액: 데이터 없음.
출처
- https://example.com/about
- https://example.com/news/expansion
- https://example.com/careers
실제 호출
개발자용: 같은 워크플로를 실행 순서대로 담은 복사 가능한 코드.
실제 API 호출 보기
먼저 회사 개요 얻기
Chat에 회사가 무엇을 하는지, 최근 공개 변화가 무엇인지 묻고 인용 출처를 남깁니다.
account.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 company = "Example Robotics"; const domain = "example.com"; const buyerRole = "Head of Operations"; const overview = await felo<ChatData>("/v2/chat", { query: `What does ${company} do, who buys from it, and what changed in the last 90 days?`, }); const seedSources = overview.data.resources.slice(0, 5);예제 출력
{ "answer": "The company builds …", "sources": [ { "link": "https://example.com/about", "title": "…", "snippet": "…" } ] }사이트, 가격, 채용 읽기
Web Fetch로 About, 가격, 채용 페이지를 읽고 제품, 고객, 채용 중인 직무를 파악합니다.
account.ts type ExtractData = { data: { content: string } }; const companyPages = [ { url: `https://${domain}/about`, title: "About" }, { url: `https://${domain}/pricing`, title: "Pricing" }, { url: `https://${domain}/careers`, title: "Careers" }, ]; const pages = await Promise.all( companyPages.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/careers", "checkedAt": "2026-10-30", "content": "# Careers\n\nOpen roles: deployment operations…" }최근 90일 공개 움직임 보기
X에서 회사명과 제품명을 검색하고 최근 90일 공개 게시물, 계정, 날짜를 남깁니다.
account.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 posts = await felo<XData>("/v2/x/tweet/search", { query: `"${company}" (hiring OR launch OR partnership OR expansion)`, limit: 20, since_time: since, }); const recent = posts.data.tweets.slice(0, 5);예제 출력
{ "data": { "tweets": [ { "content": "We just opened our second assembly site", "author": { "username": "example_company" }, "created_at": "2026-10-21T14:02:00Z", "metrics": { "retweet_count": 4, "favorite_count": 31 } } ] } }계정 브리프 쓰기
회사 개요, 최근 움직임, 예상 우선순위, 대화 시작점, 미지수, 출처를 씁니다.
account.ts const today = new Date().toISOString().slice(0, 10); const accountBrief = [ `# Account brief — ${company}`, `Checked ${today}. Buyer role: ${buyerRole}.`, "", "## What they do", overview.data.answer, "", "## Recent moves", ...recent.map( (post) => `- ${post.created_at.slice(0, 10)}: ${post.content} (from @${post.author.username})`, ), ...pages.map((page) => `- ${page.title} page captured ${page.checkedAt}: ${page.url}`), "", "## Likely priorities (inference)", "<!-- One or two sentences from the moves above. Mark them as inference, never a stated plan. Delete this comment when filled. -->", "", "## Conversation starters", ...recent.slice(0, 3).map( (post) => `- Ask about: ${post.content.slice(0, 100)} (dated ${post.created_at.slice(0, 10)})`, ), "", "## Unknowns", "- Who owns the workflow we sell into: Not available from public sources.", "- Contract values and team size: Not available.", "", "## Sources", ...pages.map((page) => `- ${page.title}: ${page.url}`), ...seedSources.map((source) => `- ${source.title}: ${source.link}`), ].join("\n"); console.log(accountBrief);예제 출력
# Account brief — Example Robotics
LiveDoc에 저장하기
브리프와 출처를 LiveDoc에 저장해 다음 팔로우업에서 재사용합니다.
account.ts type LiveDocData = { data: { short_id: string } }; const accountDoc = await felo<LiveDocData>("/v2/livedocs", { name: `Account: ${company}`, description: `Briefs and sources checked ${today}`, }); await felo(`/v2/livedocs/${accountDoc.data.short_id}/resources/urls`, { urls: [ ...pages.map((page) => ({ url: page.url, title: page.title })), ...seedSources.map((source) => ({ url: source.link, title: source.title })), ], }); await felo(`/v2/livedocs/${accountDoc.data.short_id}/resources/doc`, { title: `Account brief ${today}`, content: accountBrief, }); console.log(accountDoc.data.short_id); // the next call reuses this LiveDoc예제 출력
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
포함되는 것
- Chat의 출처 있는 회사 개요
- 회사 사이트, 가격, 채용 페이지의 Markdown 추출
- 날짜 있는 X 공개 게시물
- 구조화된 계정 브리프
- 증거를 저장하는 LiveDoc
하지 않는 것
- 연락처 이메일, 전화번호, 개인정보를 제공하지 않음
- 비공개 데이터나 로그인 전용 페이지를 읽지 않음
- CRM에 쓰거나 메시지를 보내지 않음
- 직원 수, 매출, 투자는 출처가 명시할 때만 기록
- 우선순위와 의도는 추론으로 표시
자주 묻는 질문
연락처 이메일을 주나요?
아니요. 공개 조사만 하며 이메일, 전화번호, 개인정보를 제공하지 않습니다.
데이터는 어디서 오나요?
Chat이 출처 있는 회사 개요를 반환하고 Web Fetch가 사이트, 가격, 채용 페이지를 읽으며 X Search가 공개 움직임을 더합니다. 모든 항목은 링크와 날짜를 유지합니다.
기술 회사가 아니어도 조사할 수 있나요?
네. 공개 정보가 적은 업종에서는 추측하지 않고 미지수로 표시합니다.
CRM에 쓰나요?
아니요. Markdown 브리프만 만들며 CRM 쓰기는 직접 구현해야 합니다.
우선순위는 사실인가요?
아니요. “예상 우선순위”로 표시하고 근거를 제시합니다. 최종 판단은 영업 담당자가 합니다.
한 번 비용은?
Chat, 추출, X 검색은 사용량 기반 크레딧입니다. 현재 요금은 가격 페이지에 있고 프롬프트는 쓰기 전에 승인을 요청합니다.
관련 워크플로
시장 질문을 go-to-market 브리프로 바꾸기
시장에 정확한 질문을 던지고, 답변의 배경이 되는 카테고리와 가격 페이지를 읽고, X에서 구매자가 문제를 어떻게 말하는지 모아 출처 있는 주장과 열린 질문을 담은 GTM 브리프로 저장합니다.
워크플로 열기리서치영업팀이 바로 쓰는 경쟁사 분석 만들기
경쟁사 자체 페이지, 주변 보도, X의 구매자 반응을 모아 모든 주장에 출처, 날짜, 상태를 붙인 분석을 만듭니다.
워크플로 열기콘텐츠제품 브리프를 랜딩 페이지로 바꾸기
청중을 조사하고 브리프를 LiveDoc에 저장한 뒤 그 맥락으로 Landing Page 작업을 만들고 호스팅 페이지가 준비될 때까지 폴링합니다.
워크플로 열기내 방식으로 바꾸기
같은 레시피를 실제 배포 방식에 맞게 조정합니다.
한 세그먼트만 조사하기
업종이나 지역을 좁히면 브리프가 더 구체적입니다.
최근 발표회 추가하기
발표회 페이지를 추가 출처로 넣으면 대화 시작점이 시의적절해집니다.
경쟁사 분석과 함께 쓰기
계정 브리프의 우선순위와 경쟁사 분석의 포지셔닝을 비교해 차별화 각도를 찾습니다.
더 알아보기
이 레시피의 배경이 되는 참고 페이지와 다음에 볼 곳.