Cross Sell Target Identifier logo

Cross Sell Target Identifier

Organization
microsoft
cross-sell-target-identifier

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".

Overview

Publishermicrosoft
Repositorydataverse-business-skills
Skill namecross-sell-target-identifier
Stars
52
Forks
9
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by microsoft on GitHub. Read the source before you install it.

Installation

Install the Cross Sell Target Identifier AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/microsoft/dataverse-business-skills/tree/main/skills/cross-sell-target-identifier
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/microsoft/dataverse-business-skills.git /tmp/dataverse-business-skills
mkdir -p .claude/skills
cp -r /tmp/dataverse-business-skills/skills/cross-sell-target-identifier .claude/skills/cross-sell-target-identifier
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Cross Sell Target Identifier in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Cross Sell Target Identifier on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Cross Sell Target Identifier is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

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.

Instructions

Step 1: Identify the Target Product

When user asks "Which customers should I pitch Product X to?":

  1. Identify the Product:
SELECT productid, name, description, producttypecode, productstructure
FROM product
WHERE name LIKE '%[product name]%'
AND statecode = 0
  1. Confirm with user if multiple matches
Step 2: Analyze Successful Product X Customers

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
Step 3: Generate Ideal Customer Profile (ICP)

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]
Step 4: Query Customer Base for Matches

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%):

FactorPointsScoring Logic
Industry Match0-15Exact match to top ICP industry = 15, Adjacent = 10, Other = 0
Size Match0-15Within ICP range = 15, Close = 10, Outside = 5, Way off = 0
Revenue Match0-10Within ICP range = 10, Close = 5, Outside = 0

Behavioral Fit (35%):

FactorPointsScoring Logic
Owns Prerequisite Products0-15Has common prerequisite = 15, Related product = 10
Customer Tenure0-10In ICP tenure range = 10, Close = 5
Recent Engagement0-10High recent activity = 10, Moderate = 5, Low = 0

Buying Signals (25%):

FactorPointsScoring Logic
Recent Purchases0-10Bought something in last 6 months = 10
Expansion Behavior0-10Added users, upgraded = 10, Stable = 5
Strategic Initiative Signals0-5Mentioned in notes/activities = 5
Step 5: Analyze Buying Signals

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:

  • Expansion: "growing", "scaling", "expanding", "new offices", "hiring"
  • Strategic: "initiative", "project", "transformation", "migration"
  • Pain: "struggling", "challenge", "problem", "need"
  • Competition: "evaluating", "considering", "looking at"

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:

  • Active usage (good for expansion)
  • Frustration (may need resolution first)
  • Product limitations (potential for upsell to better solution)
Step 6: Rank and Present Target Accounts

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...]
Step 7: Create Action Items

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"
}

Dataverse Tables Used

TablePurpose
productIdentify target product
opportunityFind won deals with target product
opportunityproductLink opportunities to products
accountCustomer firmographic data
contactStakeholder information
activitypointerEngagement history
annotationNotes containing buying signals
incidentSupport case patterns
taskCreate follow-up tasks

Key Fields Reference

product:

  • productid (GUID) - Unique identifier
  • name (NVARCHAR) - Product name
  • productnumber (NVARCHAR) - SKU/product number
  • producttypecode (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 account
  • statecode (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 value
  • actualclosedate (DATE) - When deal closed
  • originatingleadid (LOOKUP → lead) - Source lead

opportunityproduct:

  • opportunityid (LOOKUP → opportunity) - Parent opportunity
  • productid (LOOKUP → product) - Product in the deal
  • quantity (DECIMAL) - Units sold
  • priceperunit (MONEY) - Unit price
  • extendedamount (MONEY) - Line total (calculated)
  • manualdiscountamount (MONEY) - Line discount

account:

  • 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 size
  • revenue (MONEY) - Annual revenue
  • customertypecode (CHOICE) - Customer classification
  • openrevenue (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)

Cross-Sell Best Practices

  1. Start with success: Always analyze existing successful customers first
  2. Multi-factor matching: Don't rely on single criteria for fit
  3. Watch for timing: Recent purchases indicate budget availability
  4. Leverage relationships: Warm introductions beat cold outreach
  5. Segment recommendations: Different approaches for different segments
  6. Track results: Monitor conversion rates to refine the model

Examples

Example 1: Find Cross-Sell Targets for New Product

User says: "Who should I pitch our new Analytics Pro product to?"

Actions:

  1. Search product table for "Analytics Pro"
  2. Find accounts that have purchased Analytics Pro
  3. Build ideal customer profile from successful accounts
  4. Query non-owners matching the profile
  5. Rank by fit score and provide recommendations

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

Example 2: Upsell Existing Customers

User says: "Which customers should upgrade to Enterprise tier?"

Actions:

  1. Identify customers on lower tiers
  2. Analyze Enterprise customers for common traits
  3. Find Standard tier customers matching Enterprise profile
  4. Factor in engagement and growth signals

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

Example 3: Product Bundle Opportunity

User says: "Who bought Product A but not Product B?"

Actions:

  1. Find accounts with Product A in won opportunities
  2. Exclude accounts with Product B in won opportunities
  3. Rank by recency and relationship strength

Result:

PRODUCT A CUSTOMERS WITHOUT PRODUCT B:
- 23 accounts identified
- Average fit score: 78%
- Top 5 recommendations with outreach scripts provided

Troubleshooting

Error: Product not found

Cause: Product name doesn't match exactly or product is inactive Solution:

  • Search with partial name match (LIKE '%name%')
  • Check statecode to include active products only
  • List available products for user to select

Error: No customers found for target product

Cause: New product with no sales history yet Solution:

  • Use similar product's customer base as proxy
  • Define ideal customer profile manually
  • Start with industry/size matching only

Error: Too few differentiation signals

Cause: Winning customers too diverse for clear pattern Solution:

  • Increase sample size (longer date range)
  • Focus on top-performing accounts only
  • Add firmographic filters (industry, size)

Frequently asked questions

What does the Cross Sell Target Identifier AI skill do?

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".

Why use Cross Sell Target Identifier on TypingMind?

Because you install it once and use it with any model. Cross Sell Target Identifier is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Cross Sell Target Identifier in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/microsoft/dataverse-business-skills/tree/main/skills/cross-sell-target-identifier. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Cross Sell Target Identifier?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Cross Sell Target Identifier?

As many as you like. As long as a model supports skills, you can use Cross Sell Target Identifier with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Cross Sell Target Identifier AI skill free?

Yes. It is published on GitHub by microsoft under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇