AgentStack
SKILL verified MIT Self-run

Sales Agent Builder

skill-khalilbenaz-claude-skills-collection-sales-agent-builder · by khalilbenaz

Construction d'agents de vente IA pour prospection, qualification et suivi commercial. Se déclenche avec "sales agent", "agent commercial", "agent de vente", "prospection IA", "SDR agent", "lead qualification agent", "outreach agent", "follow-up automatique".

No reviews yet
0 installs
16 views
0.0% view→install

Install

$ agentstack add skill-khalilbenaz-claude-skills-collection-sales-agent-builder

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access Used
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Sales Agent Builder? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Sales Agent Builder

Quand utiliser ce skill

Conçois un agent commercial automatisant tout ou partie du cycle outbound : enrichissement de leads, qualification structurée (BANT/MEDDIC), rédaction d'emails personnalisés, séquences multi-touch, mise à jour CRM, prise de rendez-vous. S'applique aux équipes SDR/BDR, startups B2B en croissance et toute équipe cherchant à industrialiser les tâches répétitives sans sacrifier la personnalisation.


Workflow en étapes

1. Choix du mode d'autonomie

Avant de coder : décide du niveau d'autonomie selon la maturité de l'équipe.

| Mode | Comportement | Quand l'utiliser | |---|---|---| | Human-in-the-loop | Propose les emails, attend validation avant envoi | Phase initiale ( 10% confirmé | | Fully autonomous | Gère l'intégralité du cycle sans intervention | Après 3+ mois de données, superviseur actif |

Toujours démarrer en human-in-the-loop. Passer en semi-autonome uniquement après validation de 100 emails minimum et taux de réponse > 10%.


2. Architecture des cinq modules

┌─────────────────────────────────────────────────────┐
│  Lead entrant (CSV / webhook CRM / formulaire)      │
└────────────────────┬────────────────────────────────┘
                     ▼
         ┌─────────────────────┐
         │ A. Enrichissement   │  Apollo, Clay, Hunter.io
         └──────────┬──────────┘
                    ▼
         ┌─────────────────────┐
         │ B. Qualification     │  BANT / MEDDIC → score 0-100
         └──────────┬──────────┘
                    ▼
         ┌─────────────────────┐
         │ C. Génération       │  Email + variantes A/B
         │    d'outreach       │
         └──────────┬──────────┘
                    ▼
         ┌─────────────────────┐
         │ D. Séquences        │  Multi-touch J0/J3/J5/J8/J10/J15
         │    & follow-ups     │
         └──────────┬──────────┘
                    ▼
         ┌─────────────────────┐
         │ E. CRM + Reporting  │  HubSpot / Salesforce / Pipedrive
         └─────────────────────┘

3. Enrichissement automatique des leads

Pour chaque lead entrant, collecter : taille/secteur/financement (Crunchbase, Apollo), profil LinkedIn, actualités récentes (levées, recrutements, partenariats), stack technique (BuiltWith), et score ICP.

# Enrichissement via Apollo API
import requests

def enrich_lead(lead: dict, api_key: str) -> dict:
    resp = requests.post(
        "https://api.apollo.io/v1/people/match",
        json={
            "first_name": lead["first_name"],
            "last_name": lead["last_name"],
            "organization_name": lead["company"],
            "api_key": api_key,
        },
        timeout=10,
    )
    resp.raise_for_status()
    person = resp.json().get("person", {})
    return {
        "title": person.get("title"),
        "linkedin_url": person.get("linkedin_url"),
        "seniority": person.get("seniority"),
        "company_size": person.get("employment_history", [{}])[0].get("organization", {}).get("estimated_num_employees"),
        "technologies": person.get("organization", {}).get("current_technologies", []),
    }

Critère de décision : si l'enrichissement retourne dict: score = 0 reasons = []

# Budget (0-25) if lead.get("companysize", 0) > 200: score += 25; reasons.append("Budget probable (>200 employés)") elif lead.get("companysize", 0) > 50: score += 15; reasons.append("Budget estimé moyen")

# Authority (0-25) seniortitles = ["VP", "Director", "Head", "Chief", "CXO", "Founder"] if any(t in (lead.get("title") or "") for t in seniortitles): score += 25; reasons.append("Décisionnaire identifié")

# Need (0-25) — basé sur stack / industrie painindustries = ["fintech", "ecommerce", "saas"] if lead.get("industry", "").lower() in painindustries: score += 20; reasons.append("Industrie cible prioritaire")

# Timeline (0-25) — basé sur signaux (recrutement SDR, levée récente) if lead.get("recentfunding") or lead.get("hiringsales"): score += 25; reasons.append("Signal de croissance détecté")

tier = "Hot" if score >= 70 else "Warm" if score >= 40 else "Cold" return {"score": score, "tier": tier, "reasons": reasons}


**Règle :** ne faire entrer dans les séquences automatiques que les leads `Warm` (≥ 40) et `Hot` (≥ 70). Les `Cold` vont dans une nurture séparée.

---

### 5. Génération d'emails d'outreach personnalisés

Contraintes non négociables :  3 mois)
- NOT_RELEVANT : hors cible, mauvaise personne
- OBJECTION_PRICE : problème de budget
- OBJECTION_TOOL : déjà un outil concurrent
- NEGATIVE : refus définitif
- QUESTION : demande d'information

Réponse : {email_body}
Réponds avec le code catégorie uniquement."""

Pour OBJECTION_PRICE et OBJECTION_TOOL : utilise une bibliothèque d'objections validée par l'équipe commerciale. Pour INTERESTED : escalade immédiate vers un humain avec contexte complet du lead.


8. Intégration CRM

# Mise à jour HubSpot après qualification (SDK officiel)
from hubspot import HubSpot

client = HubSpot(access_token=HUBSPOT_TOKEN)

def update_lead_hubspot(contact_id: str, score: int, summary: str):
    client.crm.contacts.basic_api.update(
        contact_id=contact_id,
        simple_public_object_input={
            "properties": {
                "hs_lead_status": "QUALIFIED" if score >= 70 else "IN_PROGRESS",
                "qualification_score": str(score),
                "qualification_notes": summary,
                "lifecyclestage": "salesqualifiedlead" if score >= 70 else "lead",
            }
        },
    )

Actions minimales à logger dans le CRM pour chaque lead : email envoyé, email ouvert, réponse reçue, classification de la réponse, score de qualification, meeting booké.


9. Métriques à monitorer

| Métrique | Cible | Alarme si | |---|---|---| | Taux d'ouverture emails | > 40% | 15% | 5% | 3% | | Spam rate | 0.08% | | Pipeline généré (€) | Dépend du deal size | — |

Génère un rapport hebdomadaire automatique (Slack/email) pour le manager avec ces indicateurs et les top 3 emails par taux de réponse.


Garde-fous et conformité

  • RGPD / CAN-SPAM : lien de désinscription fonctionnel dans chaque email. Respecter les opt-outs sous 48h. Ne jamais prospecter sur des listes achetées sans consentement documenté.
  • Délivrabilité : maximum 100-200 emails/jour par domaine. Réchauffage progressif sur 4 semaines (10 → 30 → 80 → 150/jour). Surveiller bounce (< 2%) et spam (< 0.1%) en continu.
  • Escalade humaine obligatoire : toute réponse INTERESTED ou réponse ambiguë → transfer immédiat à un commercial avec contexte complet. L'agent ne négocie jamais seul.
  • Audit trail : chaque email envoyé par l'agent doit être loggé avec timestamp, version du template, données d'enrichissement utilisées. Conserve 12 mois minimum pour conformité.

Anti-patterns à éviter

  • Générer des emails sans accroche contextualisée : "J'espère que vous allez bien" = taux de réponse < 3%. L'accroche doit citer une donnée concrète.
  • Lancer la séquence complète avant validation : envoyer J0 à J15 sans analyser les réponses intermédiaires brûle les leads et risque le blacklistage.
  • Score de qualification sans justification : un score sans reasons est inexploitable par le commercial. Toujours fournir les critères.
  • Pas de limite de volume au démarrage : un nouveau domaine qui envoie 500 emails J1 sera blacklisté sous 48h. Respecter le réchauffage.
  • CRM non synchronisé : un agent qui envoie des emails sans logger dans le CRM crée des doublons de prospection et détruit la relation client.
  • Objections gérées par l'agent sans validation humaine : les réponses aux objections complexes doivent être validées par l'équipe commerciale avant d'être intégrées à la bibliothèque.

Stack recommandée (2026)

| Besoin | Outils | |---|---| | Enrichissement | Apollo.io, Clay, Hunter.io, LinkedIn Sales Navigator | | Séquences email | Instantly.ai, Lemlist, Outreach | | Orchestration agent | LangChain, LangGraph, Anthropic SDK | | CRM | HubSpot API, Salesforce API, Pipedrive API | | Booking | Calendly API, Cal.com (open source) | | Monitoring | Datadog, Grafana, PostHog | | Modèle LLM | Claude Sonnet (rédaction), Claude Haiku (classification) |

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.