Compétence de recherche commerciale : Méthodologie de recherche de prospects
De Wikiprompt, l’encyclopédie libre de prompts
Compétence de recherche commerciale : Méthodologie de recherche de prospects Une compétence complète de recherche commerciale avec méthodologie, listes de contrôle, notation des signaux, et scripts Python pour l'enrichissement d'entreprises, l'analyse de LinkedIn, et la priorisation des prospects.
Contenu du PromptEnregistrer
🌐
---
name: sales-research
description: Cette compétence fournit une méthodologie et des bonnes pratiques pour la recherche de prospects commerciaux.
---
# Recherche Commerciale
## Vue d'ensemble
Cette compétence fournit une méthodologie et des bonnes pratiques pour la recherche de prospects commerciaux. Elle couvre la recherche d'entreprise, le profilage des contacts et la détection de signaux pour mettre en évidence des informations exploitables.
## Utilisation
Les sous-agents company-researcher et contact-researcher se réfèrent à cette compétence lorsque :
- Ils recherchent de nouveaux prospects
- Ils trouvent des informations sur une entreprise
- Ils profilent des contacts individuels
- Ils détectent des signaux d'achat
## Méthodologie de recherche
### Liste de contrôle pour la recherche d'entreprise
1. **Profil de base**
- Nom de l'entreprise, secteur, taille (employés, chiffre d'affaires)
- Siège social et emplacements clés
- Date de fondation, stade de croissance
2. **Développements récents**
- Annonces de financement (12 derniers mois)
- Activité de fusions et acquisitions
- Changements de direction
- Lancements de produits
3. **Pile technologique**
- Technologies connues (BuiltWith, StackShare)
- Offres d'emploi mentionnant des outils
- Partenariats d'intégration
4. **Signaux**
- Offres d'emploi (croissance = opportunité)
- Avis Glassdoor (points de douleur)
- Mentions dans les médias (contexte)
- Activité sur les réseaux sociaux
### Liste de contrôle pour la recherche de contacts
1. **Parcours professionnel**
- Poste actuel et ancienneté
- Entreprises et postes précédents
- Formation
2. **Indicateurs d'influence**
- Structure hiérarchique
- Autorité de décision
- Gestion du budget
3. **Points d'accroche**
- Publications LinkedIn récentes
- Articles publiés
- Interventions en conférence
- Connaissances communes
## Ressources
- `resources/signal-indicators.md` - Taxonomie des signaux d'achat
- `resources/research-checklist.md` - Liste de contrôle complète de recherche
## Scripts
- `scripts/company-enricher.py` - Agrégation des données d'entreprise à partir de plusieurs sources
- `scripts/linkedin-parser.py` - Structuration des données de profil LinkedIn
FILE:company-enricher.py
#!/usr/bin/env python3
"""
company-enricher.py - Agrégation des données d'entreprise à partir de plusieurs sources
Entrées :
- company_name : chaîne
- domain : chaîne (optionnel)
Sorties :
- profile :
name : chaîne
industry : chaîne
size : chaîne
funding : chaîne
tech_stack : [chaîne]
recent_news : [éléments d'actualité]
Dépendances :
- requests, beautifulsoup4
"""
# Exigences : 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:
"""
Recherche d'informations de base sur l'entreprise.
En production, cela appellerait des API comme Clearbit, Crunchbase, etc.
"""
# TODO : Implémenter les appels API réels
# Structure de retour provisoire
return {
"name": company_name,
"domain": domain or f"{company_name.lower().replace(' ', '')}.com",
"industry": "Technology", # Viendrait de l'API
"size": "Unknown",
"location": "Unknown",
"founded": "Unknown",
"description": f"Informations sur {company_name}"
}
def search_funding_info(company_name: str) -> dict:
"""
Recherche d'informations sur le financement.
En production, appellerait Crunchbase, PitchBook, etc.
"""
# TODO : Implémenter les appels API réels
return {
"total_funding": "Unknown",
"last_round": "Unknown",
"last_round_date": "Unknown",
"investors": []
}
def search_tech_stack(domain: str) -> list[str]:
"""
Détection de la pile technologique.
En production, appellerait BuiltWith, Wappalyzer, etc.
"""
# TODO : Implémenter les appels API réels
return []
def search_recent_news(company_name: str, days: int = 90) -> list[dict]:
"""
Recherche d'actualités récentes sur l'entreprise.
En production, appellerait des API d'actualités.
"""
# TODO : Implémenter les appels API réels
return []
def main(
company_name: str,
domain: str = None
) -> dict[str, Any]:
"""
Agrégation des données d'entreprise à partir de plusieurs sources.
Args :
company_name : Nom de l'entreprise à rechercher
domain : Domaine de l'entreprise (optionnel, sera déduit)
Returns :
dict avec profil d'entreprise incluant secteur, taille, financement, pile technologique, actualités
"""
# Obtenir les informations de base sur l'entreprise
basic_info = search_company_info(company_name, domain)
# Obtenir les informations sur le financement
funding_info = search_funding_info(company_name)
# Détecter la pile technologique
company_domain = basic_info.get("domain", domain)
tech_stack = search_tech_stack(company_domain) if company_domain else []
# Obtenir les actualités récentes
news = search_recent_news(company_name)
# Compiler le profil
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=[], # Serait enrichi à partir de l'analyse sectorielle
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
# Exemple d'utilisation
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 - Structuration des données de profil LinkedIn
Entrées :
- profile_url : chaîne
- ou name + company : chaînes
Sorties :
- contact :
name : chaîne
title : chaîne
tenure : chaîne
previous_roles : [objets de rôle]
mutual_connections : [chaîne]
recent_activity : [résumés de publications]
Dépendances :
- requests
"""
# Exigences : 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:
"""
Recherche d'informations sur le profil LinkedIn.
En production, utiliserait l'API LinkedIn ou Sales Navigator.
"""
# TODO : Implémenter l'intégration réelle de l'API LinkedIn
# Remarque : L'API LinkedIn a des conditions d'utilisation strictes
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]:
"""
Extraction de l'historique de carrière à partir du profil.
"""
# TODO : Implémenter l'extraction de carrière
return []
def get_mutual_connections(profile_data: dict, user_network: list = None) -> list[str]:
"""
Recherche de connaissances communes.
"""
# TODO : Implémenter la détection de connaissances communes
return []
def get_recent_activity(profile_data: dict, days: int = 30) -> list[dict]:
"""
Obtention des publications et activités récentes.
"""
# TODO : Implémenter l'extraction d'activités
return []
def main(
name: str = None,
company: str = None,
profile_url: str = None
) -> dict[str, Any]:
"""
Structuration des données de profil LinkedIn pour la préparation commerciale.
Args :
name : Nom de la personne
company : Entreprise où elle travaille
profile_url : URL directe du profil LinkedIn
Returns :
dict avec profil de contact structuré
"""
if not profile_url and not (name and company):
return {"error": "Fournir soit profile_url soit name + company"}
# Recherche du profil
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": "Profil non trouvé ou accès limité",
"suggestions": [
"Essayez de rechercher directement sur LinkedIn",
"Vérifiez les orthographes alternatives",
"Vérifiez que la personne travaille toujours dans cette entreprise"
]
}
# Obtenir l'historique de carrière
previous_roles = get_career_history(profile_data)
# Trouver les connaissances communes
mutual_connections = get_mutual_connections(profile_data)
# Obtenir l'activité récente
recent_activity = get_recent_activity(profile_data)
# Compiler le profil de contact
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=[], # Serait extrait du profil
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:
"""Calcul du degré de complétude des données du profil."""
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
# Exemple d'utilisation
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 - Calcul et classement des priorités des prospects
Entrées :
- prospects : [objets prospects avec signaux]
- weights : {deal_size, timing, warmth, signals}
Sorties :
- ranked : [prospects avec scores et justifications]
Dépendances :
- (aucune - Python pur)
"""
import json
from typing import Any
from dataclasses import dataclass
# Poids de notation par défaut
DEFAULT_WEIGHTS = {
"deal_size": 0.25,
"timing": 0.30,
"warmth": 0.20,
"signals": 0.25
}
# Correspondance des scores de signaux
SIGNAL_SCORES = {
# Signaux à forte intention
"recent_funding": 10,
"leadership_change": 8,
"job_postings_relevant": 9,
"expansion_news": 7,
"competitor_mention": 6,
# Signaux à intention moyenne
"general_hiring": 4,
"industry_event": 3,
"content_engagement": 3,
# Signaux relationnels
"mutual_connection": 5,
"previous_contact": 6,
"referred_lead": 8,
# Signaux négatifs
"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]:
"""Notation basée sur la taille estimée de la transaction."""
size_indicators = prospect.get("size_indicators", {})
employee_count = size_indicators.get("employees", 0)
revenue_estimate = size_indicators.get("revenue", 0)
# Notation simple basée sur la taille de l'entreprise
if employee_count > 1000 or revenue_estimate > 100_000_000:
return 10.0, "Opportunité de niveau entreprise"
elif employee_count > 200 or revenue_estimate > 20_000_000:
return 7.0, "Opportunité de niveau mid-market"
elif employee_count > 50:
return 5.0, "Opportunité PME"
else:
return 3.0, "Petite entreprise"
def score_timing(prospect: dict) -> tuple[float, str]:
"""Notation basée sur les signaux de timing."""
timing_signals = prospect.get("timing_signals", [])
score = 5.0 # Score de base
reasons = []
for signal in timing_signals:
if signal == "budget_cycle_q4":
score += 3
reasons.append("Planification budgétaire T4")
elif signal == "contract_expiring":
score += 4
reasons.append("Contrat arrivant à expiration")
elif signal == "active_evaluation":
score += 5
reasons.append("Évaluation active en cours")
elif signal == "just_funded":
score += 3
reasons.append("Financement récent")
return min(score, 10.0), "; ".join(reasons) if reasons else "Timing standard"
def score_warmth(prospect: dict) -> tuple[float, str]:
"""Notation basée sur la chaleur de la relation."""
relationship = prospect.get("relationship", {})
if relationship.get("is_followup"):
last_outcome = relationship.get("last_outcome", "neutral")
if last_outcome == "positive":
return 9.0, "Suivi chaleureux (dernier contact positif)"
elif last_outcome == "neutral":
return 7.0, "Suivi (dernier contact neutre)"
else:
return 5.0, "Suivi (nécessite un réengagement)"
if relationship.get("referred"):
return 8.0, "Lead référé"
if relationship.get("mutual_connections", 0) > 0:
return 6.0, f"{relationship['mutual_connections']} connaissances communes"
if relationship.get("inbound"):
return 7.0, "Intérêt entrant"
return 4.0, "Prospection à froid"
def score_signals(prospect: dict) -> tuple[float, str]:
"""Notation basée sur les signaux d'achat détectés."""
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("_", " "))
# Normalisation sur une échelle de 0 à 10
normalized = min(max(total_score / 2, 0), 10)
reason = f"Signaux : {', '.join(signal_reasons)}" if signal_reasons else "Aucun signal fort"
return normalized, reason
def calculate_priority_score(
prospect: dict,
weights: dict = None
) -> ScoredProspect:
"""Calcul du score de priorité global pour un prospect."""
weights = weights or DEFAULT_WEIGHTS
# Calcul des scores des composants
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)
# Total pondéré
raw_score = (
deal_score * weights["deal_size"] +
timing_score * weights["timing"] +
warmth_score * weights["warmth"] +
signal_score * weights["signals"]
)
# Compilation des justifications
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, # Sera défini après le tri
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 "Priorité standard",
is_followup=prospect.get("relationship", {}).get("is_followup", False)
)
def main(
prospects: list[dict],
weights: dict = None
) -> dict[str, Any]:
"""
Calcul et classement des priorités des prospects.
Args :
prospects : Liste d'objets prospects avec signaux
weights : Poids personnalisés optionnels pour les composants de notation
Returns :
dict avec prospects classés et détails de notation
"""
weights = weights or DEFAULT_WEIGHTS
# Notation de tous les prospects
scored = [calculate_priority_score(p, weights) for p in prospects]
# Tri par score brut décroissant
scored.sort(key=lambda x: x.raw_score, reverse=True)
# Attribution des rangs
for i, prospect in enumerate(scored, 1):
prospect.priority_rank = i
# Conversion en dicts pour la sérialisation JSON
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
# Exemple d'utilisation
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
# Liste de contrôle pour la recherche de prospects
## Recherche d'entreprise
### Informations de base
- [ ] Nom de l'entreprise (vérifier l'orthographe)
- [ ] Secteur/vertical
- [ ] Emplacement du siège social
- [ ] Nombre d'employés (LinkedIn, site web)
- [ ] Estimation du chiffre d'affaires (si disponible)
- [ ] Date de fondation
- [ ] Stade/historique de financement
### Actualités récentes (90 derniers jours)
- [ ] Annonces de financement
- [ ] Acquisitions ou fusions
- [ ] Changements de direction
- [ ] Lancements de produits
- [ ] Victoires clients majeures
- [ ] Mentions dans la presse
- [ ] Actualités financières/résultats
### Empreinte numérique
- [ ] Revue du site web
- [ ] Sujets du blog/contenus
- [ ] Présence sur les réseaux sociaux
- [ ] Offres d'emploi (page carrières + LinkedIn)
- [ ] Pile technologique (BuiltWith, offres d'emploi)
### Paysage concurrentiel
- [ ] Concurrents connus
- [ ] Position sur le marché
- [ ] Différenciateurs revendiqués
- [ ] Mouvements concurrentiels récents
### Indicateurs de points de douleur
- [ ] Avis Glassdoor (thèmes)
- [ ] Avis G2/Capterra (si B2B)
- [ ] Plaintes sur les réseaux sociaux
- [ ] Modèles d'offres d'emploi
## Recherche de contacts
### Profil professionnel
- [ ] Poste actuel
- [ ] Temps dans le poste
- [ ] Temps dans l'entreprise
- [ ] Entreprises précédentes
- [ ] Postes précédents
- [ ] Formation
### Autorité de décision
- [ ] Rend compte à qui
- [ ] Taille de l'équipe (si manager)
- [ ] Autorité budgétaire (déduite)
- [ ] Historique d'implication dans les achats
### Points d'accroche
- [ ] Publications LinkedIn récentes
- [ ] Articles publiés
- [ ] Apparitions dans des podcasts
- [ ] Interventions en conférence
- [ ] Connaissances communes
- [ ] Centres d'intérêt/groupes partagés
### Style de communication
- [ ] Ton des publications (formel/informel)
- [ ] Sujets avec lesquels ils interagissent
- [ ] Modèles de réponse
## Vérification CRM (si disponible)
- [ ] Points de contact antérieurs
- [ ] Opportunités précédentes
- [ ] Contacts liés dans l'entreprise
- [ ] Notes de collègues
- [ ] Historique d'engagement par e-mail
## Profondeur de recherche basée sur le temps
| Temps disponible | Profondeur de recherche |
|------------------|-------------------------|
| 5 minutes | Informations de base sur l'entreprise + poste du contact uniquement |
| 15 minutes | + Actualités récentes + profil LinkedIn |
| 30 minutes | + Signaux de points de douleur + points d'accroche |
| 60 minutes | Liste de contrôle complète + analyse concurrentielle |
FILE:signal-indicators.md
# Référence des indicateurs de signaux
## Signaux à forte intention
### Offres d'emploi
- **3+ postes pertinents publiés** = Initiative active, budget alloué
- **Recrutement senior dans votre domaine** = Priorité stratégique
- **Langage d'urgence ("ASAP", "immediate")** = Douleur aiguë
- **Outil spécifique mentionné** = Sensibilisation au concurrent ou à la catégorie
### Événements financiers
- **Financement série B+** = Capital de croissance, pouvoir d'achat
- **Préparation à l'introduction en bourse** = Maturité opérationnelle requise
- **Acquisition annoncée** = Défis d'intégration à venir
- **PR sur un jalon de revenus** = Budget disponible
### Changements de direction
- **Nouveau CXO dans votre domaine** = Définition des priorités sur 90 jours
- **Nouveau CRO/CMO** = Évaluation probable de la pile technologique
- **Transition du fondateur vers le poste de CEO** = Professionnalisation des opérations
## Signaux à intention moyenne
### Signaux d'expansion
- **Ouverture d'un nouveau bureau** = Besoins en infrastructure
- **Expansion internationale** = Localisation, conformité
- **Lancement d'un nouveau produit** = Défis de mise à l'échelle
- **Victoire client majeure** = Pression de livraison
### Signaux technologiques
- **RFP publié** = Processus d'achat actif
- **Revue de fournisseur mentionnée** = Comparaison de concurrents
- **Changement de pile technologique** = Opportunité d'intégration
- **Plaintes sur les systèmes hérités** = Besoin de modernisation
### Signaux de contenu
- **Article de blog sur votre sujet** = Auto-éducation
- **Participation à un webinaire** = Intérêt confirmé
- **Téléchargement de livre blanc** = Sensibilisation au problème
- **Intervention en conférence** = Leadership éclairé, visibilité
## Signaux à faible intention (Nurture)
### Activité générale
- **Participation à un événement sectoriel** = Participant au marché
- **Recrutement générique** = Entreprise en croissance
- **Presse positive** = Entreprise saine
- **Activité sur les réseaux sociaux** = Leadership engagé
## Notation des signaux
| Type de signal | Score | Action |
|----------------|-------|--------|
| Offre d'emploi (pertinente) | +3 | Prioriser la sensibilisation |
| Financement récent | +3 | Référencer dans la conversation |
| Changement de direction | +2 | Opportunité sensible au temps |
| Actualité d'expansion | +2 | Angle de croissance |
| Avis négatifs | +2 | Angle de point de douleur |
| Engagement de contenu | +1 | Parcours de nurture |
| Aucun signal | 0 | Focus sur la découverte |
Connectez-vous pour voir le prompt complet
Continuer avec:
En vous connectant, vous acceptez nos Conditions et Confidentialité
Utilisation
Ce prompt est conçu pour être utilisé avec business. Copiez le contenu ci-dessus et collez-le dans votre outil d’IA préféré.
Pour de meilleurs résultats, personnalisez les espaces réservés (indiqués par des crochets ou des majuscules) selon vos besoins.
Discussion
0 commentaires