How To Write a Prospecting Skill Your Whole Team Can Reuse? (2026)

JB Jezequel JB Jezequel Linkedin Prospecting

You've set up an AI agent, connected it to your lead sources, and hit go.

Then you watch it stall the moment real prospect data arrives.

No schema to validate incoming leads. No qualification logic to tier them.

30-Second Summary

  • An AI agent skill is a reusable instruction set that tells an agent what to do and how to evaluate success for a specific task, narrower than a workflow, repeatable across hundreds of prospects.
  • Qualification logic scores each lead against your ICP criteria and routes them automatically (no manual triage required), bucketing prospects into Hot, Warm, or Cold tiers.
  • Handle three predictable failure modes: missing fields (graceful degradation), duplicate records (dedup hashing)
  • Connect your skill to Salesforce, Slack, and HubSpot through a single shared output schema: each integration consumes the same lead_id, tier, and recommended_action fields via REST POST or PATCH.

No routing rules to push Hot prospects to your CRM and nurture the rest.

You're stuck manually scoring leads in a spreadsheet.

Here is what this guide covers:

In this guide

  • Understand what an AI agent skill actually is
  • Copy-paste a prospecting skill template you can run today
  • Design your skill's input schema
  • Write qualification logic and routing rules
  • Handle errors and edge cases
  • Compare agent frameworks
  • Connect your skill to Salesforce, Slack, and HubSpot
  • Test and deploy safely

This guide takes you from zero to a production prospecting skill in one afternoon.

You'll copy a minimal Python scaffold and define your input schema: company size, job title, seniority.

Then you write a scoring function that weights your ICP criteria, and wire the output straight to Salesforce, Slack or HubSpot.

By the end, every lead that exits your Sales Navigator export flows through your skill and lands in the right inbox.

Hot prospects are flagged for immediate outreach, Warm leads are routed to nurture, and Cold ones are archived.

Why this works now: Claude Code skills let sales teams register reusable, versioned prospecting functions that RevOps can share across reps.

sales navigator export into score_lead skill routing hot warm cold

Agent frameworks now expose typed input schemas and dead-letter handling, which is what makes unattended lead triage reliable.

AI qualification agents report roughly 30% faster triage by running against live lead feeds instead of nightly batches.

Understand What an AI Agent Skill Actually Is

An AI agent skill is a discrete, reusable instruction set that tells an agent what to do and how to evaluate success for a specific task, more structured than a prompt, narrower than a full workflow.

AI Agent Skill

An AI Agent Skill is a reusable set of instructions, tools, and resources that enables an AI agent to perform a specific task consistently.

It gives the agent specialized workflows and knowledge it can apply when a relevant request arises.

Once built, it repeats identically across hundreds of prospects.

I think of a skill as a trained decision-maker. It takes input (a prospect's profile), applies logic (evaluate fit against criteria), and returns a structured output (matched or rejected, with reasoning).

Your Ideal Customer Profile (ICP) is the precise description of the company type and buyer role most likely to close and retain, it becomes the criteria your skill evaluates every prospect against.

Skills vs. Tools vs. Prompts: What's the Difference?

A prompt is a one-time instruction: "Find LinkedIn profiles matching these keywords and summarize them." Flexible, but not reusable.

A tool is a software function that does one narrow thing: fetch a LinkedIn profile URL, extract an email from a domain, validate a phone number.

prompt, tool and skill compared with linkedin lead examples

Tools are deterministic; they don't reason or adapt.

A skill is the repeatable, reasoned layer on top.

When I'm prospecting, a skill might be "Identify decision-makers in target accounts": it combines prompts (instructions to the AI), tool calls (fetch a profile, look up the company), and decision logic (does this person match our persona?) into one atomic unit that fires the same way for each prospect.

The key difference: skills understand intent and adapt logic. Tools execute mechanics. Prompts issue one-off commands.

For a deeper dive into how these skills fit into your broader prospecting strategy, read our guide on B2B sales prospecting methodologies.

When to Build a Prospecting Skill vs. a One-Off Prompt

Not every prospecting task needs a skill. A prompt solves the problem once; a skill solves it every time the pattern appears.

Build a prospecting skill when the task involves:

  • Repetition. You score every inbound lead, enrich every LinkedIn export, or dedupe every CSV upload the same way. The logic doesn't change; the data does.
  • Hard problems. The task requires chaining three or more steps. API lookups, conditional branching, error retry, that a single prompt can't hold together reliably.
  • Context the agent can't guess. Your ICP definition, territory rules, or compliance filters live in your CRM. The agent needs those values injected at runtime, not inferred from a user message.

Use a one-off prompt when:

  • The task happens once. You're drafting a new cold-email template, not personalizing 500 variants.
  • The input is already in the chat. You paste a LinkedIn profile URL and ask for a two-sentence summary. No external data, no branching.
  • The logic changes every time. "Find companies like X but not like Y" shifts with each search. Hardcoding it into a skill creates more friction than it saves.

The timing matters more in 2026 than it did a year ago.

Why Now

Why now: Agentic systems in 2026 can route user intent to the right skill at runtime. That routing only works when each skill owns one repeatable job, not a grab-bag of tangential tasks.

A skill that tries to "do prospecting" is too vague to invoke; a skill that scores a lead against your ICP fires automatically when the agent sees scoring language in the user's message.

The test: if you'd Zapier-automate it, you'd skill-automate it. If you'd do it by hand each time because the nuance shifts, leave it as a prompt.

Quick Start: Copy-Paste Prospecting Skill Template

A prospecting skill needs three things: structured input, qualification logic, and a structured output. Copy the scaffold below, swap in your own lead fields, and you have a working skill in minutes.

The Minimal Skill Structure (Input → Logic → Output)

Every prospecting skill follows the same three-part anatomy:

  1. Receive structured input (a JSON object describing the prospect)
  2. Execute logic to score or filter that prospect
  3. Return structured output (a decision or enriched data).

This separation keeps your skill modular and reusable across different lead sources and sales workflows.

The input schema defines what fields your skill expects; the logic is your decision rule or calculation; the output is what the calling system receives and acts on.

The Template Code Block

Copy the function below into a Python file or Jupyter notebook. Replace the lead_fields list with the fields you plan to filter or score on, and customize the logic block to match your prospecting criteria.

Prompt

python
import json

def prospect_skill(prospect_json: str) -> dict:
    """
    Minimal prospecting skill scaffold. Input: JSON string with prospect data (e.g., from a Sales Navigator export).

Output: Dictionary with decision and optional enriched fields. """
    prospect = json.loads(prospect_json)
    
    # Define the lead fields your skill cares about
    lead_fields = [
        'first_name',
        'last_name',
        'company',
        'title',
        'seniority'
    ]
    
    # Validate input has required fields
    for field in lead_fields:
        if field not in prospect:
            return {"decision": "skip", "reason": f"Missing {field}"}
    
    # Your prospecting logic here
    title = prospect.get('title', '').lower()
    seniority = prospect.get('seniority', '').lower()
    
    # Example: target VP+ titles at target companies
    if any(x in title for x in ['vp', 'director', 'head of']):
        return {"decision": "qualify", "score": 0.85}
    elif 'manager' in title and seniority == 'mid-level':
        return {"decision": "qualify", "score": 0.65}
    else:
        return {"decision": "skip", "reason": "Does not match seniority criteria"}

# Test the skill
test_input = json.dumps({
    "first_name": "Jane",
    "last_name": "Doe",
    "company": "Acme Corp",
    "title": "VP of Sales",
    "seniority": "senior"
})

result = prospect_skill(test_input)
print(result)  # Output: {"decision": "qualify", "score": 0.85}

After copying, swap in your own lead_fields from your export: for example, job_title, industry, company_size, and adjust the logic block to encode your target prospect profile.

To learn how to prepare clean lead data for your skill, see our guide on exporting Sales Navigator lead lists to Excel.

This is where you encode what you've learned from your best closes.

Define Your Skill's Input Schema

Your skill's input schema defines what lead data it expects to receive and process.

A well-designed schema accepts the fields that drive qualification logic while remaining flexible enough to work with incomplete records.

Start by listing the fields you actually need to score or filter leads.

When I built Evaboot's prospecting engine, I included company size, industry, job title, decision-making level, and any budget or timeline signals visible in the source data.

input schema fields company_size, industry, job_title with data types

Each field should map back to a concrete attribute in Sales Navigator: "company size" might correspond to employee-count ranges in search filters, or "industry" might align with the classification on a company profile.

Which Lead Fields Should Your Skill Accept?

Include fields that directly inform your qualification rules. Company size targets organizations within your market sweet spot, industry narrows to vertical fit, and job title and seniority signal buying authority.

Each field needs a clear data type: string for names and titles, integer for employee counts, array for multiple industries, boolean for yes/no signals.

Document where each field originates: Sales Navigator profile attribute, enrichment provider, or a custom flag in your export.

lead fields table mapping sales navigator data to qualify_lead

Don't invent fields your prospecting data cannot supply. If your exported leads don't include a "budget confirmed" flag, your schema shouldn't require it.

Mark Fields as Required vs. Optional

Designate fields as required only if your skill cannot function without them.

A lead's company name and job title are typically essential; industry or company size might be optional if your logic degrades gracefully when they're missing.

Optional fields let your skill score or route leads even when some attributes are unavailable, common with incomplete data or fresh exports.

Use optional fields to improve scoring confidence when present, but don't fail qualification if they're absent.

required and optional lead fields feeding a 78 lead score

Define a default or fallback behavior for each optional field. For example: "if industry is missing, assume broad B2B relevance." That keeps downstream decision-making predictable.

Write the Qualification Logic and Routing Rules

Qualification logic scores each prospect against your ICP criteria and routes them to the right action automatically, no manual triage required.

Build a simple scoring function that buckets prospects into Hot, Warm, or Cold, then trigger downstream workflows.

Build a Simple ICP Scoring Function

Start with the core inputs: company size, industry fit, and job seniority.

Weight each one based on what matters to your sales team.

Say your ICP targets mid-market software companies with 50–500 employees. Score company size on a 0–3 scale: 3 points if they're 50–500 people, 1 point if 500–5,000, and 0 otherwise.

Industry fit gets 2 points for Software, SaaS, or Tech; 1 point if adjacent (Finance, Marketing); 0 if they're outside your target.

icp scoring weights totalling 0-8 for hot warm cold

Job seniority: 2 points for Director/VP/C-suite, 1 for Manager, 0 for IC.

Add the scores: 7–8 = Hot, 4–6 = Warm, 0–3 = Cold. You can run this in a spreadsheet formula or a simple script. The mechanism doesn't matter, consistency does.

Test your scoring against 10–20 known closed wins and losses. If your system ranks your best customers as Hot, you've got calibration; if not, adjust the weights.

Route Each Tier to the Right Action

  1. Hot prospects need speed. Create a Salesforce task due tomorrow and send a Slack alert to your sales team with the prospect's name, company, and why they scored Hot.
  2. Warm prospects go into nurture, usually a drip email campaign or a monthly check-in task in your CRM. Set a 30-day follow-up task; don't let them ghost in your pipeline.
  3. Cold prospects: archive them or add them to a long-term nurture list (quarterly outreach). This keeps your active pipeline clean and prevents cold leads from clogging your inbox.

Tie it together with conditional logic: if score >= 7 then hot_alert() and create_task(due="tomorrow") else if score >= 4 then nurture_sequence() else archive().

Most CRM tools (Zapier, Make, native CRM workflows) handle this without code.

To identify which roles matter most in your scoring criteria, review our guide on finding decision-makers in a company.

Handle Errors and Edge Cases in Your Prospecting Skill

Prospecting skills face three predictable failure modes: missing or null lead fields, duplicate records, and enrichment API timeouts.

Handle each with a distinct pattern: graceful degradation, dedup hashing, and retry-with-backoff, so no lead is lost silently.

  • Missing or Null Fields: Graceful Degradation Pattern
  • Duplicate Lead Detection
  • API Timeout and Enrichment Failures

Missing or Null Fields: Graceful Degradation Pattern

Not every lead will have a phone number or email visible. Rather than reject the entire record, route incomplete leads to a manual-review queue.

Wrap your CRM write in a try/except block. Check for required fields (email, company name, job title) and assign a default status like "pending_enrichment" if any are missing.

Log the lead ID and the missing field, then move on. Your sales team manually verifies or enriches these records later, and you avoid silent data loss.

Duplicate Lead Detection

The same person shows up in multiple searches or lists. A lightweight dedup check before CRM write prevents duplicate records and wasted outreach.

Create a composite hash of email + company domain (or LinkedIn URL if email is absent). Query your CRM for a match; if found, log a skip and move on.

This single check eliminates most duplicates without expensive database scans.

Which Framework Should You Use in 2026?

Most teams should start with the Anthropic SDK (Claude) or the OpenAI function-calling API (ChatGPT), both handle prospecting skill scoring with minimal boilerplate and strong schema support.

Your choice depends on what stack your team already knows, your budget, and how many leads you're scoring.

The table below compares the four most common paths for implementing a prospecting skill like score_lead.

Framework Comparison Table: Registering a 'score_lead' Skill

FrameworkSetup ComplexityProspecting FitGitHub StarterBest For
Anthropic SDK (Claude)Low–MediumHighYes (Anthropic docs)Teams already on Claude; minimal dependencies
OpenAI function-calling (ChatGPT)Low–MediumHighYes (OpenAI examples)Teams already on ChatGPT; API-first workflows
LangChainMedium–HighMediumYes (community examples)Complex agent chains; multi-model flexibility
Custom REST webhookLowHighYes (custom Python)High-volume prospecting; no external agent overhead

Both the Anthropic SDK (Claude) and the OpenAI function-calling API (ChatGPT) handle prospecting skill scoring with minimal boilerplate, either works for teams already on those platforms.

LangChain adds flexibility if you're chaining multiple tools or swapping models later, but it adds complexity upfront. A custom REST endpoint bypasses agent framework overhead entirely.

For a comprehensive comparison of available platforms and tools, see our review of the best AI sales tools for outbound prospecting in 2026.

Connect Your Prospecting Skill to Your Sales Stack

Connect your skill to any destination by emitting one shared JSON schema, lead_id, tier, recommended_action, enriched_fields, then POST or PATCH that payload to Salesforce, Slack, or HubSpot without modifying the skill itself.

To understand how these integrations fit into your broader automation toolkit, explore lead generation automation tools that can amplify your skill's output.

  • Design an Output Schema Your Integrations Can Consume
  • Integration 1: Create a Salesforce Lead
  • Integration 2: Send a Slack Notification to the Sales Team
  • Integration 3: Update a HubSpot Custom Property

1. Design an Output Schema Your Integrations Can Consume

Every prospecting skill should emit four core fields: lead_id, tier, recommended_action, and enriched_fields. This schema becomes your contract with downstream systems.

lead_id uniquely identifies the prospect (LinkedIn URL, email, or internal ID). tier holds the qualification level: Hot, Warm, or Cold.

recommended_action tells your sales team what to do next: "Reach out immediately," "Add to nurture sequence," or "Revisit in 90 days." enriched_fields is a flexible object holding any additional data (job title, company, intent signals) that flows into the destination system.

One consistent schema means one skill can power three different integrations without modification. Each downstream tool extracts the fields it needs and ignores the rest.

2. Integration 1: Create a Salesforce Lead

Once your skill outputs a prospect, POST the lead_id and enriched data to Salesforce Leads via the REST API.

Map your tier field directly to Salesforce's Lead Status: Hot → "Qualified," Warm → "Open," Cold → "New."

Here's the pattern:

POST /services/data/v57.0/sobjects/Lead
{
  "LastName": "enriched_fields.last_name",
  "Company": "enriched_fields.company",
  "Status": "Qualified",
  "Description": "recommended_action"
}

Salesforce responds with the new Lead ID, which you store for future updates. This one-way push keeps your CRM in sync with skill output in near-real time.

3. Integration 2: Send a Slack Notification to the Sales Team

For Hot-tier prospects, send an immediate Slack alert to your sales channel via an Incoming Webhook. Filter your skill's output: only send prospects where tier == "Hot".

Build a Slack payload like this:

POST <your-webhook-url>
{
  "text": "🔥 Hot prospect identified",
  "blocks": [
    {"type": "section", "text": {"type": "mrkdwn", "text": "**enriched_fields.name** at enriched_fields.company\nAction: recommended_action"}}
  ]
}

The webhook receives the JSON, parses it, and posts a formatted message to your channel. Your sales reps see the prospect name, company, and next action in seconds.

4. Integration 3: Update a HubSpot Custom Property

To track prospect tier in HubSpot, create a custom property called ICP_tier (or use an existing one). Then PATCH the contact record with your skill's output.

The call looks like this:

PATCH /crm/v3/objects/contacts/<contact-id>
{
  "properties": {
    "ICP_tier": "enriched_fields.tier"
  }
}

HubSpot updates the contact in real time. Once the property is set, you can segment lists, trigger workflows, or report on ICP alignment, all downstream of your skill's single output schema.

Test and Deploy Your Prospecting Skill

Before you run your qualification skill against a full export, validate it in isolation and against real data. This two-stage approach catches logic errors and schema mismatches before they affect your entire pipeline.

1. Unit-Test Your Qualification Logic

Write test cases for three scenarios: an ideal ICP lead, a lead with partial or missing data, and a known duplicate.

For an ideal ICP lead (say, a VP of Sales at a mid-market SaaS company), your skill should return qualified: true with a clear reason.

For a partial-data lead (missing job title or incomplete company info), it should either return qualified: false with a specific reason or flag it for manual review, depending on your rules.

For a known duplicate (same email or LinkedIn URL as a prior record), it should return qualified: false and cite the match.

unit test, smoke test and deploy stages with evaboot-leads.csv

This simple table catches rule contradictions and null-handling bugs before you export.

2. Smoke-Test With a Real Lead Export Before Going Live

Run the skill against a small, real export from Evaboot: 20 to 50 leads from a LinkedIn Sales Navigator search you control.

Use the cleaned CSV that Evaboot (a LinkedIn Sales Navigator export and lead-cleaning tool) delivers, including the "No Match Reasons" column if present.

Watch for schema mismatches: missing columns, unexpected data types, job titles as null or blank strings.

Once the skill runs cleanly and flags the right leads, you're ready to scale to your full export.

Package Your Prospecting Skill for Team Reuse

Package a prospecting skill as a versioned Python file in a shared .agent/skills/ directory tracked by Git, teammates pull it and their agent auto-registers it on startup.

Once you've built a working skill, the entire sales team should be able to use it without re-writing the same logic.

Version the skill file and store it in a shared location: a team repository, a .agent/skills/ folder synced via Git, or an internal package registry.

score_lead_v1.py versioned in a shared repo, git push to teammates

Each skill gets a semantic version number (1.0.0, 1.1.0) so teammates know when breaking changes land.

Convention: one Python file per skill, named score_lead_v1.py or dedupe_lead.py. The agent runtime scans the skills directory on startup and auto-registers every function decorated with @skill or listed in a manifest.

If you change the input schema, bump the version and update the changelog comment at the top of the file so the next person knows what changed.

Push the file to your shared repo. Teammates pull, and the skill appears in their agent's toolkit. No second installation step: just a git pull and the agent picks it up.

Where to Save the Skill File So Your Agent Finds It

Put your skill file in .agent/skills/ at the project root, the agent scans that folder on startup, imports every Python module, and registers decorated functions.

Most frameworks (Claude Desktop, LangChain, Semantic Kernel) check that path by default. Create the folder if it doesn't exist, drop your file in, and restart the agent.

File tree example:

project-root/
├── .agent/
│   └── skills/
│       ├── score_lead.py
│       ├── dedupe_lead.py
│       └── identify_decision_maker.py
└── main.py

Hosted AI agent platforms like Relevance AI and Voiceflow (no-code environments for deploying agent skills) let you upload the file through their skill manager UI instead of a file path.

Same logic, different interface.

Restart the agent after adding a new file. It won't hot-reload mid-conversation in most setups.

Write a SKILL.md Manifest So the Agent Knows When to Fire It

The skill file holds your Python or TypeScript logic. The SKILL.md manifest tells the agent what the skill does and when to invoke it, without reading your code.

Most runtimes (Codex, Claude Desktop, Replit Agent) auto-discover skills by scanning .agent/skills/ or .agents/skills/ for a SKILL.md file alongside the code.

When a user message matches a skill's description or trigger phrase, the agent fires that skill instead of generating a generic response.

Minimal SKILL.md for a prospecting skill

Save this as .agent/skills/score_lead/SKILL.md:

score_lead

Description: Scores an inbound lead against ICP criteria (employee count, tech stack, funding stage) and returns a numeric score with reasoning.

Triggers:

  • "score this lead"
  • "qualify this company"
  • "does this fit our ICP"

Inputs:

  • company_name (string, required)
  • employee_count (integer, optional)
  • technologies (array of strings, optional)

Outputs:

  • score (integer, 0–100)
  • reasoning (string)
  • next_action (string: "route_to_AE" | "nurture" | "discard")

Dependencies:

  • Clearbit API key (env: CLEARBIT_API_KEY)
  • HubSpot CRM (read-only, company properties)

The agent reads Description and Triggers to decide whether your user's message ("Does Acme Corp fit our ICP?") should invoke score_lead or fall back to chat.

What goes in each field

  • Name. Match the skill folder and the primary function. Use snake_case, never spaces.
  • Description. One sentence. State the job, the input type, and the output. "Scores a company against ICP rules" beats "Helps with lead qualification."
  • Triggers. Short phrases users actually type. Avoid jargon the agent won't recognize. "Score this lead" works; "execute qualification heuristic" does not.
  • Inputs. List every parameter your skill expects, with type and whether it's required. The agent uses this to prompt the user for missing data before firing the skill.
  • Outputs. What the skill returns. Be specific, "a score and a next-action enum" is better than "qualification result."
  • Dependencies. API keys, CRM permissions, third-party packages. If the skill can't run without Clearbit, say so. The agent will surface a clear error instead of failing silently.

Why this matters: Without a manifest, the agent treats your skill as a black box.

It won't know when to invoke it, what data to pass, or how to explain the result to the user.

A two-minute SKILL.md file turns a fragile script into a discoverable, self-documenting tool the agent can route to automatically.

Four More Prospecting Skills Your Team Can Copy-Paste

Beyond score_lead, here are three more named, reusable skills that cover the gaps in a typical outbound workflow. Drop these into .agent/skills/ and your agents inherit the logic.

  • identify_decision_maker
  • dedupe_lead
  • detect_intent_signal
  • extract_company_metadata

identify_decision_maker

from pydantic import BaseModel, Field

class DecisionMakerInput(BaseModel):
    linkedin_url: str = Field(description="LinkedIn profile URL")
    company_domain: str
    target_role: str = Field(default="VP Sales", description="Role you want to reach")

@skill(name="identify_decision_maker", description="Find the best contact at a company for a given role")
def identify_decision_maker(params: DecisionMakerInput) -> dict:
    # Call LinkedIn enrichment API or scrape title/department
    # Return name, title, email if found
    return {
        "name": "Jane Doe",
        "title": "VP Sales",
        "email": "jane@company.com",
        "confidence": 0.92
    }

Use case: Agent sees a company domain, hunts for the right person before sending outreach.

dedupe_lead

class DedupeInput(BaseModel):
    email: str
    existing_crm_ids: list[str] = Field(description="List of CRM record IDs already in the system")

@skill(name="dedupe_lead", description="Check if this lead already exists in CRM to avoid duplicates")
def dedupe_lead(params: DedupeInput) -> dict:
    # Query CRM by email, phone, or LinkedIn URL
    # Return match status and existing record ID if found
    existing = next((id for id in params.existing_crm_ids if match(params.email, id)), None)
    return {"is_duplicate": bool(existing), "crm_id": existing}

Use case: Before adding a lead to a sequence, verify they're not already in the pipeline under a different name.

detect_intent_signal

class IntentInput(BaseModel):
    company_domain: str
    signals: list[str] = Field(description="List of intent keywords or events to watch for")

@skill(name="detect_intent_signal", description="Check if a company shows buying intent (job posts, tech stack changes, funding)")
def detect_intent_signal(params: IntentInput) -> dict:
    # Check job boards, Crunchbase, BuiltWith, G2 reviews
    # Return boolean + list of detected signals
    return {
        "has_intent": True,
        "signals_found": ["Posted 'Sales Ops Manager' role 3 days ago", "Added Salesforce to tech stack"],
        "priority_score": 8
    }

Use case: Prioritize accounts that just raised funding or posted a relevant job, your agent auto-bumps them to the top of the list.

extract_company_metadata

class CompanyMetaInput(BaseModel):
    domain: str

@skill(name="extract_company_metadata", description="Pull firmographic data: employee count, industry, revenue estimate")
def extract_company_metadata(params: CompanyMetaInput) -> dict:
    # Call Clearbit, BuiltWith, or LinkedIn Company API
    return {
        "employees": 450,
        "industry": "B2B SaaS",
        "revenue_range": "$10M–$50M",
        "hq_location": "Austin, TX"
    }

Use case: Auto-qualify inbound signups or enrich a raw CSV of domains before outreach.

The team that ships agentic prospecting skills first isn't the one with the best engineers.

It's the one where a sales-ops analyst who knows Python sits next to a rev-ops lead who knows the ICP rules and they pair-program a skill in an afternoon. The missing piece is almost never the code.

Building a prospecting agent requires three skill sets: prompt engineering, API integration, and schema design. The table below maps each to what it covers and why it matters.

Skill areaWhat it coversWhy prospecting agents need it
Prompt engineeringWriting clear instructions, few-shot examples, output format constraintsAgents misinterpret vague prompts: "find leads" does nothing without structure. You need to specify schema, edge cases, and success criteria in the prompt itself.
API integrationConnecting to CRMs (Salesforce, HubSpot), enrichment APIs (Clearbit, Apollo), LinkedIn scrapersProspecting skills pull live data. A score_lead skill is useless if it can't read from your CRM or write qualified leads back.
Schema designDefining Pydantic models or JSON Schema for inputs/outputsAgents break when inputs are ambiguous. A well-defined schema (required fields, defaults, descriptions) turns a flaky agent into a reliable one.

Frequently asked questions

What are concrete examples of skills in an AI prospecting agent?

In prospecting, skills are discrete tasks that score or route leads. Common examples include: (1) Lead Qualification Skill: takes prospect data (company size, job title, industry) and returns a tier (Hot/Warm/Cold); (2) Decision-Maker Identification Skill: filters for seniority levels (VP+, Director) likely to have budget authority; (3) Duplicate Detection Skill: compares incoming leads against your CRM to flag duplicates before outreach; (4) Intent Signal Matching Skill: scans available data (recent job changes, company growth signals) and scores urgency.

Each skill is modular, reusable across your entire lead list, and outputs a structured decision that feeds downstream actions like CRM creation or Slack alerts.

How do you write a good prompt for an AI prospecting agent skill?

A prospecting skill prompt must be specific to your ICP and decision criteria. Start by defining what "good" means: which company sizes, industries, job titles, and seniority levels have closed deals for you?

Write your prompt as a clear decision rule, not a general question. For example: "Score this prospect 0–10 based on: +3 if company has 50–500 employees, +2 if title includes VP/Director/Head, +2 if in Software or SaaS industry. Return the score and one-sentence reasoning."

The prompt should reference your actual ICP attributes and avoid vague language like "seems like a good fit." Include an example of a high-scoring prospect so the AI grounds its reasoning in your actual market.

What are the essential skills you need to build AI agents for sales prospecting?

You need four core skill categories: (1) Data Handling: parse lead records, extract relevant fields (name, company, title), and handle missing or null data gracefully; (2) Qualification Logic: implement your ICP criteria as a scoring or filtering function that maps prospect attributes to a decision; (3) Error Resilience: retry failed API calls, detect duplicates, and route incomplete records to manual review instead of failing silently; (4) Integration: shape your skill's output (structured JSON with lead ID, tier, and recommended action) so downstream systems like Salesforce, HubSpot, or Slack can consume it.

You don't need advanced ML; basic data filtering, conditional logic, and API error handling cover 90% of prospecting workflows.

Which framework is best for building AI agent prospecting skills in 2026?

For most prospecting skills, the Anthropic SDK (Claude) or OpenAI SDK (ChatGPT) is the fastest starting point: minimal boilerplate, strong scoring support. Choose LangChain for multi-tool chains; choose a custom REST webhook for high-volume (500+ leads/week) or budget-sensitive setups.

If you're under 500 leads/week, skip the framework entirely and use a straightforward function. You'll ship faster and spend less on API calls.

How do you handle missing lead data in an AI prospecting skill?

Design your skill to degrade gracefully: mark fields as required or optional in your input schema, and provide a fallback for each optional field. When a prospect record is missing job title or industry, your skill should not reject the entire lead.

Instead, assign a default status (for example, pending_enrichment) and route the record to a manual-review queue: a separate CSV or database table your sales team enriches later.

Wrap CRM writes in error handling: check for required fields before writing, and log the lead ID and missing field if validation fails.

This pattern ensures no prospect disappears and keeps your pipeline moving even with incomplete data.

Can an AI agent skill write directly to Salesforce or HubSpot?

Yes, but the skill itself only outputs structured data (JSON with lead ID, tier, and enriched fields). A separate integration layer (usually a webhook, Zapier workflow, or native CRM automation) consumes that output and writes to your CRM.

Design your skill's output schema to match what Salesforce or HubSpot expect: map your tier field to Lead Status, include enriched_fields (name, company, title), and set recommended_action to guide follow-up workflows.

Once your skill outputs clean JSON, a POST request to the Salesforce Leads API or a HubSpot PATCH to a contact's custom property completes the handoff.

This separation keeps your skill reusable across multiple downstream systems.

What's the difference between a skill, a tool, and a prompt in AI agents?

A prompt is a one-time instruction: for example, "Find LinkedIn profiles matching these keywords." Flexible but not reusable.

A tool is a deterministic software function: fetch a profile URL, extract an email, validate a phone number. Tools don't reason; they execute mechanics.

A skill is the repeatable, reasoned layer on top: it combines prompts (instructions to the AI), tool calls (for example, fetch a profile), and decision logic (does this person match our ICP?) into one atomic unit that fires the same way for every prospect. Skills understand intent and adapt logic; tools execute mechanics; prompts issue one-off commands.

What should your prospecting skill's output schema look like?

Your output schema is the contract between your skill and downstream systems. It should always include: (1) lead_id: unique identifier (email, LinkedIn URL, or internal ID); (2) tier: qualification level (Hot, Warm, Cold); (3) recommended_action: what the sales team should do next (for example, "Reach out immediately", "Add to nurture", "Revisit in 90 days"); (4) enriched_fields: a flexible object holding any additional data (name, company, title, intent signals) that flows downstream.

One consistent schema means a single skill can power multiple integrations (Salesforce, Slack, HubSpot) without modification. Each destination tool extracts the fields it needs and ignores the rest.

How do you prevent duplicate leads in a prospecting skill?

Add a lightweight dedup check before writing to your CRM. Create a composite hash of email + company domain (or LinkedIn URL if email is absent), then query your CRM for a matching record; if found, log a skip and move on.

This single check eliminates most duplicates without expensive database scans. If you're processing leads from multiple sources, build a hash table in memory as you go, checking each incoming lead against it.

For a robust solution, query your CRM once at the start of your batch, store the hashes locally, and check against them, faster than a lookup per lead and reduces API calls to your CRM.

What should you do if an enrichment API times out during prospecting?

Use a retry-with-backoff pattern: wait 2 seconds on the first failure and retry; if it fails again, wait 5 seconds and retry a third time. If the third attempt fails, write the lead to a dead-letter queue: a separate CSV or database table where failed records are held for reprocessing rather than discarded, preserving every lead even when external APIs fail.

Tag each dead-letter record with the failure reason and timestamp so you can debug or rerun batches during off-peak hours. This approach reduces load on external APIs, ensures no lead disappears permanently, and lets you batch-reprocess once daily when APIs have slack capacity.

The dead-letter queue becomes a safety net for transient failures.

Rate this article

4.9/5 (117 votes)