Analyzes successful product customers to identify patterns, then finds similar accounts that are good cross-sell candidates with fit scores and reasoning. Use when user asks "who should I pitch this product to", "find cross-sell opportunities", "which customers should buy Product X", "identify upsell targets", "product expansion candidates", or "who else would buy this".
npx skills add https://github.com/microsoft/dataverse-business-skills --skill cross-sell-target-identifier
When launching a new product or looking to expand product adoption, sales teams need to identify which existing customers are most likely to purchase. This skill analyzes the characteristics of successful customers for a given product, finds similar customers who don't own it yet, and provides prioritized recommendations with justification.
When user asks "Which customers should I pitch Product X to?":
SELECT productid, name, description, producttypecode, productstructure
FROM product
WHERE name LIKE '%[product name]%'
AND statecode = 0
2.1 Find Customers Who Own Product X
Query won opportunities that included the target product:
SELECT op.opportunityid, op.customerid, op.accountid, op.actualvalue,
op.actualclosedate, op.salesstage
FROM opportunity op
JOIN opportunityproduct opp ON op.opportunityid = opp.opportunityid
WHERE opp.productid = '[target_product_id]'
AND op.statecode = 1
Note: A product may appear in multiple opportunityproduct rows per opportunity. Deduplicate opportunityids programmatically after fetching results.
2.2 Build Success Profile from Winning Accounts
For each winning account, gather firmographic data:
SELECT accountid, name, industrycode, numberofemployees, revenue,
customertypecode, address1_stateorprovince, address1_country,
ownershipcode, createdon
FROM account
WHERE accountid IN ([list of winning account ids])
2.3 Analyze Success Patterns
Firmographic Analysis:
Calculate distribution across successful customers:
- Industry breakdown (industrycode): Which industries buy most?
- Company size (numberofemployees): What's the typical range?
- Revenue range: What's the typical revenue bracket?
- Geography (address1_stateorprovince/country): Regional concentrations?
- Customer type (customertypecode): Are they customers, partners, etc.?
Existing Product Ownership:
For each successful customer, identify other products owned:
SELECT a.accountid, a.name, p.name as product_name
FROM account a
JOIN opportunity o ON a.accountid = o.accountid
JOIN opportunityproduct op ON o.opportunityid = op.opportunityid
JOIN product p ON op.productid = p.productid
WHERE o.statecode = 1
AND a.accountid IN ([winning account ids])
Buying Pattern Analysis:
Identify patterns in successful deals:
- Average deal size for Product X
- Common bundled products
- Typical sales cycle length
- Time since becoming customer before purchasing Product X
Activity Pattern Analysis:
Review activities preceding successful deals:
- Types of engagement (calls, meetings, emails)
- Number of touchpoints before close
- Content/resources shared
Based on the analysis, create an Ideal Customer Profile:
IDEAL CUSTOMER PROFILE FOR [PRODUCT X]
════════════════════════════════════════════════════
FIRMOGRAPHIC CHARACTERISTICS:
- Industry: [Top 3 industries, e.g., "Financial Services (35%), Healthcare (28%), Technology (22%)"]
- Company Size: [Employee range, e.g., "100-500 employees (sweet spot)"]
- Revenue: [Revenue range, e.g., "$10M-$100M annual revenue"]
- Geography: [Regional patterns, e.g., "Primarily US, expanding to UK/EU"]
BEHAVIORAL INDICATORS:
- Already Owns: [Products commonly owned first, e.g., "80% have Product Y"]
- Customer Tenure: [Time as customer, e.g., "Typically 6-18 months as customer"]
- Recent Activity: [Engagement patterns, e.g., "High engagement with support/success"]
- Expansion Signals: [Growth indicators, e.g., "Recent hiring, new funding"]
BUYING PATTERNS:
- Average Deal Size: [$X]
- Typical Bundle: [Product X + Y + Z]
- Sales Cycle: [X days average]
- Common Champion: [Job title patterns]
SUCCESS INDICATORS FROM NOTES:
- Pain Points: [Common challenges mentioned]
- Use Cases: [How they use the product]
- Trigger Events: [What prompted purchase]
4.1 Find Non-Owners of Product X
Note: Dataverse SQL does not support subqueries. Run two separate queries and exclude owners programmatically.
First, get all accounts that already own Product X (from Step 2.1 results — collect their accountids into a list).
Then query all active accounts:
SELECT a.accountid, a.name, a.industrycode, a.numberofemployees, a.revenue,
a.customertypecode, a.address1_stateorprovince, a.createdon
FROM account a
WHERE a.statecode = 0
Filter out accounts whose accountid appears in the owner list programmatically after fetching.
4.2 Score Each Potential Target
For each non-owner account, calculate fit score:
Firmographic Fit (40%):
| Factor | Points | Scoring Logic |
|--------|--------|---------------|
| Industry Match | 0-15 | Exact match to top ICP industry = 15, Adjacent = 10, Other = 0 |
| Size Match | 0-15 | Within ICP range = 15, Close = 10, Outside = 5, Way off = 0 |
| Revenue Match | 0-10 | Within ICP range = 10, Close = 5, Outside = 0 |
Behavioral Fit (35%):
| Factor | Points | Scoring Logic |
|--------|--------|---------------|
| Owns Prerequisite Products | 0-15 | Has common prerequisite = 15, Related product = 10 |
| Customer Tenure | 0-10 | In ICP tenure range = 10, Close = 5 |
| Recent Engagement | 0-10 | High recent activity = 10, Moderate = 5, Low = 0 |
Buying Signals (25%):
| Factor | Points | Scoring Logic |
|--------|--------|---------------|
| Recent Purchases | 0-10 | Bought something in last 6 months = 10 |
| Expansion Behavior | 0-10 | Added users, upgraded = 10, Stable = 5 |
| Strategic Initiative Signals | 0-5 | Mentioned in notes/activities = 5 |
Important: Dataverse SQL Limitations
Dataverse SQL does NOT support: subqueries, DATEADD(), GETUTCDATE(), HAVING, DISTINCT, UNION, CASE statements, AVG on sentiment.
Calculate date filters programmatically before querying (e.g., '2025-09-01' for 6 months ago).
5.1 Recent Purchase Activity
SELECT a.accountid, a.name, o.opportunityid, o.name, o.actualclosedate, o.actualvalue
FROM account a
JOIN opportunity o ON a.accountid = o.accountid
WHERE o.statecode = 1
AND o.actualclosedate > '2025-09-01'
5.2 Expansion Indicators
Look for signals in activities and notes:
SELECT annotationid, objectid, subject, notetext, createdon
FROM annotation
WHERE objecttypecode = 'account'
AND createdon > '2025-09-01'
Keywords to Detect:
5.3 Recent Cases (Support Indicators)
Query cases per account, then aggregate programmatically:
SELECT incidentid, customerid, createdon, prioritycode, msdyn_casesentiment
FROM incident
WHERE createdon >= '[6_months_ago]'
Group and count by customerid programmatically after fetching results.
High case volume could indicate:
Output Format:
CROSS-SELL TARGETS FOR [PRODUCT X]
════════════════════════════════════════════════════
Analysis Date: [Date]
Methodology: Compared against [N] successful Product X customers
SUMMARY:
- Total Eligible Accounts: [N]
- High Fit (Score 80+): [N] accounts
- Medium Fit (Score 60-79): [N] accounts
- Low Fit (Score <60): [N] accounts
════════════════════════════════════════════════════
TOP 10 CROSS-SELL TARGETS
════════════════════════════════════════════════════
1. CONTOSO CORPORATION
Fit Score: 92/100
────────────────────────────────────────────────
WHY THEY'RE A FIT:
✓ Industry: Financial Services (top ICP industry)
✓ Size: 350 employees (in sweet spot 100-500)
✓ Already Owns: Product Y, Product Z (common prerequisite)
✓ Customer Since: 14 months (optimal tenure range)
✓ Recent Activity: 8 touchpoints in last 30 days
BUYING SIGNALS DETECTED:
• Mentioned "scaling operations" in recent meeting notes
• Purchased add-on licenses last month (expansion behavior)
• Attended Product X webinar 2 weeks ago
RECOMMENDED APPROACH:
• Lead with [specific value prop based on industry]
• Reference success story from [similar customer]
• Contact: [Primary contact name and role]
ESTIMATED DEAL SIZE: $45,000 (based on similar deals)
2. FABRIKAM INDUSTRIES
Fit Score: 87/100
────────────────────────────────────────────────
WHY THEY'RE A FIT:
✓ Industry: Manufacturing (adjacent to ICP)
✓ Size: 800 employees (slightly above sweet spot)
✓ Already Owns: Product Y
✓ High engagement with Customer Success
BUYING SIGNALS DETECTED:
• New CTO joined 3 months ago (leadership change)
• Mentioned "digital transformation" in discovery call
POTENTIAL CONCERNS:
⚠ Above typical company size - may need enterprise approach
⚠ No activity with Sales in last 60 days
RECOMMENDED APPROACH:
• Re-engage through Customer Success warm intro
• Position as part of transformation initiative
• Consider executive sponsor engagement
[Continue for top 10...]
Generate Follow-up Tasks:
For each top target, offer to create:
Use create_record with tablename: task
{
"subject": "Cross-sell outreach: [Product X] to [Account Name]",
"description": "Target identified as high fit for [Product X].\n\nFit Score: [X]/100\n\nKey talking points:\n- [Point 1]\n- [Point 2]\n\nContact: [Recommended contact]",
"regardingobjectid": "[accountid]",
"scheduledend": "[appropriate date]",
"prioritycode": [based on fit score]
}
Update Account with Cross-Sell Flag:
Consider adding notes to account:
Use create_record with tablename: annotation
{
"subject": "Cross-sell opportunity identified: [Product X]",
"notetext": "[Summary of why they're a fit and recommended approach]",
"objectid": "[accountid]",
"objecttypecode": "account"
}
| Table | Purpose |
|-------|---------|
| product | Identify target product |
| opportunity | Find won deals with target product |
| opportunityproduct | Link opportunities to products |
| account | Customer firmographic data |
| contact | Stakeholder information |
| activitypointer | Engagement history |
| annotation | Notes containing buying signals |
| incident | Support case patterns |
| task | Create follow-up tasks |
product:
productid (GUID) - Unique identifiername (NVARCHAR) - Product nameproductnumber (NVARCHAR) - SKU/product numberproducttypecode (CHOICE) - Sales Inventory(1), Misc Charges(2), Services(3), Flat Fees(4)productstructure (CHOICE) - Product(1), Family(2), Bundle(3)statecode (STATE) - Active(0), Retired(1), Draft(2), Under Revision(3)opportunity:
accountid (LOOKUP → account) - Related accountstatecode (STATE) - Open(0), Won(1), Lost(2)statuscode (STATUS) - In Progress(1), On Hold(2) [Open]; Won(3) [Won]; Canceled(4), Out-Sold(5) [Lost]actualvalue (MONEY) - Won deal valueactualclosedate (DATE) - When deal closedoriginatingleadid (LOOKUP → lead) - Source leadopportunityproduct:
opportunityid (LOOKUP → opportunity) - Parent opportunityproductid (LOOKUP → product) - Product in the dealquantity (DECIMAL) - Units soldpriceperunit (MONEY) - Unit priceextendedamount (MONEY) - Line total (calculated)manualdiscountamount (MONEY) - Line discountaccount:
industrycode (CHOICE) - Accounting(1), Agriculture(2), Broadcasting(3), Brokers(4), Building Supply(5), Business Services(6), Consulting(7), Consumer Services(8), etc.numberofemployees (INT) - Company sizerevenue (MONEY) - Annual revenuecustomertypecode (CHOICE) - Customer classificationopenrevenue (MONEY) - Total open pipeline value *(rollup field; availability depends on org configuration — query opportunity table directly if not present)*opendeals (INT) - Number of open opportunities *(rollup field; availability depends on org configuration)*User says: "Who should I pitch our new Analytics Pro product to?"
Actions:
Result:
IDEAL CUSTOMER PROFILE FOR ANALYTICS PRO:
- Industry: Financial Services (45%), Healthcare (30%)
- Size: 200-1000 employees
- Already owns: Platform Basic (80% correlation)
TOP 10 CROSS-SELL TARGETS:
1. Northwind Bank (92% fit) - Financial Services, 450 employees, owns Platform Basic
2. Alpine Health (87% fit) - Healthcare, 800 employees, recent support engagement
User says: "Which customers should upgrade to Enterprise tier?"
Actions:
Result:
UPGRADE CANDIDATES (Standard → Enterprise):
1. Contoso Ltd - Growing usage, added 50 users last quarter
2. Fabrikam Inc - Multiple support cases about feature limits
3. Tailspin Toys - Recent funding, headcount doubling
User says: "Who bought Product A but not Product B?"
Actions:
Result:
PRODUCT A CUSTOMERS WITHOUT PRODUCT B:
- 23 accounts identified
- Average fit score: 78%
- Top 5 recommendations with outreach scripts provided
Cause: Product name doesn't match exactly or product is inactive
Solution:
Cause: New product with no sales history yet
Solution:
Cause: Winning customers too diverse for clear pattern
Solution:
Integration with protocols.io API for managing scientific protocols. This skill should be used when working with protocols.io to search, create, update, or publish protocols; manage protocol steps and materials; handle discussions and comments; organize workspaces; upload and manage files; or integrate protocols.io functionality into workflows. Applicable for protocol discovery, collaborative protocol development, experiment tracking, lab protocol management, and scientific documentation.
Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances
Generate Excalidraw diagrams from natural language descriptions. Use when asked to "create a diagram", "make a flowchart", "visualize a process", "draw a system architecture", "create a mind map", or "generate an Excalidraw file". Supports flowcharts, relationship diagrams, mind maps, and system architecture diagrams. Outputs .excalidraw JSON files that can be opened directly in Excalidraw.
Build and distribute Expo development clients locally or via TestFlight
Use when you have a written implementation plan to execute in a separate session with review checkpoints
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data format skill—for analysis workflows use scanpy; for probabilistic models use scvi-tools; for population-scale queries use cellxgene-census.
Benchling R&D platform integration. Access registry (DNA, proteins), inventory, ELN entries, workflows via API, build Benchling Apps, query Data Warehouse, for lab data management automation.
Comprehensive molecular biology toolkit. Use for sequence manipulation, file parsing (FASTA/GenBank/PDB), phylogenetics, and programmatic NCBI/PubMed access (Bio.Entrez). Best for batch processing, custom bioinformatics pipelines, BLAST automation. For quick lookups use gget; for multi-service integration use bioservices.
Take microsoft/cross-sell-target-identifier 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.