APM

>Agent Skill

@microsoft/lead-qualification-playbook

skilldata

Guides sales reps through structured lead qualification using BANT+ methodology. Evaluates leads, suggests discovery questions, scores quality, and recommends next steps. Use when user says "qualify this lead", "help me qualify", "BANT analysis", "score this lead", "should I convert this lead", "lead qualification questions", or "assess lead quality".

data
apm::install
$apm install @microsoft/lead-qualification-playbook
apm::skill.md
---
name: lead-qualification-playbook
description: Guides sales reps through structured lead qualification using BANT+ methodology. Evaluates leads, suggests discovery questions, scores quality, and recommends next steps. Use when user says "qualify this lead", "help me qualify", "BANT analysis", "score this lead", "should I convert this lead", "lead qualification questions", or "assess lead quality".
metadata:
  author: Dataverse
  version: 1.0.0
  category: sales-process
---

# Lead Qualification Playbook

Consistent lead qualification is critical for sales efficiency. This skill provides a structured playbook that helps SDRs qualify leads effectively, ensures all qualification criteria are captured in Dataverse, and provides AI-assisted recommendations on lead disposition.

## Instructions

### Step 1: Retrieve Lead Information
When user provides a lead to qualify, retrieve current lead data:

```
SELECT leadid, subject, firstname, lastname, fullname, companyname, jobtitle,
       emailaddress1, telephone1, mobilephone, description,
       leadsourcecode, industrycode, numberofemployees, revenue,
       budgetstatus, budgetamount, need, purchasetimeframe, purchaseprocess,
       decisionmaker, leadqualitycode, msdyn_leadscore, msdyn_leadgrade,
       estimatedamount, estimatedclosedate, qualificationcomments,
       createdon, modifiedon, statecode, statuscode, ownerid
FROM lead
WHERE leadid = '[lead_id]'
```

Also retrieve any related activities:
```
SELECT activityid, subject, activitytypecode, createdon, description, statecode
FROM activitypointer
WHERE regardingobjectid = '[lead_id]'
ORDER BY createdon DESC
```

#### Step 2: Assess Current Qualification Status

**Display Lead Summary:**
```
LEAD QUALIFICATION WORKSHEET
════════════════════════════════════════════════════
Lead: [fullname] at [companyname]
Title: [jobtitle]
Source: [leadsourcecode]
Created: [createdon]
Current Grade: [msdyn_leadgrade]
AI Score: [msdyn_leadscore]/100

CURRENT BANT STATUS:
════════════════════════════════════════════════════
Budget:    [budgetstatus] - [budgetamount if set]
Authority: [decisionmaker status]
Need:      [need]
Timeline:  [purchasetimeframe]
Process:   [purchaseprocess]
```

**Calculate Initial Qualification Score:**
| Criteria | Current Value | Score (0-20) |
|----------|---------------|--------------|
| Budget | [value] | [score] |
| Authority | [value] | [score] |
| Need | [value] | [score] |
| Timeline | [value] | [score] |
| Fit | [value] | [score] |
| **Total** | | **/100** |

#### Step 3: Guide Through BANT+ Discovery

**3.1 Budget Qualification**

Current Status: `budgetstatus` field value
- 0 = No Committed Budget
- 1 = May Buy
- 2 = Can Buy
- 3 = Will Buy

**Discovery Questions to Ask:**
```
If budgetstatus is NULL or 0 (No Budget):
- "Do you have budget allocated for this initiative?"
- "What's the approval process for projects like this?"
- "Have you invested in similar solutions before? What was the range?"

If budgetstatus is 1 (May Buy):
- "Is budget already approved, or does it need to go through a process?"
- "Who needs to sign off on the budget?"
- "What's your target investment range?"

If budgetstatus is 2 (Can Buy):
- "What's the specific budget you're working with?"
- "Are there any constraints on timing of spend?"
```

**Update Guidance:**
```
Based on responses, update lead record:
- budgetstatus: [0-3 based on response]
- budgetamount: [$ amount if confirmed]
- qualificationcomments: Append budget notes
```

**3.2 Authority Qualification**

Current Status: `decisionmaker` field (BIT: true/false)

**Discovery Questions:**
```
If decisionmaker is NULL or false:
- "Who else is involved in evaluating solutions like ours?"
- "What's the decision-making process at [companyname]?"
- "Will you be the one signing the contract, or is there another stakeholder?"

If jobtitle suggests individual contributor:
- "Who on your team would champion a project like this?"
- "Does your manager know you're exploring solutions?"
- "Who would need to approve moving forward?"
```

**Authority Mapping:**
```
Based on job title and responses, classify:
- Economic Buyer (signs checks): C-level, VP, Director
- Technical Buyer (evaluates): Manager, Sr. Engineer, Architect
- User Buyer (end user): Analyst, Associate, Individual Contributor
- Champion (internal advocate): Any level, shows enthusiasm
- Blocker (potential resistance): IT Security, Procurement
```

**Update Guidance:**
```
Update lead record:
- decisionmaker: true/false (is this person the decision maker?)
- qualificationcomments: Append "Decision Process: [notes]"
- description: Add stakeholder mapping if multiple people mentioned

Consider creating related contacts if additional stakeholders identified
```

**3.3 Need Qualification**

Current Status: `need` field
- 0 = Must have
- 1 = Should have
- 2 = Good to have
- 3 = No need

**Discovery Questions:**
```
If need is NULL or 3 (No need):
- "What prompted you to look into [solution type] now?"
- "What challenges are you trying to solve?"
- "What happens if you don't address this?"

If need is 2 (Good to have):
- "How is this problem impacting your business today?"
- "What's the cost of inaction?"
- "Is this tied to any strategic initiatives?"

If need is 0-1 (Strong need):
- "Can you quantify the impact of this problem?"
- "What have you tried before to solve this?"
- "What would success look like?"
```

**Pain Point Framework (capture in notes):**
1. **Problem:** What specific problem are they experiencing?
2. **Impact:** What's the business impact (cost, time, risk)?
3. **Root Cause:** Why hasn't this been solved before?
4. **Desired Outcome:** What does the ideal solution look like?

**Update Guidance:**
```
Update lead record:
- need: [0-3 based on response]
- description: Append pain points and requirements
- qualificationcomments: Append need summary
```

**3.4 Timeline Qualification**

Current Status: `purchasetimeframe` field
- 0 = Immediate
- 1 = This Quarter
- 2 = Next Quarter
- 3 = This Year
- 4 = Unknown

**Discovery Questions:**
```
If purchasetimeframe is NULL or 4 (Unknown):
- "When are you looking to have a solution in place?"
- "Is there a specific event or deadline driving this?"
- "What happens if this slips to next quarter/year?"

If purchasetimeframe is 2-3 (Next Quarter/This Year):
- "What's driving that timeline?"
- "Is there flexibility, or is it a hard deadline?"
- "What needs to happen between now and then?"

If purchasetimeframe is 0-1 (Immediate/This Quarter):
- "What's the compelling event?"
- "What could delay the decision?"
- "Who needs to be involved to meet that timeline?"
```

**Urgency Signals to Listen For:**
- Contract renewals (existing vendor)
- Regulatory compliance deadlines
- Fiscal year budget cycles
- Business initiatives or transformations
- Competitive pressure
- Executive mandates

**Update Guidance:**
```
Update lead record:
- purchasetimeframe: [0-4 based on response]
- estimatedclosedate: Set based on timeline
- qualificationcomments: Append timeline notes and compelling event
```

**3.5 Fit Assessment (Additional Qualification)**

Evaluate if the lead matches your ideal customer profile:

**Company Fit:**
```
Query industry and size signals:
- industrycode: Does it match target industries?
- numberofemployees: Is company size in range?
- revenue: Does revenue indicate right market segment?
```

**Fit Questions:**
```
- "How many people would use this solution?"
- "What systems would this need to integrate with?"
- "Are you currently using any similar tools?"
- "What's your technology stack?"
```

**Fit Scoring Matrix:**
| Criteria | Good Fit | Moderate Fit | Poor Fit |
|----------|----------|--------------|----------|
| Company Size | [your range] | Borderline | Outside range |
| Industry | Target vertical | Adjacent | Unserved |
| Use Case | Core product | Possible | Not supported |
| Tech Stack | Compatible | Workable | Incompatible |

#### Step 4: Calculate Final Qualification Score

**BANT+ Scoring Model:**

| Criteria | Weight | Scoring |
|----------|--------|---------|
| **Budget** | 25% | 3=25, 2=20, 1=10, 0=0 |
| **Authority** | 20% | Decision Maker=20, Champion=15, User=10, Unknown=0 |
| **Need** | 25% | 0=25, 1=20, 2=10, 3=0 |
| **Timeline** | 15% | 0=15, 1=12, 2=8, 3=4, 4=0 |
| **Fit** | 15% | Good=15, Moderate=10, Poor=0 |

**Total Score Interpretation:**
- 80-100: **Hot** - Highly qualified, ready for opportunity
- 60-79: **Warm** - Qualified but needs nurturing on gaps
- 40-59: **Cold** - Significant gaps, may need more development
- 0-39: **Disqualify** - Poor fit or no real opportunity

#### Step 5: Update Lead Record

```
Use update_record tool with tablename: lead

Update these fields based on discovery:
{
  "leadqualitycode": [1=Hot, 2=Warm, 3=Cold],
  "budgetstatus": [0-3],
  "budgetamount": [if confirmed],
  "need": [0-3],
  "purchasetimeframe": [0-4],
  "purchaseprocess": [0=Individual, 1=Committee, 2=Unknown],
  "decisionmaker": [true/false],
  "estimatedamount": [deal value estimate],
  "estimatedclosedate": [based on timeline],
  "qualificationcomments": "[Updated qualification notes]",
  "description": "[Updated with pain points and requirements]"
}
```

#### Step 6: Recommend Next Steps

**Based on Qualification Score:**

**If Score >= 80 (Hot Lead):**
```
RECOMMENDATION: QUALIFY TO OPPORTUNITY
════════════════════════════════════════════════════
This lead is well-qualified. Recommended actions:

1. Convert to Opportunity
   - Create opportunity with extracted BANT data
   - Set appropriate sales stage (Qualify or Develop)
   - Link to existing or new Account

2. Create Account (if new company)
   - Use companyname, industrycode, revenue, numberofemployees

3. Create Contact
   - Use lead's contact information
   - Set accountrolecode based on authority assessment

4. Schedule Next Activity
   - Book discovery call or demo
   - Invite decision maker if different from lead
```

**If Score 60-79 (Warm Lead):**
```
RECOMMENDATION: CONTINUE NURTURING
════════════════════════════════════════════════════
This lead has potential but gaps exist:

Gap Analysis:
- [List specific gaps, e.g., "Budget not confirmed"]
- [e.g., "Decision maker not identified"]

Recommended Actions:
1. Schedule follow-up call to address gaps
2. Send relevant content to build value
3. Request introduction to additional stakeholders

Create Task:
- Subject: "Follow-up: Address qualification gaps"
- Due: [appropriate date]
- Description: [specific gap to address]
```

**If Score 40-59 (Cold Lead):**
```
RECOMMENDATION: LONG-TERM NURTURE
════════════════════════════════════════════════════
This lead is not ready for active pursuit:

Issues:
- [List significant gaps]

Recommended Actions:
1. Add to nurture campaign
2. Set re-engagement reminder for [timeline]
3. Continue light-touch engagement

Update Lead:
- statuscode: 2 (Contacted)
- Set follow-up date in future
```

**If Score < 40 (Disqualify):**
```
RECOMMENDATION: DISQUALIFY
════════════════════════════════════════════════════
This lead does not meet qualification criteria:

Disqualification Reasons:
- [Specific reasons, e.g., "No budget and no timeline"]

Recommended Actions:
1. Mark lead as disqualified
2. Document reason for future reference
3. Consider referral if poor fit for us but good fit for partner

Update Lead:
- statecode: 2 (Disqualified)
- statuscode: 6 (No Longer Interested) or appropriate code
- qualificationcomments: "Disqualified: [reason]"
```

#### Step 7: Convert Lead (if qualified)

If user confirms conversion to opportunity:

**Create Account (if needed):**
```
Use create_record with tablename: account
{
  "name": "[companyname]",
  "telephone1": "[telephone1]",
  "emailaddress1": "[company email domain]",
  "industrycode": "[industrycode]",
  "numberofemployees": "[numberofemployees]",
  "revenue": "[revenue]",
  "address1_line1": "[address]",
  "address1_city": "[city]",
  "address1_stateorprovince": "[state]",
  "address1_postalcode": "[postal]"
}
```

**Create Contact:**
```
Use create_record with tablename: contact
{
  "firstname": "[firstname]",
  "lastname": "[lastname]",
  "jobtitle": "[jobtitle]",
  "emailaddress1": "[emailaddress1]",
  "telephone1": "[telephone1]",
  "mobilephone": "[mobilephone]",
  "accountid": "[new account id]",
  "accountrolecode": [1=Decision Maker, 2=Employee, 3=Influencer]
}
```

**Create Opportunity:**
```
Use create_record with tablename: opportunity
{
  "name": "[Deal name based on subject]",
  "customerid": "[account or contact id]",
  "estimatedvalue": "[estimatedamount from lead]",
  "estimatedclosedate": "[estimatedclosedate from lead]",
  "budgetstatus": "[budgetstatus]",
  "need": "[need]",
  "purchasetimeframe": "[purchasetimeframe]",
  "purchaseprocess": "[purchaseprocess]",
  "decisionmaker": "[decisionmaker]",
  "description": "[description from lead]",
  "currentsituation": "[current situation notes]",
  "customerneed": "[customer needs from discovery]",
  "originatingleadid": "[leadid]",
  "salesstage": 0 (Qualify)
}
```

**Update Lead Status:**
```
Use update_record with tablename: lead
{
  "statecode": 1 (Qualified),
  "statuscode": 3 (Qualified),
  "qualifyingopportunityid": "[new opportunity id]"
}
```

### Dataverse Tables Used
| Table | Purpose |
|-------|---------|
| `lead` | Primary entity being qualified |
| `account` | Created upon conversion |
| `contact` | Created upon conversion |
| `opportunity` | Created upon qualification |
| `activitypointer` | Review engagement history |
| `task` | Create follow-up tasks |
| `phonecall` | Log qualification calls |

### Key Fields Reference
**lead:**
- `leadqualitycode` (CHOICE) - Hot(1), Warm(2), Cold(3)
- `budgetstatus` (CHOICE) - No Committed Budget(0), May Buy(1), Can Buy(2), Will Buy(3)
- `budgetamount` (MONEY) - Confirmed budget amount
- `need` (CHOICE) - Must have(0), Should have(1), Good to have(2), No need(3)
- `purchasetimeframe` (CHOICE) - Immediate(0), This Quarter(1), Next Quarter(2), This Year(3), Unknown(4)
- `purchaseprocess` (CHOICE) - Individual(0), Committee(1), Unknown(2)
- `decisionmaker` (BIT) - Is this contact the decision maker
- `msdyn_leadscore` (INT) - AI predictive score (0-100)
- `msdyn_leadgrade` (CHOICE) - Grade A(0), B(1), C(2), D(3)
- `msdyn_leadscoretrend` (CHOICE) - Improving(0), Steady(1), Declining(2), Not enough info(3)
- `msdyn_scorereasons` (MULTILINE TEXT) - JSON with AI scoring factors
- `statecode` (STATE) - Open(0), Qualified(1), Disqualified(2)
- `statuscode` (STATUS) - New(1), Contacted(2) [Open]; Qualified(3) [Qualified]; Lost(4), Cannot Contact(5), No Longer Interested(6), Canceled(7) [Disqualified]
- `leadsourcecode` (CHOICE) - Advertisement(1), Employee Referral(2), External Referral(3), Partner(4), Public Relations(5), Seminar(6), Trade Show(7), Web(8), Word of Mouth(9), Other(10)

**opportunity (created on conversion):**
- `originatingleadid` (LOOKUP) - Links back to source lead
- `qualifyingopportunityid` (LOOKUP) - Set on lead when qualified
- `salesstage` (CHOICE) - Qualify(0), Develop(1), Propose(2), Close(3)

### Qualification Best Practices

1. **Always capture the "why":** Don't just check boxes, understand the context
2. **Listen for buying signals:** Urgency, specific requirements, stakeholder engagement
3. **Watch for red flags:** Unrealistic timelines, no budget, tire-kickers
4. **Document everything:** Future opportunities may come from disqualified leads
5. **Re-qualify over time:** Circumstances change, revisit cold leads periodically

## Examples

### Example 1: Qualify a New Lead

**User says:** "Help me qualify the lead from John Smith at Contoso"

**Actions:**
1. Retrieve lead record for John Smith at Contoso
2. Display current BANT status and qualification score
3. Identify gaps (e.g., budget unknown, timeline unclear)
4. Suggest discovery questions to fill gaps
5. Recommend next steps based on current score

**Result:**
```
LEAD QUALIFICATION WORKSHEET
Lead: John Smith at Contoso
Current Score: 55/100 (Warm)

GAPS IDENTIFIED:
- Budget: Unknown (ask about allocated budget)
- Authority: Unclear (confirm decision-making process)

RECOMMENDED QUESTIONS:
1. "Do you have budget allocated for this initiative?"
2. "Who else is involved in evaluating solutions?"

NEXT STEP: Schedule discovery call to complete qualification
```

### Example 2: Should I Convert This Lead?

**User says:** "Should I convert this lead to an opportunity?"

**Actions:**
1. Calculate BANT+ score from lead fields
2. Compare against qualification thresholds
3. Analyze engagement history
4. Provide recommendation with reasoning

**Result:**
```
QUALIFICATION ASSESSMENT: READY TO CONVERT ✅
Score: 82/100
- Budget: Will Buy ($75K confirmed)
- Authority: Decision maker confirmed
- Need: Must have (pain point documented)
- Timeline: This Quarter

RECOMMENDATION: Convert to opportunity. Strong qualification signals.
```

### Example 3: Disqualify a Cold Lead

**User says:** "This lead isn't going anywhere, should I disqualify?"

**Actions:**
1. Review lead history and engagement
2. Assess qualification gaps
3. Recommend disqualification with appropriate reason code
4. Suggest nurture actions if applicable

**Result:**
```
DISQUALIFICATION RECOMMENDED
Reason: No Longer Interested (statuscode: 6)
- No response to 5 outreach attempts over 60 days
- Last activity: Email bounced

ACTION: Add to marketing nurture campaign for re-engagement in 6 months
```

## Troubleshooting

### Error: Lead not found
**Cause:** Invalid lead ID or lead has been merged/deleted
**Solution:**
- Search by name and company instead of ID
- Check if lead was already qualified (statecode = 1)
- Verify lead exists in active records

### Error: Cannot convert lead - missing required fields
**Cause:** Account or contact creation requires populated fields
**Solution:**
- Ensure companyname is populated for account creation
- Verify email or phone exists for contact creation
- Prompt user to provide missing information

### Error: AI Lead Score not available
**Cause:** Sales Insights not enabled or insufficient data
**Solution:**
- Fall back to manual BANT scoring
- Check if msdyn_leadscore field exists in org
- Use leadqualitycode (Hot/Warm/Cold) as alternative