OpportunityIQ MVP Scanner
Identifies revenue opportunities by matching clients against pre-defined scenarios and calculating potential revenue.
When to Use This Skill
Use when the user asks to:
- •"Scan my clients for opportunities"
- •"Find revenue opportunities in my book"
- •"Run OpportunityIQ on my client data"
- •"Identify sales opportunities"
- •"Generate my weekly opportunity report"
Inputs Required
- •
Client Data: Google Sheets link with tabs:
- •
Client_Master: Client demographics, portfolio totals, cash balances - •
Products: FIAs, life insurance, annuities with details - •
Holdings: Investment positions for concentration analysis
- •
- •
Scenario Selection (defaults to MVP scenarios):
- •FIA Surrender Ending
- •Cash Drag Opportunity
- •Concentrated Position
Reference Materials
For detailed guidance on specific topics, consult these reference files:
- •Data Structure: See data_structure_guide.md for comprehensive guide on handling multi-source data with client identifiers
- •Classifications: See expanded_classifications.md for 15+ classification categories with detailed explanations
- •Implementation: See implementation_guide.md for step-by-step deployment roadmap
- •Product Reference: See product_reference_system.md for maintaining product/carrier reference tables
- •Decision Guide: See decision_guide.md for choosing between different approaches
- •Starter Scenarios: See starter_scenarios.md for 12 fully-completed scenario examples
Templates
Use these templates for creating new scenarios:
- •Excel Template: scenario_template.xlsx - Excel workbook with Scenario Library, Classification Reference, and Example Scenarios
- •Markdown Template: scenario_template.md - Markdown version optimized for LLM processing
Process Workflow
Step 1: Load & Validate Data
# Load Google Sheets data
client_master = load_sheet(url, 'Client_Master')
products = load_sheet(url, 'Products')
holdings = load_sheet(url, 'Holdings')
# Validate required columns exist
required_columns = {
'Client_Master': ['Client_ID', 'Client_Name', 'Total_Portfolio', 'Cash_Balance', 'Cash_Yield'],
'Products': ['Client_ID', 'Product_Type', 'Current_Value', 'Surrender_End_Date', 'Cap_Rate'],
'Holdings': ['Client_ID', 'Current_Value', 'Percent_of_Portfolio']
}
# Report any missing data
Step 2: Match Scenarios
Scenario 1: FIA Surrender Ending
Criteria:
- •Product_Type = 'FIA'
- •Surrender_End_Date within 12 months from today
- •Cap_Rate < 5.5%
Revenue Calculation:
revenue = product['Current_Value'] * 0.05 # 5% commission
Output Template:
Client: {client_name}
Type: FIA Replacement Opportunity
Details: {product_name} FIA with ${current_value:,} approaching surrender end in {months} months. Current cap rate of {cap_rate} is below market average of 5.5-6.5%.
Revenue Estimate: ${revenue:,}
Action: Schedule review meeting to discuss current product performance and illustrate replacement options with higher crediting rates.
Scenario 2: Cash Drag
Criteria:
- •Cash_Balance > $50,000
- •Cash_Yield < 3.0%
Revenue Calculation:
revenue = client['Cash_Balance'] * 0.01 # 1% AUM fee
Output Template:
Client: {client_name}
Type: Cash Repositioning Opportunity
Details: ${cash_balance:,} in cash earning {cash_yield}. Money market funds currently yielding 4.5-5.5%.
Revenue Estimate: ${revenue:,} annually
Action: Quick call to reposition to higher-yielding money market or short-term treasury fund.
Scenario 3: Concentrated Position
Criteria:
- •Any single position > 20% of portfolio
- •Total_Portfolio > $500,000
- •Accredited_Investor = 'Yes'
Revenue Calculation:
# Assume 30% of concentrated position can be repositioned reposition_amount = position['Current_Value'] * 0.30 # Alternative investment typically 5% upfront revenue = reposition_amount * 0.05
Output Template:
Client: {client_name}
Type: Concentration Risk / Diversification
Details: {ticker} position of ${position_value:,} represents {percentage}% of portfolio. Significant single-stock concentration risk.
Revenue Estimate: ${revenue:,}
Action: Schedule portfolio review to discuss diversification into alternative investments or sector diversification.
Step 3: Consolidate & Rank
# Collect all opportunities
all_opportunities = []
all_opportunities.extend(fia_opportunities)
all_opportunities.extend(cash_opportunities)
all_opportunities.extend(concentration_opportunities)
# Deduplicate: One opportunity per client (keep highest revenue)
client_best_opp = {}
for opp in all_opportunities:
client_id = opp['client_id']
if client_id not in client_best_opp:
client_best_opp[client_id] = opp
elif opp['revenue'] > client_best_opp[client_id]['revenue']:
client_best_opp[client_id] = opp
# Sort by revenue (highest first)
sorted_opportunities = sorted(
client_best_opp.values(),
key=lambda x: x['revenue'],
reverse=True
)
Step 4: Generate Report
Report Format:
═══════════════════════════════════════════════════
OPPORTUNITYIQ MVP SCAN RESULTS
═══════════════════════════════════════════════════
Generated: {current_date_time}
Clients Scanned: {total_clients}
Opportunities Found: {total_opportunities}
Total Revenue Potential: ${total_revenue:,}
───────────────────────────────────────────────────
OPPORTUNITY #1 - ${revenue:,}
Client: {client_name} ({client_id})
Type: {scenario_name}
Details:
{detailed_description}
Recommended Action:
{next_steps}
───────────────────────────────────────────────────
[Repeat for each opportunity]
───────────────────────────────────────────────────
SUMMARY BY TYPE:
• FIA Replacement: {fia_count} opportunities - ${fia_total:,}
• Cash Repositioning: {cash_count} opportunities - ${cash_total:,}
• Concentration/Diversification: {conc_count} opportunities - ${conc_total:,}
PRIORITY ACTIONS:
1. High Priority (>$5,000): {high_priority_count} opportunities
2. Medium Priority ($2,000-$5,000): {medium_priority_count} opportunities
3. Quick Wins (<$2,000): {quick_win_count} opportunities
NEXT STEPS:
□ Review each opportunity for accuracy
□ Prioritize top 3-5 for immediate outreach
□ Note any false positives to refine criteria
□ Decide: Expand to more scenarios or scale client base?
Error Handling
Handle common data issues gracefully:
# Missing data
if 'Surrender_End_Date' not in products.columns:
print("⚠️ Warning: Surrender_End_Date not found in Products sheet. Skipping FIA scenario.")
# Invalid dates
try:
surrender_date = pd.to_datetime(product['Surrender_End_Date'])
except:
print(f"⚠️ Invalid date format for client {client_id}, skipping this product")
# Empty dataframes
if holdings.empty:
print("⚠️ No holdings data found. Skipping concentration scenario.")
# Division by zero
if total_portfolio > 0:
percent = position_value / total_portfolio
else:
percent = 0
Output Examples
Example 1: FIA Opportunity
OPPORTUNITY #1 - $24,350 Client: John Smith (C001) Type: FIA Replacement Opportunity Details: Allianz 222 FIA with $487,000 approaching surrender end in 7 months. Current cap rate of 4.5% is significantly below current market rates of 5.8-6.5%. Client has held product for 6.5 years through low-rate environment. Recommended Action: 1. Schedule 45-minute review meeting within next 2 weeks 2. Run side-by-side illustration: Current product vs. best available replacement 3. Review surrender schedule details to confirm no penalties 4. Prepare 1035 exchange paperwork if client approves 5. Expected timeline: 30-60 days to completion Revenue Estimate: $24,350 (5% commission on $487,000) Confidence: High
Example 2: Cash Drag Opportunity
OPPORTUNITY #3 - $1,500 Client: Mary Johnson (C002) Type: Cash Repositioning Opportunity Details: $150,000 in cash earning 0.5% in traditional savings account. Money market funds currently yielding 4.5-5.5%. Client is losing approximately $6,000 annually in opportunity cost. No upcoming liquidity needs identified. Recommended Action: 1. Quick 15-minute call to client 2. Explain opportunity cost (earning $750/year vs. $7,500/year) 3. Recommend repositioning to money market fund 4. Execute trade same day if approved 5. No-brainer quick win Revenue Estimate: $1,500 annually (1% AUM fee) Confidence: High
Validation Checklist
After running scan, validate results:
- • All opportunities have valid Client_IDs
- • Revenue estimates are > $0
- • Descriptions are specific (not generic)
- • Recommended actions are actionable
- • No obvious false positives (clients who don't match criteria)
- • Revenue estimates seem realistic for your practice
Customization Options
User can adjust:
Revenue Commission Rates:
COMMISSION_RATES = {
'FIA_replacement': 0.05, # Default: 5%
'Life_insurance': 0.01, # Default: 1% of face value
'AUM_fee': 0.01, # Default: 1%
'Alternative_product': 0.05, # Default: 5%
}
Threshold Values:
THRESHOLDS = {
'cash_minimum': 50000, # Minimum cash balance
'cash_yield_threshold': 3.0, # Yield below which to flag
'fia_cap_rate_threshold': 5.5, # Cap rate below market
'concentration_percentage': 20, # Portfolio concentration %
'concentration_minimum_portfolio': 500000, # Minimum portfolio for concentration
}
Urgency Weighting (if implementing ranking):
URGENCY_WEIGHTS = {
'Immediate': 1.3,
'Near-term': 1.2,
'Time-sensitive': 1.3,
'Strategic': 1.0,
}
Expansion Path
To add more scenarios:
- •Define matching criteria
- •Add revenue calculation logic
- •Create output template
- •Test with sample data
- •Add to scenario rotation
Future scenarios to consider:
- •Tax loss harvesting (seasonal)
- •RMD planning (pre-age 73)
- •Life insurance coverage gaps
- •Beneficiary reviews
- •Estate planning triggers
- •Portfolio rebalancing triggers
Notes
- •Privacy: Client data never leaves your Google Sheet. Skill only reads and analyzes.
- •Accuracy: Revenue estimates are conservative. Actual results may vary.
- •Frequency: Recommend running weekly (every Sunday night for Monday delivery).
- •Scale: Tested with 10-50 clients. Can handle up to 500 clients per scan.
Success Metrics
Track these over time:
- •Opportunities identified per scan
- •False positive rate (opportunities that aren't real)
- •Conversion rate (opportunities → actions)
- •Revenue generated (closed deals from opportunities)
- •Time saved (vs. manual review)