microsoft/account-briefing-generator
Generates meeting briefings by aggregating account info, contacts, opportunities, cases, and activity history into structured prep documents with talking points and discovery questions. Use when user says "prep me for my call", "brief me on this account", "meeting prep", "I have a meeting with [company]", "account briefing", "customer briefing", or "prepare for customer meeting".
npx skills add https://github.com/microsoft/dataverse-business-skills --skill account-briefing-generator
Sales reps often have meetings scheduled with little prep time. This skill rapidly synthesizes all available Dataverse information about an account into a concise, actionable meeting brief. In Quick Prep mode, it identifies the specific meeting and attendees and generates a targeted agenda with BANT-gap discovery questions. In Full Briefing mode, it delivers a comprehensive account view with relationship health scoring, stakeholder mapping, and deal history.
| Trigger | Mode | Focus |
|---------|------|-------|
| "Prep me for my call with Fabrikam at 2pm" | Quick Prep | Specific meeting — attendees, agenda, BANT gaps, discovery questions |
| "I have a meeting with Contoso in 30 minutes" | Quick Prep | Specific meeting — fast, scannable, action-oriented |
| "Brief me on Contoso" | Full Briefing | Full account — health score, stakeholder map, LTV, strategic context |
| "Give me a full briefing on Fabrikam" | Full Briefing | Full account — all sections |
If a specific appointment is identified, always include the Quick Prep section. Full Briefing sections are added when time permits or explicitly requested.
1.1 Find the Account:
SELECT accountid, name, telephone1, emailaddress1, websiteurl,
address1_line1, address1_city, address1_stateorprovince, address1_postalcode,
industrycode, numberofemployees, revenue, ownershipcode,
description, createdon, primarycontactid, ownerid
FROM account
WHERE name LIKE '%[account_name]%'
AND statecode = 0
Confirm account with user if multiple matches.
1.2 Find Upcoming Appointment (Quick Prep mode or if available):
SELECT appointmentid, subject, scheduledstart, scheduledend,
location, description, regardingobjectid, regardingobjecttypecode, ownerid
FROM appointment
WHERE statecode = 0
AND scheduledstart >= '[today]'
ORDER BY scheduledstart ASC
Filter results where scheduledstart is within the next 7 days and regardingobjectid matches the account or a related opportunity. Present to user if multiple matches.
1.3 Get Meeting Attendees via Activity Party:
If an appointment is found, retrieve attendees from the activityparty table:
SELECT partyid, participationtypemask, addressused
FROM activityparty
WHERE activityid = '[appointmentid]'
Participation type codes:
For each external partyid (contact or lead), fetch details:
SELECT contactid, fullname, jobtitle, emailaddress1, telephone1,
accountrolecode, msdyn_decisioninfluencetag, description
FROM contact
WHERE contactid = '[partyid]'
2.1 Get All Contacts:
SELECT contactid, fullname, firstname, lastname, jobtitle,
emailaddress1, telephone1, mobilephone,
accountrolecode, msdyn_decisioninfluencetag, description
FROM contact
WHERE accountid = '[accountid]'
AND statecode = 0
ORDER BY accountrolecode
2.2 Map Contact Roles:
Classify contacts by buying role based on jobtitle and role fields:
Use msdyn_decisioninfluencetag where available:
2.3 Get Recent Activities (last 90 days):
Calculate cutoff date programmatically: [90_days_ago] = today minus 90 days.
SELECT activityid, activitytypecode, subject, description,
createdon, actualend, ownerid, statecode
FROM activitypointer
WHERE regardingobjectid = '[accountid]'
AND createdon >= '[90_days_ago]'
ORDER BY createdon DESC
2.4 Analyze Activity Patterns:
3.1 Get Open Opportunities:
SELECT opportunityid, name, estimatedvalue, estimatedclosedate,
salesstage, stepname, closeprobability,
budgetstatus, need, purchasetimeframe, decisionmaker, purchaseprocess,
description, currentsituation, customerneed, customerpainpoints,
msdyn_forecastcategory, msdyn_opportunityscore, createdon
FROM opportunity
WHERE accountid = '[accountid]'
AND statecode = 0
ORDER BY estimatedvalue DESC
3.2 Get Opportunity History:
SELECT opportunityid, name, estimatedvalue, actualclosedate, statecode
FROM opportunity
WHERE accountid = '[accountid]'
AND statecode IN (1, 2)
ORDER BY actualclosedate DESC
3.3 Get Products Owned (from won opportunities):
SELECT p.name as product, op.quantity, op.extendedamount, o.name as opportunity,
o.actualclosedate
FROM opportunityproduct op
JOIN opportunity o ON op.opportunityid = o.opportunityid
JOIN product p ON op.productid = p.productid
WHERE o.accountid = '[accountid]'
AND o.statecode = 1
ORDER BY o.actualclosedate DESC
3.4 BANT Gap Analysis (for primary open opportunity):
For the highest-value or most recently active open opportunity, assess qualification status:
| Signal | Field | Weak | Moderate | Strong |
|--------|-------|------|----------|--------|
| Budget | budgetstatus | 0 (No Budget) | 1 (May Buy) | 2–3 (Can/Will Buy) |
| Authority | decisionmaker | NULL / false | — | true |
| Need | need | 3 (No need) | 2 (Good to have) | 0–1 (Must/Should have) |
| Timeline | purchasetimeframe | 4 (Unknown) | 2–3 (This/Next Year) | 0–1 (Immediate/This Qtr) |
| Process | purchaseprocess | 2 (Unknown) | 1 (Committee) | 0 (Individual) |
Identify all weak/unknown signals — these drive the discovery questions in Step 6.
4.1 Get Recent Cases:
Calculate cutoff: [90_days_ago] = today minus 90 days.
SELECT incidentid, title, ticketnumber, createdon, prioritycode,
statecode, statuscode, caseorigincode, casetypecode,
description, customersatisfactioncode, msdyn_casesentiment
FROM incident
WHERE accountid = '[accountid]'
AND createdon >= '[90_days_ago]'
ORDER BY createdon DESC
4.2 Analyze Support Patterns:
5.1 Engagement Metrics:
5.2 Relationship Health Score:
| Factor | Weight | Scoring |
|--------|--------|---------|
| Recent engagement | 25% | Active <14 days = High; 14–45 days = Medium; >45 days = Low |
| Open opportunities | 20% | Active open deal = High; No open deals = Low |
| Support sentiment | 20% | No open cases = High; Open normal = Medium; Escalated = Low |
| Stakeholder coverage | 20% | 3+ contacts engaged = High; 1–2 = Medium; 0 = Low |
| Revenue trajectory | 15% | Growing = High; Stable = Medium; Declining = Low |
Score interpretation: High factors = Healthy | Mix = At Risk | Mostly Low = Critical
6.1 Recommended Meeting Agenda (Quick Prep mode — when appointment found):
Based on opportunity stage and open items, generate a 3–5 point agenda:
6.2 Discovery Questions by BANT Gap:
Generate targeted questions only for weak/unknown signals identified in Step 3.4:
*Budget gaps (budgetstatus = 0 or 1):*
*Authority gaps (decisionmaker = false/null):*
*Need gaps (need = 2 or 3):*
*Timeline gaps (purchasetimeframe = 3 or 4):*
*Process gaps (purchaseprocess = 2):*
6.3 Positive Talking Points:
6.4 Issues to Address Proactively:
6.5 Contingency Responses:
Quick Prep Output (when specific appointment identified):
════════════════════════════════════════════════════════════════
QUICK PREP: [ACCOUNT NAME]
════════════════════════════════════════════════════════════════
Generated: [Date/Time]
Meeting: [Meeting subject]
Scheduled: [Time] | [Location/Teams link]
Attendees: [Name, Title] | [Name, Title]
📊 ACCOUNT SNAPSHOT
────────────────────────────────────────────────────────────────
[Industry] | [n] employees | Customer since [year] | LTV: $[value]
💼 ACTIVE DEAL
────────────────────────────────────────────────────────────────
[Deal Name] — $[Value] | [Stage] | Close: [Date]
BANT: Budget [✓/⚠️] | Authority [✓/⚠️] | Need [✓/⚠️] | Timeline [✓/⚠️]
📋 OPEN ITEMS
────────────────────────────────────────────────────────────────
⚠️ [Overdue task or commitment — due date]
🎫 [Open support case — priority and age]
📅 SUGGESTED AGENDA
────────────────────────────────────────────────────────────────
1. [Agenda point 1]
2. [Agenda point 2]
3. [Agenda point 3]
4. [Discovery: BANT gap]
5. Next steps and decision timeline
❓ DISCOVERY QUESTIONS
────────────────────────────────────────────────────────────────
• [Question targeting identified BANT gap]
• [Question targeting identified BANT gap]
• [Question targeting identified BANT gap]
⚠️ WATCH OUTS
────────────────────────────────────────────────────────────────
• [Risk 1]
• [Risk 2]
════════════════════════════════════════════════════════════════
Full Briefing Output (when account-level view requested):
════════════════════════════════════════════════════════════════
MEETING BRIEF: [ACCOUNT NAME]
════════════════════════════════════════════════════════════════
Generated: [Date/Time]
Meeting: [Meeting subject if found]
Scheduled: [Meeting time if found]
Attendees: [Expected attendees if found]
════════════════════════════════════════════════════════════════
📊 COMPANY SNAPSHOT
════════════════════════════════════════════════════════════════
Company: [Account Name]
Industry: [Industry]
Size: [n] employees | Revenue: $[n]M
Location: [City, State]
Relationship Status: [PROSPECT / ACTIVE CUSTOMER / AT RISK]
Customer Since: [Date] ([n] years)
Account Owner: [Rep Name]
Total Lifetime Value: $[sum of won opportunities]
════════════════════════════════════════════════════════════════
👥 KEY STAKEHOLDERS
════════════════════════════════════════════════════════════════
[For each contact — name, title, role classification, last contact date, notes]
STAKEHOLDER MAP:
┌─────────────────────────────────────────────────────┐
│ [Economic Buyer] │
│ │ │
│ ├── [Champion] ← CHAMPION ✓ │
│ │ │ │
│ │ └── [Technical Buyer] ✓ │
│ │ │
│ └── [Blocker/Gap] ← Needs engagement ⚠️ │
└─────────────────────────────────────────────────────┘
════════════════════════════════════════════════════════════════
💼 CURRENT OPPORTUNITIES
════════════════════════════════════════════════════════════════
[For each open opportunity — value, stage, close date, BANT status, next steps, risks]
BANT STATUS:
• Budget: [✓ Confirmed / ⚠️ Unknown / ✗ No Budget]
• Authority: [✓ Decision maker confirmed / ⚠️ Not identified]
• Need: [✓ Strong / ⚠️ Moderate / ✗ Weak]
• Timeline: [✓ This quarter / ⚠️ This year / ✗ Unknown]
DEAL HISTORY (Won):
[List of won deals with value and date]
TOTAL WON: $[value] | EXPANSION POTENTIAL: [High/Medium/Low]
════════════════════════════════════════════════════════════════
📞 RECENT ACTIVITY SUMMARY
════════════════════════════════════════════════════════════════
LAST 90 DAYS: [n] activities | [n] calls | [n] meetings | [n] emails
Trend: [Stable / Increasing / Declining]
RECENT HIGHLIGHTS:
[Date] [Type] with [Contact] — [Subject] — [Outcome]
...
ENGAGEMENT GAPS:
⚠️ [Contact name]: Last contact [n] days ago — [context]
════════════════════════════════════════════════════════════════
🎫 SUPPORT CASE STATUS
════════════════════════════════════════════════════════════════
OPEN CASES: [n]
[Case title | Priority | Age | Status | Summary]
RECENT CLOSED (90 days): [n] | Avg satisfaction: [score]/5
════════════════════════════════════════════════════════════════
🎯 MEETING PREPARATION
════════════════════════════════════════════════════════════════
SUGGESTED AGENDA:
1–5 [Agenda points based on open items and opportunity stage]
DISCOVERY QUESTIONS (by BANT gap):
[Questions targeting only identified weak signals]
POSITIVE TALKING POINTS:
✅ [Value reinforcement, ROI, recent wins]
ISSUES TO ADDRESS:
⚠️ [Support cases, overdue commitments, competitive mentions]
CONTINGENCY RESPONSES:
[Specific responses for anticipated difficult topics]
════════════════════════════════════════════════════════════════
📋 PRE-MEETING ACTION ITEMS
════════════════════════════════════════════════════════════════
□ [Action 1 — e.g., check open case status before meeting]
□ [Action 2 — e.g., prepare ROI summary]
□ [Action 3 — e.g., re-send security docs]
════════════════════════════════════════════════════════════════
📚 QUICK REFERENCE
════════════════════════════════════════════════════════════════
Key Numbers: LTV $[n] | Current Deal $[n] | Employees [n] | Customer [n] yrs
Key Dates: Deal close [date] | Contract renewal [date] | Last purchase [date]
Key Relationships: Champion [name] | Technical [name] | Gap [name]
Products Owned: [list]
════════════════════════════════════════════════════════════════
After delivering the brief, offer to create a follow-up task:
Use create_record with tablename: task
- subject: "Post-meeting: Log notes and next steps for [Account]"
- description: "Meeting with [Contact] on [Date]. Capture: key discussion points, decisions made, action items, next steps."
- regardingobjectid: [accountid or opportunityid]
- scheduledend: [meeting end time + 30 minutes]
- prioritycode: 2
User Input (Quick Prep):
"Prep me for my call with Fabrikam tomorrow at 2pm."
Skill Output:
════════════════════════════════════════════════════════════════
QUICK PREP: FABRIKAM
════════════════════════════════════════════════════════════════
Meeting: QBR — Cloud Migration
Tomorrow, 2:00–3:00 PM | Teams (link in calendar)
Attendees: Emily Torres (VP Operations) | James Liu (IT Director — new)
📊 ACCOUNT SNAPSHOT
Manufacturing | 1,200 employees | Customer since 2022 | LTV: $275,000
💼 ACTIVE DEAL
Fabrikam Cloud Migration — $85,000 | Propose | Close: Mar 31
BANT: Budget ⚠️ | Authority ⚠️ | Need ✓ | Timeline ✓
📋 OPEN ITEMS
⚠️ Overdue task: "Send updated SOW to Emily" — was due 5 days ago
🎫 Open case: Priority 2 — "API integration timeout errors" (12 days open)
📅 SUGGESTED AGENDA
1. Acknowledge API case — share resolution status
2. Present updated SOW (resolve overdue commitment)
3. Confirm budget approval process (budget gap)
4. Understand James Liu's role in the decision (authority gap)
5. Agree on next steps and decision timeline by Mar 31
❓ DISCOVERY QUESTIONS
• "Has budget been formally allocated for the cloud migration this quarter?"
• "James — what's your involvement in evaluating this solution?"
• "What needs to happen on your end to make a decision by March 31?"
⚠️ WATCH OUTS
• 🔴 Competitor mentioned in notes — be ready with differentiation narrative
• 🟡 Open support case — coordinate with support before call; acknowledge it first
════════════════════════════════════════════════════════════════
User Input (Full Briefing):
"Give me a full briefing on Contoso."
*(Full Briefing output — all sections as shown in the Full Briefing template above.)*
| Table | Purpose |
|-------|---------|
| account | Primary account information |
| contact | Stakeholder details and role mapping |
| opportunity | Current and historical deals, BANT fields |
| opportunityproduct | Products in deals |
| activitypointer | Activity history |
| appointment | Meeting context and scheduling |
| activityparty | Meeting attendees (required/optional) |
| phonecall | Call history |
| email | Email history |
| incident | Support case status |
| annotation | Notes and additional context |
| task | Create post-meeting tasks |
| product | Product names |
account:
industrycode (CHOICE) - Industry classificationnumberofemployees (INT) - Company sizerevenue (MONEY) - Annual revenueprimarycontactid (LOOKUP → contact) - Main contactwebsiteurl (URL) - Company websitestatecode (STATE) - Active(0), Inactive(1)contact:
fullname (NVARCHAR) - Contact namejobtitle (NVARCHAR) - Title for role mappingemailaddress1 (EMAIL) - Primary emailtelephone1, mobilephone (PHONE) - Phone numbersaccountrolecode (CHOICE) - Decision Maker(1), Employee(2), Influencer(3)msdyn_decisioninfluencetag (CHOICE) - Decision maker(0), Influencer(1), Blocker(2), Unknown(3)opportunity:
salesstage (CHOICE) - Qualify(0), Develop(1), Propose(2), Close(3)estimatedvalue (MONEY) - Deal valuecloseprobability (INT) - Win probability (0-100)budgetstatus (CHOICE) - No Committed Budget(0), May Buy(1), Can Buy(2), Will Buy(3)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) - Decision maker confirmed (true/false)msdyn_forecastcategory (CHOICE) - Pipeline(100000001), Best case(100000002), Committed(100000003), Omitted(100000004)customerpainpoints (MULTILINE TEXT) - Customer pain pointscurrentsituation (MULTILINE TEXT) - Current situation notesactivityparty:
activityid (LOOKUP) - Links to appointmentpartyid (LOOKUP) - Contact, lead, or systemuserparticipationtypemask (CHOICE) - Organizer(1), To/Required(2), Owner(5), Customer(9)incident:
statecode (STATE) - Active(0), Resolved(1), Cancelled(2)prioritycode (CHOICE) - High(1), Normal(2), Low(3)customersatisfactioncode (CHOICE) - Very Dissatisfied(1), Dissatisfied(2), Neutral(3), Satisfied(4), Very Satisfied(5)User says: "I have a meeting with Contoso in 30 minutes"
Actions:
Result:
QUICK PREP: Contoso - Call at 2:00pm
ATTENDEES:
- John Smith (CFO) - Economic Buyer, first meeting
- Mary Johnson (VP Ops) - Champion, met 3x before
OPEN DEAL: Enterprise Platform - $150K - Propose Stage
BANT Gaps: Timeline not confirmed, procurement not engaged
DISCOVERY QUESTIONS:
1. "What's your target go-live date?"
2. "When should we loop in procurement?"
CAUTION: 1 open support case (P2) - be prepared to address
OBJECTIVE: Confirm timeline, get procurement intro
User says: "Give me a full briefing on Fabrikam"
Actions:
Result:
ACCOUNT BRIEFING: FABRIKAM INC
OVERVIEW:
Industry: Manufacturing | Employees: 2,500 | Revenue: $500M
Customer Since: 2022 | Lifetime Value: $450K
RELATIONSHIP HEALTH: Good (78/100)
- Engagement Trend: Stable
- Last Contact: 3 days ago
STAKEHOLDER MAP:
- Tom CEO → Executive Sponsor (met 2x)
- Lisa VP IT → Technical Buyer (highly engaged)
- Mark Procurement → Gatekeeper (not yet engaged)
OPEN OPPORTUNITIES:
1. Analytics Expansion - $80K - Develop Stage
HISTORICAL WINS:
- Platform License (2022) - $200K
- Integration Services (2023) - $170K
OPEN CASES: None
STRATEGIC NOTES:
- Mentioned expansion to Europe in last QBR
- Budget cycle is Q4
User says: "Prep me for my call with the Alpine Ski House team at 10am tomorrow"
Actions:
Result:
MEETING PREP: Alpine Ski House - Demo Call
Tomorrow 10:00am | Teams Meeting
ATTENDEES & CONTEXT:
- Sarah Chen (IT Director) - Technical evaluator, driving this initiative
- James Wilson (CFO) - First time joining, likely budget discussion
MEETING OBJECTIVE: Demo + Budget Alignment
TALKING POINTS FOR CFO:
- ROI from similar implementations (include case study)
- Implementation timeline and resource requirements
- Pricing and payment terms
PREP: Have pricing sheet ready, expect budget questions
Cause: Name doesn't match exactly or account is inactive
Solution:
Cause: Meeting not in Dynamics or linked to different record
Solution:
Cause: External attendees not in system or activityparty not populated
Solution:
Take microsoft/account-briefing-generator 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.