영업 리서치 스킬: 잠재 고객 리서치 방법론
Wikiprompt, 무료 프롬프트 백과사전에서
영업 리서치 스킬: 잠재 고객 리서치 방법론 완전한 영업 리서치 스킬로, 방법론, 체크리스트, 신호 점수화, 그리고 회사 보강, LinkedIn 파싱, 잠재 고객 우선순위화를 위한 Python 스크립트를 포함합니다.
프롬프트 내용저장
🌐
---
name: sales-research
description: 이 스킬은 영업 잠재 고객 조사를 위한 방법론과 모범 사례를 제공합니다.
---
# 영업 조사
## 개요
이 스킬은 영업 잠재 고객 조사를 위한 방법론과 모범 사례를 제공합니다. 회사 조사, 연락처 프로파일링, 신호 탐지를 다루어 실행 가능한 인텔리전스를 표면화합니다.
## 사용법
company-researcher 및 contact-researcher 하위 에이전트는 다음 상황에서 이 스킬을 참조합니다:
- 새 잠재 고객 조사
- 회사 정보 찾기
- 개별 연락처 프로파일링
- 구매 신호 탐지
## 조사 방법론
### 회사 조사 체크리스트
1. **기본 프로필**
- 회사명, 업종, 규모(직원 수, 매출)
- 본사 및 주요 지사 위치
- 설립일, 성장 단계
2. **최근 동향**
- 자금 조달 발표(최근 12개월)
- M&A 활동
- 리더십 변경
- 제품 출시
3. **기술 스택**
- 알려진 기술(BuiltWith, StackShare)
- 도구를 언급하는 채용 공고
- 통합 파트너십
4. **신호**
- 채용 공고(확장 = 기회)
- Glassdoor 리뷰(고충 지점)
- 뉴스 언급(맥락)
- 소셜 미디어 활동
### 연락처 조사 체크리스트
1. **전문 배경**
- 현재 역할 및 재임 기간
- 이전 회사 및 역할
- 교육
2. **영향력 지표**
- 보고 구조
- 의사 결정 권한
- 예산 소유권
3. **참여 유도 포인트**
- 최근 LinkedIn 게시물
- 게재된 기사
- 연설 활동
- 공통 연결
## 리소스
- `resources/signal-indicators.md` - 구매 신호 분류 체계
- `resources/research-checklist.md` - 전체 조사 체크리스트
## 스크립트
- `scripts/company-enricher.py` - 여러 소스에서 회사 데이터 집계
- `scripts/linkedin-parser.py` - LinkedIn 프로필 데이터 구조화
FILE:company-enricher.py
#!/usr/bin/env python3
"""
company-enricher.py - 여러 소스에서 회사 데이터 집계
입력:
- company_name: 문자열
- domain: 문자열 (선택)
출력:
- profile:
name: 문자열
industry: 문자열
size: 문자열
funding: 문자열
tech_stack: [문자열]
recent_news: [뉴스 항목]
의존성:
- requests, beautifulsoup4
"""
# 요구 사항: requests, beautifulsoup4
import json
from typing import Any
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class NewsItem:
title: str
date: str
source: str
url: str
summary: str
@dataclass
class CompanyProfile:
name: str
domain: str
industry: str
size: str
location: str
founded: str
funding: str
tech_stack: list[str]
recent_news: list[dict]
competitors: list[str]
description: str
def search_company_info(company_name: str, domain: str = None) -> dict:
"""
기본 회사 정보 검색.
프로덕션에서는 Clearbit, Crunchbase 등의 API를 호출할 것.
"""
# TODO: 실제 API 호출 구현
# 임시 반환 구조
return {
"name": company_name,
"domain": domain or f"{company_name.lower().replace(' ', '')}.com",
"industry": "Technology", # API에서 가져올 것
"size": "Unknown",
"location": "Unknown",
"founded": "Unknown",
"description": f"Information about {company_name}"
}
def search_funding_info(company_name: str) -> dict:
"""
자금 조달 정보 검색.
프로덕션에서는 Crunchbase, PitchBook 등을 호출할 것.
"""
# TODO: 실제 API 호출 구현
return {
"total_funding": "Unknown",
"last_round": "Unknown",
"last_round_date": "Unknown",
"investors": []
}
def search_tech_stack(domain: str) -> list[str]:
"""
기술 스택 탐지.
프로덕션에서는 BuiltWith, Wappalyzer 등을 호출할 것.
"""
# TODO: 실제 API 호출 구현
return []
def search_recent_news(company_name: str, days: int = 90) -> list[dict]:
"""
회사에 대한 최근 뉴스 검색.
프로덕션에서는 뉴스 API를 호출할 것.
"""
# TODO: 실제 API 호출 구현
return []
def main(
company_name: str,
domain: str = None
) -> dict[str, Any]:
"""
여러 소스에서 회사 데이터 집계.
Args:
company_name: 조사할 회사 이름
domain: 회사 도메인 (선택, 추론됨)
Returns:
업종, 규모, 자금 조달, 기술 스택, 뉴스를 포함한 회사 프로필 dict
"""
# 기본 회사 정보 가져오기
basic_info = search_company_info(company_name, domain)
# 자금 조달 정보 가져오기
funding_info = search_funding_info(company_name)
# 기술 스택 탐지
company_domain = basic_info.get("domain", domain)
tech_stack = search_tech_stack(company_domain) if company_domain else []
# 최근 뉴스 가져오기
news = search_recent_news(company_name)
# 프로필 컴파일
profile = CompanyProfile(
name=basic_info["name"],
domain=basic_info["domain"],
industry=basic_info["industry"],
size=basic_info["size"],
location=basic_info["location"],
founded=basic_info["founded"],
funding=funding_info.get("total_funding", "Unknown"),
tech_stack=tech_stack,
recent_news=news,
competitors=[], # 업종 분석에서 강화될 것
description=basic_info["description"]
)
return {
"profile": asdict(profile),
"funding_details": funding_info,
"enriched_at": datetime.now().isoformat(),
"sources_checked": ["company_info", "funding", "tech_stack", "news"]
}
if __name__ == "__main__":
import sys
# 예제 사용
result = main(
company_name="DataFlow Systems",
domain="dataflow.io"
)
print(json.dumps(result, indent=2))
FILE:linkedin-parser.py
#!/usr/bin/env python3
"""
linkedin-parser.py - LinkedIn 프로필 데이터 구조화
입력:
- profile_url: 문자열
- 또는 name + company: 문자열
출력:
- contact:
name: 문자열
title: 문자열
tenure: 문자열
previous_roles: [역할 객체]
mutual_connections: [문자열]
recent_activity: [게시물 요약]
의존성:
- requests
"""
# 요구 사항: requests
import json
from typing import Any
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class PreviousRole:
title: str
company: str
duration: str
description: str
@dataclass
class RecentPost:
date: str
content_preview: str
engagement: int
topic: str
@dataclass
class ContactProfile:
name: str
title: str
company: str
location: str
tenure: str
previous_roles: list[dict]
education: list[str]
mutual_connections: list[str]
recent_activity: list[dict]
profile_url: str
headline: str
def search_linkedin_profile(name: str = None, company: str = None, profile_url: str = None) -> dict:
"""
LinkedIn 프로필 정보 검색.
프로덕션에서는 LinkedIn API 또는 Sales Navigator를 사용할 것.
"""
# TODO: 실제 LinkedIn API 통합 구현
# 참고: LinkedIn API는 엄격한 서비스 약관이 있음
return {
"found": False,
"name": name or "Unknown",
"title": "Unknown",
"company": company or "Unknown",
"location": "Unknown",
"headline": "",
"tenure": "Unknown",
"profile_url": profile_url or ""
}
def get_career_history(profile_data: dict) -> list[dict]:
"""
프로필에서 경력 이력 추출.
"""
# TODO: 경력 추출 구현
return []
def get_mutual_connections(profile_data: dict, user_network: list = None) -> list[str]:
"""
공통 연결 찾기.
"""
# TODO: 공통 연결 탐지 구현
return []
def get_recent_activity(profile_data: dict, days: int = 30) -> list[dict]:
"""
최근 게시물 및 활동 가져오기.
"""
# TODO: 활동 추출 구현
return []
def main(
name: str = None,
company: str = None,
profile_url: str = None
) -> dict[str, Any]:
"""
영업 준비를 위해 LinkedIn 프로필 데이터 구조화.
Args:
name: 개인 이름
company: 근무 회사
profile_url: 직접 LinkedIn 프로필 URL
Returns:
구조화된 연락처 프로필 dict
"""
if not profile_url and not (name and company):
return {"error": "Provide either profile_url or name + company"}
# 프로필 검색
profile_data = search_linkedin_profile(
name=name,
company=company,
profile_url=profile_url
)
if not profile_data.get("found"):
return {
"found": False,
"name": name or "Unknown",
"company": company or "Unknown",
"message": "Profile not found or limited access",
"suggestions": [
"Try searching directly on LinkedIn",
"Check for alternative spellings",
"Verify the person still works at this company"
]
}
# 경력 이력 가져오기
previous_roles = get_career_history(profile_data)
# 공통 연결 찾기
mutual_connections = get_mutual_connections(profile_data)
# 최근 활동 가져오기
recent_activity = get_recent_activity(profile_data)
# 연락처 프로필 컴파일
contact = ContactProfile(
name=profile_data["name"],
title=profile_data["title"],
company=profile_data["company"],
location=profile_data["location"],
tenure=profile_data["tenure"],
previous_roles=previous_roles,
education=[], # 프로필에서 추출될 것
mutual_connections=mutual_connections,
recent_activity=recent_activity,
profile_url=profile_data["profile_url"],
headline=profile_data["headline"]
)
return {
"found": True,
"contact": asdict(contact),
"research_date": datetime.now().isoformat(),
"data_completeness": calculate_completeness(contact)
}
def calculate_completeness(contact: ContactProfile) -> dict:
"""프로필 데이터가 얼마나 완전한지 계산."""
fields = {
"basic_info": bool(contact.name and contact.title and contact.company),
"career_history": len(contact.previous_roles) > 0,
"mutual_connections": len(contact.mutual_connections) > 0,
"recent_activity": len(contact.recent_activity) > 0,
"education": len(contact.education) > 0
}
complete_count = sum(fields.values())
return {
"fields": fields,
"score": f"{complete_count}/{len(fields)}",
"percentage": int((complete_count / len(fields)) * 100)
}
if __name__ == "__main__":
import sys
# 예제 사용
result = main(
name="Sarah Chen",
company="DataFlow Systems"
)
print(json.dumps(result, indent=2))
FILE:priority-scorer.py
#!/usr/bin/env python3
"""
priority-scorer.py - 잠재 고객 우선순위 계산 및 순위 지정
입력:
- prospects: [신호가 있는 잠재 고객 객체]
- weights: {deal_size, timing, warmth, signals}
출력:
- ranked: [점수 및 근거가 있는 잠재 고객]
의존성:
- (없음 - 순수 Python)
"""
import json
from typing import Any
from dataclasses import dataclass
# 기본 점수 가중치
DEFAULT_WEIGHTS = {
"deal_size": 0.25,
"timing": 0.30,
"warmth": 0.20,
"signals": 0.25
}
# 신호 점수 매핑
SIGNAL_SCORES = {
# 높은 의도 신호
"recent_funding": 10,
"leadership_change": 8,
"job_postings_relevant": 9,
"expansion_news": 7,
"competitor_mention": 6,
# 중간 의도 신호
"general_hiring": 4,
"industry_event": 3,
"content_engagement": 3,
# 관계 신호
"mutual_connection": 5,
"previous_contact": 6,
"referred_lead": 8,
# 부정 신호
"recent_layoffs": -3,
"budget_freeze_mentioned": -5,
"competitor_selected": -7,
}
@dataclass
class ScoredProspect:
company: str
contact: str
call_time: str
raw_score: float
normalized_score: int
priority_rank: int
score_breakdown: dict
reasoning: str
is_followup: bool
def score_deal_size(prospect: dict) -> tuple[float, str]:
"""추정 거래 규모 기반 점수."""
size_indicators = prospect.get("size_indicators", {})
employee_count = size_indicators.get("employees", 0)
revenue_estimate = size_indicators.get("revenue", 0)
# 회사 규모 기반 간단한 점수
if employee_count > 1000 or revenue_estimate > 100_000_000:
return 10.0, "Enterprise-scale opportunity"
elif employee_count > 200 or revenue_estimate > 20_000_000:
return 7.0, "Mid-market opportunity"
elif employee_count > 50:
return 5.0, "SMB opportunity"
else:
return 3.0, "Small business"
def score_timing(prospect: dict) -> tuple[float, str]:
"""타이밍 신호 기반 점수."""
timing_signals = prospect.get("timing_signals", [])
score = 5.0 # 기본 점수
reasons = []
for signal in timing_signals:
if signal == "budget_cycle_q4":
score += 3
reasons.append("Q4 budget planning")
elif signal == "contract_expiring":
score += 4
reasons.append("Contract expiring soon")
elif signal == "active_evaluation":
score += 5
reasons.append("Actively evaluating")
elif signal == "just_funded":
score += 3
reasons.append("Recently funded")
return min(score, 10.0), "; ".join(reasons) if reasons else "Standard timing"
def score_warmth(prospect: dict) -> tuple[float, str]:
"""관계 온도 기반 점수."""
relationship = prospect.get("relationship", {})
if relationship.get("is_followup"):
last_outcome = relationship.get("last_outcome", "neutral")
if last_outcome == "positive":
return 9.0, "Warm follow-up (positive last contact)"
elif last_outcome == "neutral":
return 7.0, "Follow-up (neutral last contact)"
else:
return 5.0, "Follow-up (needs re-engagement)"
if relationship.get("referred"):
return 8.0, "Referred lead"
if relationship.get("mutual_connections", 0) > 0:
return 6.0, f"{relationship['mutual_connections']} mutual connections"
if relationship.get("inbound"):
return 7.0, "Inbound interest"
return 4.0, "Cold outreach"
def score_signals(prospect: dict) -> tuple[float, str]:
"""탐지된 구매 신호 기반 점수."""
signals = prospect.get("signals", [])
total_score = 0
signal_reasons = []
for signal in signals:
signal_score = SIGNAL_SCORES.get(signal, 0)
total_score += signal_score
if signal_score > 0:
signal_reasons.append(signal.replace("_", " "))
# 0-10 척도로 정규화
normalized = min(max(total_score / 2, 0), 10)
reason = f"Signals: {', '.join(signal_reasons)}" if signal_reasons else "No strong signals"
return normalized, reason
def calculate_priority_score(
prospect: dict,
weights: dict = None
) -> ScoredProspect:
"""잠재 고객의 전체 우선순위 점수 계산."""
weights = weights or DEFAULT_WEIGHTS
# 구성 점수 계산
deal_score, deal_reason = score_deal_size(prospect)
timing_score, timing_reason = score_timing(prospect)
warmth_score, warmth_reason = score_warmth(prospect)
signal_score, signal_reason = score_signals(prospect)
# 가중 총점
raw_score = (
deal_score * weights["deal_size"] +
timing_score * weights["timing"] +
warmth_score * weights["warmth"] +
signal_score * weights["signals"]
)
# 근거 컴파일
reasons = []
if timing_score >= 8:
reasons.append(timing_reason)
if signal_score >= 7:
reasons.append(signal_reason)
if warmth_score >= 7:
reasons.append(warmth_reason)
if deal_score >= 8:
reasons.append(deal_reason)
return ScoredProspect(
company=prospect.get("company", "Unknown"),
contact=prospect.get("contact", "Unknown"),
call_time=prospect.get("call_time", "Unknown"),
raw_score=round(raw_score, 2),
normalized_score=int(raw_score * 10),
priority_rank=0, # 정렬 후 설정될 것
score_breakdown={
"deal_size": {"score": deal_score, "reason": deal_reason},
"timing": {"score": timing_score, "reason": timing_reason},
"warmth": {"score": warmth_score, "reason": warmth_reason},
"signals": {"score": signal_score, "reason": signal_reason}
},
reasoning="; ".join(reasons) if reasons else "Standard priority",
is_followup=prospect.get("relationship", {}).get("is_followup", False)
)
def main(
prospects: list[dict],
weights: dict = None
) -> dict[str, Any]:
"""
잠재 고객 우선순위 계산 및 순위 지정.
Args:
prospects: 신호가 있는 잠재 고객 객체 목록
weights: 점수 구성 요소에 대한 선택적 사용자 정의 가중치
Returns:
순위가 매겨진 잠재 고객 및 점수 세부 정보가 포함된 dict
"""
weights = weights or DEFAULT_WEIGHTS
# 모든 잠재 고객 점수 계산
scored = [calculate_priority_score(p, weights) for p in prospects]
# 원시 점수 내림차순 정렬
scored.sort(key=lambda x: x.raw_score, reverse=True)
# 순위 할당
for i, prospect in enumerate(scored, 1):
prospect.priority_rank = i
# JSON 직렬화를 위해 dict로 변환
ranked = []
for s in scored:
ranked.append({
"company": s.company,
"contact": s.contact,
"call_time": s.call_time,
"priority_rank": s.priority_rank,
"score": s.normalized_score,
"reasoning": s.reasoning,
"is_followup": s.is_followup,
"breakdown": s.score_breakdown
})
return {
"ranked": ranked,
"weights_used": weights,
"total_prospects": len(prospects)
}
if __name__ == "__main__":
import sys
# 예제 사용
example_prospects = [
{
"company": "DataFlow Systems",
"contact": "Sarah Chen",
"call_time": "2pm",
"size_indicators": {"employees": 200, "revenue": 25_000_000},
"timing_signals": ["just_funded", "active_evaluation"],
"signals": ["recent_funding", "job_postings_relevant"],
"relationship": {"is_followup": False, "mutual_connections": 2}
},
{
"company": "Acme Manufacturing",
"contact": "Tom Bradley",
"call_time": "10am",
"size_indicators": {"employees": 500},
"timing_signals": ["contract_expiring"],
"signals": [],
"relationship": {"is_followup": True, "last_outcome": "neutral"}
},
{
"company": "FirstRate Financial",
"contact": "Linda Thompson",
"call_time": "4pm",
"size_indicators": {"employees": 300},
"timing_signals": [],
"signals": [],
"relationship": {"is_followup": False}
}
]
result = main(prospects=example_prospects)
print(json.dumps(result, indent=2))
FILE:research-checklist.md
# 잠재 고객 조사 체크리스트
## 회사 조사
### 기본 정보
- [ ] 회사명 (철자 확인)
- [ ] 업종/버티컬
- [ ] 본사 위치
- [ ] 직원 수 (LinkedIn, 웹사이트)
- [ ] 매출 추정치 (가능한 경우)
- [ ] 설립일
- [ ] 자금 조달 단계/이력
### 최근 뉴스 (최근 90일)
- [ ] 자금 조달 발표
- [ ] 인수 또는 합병
- [ ] 리더십 변경
- [ ] 제품 출시
- [ ] 주요 고객 확보
- [ ] 언론 보도
- [ ] 실적/재무 뉴스
### 디지털 발자국
- [ ] 웹사이트 검토
- [ ] 블로그/콘텐츠 주제
- [ ] 소셜 미디어 존재감
- [ ] 채용 공고 (채용 페이지 + LinkedIn)
- [ ] 기술 스택 (BuiltWith, 채용 공고)
### 경쟁 구도
- [ ] 알려진 경쟁사
- [ ] 시장 위치
- [ ] 주장하는 차별점
- [ ] 최근 경쟁 움직임
### 고충 지점 지표
- [ ] Glassdoor 리뷰 (테마)
- [ ] G2/Capterra 리뷰 (B2B인 경우)
- [ ] 소셜 미디어 불만
- [ ] 채용 공고 패턴
## 연락처 조사
### 전문 프로필
- [ ] 현재 직함
- [ ] 역할 재임 기간
- [ ] 회사 재직 기간
- [ ] 이전 회사
- [ ] 이전 역할
- [ ] 교육
### 의사 결정 권한
- [ ] 보고 대상
- [ ] 팀 규모 (관리자인 경우)
- [ ] 예산 권한 (추론)
- [ ] 구매 참여 이력
### 참여 유도 포인트
- [ ] 최근 LinkedIn 게시물
- [ ] 게재된 기사
- [ ] 팟캐스트 출연
- [ ] 컨퍼런스 발표
- [ ] 공통 연결
- [ ] 공유 관심사/그룹
### 커뮤니케이션 스타일
- [ ] 게시물 톤 (격식/비격식)
- [ ] 참여하는 주제
- [ ] 응답 패턴
## CRM 확인 (가능한 경우)
- [ ] 이전 접촉 포인트
- [ ] 이전 기회
- [ ] 회사 내 관련 연락처
- [ ] 동료 메모
- [ ] 이메일 참여 이력
## 시간 기반 조사 깊이
| 사용 가능 시간 | 조사 깊이 |
|----------------|----------------|
| 5분 | 회사 기본 + 연락처 직함만 |
| 15분 | + 최근 뉴스 + LinkedIn 프로필 |
| 30분 | + 고충 지점 신호 + 참여 유도 포인트 |
| 60분 | 전체 체크리스트 + 경쟁 분석 |
FILE:signal-indicators.md
# 신호 지표 참조
## 높은 의도 신호
### 채용 공고
- **관련 역할 3개 이상 게시** = 적극적인 이니셔티브, 예산 할당됨
- **귀하의 도메인에서 시니어 채용** = 전략적 우선순위
- **긴급 언어 ("ASAP", "immediate")** = 고충이 심각함
- **특정 도구 언급** = 경쟁사 또는 카테고리 인지도
### 재무 이벤트
- **시리즈 B+ 자금 조달** = 성장 자본, 구매력
- **IPO 준비** = 운영 성숙도 필요
- **인수 발표** = 통합 과제 도래
- **매출 이정표 PR** = 예산 가용
### 리더십 변경
- **귀하의 도메인에서 새 CXO** = 90일 우선순위 설정
- **새 CRO/CMO** = 기술 스택 평가 가능성
- **창업자 CEO 전환** = 운영 전문성 확립
## 중간 의도 신호
### 확장 신호
- **새 사무실 개설** = 인프라 필요
- **국제 확장** = 현지화, 규정 준수
- **새 제품 출시** = 확장 과제
- **주요 고객 확보** = 전달 압박
### 기술 신호
- **RFP 게시** = 적극적인 구매 프로세스
- **벤더 검토 언급** = 비교 쇼핑
- **기술 스택 변경** = 통합 기회
- **레거시 시스템 불만** = 현대화 필요
### 콘텐츠 신호
- **귀하의 주제에 대한 블로그 게시물** = 스스로 교육 중
- **웨비나 참석** = 관심 확인됨
- **백서 다운로드** = 문제 인지
- **컨퍼런스 발표** = 사고 리더십, 가시성
## 낮은 의도 신호 (육성)
### 일반 활동
- **업계 이벤트 참석** = 시장 참여자
- **일반 채용** = 회사 성장 중
- **긍정적 언론** = 건강한 회사
- **소셜 미디어 활동** = 참여하는 리더십
## 신호 점수
| 신호 유형 | 점수 | 조치 |
|-------------|-------|--------|
| 채용 공고 (관련) | +3 | 아웃리치 우선순위 |
| 최근 자금 조달 | +3 | 대화에서 언급 |
| 리더십 변경 | +2 | 시기 민감 기회 |
| 확장 뉴스 | +2 | 성장 각도 |
| 부정적 리뷰 | +2 | 고충 지점 각도 |
| 콘텐츠 참여 | +1 | 육성 트랙 |
| 신호 없음 | 0 | 발견 중심 |
전체 프롬프트를 보려면 로그인하세요
Continue with:
By logging in, you agree to our Terms of Use and Privacy Policy
사용법
이 프롬프트는 business와 함께 사용하도록 설계되었습니다. 위의 프롬프트 내용을 복사하여 원하는 AI 도구에 붙여넣으세요.
최상의 결과를 얻으려면 자리 표시자(대괄호 또는 대문자로 표시)를 특정 요구 사항으로 사용자 지정할 수 있습니다.
토론
댓글 0개