microsoft/lead-qualification-playbook
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".
npx skills add https://github.com/microsoft/dataverse-business-skills --skill 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.
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
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 |
3.1 Budget Qualification
Current Status: budgetstatus field value
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
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):
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
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:
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 |
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:
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]"
}
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]"
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]"
}
| 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 |
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 amountneed (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 makermsdyn_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 factorsstatecode (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 leadqualifyingopportunityid (LOOKUP) - Set on lead when qualifiedsalesstage (CHOICE) - Qualify(0), Develop(1), Propose(2), Close(3)User says: "Help me qualify the lead from John Smith at Contoso"
Actions:
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
User says: "Should I convert this lead to an opportunity?"
Actions:
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.
User says: "This lead isn't going anywhere, should I disqualify?"
Actions:
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
Cause: Invalid lead ID or lead has been merged/deleted
Solution:
Cause: Account or contact creation requires populated fields
Solution:
Cause: Sales Insights not enabled or insufficient data
Solution:
Take microsoft/lead-qualification-playbook from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.