Lead Qualification and Processing - Complete AI-Powered with Smart Routing

Advanced lead qualification workflow combining data enrichment with AI-powered scoring and automated sales assignment

Back
Workflow Information

ID: lead_qualification_complete_ai

Namespace: sales

Version: 2.0

Created: 2025-07-01

Updated: 2025-07-01

Tasks: 11

Quick Actions
Manage Secrets
Inputs
Name Type Required Default
timezone string Optional UTC
time_format string Optional iso
lead_id string Required LEAD_001
lead_name string Required John Smith
lead_email string Required john.smith@company.com
company_name string Required Acme Corporation
industry string Optional Technology
annual_revenue integer Optional 50000
Outputs
Name Type Source
lead_score object AI-calculated lead scoring results
similar_leads object Similar leads analysis from Dynamics
final_processing object Final lead processing results and notifications
workload_analysis object Sales officer workload assessment
historical_analysis object Historical data analysis from BigQuery
initialization_data object System initialization and lead data extraction
qualification_results object Lead qualification determination and routing results
Tasks
get_lead_data_from_crm
script

Extract and initialize lead data from CRM webhook trigger

get_historical_data_from_bigquery
script

Retrieve and analyze historical data from BigQuery for lead scoring

get_similar_leads_from_dynamics
script

Find and analyze similar leads from Dynamics for pattern matching

get_sales_officer_workload
script

Analyze current sales officer workload for optimal assignment

calculate_lead_score
ai_agent

AI-powered lead scoring combining all data sources

determine_qualification_status
script

Determine qualification status and route based on lead score

qualification_router
conditional_router

Routes qualified leads to sales team or unqualified leads to follow-up

Conditional Router
Router Type: condition
Default Route: unqualified_path
process_qualified_lead
script

Process qualified leads - recommend sales officer and create deal

process_unqualified_lead
script

Process unqualified leads - update status and schedule follow-up

qualification_summary
script

Summarize qualification results and generate final status report

end_lead_processed
script

Final step marking lead processing as complete

YAML Source
id: lead_qualification_complete_ai
name: Lead Qualification and Processing - Complete AI-Powered with Smart Routing
tasks:
- id: get_lead_data_from_crm
  name: Get Lead Data from CRM
  type: script
  script: "import os\nimport json\nfrom datetime import datetime\n\nprint(\"\U0001F4BC\
    \ LEAD DATA EXTRACTION FROM CRM\")\nprint(\"=\" * 60)\nprint(\"\U0001F504 Processing\
    \ new lead webhook trigger...\")\nprint(\"\")\n\n# Get input parameters\nexecution_id\
    \ = os.environ.get('EXECUTION_ID', 'unknown')\nlead_id = \"${lead_id}\"\nlead_name\
    \ = \"${lead_name}\"\nlead_email = \"${lead_email}\"\ncompany_name = \"${company_name}\"\
    \nindustry = \"${industry}\" or \"Unknown\"\nannual_revenue = \"${annual_revenue}\"\
    \ or 0\ntimezone = \"${timezone}\"\ntime_format = \"${time_format}\"\n\n# Process\
    \ annual revenue\ntry:\n    annual_revenue = int(annual_revenue) if annual_revenue\
    \ else 0\nexcept ValueError:\n    annual_revenue = 0\n    print(f\"\u26A0\uFE0F\
    \ Invalid annual revenue value: ${annual_revenue}\")\n\nprint(\"\U0001F4CB Lead\
    \ Details:\")\nprint(f\"   Execution ID: {execution_id}\")\nprint(f\"   Lead ID:\
    \ {lead_id}\")\nprint(f\"   Name: {lead_name}\")\nprint(f\"   Email: {lead_email}\"\
    )\nprint(f\"   Company: {company_name}\")\nprint(f\"   Industry: {industry}\"\
    )\nprint(f\"   Annual Revenue: ${annual_revenue:,}\")\nprint(f\"   Timezone: {timezone}\"\
    )\nprint(f\"   Time Format: {time_format}\")\nprint(\"\")\n\n# Extract domain\
    \ from email for company matching\nemail_domain = lead_email.split('@')[1] if\
    \ '@' in lead_email else 'unknown.com'\n\n# Simulate CRM data enrichment\ncrm_data\
    \ = {\n    \"lead_source\": \"Website Form\",\n    \"campaign_id\": \"CAMP_2024_Q1\"\
    ,\n    \"utm_source\": \"google\",\n    \"utm_medium\": \"cpc\",\n    \"lead_status\"\
    : \"New\",\n    \"created_date\": datetime.now().isoformat(),\n    \"last_activity\"\
    : \"Form Submission\",\n    \"phone\": \"+1-555-0123\",\n    \"job_title\": \"\
    VP of Sales\",\n    \"company_size\": \"51-200 employees\",\n    \"website\":\
    \ f\"https://www.{email_domain}\"\n}\n\nprint(\"\U0001F4CA Additional CRM Data:\"\
    )\nprint(f\"   Source: {crm_data['lead_source']}\")\nprint(f\"   Campaign: {crm_data['campaign_id']}\"\
    )\nprint(f\"   Job Title: {crm_data['job_title']}\")\nprint(f\"   Company Size:\
    \ {crm_data['company_size']}\")\nprint(f\"   Website: {crm_data['website']}\"\
    )\nprint(\"\")\n\nprint(\"\u2705 Lead data extracted successfully\")\nprint(\"\
    \u27A1\uFE0F Proceeding to historical data analysis...\")\n\n# Output structured\
    \ lead data\nresult = {\n    \"status\": \"completed\",\n    \"execution_id\"\
    : execution_id,\n    \"lead_data\": {\n        \"lead_id\": lead_id,\n       \
    \ \"name\": lead_name,\n        \"email\": lead_email,\n        \"company\": company_name,\n\
    \        \"industry\": industry,\n        \"annual_revenue\": annual_revenue,\n\
    \        \"email_domain\": email_domain\n    },\n    \"crm_enrichment\": crm_data,\n\
    \    \"timezone\": timezone,\n    \"time_format\": time_format,\n    \"timestamp\"\
    : datetime.now().isoformat()\n}\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  description: Extract and initialize lead data from CRM webhook trigger
  timeout_seconds: 30
- id: get_historical_data_from_bigquery
  name: Get Historical Data from BigQuery
  type: script
  script: "import json\nimport time\nfrom datetime import datetime, timedelta\nimport\
    \ random\n\nprint(\"\U0001F4CA HISTORICAL DATA ANALYSIS FROM BIGQUERY\")\nprint(\"\
    =\" * 60)\nprint(\"\")\n\n# Get lead data from previous step\nlead_email = \"\
    ${get_lead_data_from_crm.lead_data.email}\"\ncompany_name = \"${get_lead_data_from_crm.lead_data.company}\"\
    \nindustry = \"${get_lead_data_from_crm.lead_data.industry}\"\nemail_domain =\
    \ \"${get_lead_data_from_crm.lead_data.email_domain}\"\n\nprint(f\"\U0001F50D\
    \ Analyzing historical data for: {company_name}\")\nprint(f\"   Industry: {industry}\"\
    )\nprint(f\"   Domain: {email_domain}\")\nprint(\"\")\n\ntry:\n    print(\"\U0001F310\
    \ Connecting to BigQuery...\")\n    time.sleep(2)  # Simulate BigQuery connection\n\
    \    \n    # Simulate historical data analysis\n    print(\"\u2713 Connected to\
    \ BigQuery successfully\")\n    print(\"\u2713 Querying historical lead data...\"\
    )\n    print(\"\u2713 Analyzing conversion patterns...\")\n    print(\"\u2713\
    \ Calculating industry benchmarks...\")\n    \n    # Generate mock historical\
    \ insights\n    historical_insights = {\n        \"total_leads_analyzed\": random.randint(5000,\
    \ 15000),\n        \"industry_conversion_rate\": round(random.uniform(0.12, 0.28),\
    \ 3),\n        \"average_deal_size\": random.randint(25000, 150000),\n       \
    \ \"average_sales_cycle_days\": random.randint(45, 120),\n        \"similar_companies_converted\"\
    : random.randint(15, 45),\n        \"domain_previous_leads\": random.randint(0,\
    \ 5),\n        \"seasonal_trends\": {\n            \"current_quarter_performance\"\
    : \"Above Average\",\n            \"best_conversion_month\": \"March\",\n    \
    \        \"industry_peak_season\": \"Q1-Q2\"\n        },\n        \"engagement_patterns\"\
    : {\n            \"email_open_rate\": round(random.uniform(0.25, 0.45), 3),\n\
    \            \"content_download_rate\": round(random.uniform(0.15, 0.35), 3),\n\
    \            \"demo_request_rate\": round(random.uniform(0.08, 0.18), 3)\n   \
    \     }\n    }\n    \n    # Calculate historical score based on patterns\n   \
    \ historical_score = 0\n    \n    # Industry performance factor\n    if historical_insights[\"\
    industry_conversion_rate\"] > 0.20:\n        historical_score += 25\n    elif\
    \ historical_insights[\"industry_conversion_rate\"] > 0.15:\n        historical_score\
    \ += 15\n    else:\n        historical_score += 5\n    \n    # Deal size factor\n\
    \    if historical_insights[\"average_deal_size\"] > 100000:\n        historical_score\
    \ += 20\n    elif historical_insights[\"average_deal_size\"] > 50000:\n      \
    \  historical_score += 15\n    else:\n        historical_score += 10\n    \n \
    \   # Domain history factor\n    if historical_insights[\"domain_previous_leads\"\
    ] > 0:\n        historical_score += 15\n        domain_status = \"Returning Domain\"\
    \n    else:\n        historical_score += 5\n        domain_status = \"New Domain\"\
    \n    \n    # Seasonal trends factor\n    if historical_insights[\"seasonal_trends\"\
    ][\"current_quarter_performance\"] == \"Above Average\":\n        historical_score\
    \ += 10\n    \n    print(\"\")\n    print(\"\U0001F4CA Historical Analysis Results:\"\
    )\n    print(f\"   Industry Conversion Rate: {historical_insights['industry_conversion_rate']*100:.1f}%\"\
    )\n    print(f\"   Average Deal Size: ${historical_insights['average_deal_size']:,}\"\
    )\n    print(f\"   Sales Cycle: {historical_insights['average_sales_cycle_days']}\
    \ days\")\n    print(f\"   Domain Status: {domain_status}\")\n    print(f\"  \
    \ Historical Score: {historical_score}/70\")\n    \n    result = {\n        \"\
    status\": \"completed\",\n        \"historical_insights\": historical_insights,\n\
    \        \"historical_score\": historical_score,\n        \"domain_status\": domain_status,\n\
    \        \"analysis_timestamp\": datetime.now().isoformat(),\n        \"data_source\"\
    : \"BigQuery Historical Analysis\"\n    }\n    \n    print(\"\")\n    print(\"\
    \u2705 Historical analysis completed\")\n    \nexcept Exception as e:\n    result\
    \ = {\n        \"status\": \"error\",\n        \"error\": str(e),\n        \"\
    historical_score\": 0,\n        \"analysis_timestamp\": datetime.now().isoformat()\n\
    \    }\n    print(f\"\u274C Historical analysis failed: {e}\")\n\nprint(f\"__OUTPUTS__\
    \ {json.dumps(result)}\")\n"
  depends_on:
  - get_lead_data_from_crm
  description: Retrieve and analyze historical data from BigQuery for lead scoring
  previous_node: get_lead_data_from_crm
  timeout_seconds: 45
- id: get_similar_leads_from_dynamics
  name: Get Similar Leads from Dynamics
  type: script
  script: "import json\nimport time\nimport random\nfrom datetime import datetime\n\
    \nprint(\"\U0001F50D SIMILAR LEADS ANALYSIS FROM DYNAMICS\")\nprint(\"=\" * 60)\n\
    print(\"\")\n\n# Get data from previous steps\ncompany_name = \"${get_lead_data_from_crm.lead_data.company}\"\
    \nindustry = \"${get_lead_data_from_crm.lead_data.industry}\"\nannual_revenue\
    \ = \"${get_lead_data_from_crm.lead_data.annual_revenue}\"\njob_title = \"${get_lead_data_from_crm.crm_enrichment.job_title}\"\
    \ncompany_size = \"${get_lead_data_from_crm.crm_enrichment.company_size}\"\n\n\
    print(f\"\U0001F3AF Searching for similar leads to: {company_name}\")\nprint(f\"\
    \   Industry: {industry}\")\nprint(f\"   Revenue: ${annual_revenue:,}\" if annual_revenue\
    \ else \"   Revenue: Unknown\")\nprint(f\"   Job Title: {job_title}\")\nprint(f\"\
    \   Company Size: {company_size}\")\nprint(\"\")\n\ntry:\n    print(\"\U0001F310\
    \ Connecting to Dynamics CRM...\")\n    time.sleep(2)  # Simulate Dynamics connection\n\
    \    \n    print(\"\u2713 Connected to Dynamics successfully\")\n    print(\"\u2713\
    \ Searching for similar industry leads...\")\n    print(\"\u2713 Analyzing job\
    \ title patterns...\")\n    print(\"\u2713 Matching company size criteria...\"\
    )\n    print(\"\u2713 Evaluating revenue segments...\")\n    \n    # Generate\
    \ mock similar leads data\n    similar_leads_count = random.randint(8, 25)\n \
    \   converted_leads = random.randint(2, 8)\n    conversion_rate = round(converted_leads\
    \ / similar_leads_count, 3)\n    \n    similar_leads_data = {\n        \"total_similar_leads\"\
    : similar_leads_count,\n        \"converted_leads\": converted_leads,\n      \
    \  \"conversion_rate\": conversion_rate,\n        \"average_time_to_conversion\"\
    : random.randint(30, 90),\n        \"common_objections\": [\n            \"Budget\
    \ constraints\",\n            \"Timeline concerns\",\n            \"Feature requirements\"\
    \n        ],\n        \"successful_tactics\": [\n            \"Product demo\"\
    ,\n            \"ROI calculator\",\n            \"Case study presentation\"\n\
    \        ],\n        \"similar_lead_profiles\": [\n            {\n           \
    \     \"company\": \"TechCorp Inc\",\n                \"industry\": industry,\n\
    \                \"status\": \"Converted\",\n                \"deal_value\": random.randint(45000,\
    \ 120000),\n                \"conversion_time_days\": random.randint(25, 85)\n\
    \            },\n            {\n                \"company\": \"InnoSoft Ltd\"\
    ,\n                \"industry\": industry,\n                \"status\": \"Converted\"\
    ,\n                \"deal_value\": random.randint(35000, 95000),\n           \
    \     \"conversion_time_days\": random.randint(40, 75)\n            },\n     \
    \       {\n                \"company\": \"DataFlow Systems\",\n              \
    \  \"industry\": industry,\n                \"status\": \"Lost\",\n          \
    \      \"reason\": \"Budget constraints\",\n                \"engagement_duration\"\
    : random.randint(15, 45)\n            }\n        ]\n    }\n    \n    # Calculate\
    \ similarity score\n    similarity_score = 0\n    \n    # Conversion rate factor\n\
    \    if conversion_rate > 0.30:\n        similarity_score += 25\n    elif conversion_rate\
    \ > 0.20:\n        similarity_score += 20\n    elif conversion_rate > 0.15:\n\
    \        similarity_score += 15\n    else:\n        similarity_score += 10\n \
    \   \n    # Sample size factor\n    if similar_leads_count > 20:\n        similarity_score\
    \ += 15\n    elif similar_leads_count > 10:\n        similarity_score += 10\n\
    \    else:\n        similarity_score += 5\n    \n    # Time to conversion factor\n\
    \    if similar_leads_data[\"average_time_to_conversion\"] < 60:\n        similarity_score\
    \ += 10\n    else:\n        similarity_score += 5\n    \n    print(\"\")\n   \
    \ print(\"\U0001F4CA Similar Leads Analysis:\")\n    print(f\"   Similar Leads\
    \ Found: {similar_leads_count}\")\n    print(f\"   Conversion Rate: {conversion_rate*100:.1f}%\"\
    )\n    print(f\"   Average Conversion Time: {similar_leads_data['average_time_to_conversion']}\
    \ days\")\n    print(f\"   Similarity Score: {similarity_score}/50\")\n    \n\
    \    result = {\n        \"status\": \"completed\",\n        \"similar_leads_data\"\
    : similar_leads_data,\n        \"similarity_score\": similarity_score,\n     \
    \   \"pattern_confidence\": \"High\" if similarity_score > 35 else \"Medium\"\
    \ if similarity_score > 25 else \"Low\",\n        \"analysis_timestamp\": datetime.now().isoformat(),\n\
    \        \"data_source\": \"Dynamics CRM Similar Leads Analysis\"\n    }\n   \
    \ \n    print(\"\")\n    print(\"\u2705 Similar leads analysis completed\")\n\
    \    \nexcept Exception as e:\n    result = {\n        \"status\": \"error\",\n\
    \        \"error\": str(e),\n        \"similarity_score\": 0,\n        \"pattern_confidence\"\
    : \"Low\",\n        \"analysis_timestamp\": datetime.now().isoformat()\n    }\n\
    \    print(f\"\u274C Similar leads analysis failed: {e}\")\n\nprint(f\"__OUTPUTS__\
    \ {json.dumps(result)}\")\n"
  depends_on:
  - get_historical_data_from_bigquery
  description: Find and analyze similar leads from Dynamics for pattern matching
  previous_node: get_historical_data_from_bigquery
  timeout_seconds: 45
- id: get_sales_officer_workload
  name: Get Sales Officer Workload
  type: script
  script: "import json\nimport random\nfrom datetime import datetime\n\nprint(\"\U0001F464\
    \ SALES OFFICER WORKLOAD ANALYSIS\")\nprint(\"=\" * 60)\nprint(\"\")\n\n# Get\
    \ industry from previous steps for specialization matching\nindustry = \"${get_lead_data_from_crm.lead_data.industry}\"\
    \nannual_revenue = \"${get_lead_data_from_crm.lead_data.annual_revenue}\"\n\n\
    print(f\"\U0001F50D Analyzing workload for {industry} industry lead\")\nprint(f\"\
    \   Deal Size Category: {'Enterprise' if annual_revenue and int(annual_revenue)\
    \ > 100000 else 'Mid-Market' if annual_revenue and int(annual_revenue) > 25000\
    \ else 'SMB'}\")\nprint(\"\")\n\ntry:\n    print(\"\U0001F310 Connecting to Sales\
    \ Team Management System...\")\n    print(\"\u2713 Retrieving active sales officers...\"\
    )\n    print(\"\u2713 Analyzing current workloads...\")\n    print(\"\u2713 Checking\
    \ specializations...\")\n    print(\"\u2713 Evaluating performance metrics...\"\
    )\n    \n    # Generate mock sales officer data\n    sales_officers = [\n    \
    \    {\n            \"officer_id\": \"SO001\",\n            \"name\": \"Sarah\
    \ Johnson\",\n            \"specialization\": [industry, \"Enterprise Sales\"\
    ],\n            \"current_leads\": random.randint(8, 15),\n            \"active_deals\"\
    : random.randint(3, 8),\n            \"capacity_utilization\": round(random.uniform(0.65,\
    \ 0.85), 2),\n            \"conversion_rate\": round(random.uniform(0.22, 0.35),\
    \ 3),\n            \"average_deal_size\": random.randint(75000, 150000),\n   \
    \         \"response_time_hours\": round(random.uniform(2, 8), 1),\n         \
    \   \"availability_score\": random.randint(75, 95)\n        },\n        {\n  \
    \          \"officer_id\": \"SO002\",\n            \"name\": \"Michael Chen\"\
    ,\n            \"specialization\": [\"Technology\", \"Mid-Market\"],\n       \
    \     \"current_leads\": random.randint(12, 20),\n            \"active_deals\"\
    : random.randint(5, 12),\n            \"capacity_utilization\": round(random.uniform(0.75,\
    \ 0.95), 2),\n            \"conversion_rate\": round(random.uniform(0.18, 0.28),\
    \ 3),\n            \"average_deal_size\": random.randint(35000, 85000),\n    \
    \        \"response_time_hours\": round(random.uniform(3, 12), 1),\n         \
    \   \"availability_score\": random.randint(60, 80)\n        },\n        {\n  \
    \          \"officer_id\": \"SO003\",\n            \"name\": \"Emily Rodriguez\"\
    ,\n            \"specialization\": [industry, \"SMB Sales\"],\n            \"\
    current_leads\": random.randint(15, 25),\n            \"active_deals\": random.randint(8,\
    \ 15),\n            \"capacity_utilization\": round(random.uniform(0.70, 0.90),\
    \ 2),\n            \"conversion_rate\": round(random.uniform(0.25, 0.38), 3),\n\
    \            \"average_deal_size\": random.randint(15000, 45000),\n          \
    \  \"response_time_hours\": round(random.uniform(1, 6), 1),\n            \"availability_score\"\
    : random.randint(80, 95)\n        }\n    ]\n    \n    # Calculate recommendation\
    \ scores for each officer\n    for officer in sales_officers:\n        score =\
    \ 0\n        \n        # Specialization match\n        if industry in officer[\"\
    specialization\"]:\n            score += 30\n        else:\n            score\
    \ += 10\n        \n        # Capacity availability (lower utilization = higher\
    \ score)\n        if officer[\"capacity_utilization\"] < 0.75:\n            score\
    \ += 25\n        elif officer[\"capacity_utilization\"] < 0.85:\n            score\
    \ += 15\n        else:\n            score += 5\n        \n        # Conversion\
    \ rate performance\n        if officer[\"conversion_rate\"] > 0.30:\n        \
    \    score += 20\n        elif officer[\"conversion_rate\"] > 0.25:\n        \
    \    score += 15\n        else:\n            score += 10\n        \n        #\
    \ Response time\n        if officer[\"response_time_hours\"] < 4:\n          \
    \  score += 15\n        elif officer[\"response_time_hours\"] < 8:\n         \
    \   score += 10\n        else:\n            score += 5\n        \n        # Availability\
    \ score\n        if officer[\"availability_score\"] > 85:\n            score +=\
    \ 10\n        elif officer[\"availability_score\"] > 75:\n            score +=\
    \ 5\n        \n        officer[\"recommendation_score\"] = score\n    \n    #\
    \ Sort by recommendation score\n    sales_officers.sort(key=lambda x: x[\"recommendation_score\"\
    ], reverse=True)\n    recommended_officer = sales_officers[0]\n    \n    print(\"\
    \")\n    print(\"\U0001F4CA Sales Officer Analysis Results:\")\n    print(f\"\
    \   Total Officers Analyzed: {len(sales_officers)}\")\n    print(f\"   Recommended\
    \ Officer: {recommended_officer['name']}\")\n    print(f\"   Specialization Match:\
    \ {'\u2713' if industry in recommended_officer['specialization'] else '\u2717\
    '}\")\n    print(f\"   Capacity Utilization: {recommended_officer['capacity_utilization']*100:.0f}%\"\
    )\n    print(f\"   Recommendation Score: {recommended_officer['recommendation_score']}/100\"\
    )\n    \n    result = {\n        \"status\": \"completed\",\n        \"sales_officers\"\
    : sales_officers,\n        \"recommended_officer\": recommended_officer,\n   \
    \     \"team_capacity\": {\n            \"total_officers\": len(sales_officers),\n\
    \            \"average_utilization\": round(sum(o[\"capacity_utilization\"] for\
    \ o in sales_officers) / len(sales_officers), 2),\n            \"specialization_coverage\"\
    : industry in [spec for officer in sales_officers for spec in officer[\"specialization\"\
    ]]\n        },\n        \"analysis_timestamp\": datetime.now().isoformat(),\n\
    \        \"data_source\": \"Sales Team Management System\"\n    }\n    \n    print(\"\
    \")\n    print(\"\u2705 Sales officer workload analysis completed\")\n    \nexcept\
    \ Exception as e:\n    result = {\n        \"status\": \"error\",\n        \"\
    error\": str(e),\n        \"recommended_officer\": None,\n        \"analysis_timestamp\"\
    : datetime.now().isoformat()\n    }\n    print(f\"\u274C Sales officer analysis\
    \ failed: {e}\")\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - get_similar_leads_from_dynamics
  description: Analyze current sales officer workload for optimal assignment
  previous_node: get_similar_leads_from_dynamics
  timeout_seconds: 30
- id: calculate_lead_score
  name: Calculate Lead Score
  type: ai_agent
  config:
    model_client_id: lead_scorer
  depends_on:
  - get_sales_officer_workload
  description: AI-powered lead scoring combining all data sources
  user_message: 'Calculate comprehensive lead score for:

    Lead Data: ${get_lead_data_from_crm.lead_data} CRM Enrichment: ${get_lead_data_from_crm.crm_enrichment}

    Historical Analysis: ${get_historical_data_from_bigquery.historical_insights}
    Historical Score: ${get_historical_data_from_bigquery.historical_score}

    Similar Leads: ${get_similar_leads_from_dynamics.similar_leads_data} Similarity
    Score: ${get_similar_leads_from_dynamics.similarity_score}

    Sales Team Analysis: ${get_sales_officer_workload.team_capacity} Recommended Officer:
    ${get_sales_officer_workload.recommended_officer}

    '
  previous_node: get_sales_officer_workload
  system_message: "You are an expert lead scoring analyst specializing in B2B sales\
    \ qualification.\n\nAnalyze all available data and calculate a comprehensive lead\
    \ score from 0-100 based on:\n- Lead demographic data (company, industry, revenue)\n\
    - Historical conversion patterns\n- Similar lead performance\n- Sales team capacity\
    \ and specialization\n\nProvide your analysis in JSON format:\n{\n  \"overall_lead_score\"\
    : 0-100,\n  \"score_breakdown\": {\n    \"demographic_score\": 0-30,\n    \"historical_score\"\
    : 0-25,\n    \"similarity_score\": 0-25,\n    \"timing_score\": 0-20\n  },\n \
    \ \"scoring_rationale\": \"Detailed explanation of scoring factors\",\n  \"confidence_level\"\
    : \"High|Medium|Low\",\n  \"key_strengths\": [\"strength1\", \"strength2\"],\n\
    \  \"potential_concerns\": [\"concern1\", \"concern2\"],\n  \"predicted_conversion_probability\"\
    : 0.0-1.0\n}\n"
- id: determine_qualification_status
  name: Determine Qualification Status
  type: script
  script: "import json\nfrom datetime import datetime\n\nprint(\"\U0001F4CA LEAD QUALIFICATION\
    \ DETERMINATION\")\nprint(\"=\" * 60)\nprint(\"\")\n\n# Get lead score from AI\
    \ analysis\nlead_score_data = '''${calculate_lead_score}'''\n\ntry:\n    # Parse\
    \ the AI scoring results\n    scoring_results = json.loads(lead_score_data)\n\
    \    overall_lead_score = scoring_results.get('overall_lead_score', 0)\n    confidence_level\
    \ = scoring_results.get('confidence_level', 'Low')\n    conversion_probability\
    \ = scoring_results.get('predicted_conversion_probability', 0.0)\n    \n    print(f\"\
    \U0001F4CA Lead Scoring Results:\")\n    print(f\"   Overall Score: {overall_lead_score}/100\"\
    )\n    print(f\"   Confidence Level: {confidence_level}\")\n    print(f\"   Conversion\
    \ Probability: {conversion_probability*100:.1f}%\")\n    print(\"\")\n    \n \
    \   # Qualification threshold is 70\n    qualification_threshold = 70\n    \n\
    \    print(f\"\U0001F3AF Qualification Threshold: {qualification_threshold}\"\
    )\n    print(f\"   Lead Score: {overall_lead_score}\")\n    print(f\"   Status:\
    \ {'ABOVE' if overall_lead_score >= qualification_threshold else 'BELOW'} threshold\"\
    )\n    print(\"\")\n    \n    # Determine routing based on score\n    if overall_lead_score\
    \ >= qualification_threshold:\n        qualification_status = \"QUALIFIED\"\n\
    \        next_action = \"route_to_sales\"\n        priority_level = \"High\" if\
    \ overall_lead_score >= 85 else \"Medium\"\n        print(\"\u2705 QUALIFICATION\
    \ DECISION: QUALIFIED\")\n        print(f\"   Priority Level: {priority_level}\"\
    )\n        print(\"   Next Action: Route to Sales Officer\")\n    else:\n    \
    \    qualification_status = \"UNQUALIFIED\"\n        next_action = \"schedule_followup\"\
    \n        priority_level = \"Low\"\n        print(\"\u274C QUALIFICATION DECISION:\
    \ UNQUALIFIED\")\n        print(\"   Priority Level: Low\")\n        print(\"\
    \   Next Action: Schedule Follow-up\")\n    \n    print(\"\")\n    print(\"\u27A1\
    \uFE0F Proceeding to conditional routing...\")\n    \n    result = {\n       \
    \ \"status\": \"completed\",\n        \"qualification_status\": qualification_status,\n\
    \        \"lead_score\": overall_lead_score,\n        \"qualification_threshold\"\
    : qualification_threshold,\n        \"meets_threshold\": overall_lead_score >=\
    \ qualification_threshold,\n        \"next_action\": next_action,\n        \"\
    priority_level\": priority_level,\n        \"scoring_details\": scoring_results,\n\
    \        \"decision_timestamp\": datetime.now().isoformat(),\n        \"routing_decision\"\
    : \"qualified_path\" if qualification_status == \"QUALIFIED\" else \"unqualified_path\"\
    \n    }\n    \nexcept Exception as e:\n    print(f\"\u274C Error processing lead\
    \ score: {e}\")\n    result = {\n        \"status\": \"error\",\n        \"qualification_status\"\
    : \"UNQUALIFIED\",\n        \"lead_score\": 0,\n        \"next_action\": \"manual_review\"\
    ,\n        \"error\": str(e)\n    }\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  depends_on:
  - calculate_lead_score
  description: Determine qualification status and route based on lead score
  previous_node: calculate_lead_score
  timeout_seconds: 30
- id: qualification_router
  name: Lead Qualification Router
  type: conditional_router
  conditions:
  - name: qualified_lead
    route: qualified_path
    condition: ${determine_qualification_status.qualification_status} == 'QUALIFIED'
  depends_on:
  - determine_qualification_status
  description: Routes qualified leads to sales team or unqualified leads to follow-up
  default_route: unqualified_path
  previous_node: determine_qualification_status
- id: process_qualified_lead
  name: Process Qualified Lead
  type: script
  script: "import json\nimport time\nfrom datetime import datetime\n\nprint(\"\u2705\
    \ PROCESSING QUALIFIED LEAD\")\nprint(\"=\" * 50)\nprint(\"\")\n\n# Get data from\
    \ previous steps\nlead_data = '''${get_lead_data_from_crm.lead_data}'''\nrecommended_officer_data\
    \ = '''${get_sales_officer_workload.recommended_officer}'''\nscoring_data = '''${determine_qualification_status.scoring_details}'''\n\
    \ntry:\n    lead_info = json.loads(lead_data)\n    officer_info = json.loads(recommended_officer_data)\n\
    \    scoring_info = json.loads(scoring_data)\n    \n    lead_name = lead_info['name']\n\
    \    company_name = lead_info['company']\n    lead_score = scoring_info.get('overall_lead_score',\
    \ 0)\n    officer_name = officer_info['name']\n    officer_id = officer_info['officer_id']\n\
    \    \n    print(f\"\U0001F464 Recommended Sales Officer: {officer_name} ({officer_id})\"\
    )\n    print(f\"   Lead: {lead_name} from {company_name}\")\n    print(f\"   Lead\
    \ Score: {lead_score}/100\")\n    print(\"\")\n    \n    # Step 1: Create Deal\
    \ in CRM\n    print(\"\U0001F4BC Creating deal in CRM...\")\n    time.sleep(2)\
    \  # Simulate CRM API call\n    \n    deal_data = {\n        \"deal_id\": f\"\
    DEAL_{int(time.time())}\",\n        \"deal_name\": f\"{company_name} - {lead_name}\"\
    ,\n        \"lead_id\": lead_info['lead_id'],\n        \"assigned_officer\": officer_id,\n\
    \        \"stage\": \"Qualification\",\n        \"probability\": f\"{scoring_info.get('predicted_conversion_probability',\
    \ 0.5)*100:.0f}%\",\n        \"estimated_value\": officer_info.get('average_deal_size',\
    \ 50000),\n        \"created_date\": datetime.now().isoformat(),\n        \"priority\"\
    : \"High\" if lead_score >= 85 else \"Medium\"\n    }\n    \n    print(\"\u2713\
    \ Deal created successfully\")\n    print(f\"   Deal ID: {deal_data['deal_id']}\"\
    )\n    print(f\"   Estimated Value: ${deal_data['estimated_value']:,}\")\n   \
    \ print(f\"   Priority: {deal_data['priority']}\")\n    \n    # Step 2: Update\
    \ CRM Lead Status\n    print(\"\")\n    print(\"\U0001F504 Updating CRM lead status...\"\
    )\n    time.sleep(1)\n    \n    crm_update = {\n        \"lead_id\": lead_info['lead_id'],\n\
    \        \"status\": \"Qualified\",\n        \"assigned_officer\": officer_id,\n\
    \        \"qualification_date\": datetime.now().isoformat(),\n        \"lead_score\"\
    : lead_score,\n        \"deal_id\": deal_data['deal_id']\n    }\n    \n    print(\"\
    \u2713 CRM lead status updated to 'Qualified'\")\n    \n    # Step 3: Log Activity\
    \ in Dynamics\n    print(\"\")\n    print(\"\U0001F4DD Logging activity in Dynamics...\"\
    )\n    time.sleep(1)\n    \n    activity_log = {\n        \"activity_id\": f\"\
    ACT_{int(time.time())}\",\n        \"type\": \"Lead Qualification\",\n       \
    \ \"lead_id\": lead_info['lead_id'],\n        \"deal_id\": deal_data['deal_id'],\n\
    \        \"description\": f\"Lead qualified with score {lead_score}/100 and assigned\
    \ to {officer_name}\",\n        \"created_by\": \"AI Lead Qualification System\"\
    ,\n        \"timestamp\": datetime.now().isoformat()\n    }\n    \n    print(\"\
    \u2713 Activity logged in Dynamics\")\n    print(f\"   Activity ID: {activity_log['activity_id']}\"\
    )\n    \n    # Step 4: Notify Sales Officer\n    print(\"\")\n    print(f\"\U0001F514\
    \ Notifying sales officer: {officer_name}...\")\n    time.sleep(1)\n    \n   \
    \ notification = {\n        \"notification_id\": f\"NOTIF_{int(time.time())}\"\
    ,\n        \"recipient\": officer_id,\n        \"subject\": f\"New Qualified Lead:\
    \ {lead_name} from {company_name}\",\n        \"message\": f\"You have been assigned\
    \ a new qualified lead with a score of {lead_score}/100. Deal ID: {deal_data['deal_id']}\"\
    ,\n        \"priority\": deal_data['priority'],\n        \"sent_timestamp\": datetime.now().isoformat()\n\
    \    }\n    \n    print(\"\u2713 Sales officer notified\")\n    print(f\"   Notification\
    \ sent to: {officer_name}\")\n    \n    result = {\n        \"status\": \"completed\"\
    ,\n        \"processing_type\": \"Qualified Lead Processing\",\n        \"deal_created\"\
    : deal_data,\n        \"crm_updated\": crm_update,\n        \"activity_logged\"\
    : activity_log,\n        \"notification_sent\": notification,\n        \"next_steps\"\
    : [\n            \"Sales officer to contact lead within 24 hours\",\n        \
    \    \"Schedule discovery call\",\n            \"Send welcome package\"\n    \
    \    ],\n        \"processing_timestamp\": datetime.now().isoformat()\n    }\n\
    \    \n    print(\"\")\n    print(\"\u2705 Qualified lead processing completed\
    \ successfully\")\n    \nexcept Exception as e:\n    result = {\n        \"status\"\
    : \"error\",\n        \"error\": str(e),\n        \"processing_type\": \"Qualified\
    \ Lead Processing\"\n    }\n    print(f\"\u274C Qualified lead processing failed:\
    \ {e}\")\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - determine_qualification_status
  - qualification_router
  description: Process qualified leads - recommend sales officer and create deal
  previous_node: qualification_router
  timeout_seconds: 45
  execute_on_routes:
  - qualified_path
- id: process_unqualified_lead
  name: Process Unqualified Lead
  type: script
  script: "import json\nimport time\nfrom datetime import datetime, timedelta\n\n\
    print(\"\u26A0\uFE0F PROCESSING UNQUALIFIED LEAD\")\nprint(\"=\" * 50)\nprint(\"\
    \")\n\n# Get data from previous steps\nlead_data = '''${get_lead_data_from_crm.lead_data}'''\n\
    scoring_data = '''${determine_qualification_status.scoring_details}'''\n\ntry:\n\
    \    lead_info = json.loads(lead_data)\n    scoring_info = json.loads(scoring_data)\n\
    \    \n    lead_name = lead_info['name']\n    company_name = lead_info['company']\n\
    \    lead_score = scoring_info.get('overall_lead_score', 0)\n    concerns = scoring_info.get('potential_concerns',\
    \ [])\n    \n    print(f\"\U0001F464 Lead: {lead_name} from {company_name}\")\n\
    \    print(f\"   Lead Score: {lead_score}/100 (Below threshold of 70)\")\n   \
    \ print(f\"   Key Concerns: {', '.join(concerns[:2]) if concerns else 'General\
    \ qualification criteria not met'}\")\n    print(\"\")\n    \n    # Step 1: Update\
    \ CRM Lead Status to Unqualified\n    print(\"\U0001F504 Updating CRM lead status...\"\
    )\n    time.sleep(1)\n    \n    crm_update = {\n        \"lead_id\": lead_info['lead_id'],\n\
    \        \"status\": \"Unqualified\",\n        \"unqualification_date\": datetime.now().isoformat(),\n\
    \        \"lead_score\": lead_score,\n        \"unqualification_reason\": f\"\
    Score {lead_score}/100 below threshold. Concerns: {', '.join(concerns[:2]) if\
    \ concerns else 'General criteria not met'}\",\n        \"assigned_officer\":\
    \ None\n    }\n    \n    print(\"\u2713 CRM lead status updated to 'Unqualified'\"\
    )\n    \n    # Step 2: Schedule Follow-up\n    print(\"\")\n    print(\"\U0001F4C5\
    \ Scheduling follow-up activities...\")\n    time.sleep(1)\n    \n    # Determine\
    \ follow-up strategy based on score\n    if lead_score >= 50:\n        followup_strategy\
    \ = \"nurturing_campaign\"\n        followup_interval = 30  # days\n        followup_type\
    \ = \"Email nurturing sequence\"\n    elif lead_score >= 30:\n        followup_strategy\
    \ = \"quarterly_check\"\n        followup_interval = 90  # days\n        followup_type\
    \ = \"Quarterly touchpoint\"\n    else:\n        followup_strategy = \"annual_review\"\
    \n        followup_interval = 365  # days\n        followup_type = \"Annual market\
    \ review\"\n    \n    followup_date = (datetime.now() + timedelta(days=followup_interval)).isoformat()\n\
    \    \n    followup_schedule = {\n        \"followup_id\": f\"FOLLOWUP_{int(time.time())}\"\
    ,\n        \"lead_id\": lead_info['lead_id'],\n        \"strategy\": followup_strategy,\n\
    \        \"type\": followup_type,\n        \"scheduled_date\": followup_date,\n\
    \        \"interval_days\": followup_interval,\n        \"automated\": True,\n\
    \        \"description\": f\"Automated follow-up for lead with score {lead_score}/100\"\
    \n    }\n    \n    print(f\"\u2713 Follow-up scheduled: {followup_type}\")\n \
    \   print(f\"   Next Contact: {followup_date[:10]}\")\n    print(f\"   Strategy:\
    \ {followup_strategy}\")\n    \n    # Step 3: Add to appropriate nurturing list\n\
    \    print(\"\")\n    print(\"\U0001F4E7 Adding to nurturing campaign...\")\n\
    \    time.sleep(1)\n    \n    nurturing_assignment = {\n        \"campaign_id\"\
    : f\"NURTURE_{followup_strategy.upper()}\",\n        \"lead_id\": lead_info['lead_id'],\n\
    \        \"campaign_type\": followup_strategy,\n        \"enrolled_date\": datetime.now().isoformat(),\n\
    \        \"email_sequence\": True,\n        \"content_personalization\": {\n \
    \           \"industry\": lead_info.get('industry', 'General'),\n            \"\
    company_size\": \"SMB\" if lead_score < 40 else \"Mid-Market\"\n        }\n  \
    \  }\n    \n    print(f\"\u2713 Added to nurturing campaign: {nurturing_assignment['campaign_id']}\"\
    )\n    \n    result = {\n        \"status\": \"completed\",\n        \"processing_type\"\
    : \"Unqualified Lead Processing\",\n        \"crm_updated\": crm_update,\n   \
    \     \"followup_scheduled\": followup_schedule,\n        \"nurturing_assigned\"\
    : nurturing_assignment,\n        \"recommendations\": [\n            \"Monitor\
    \ for company growth/changes\",\n            \"Track engagement with nurturing\
    \ content\",\n            \"Re-evaluate qualification criteria periodically\"\n\
    \        ],\n        \"processing_timestamp\": datetime.now().isoformat()\n  \
    \  }\n    \n    print(\"\")\n    print(\"\u2705 Unqualified lead processing completed\"\
    )\n    print(\"   Lead will be nurtured and re-evaluated based on engagement\"\
    )\n    \nexcept Exception as e:\n    result = {\n        \"status\": \"error\"\
    ,\n        \"error\": str(e),\n        \"processing_type\": \"Unqualified Lead\
    \ Processing\"\n    }\n    print(f\"\u274C Unqualified lead processing failed:\
    \ {e}\")\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\")\n"
  depends_on:
  - determine_qualification_status
  - qualification_router
  description: Process unqualified leads - update status and schedule follow-up
  previous_node: qualification_router
  timeout_seconds: 30
  execute_on_routes:
  - unqualified_path
- id: qualification_summary
  name: Qualification Summary Report
  type: script
  script: "import json\nfrom datetime import datetime\n\nprint(\"\")\nprint(\"=\"\
    \ * 70)\nprint(\"\U0001F4CA LEAD QUALIFICATION SUMMARY REPORT\")\nprint(\"=\"\
    \ * 70)\nprint(\"\")\n\n# Get basic lead information\nlead_info = json.loads('''${get_lead_data_from_crm.lead_data}''')\n\
    qualification_result = json.loads('''${determine_qualification_status}''')\n\n\
    lead_name = lead_info['name']\ncompany_name = lead_info['company']\nlead_id =\
    \ lead_info['lead_id']\nqualification_status = qualification_result['qualification_status']\n\
    lead_score = qualification_result['lead_score']\n\nprint(f\"Lead ID: {lead_id}\"\
    )\nprint(f\"Contact: {lead_name}\")\nprint(f\"Company: {company_name}\")\nprint(f\"\
    Final Score: {lead_score}/100\")\nprint(f\"Status: {qualification_status}\")\n\
    print(f\"Report Generated: {datetime.now().isoformat()}\")\nprint(\"\")\n\n# Determine\
    \ which processing path was taken and get results\nprocessing_result = None\n\
    processing_type = None\n\nif qualification_status == \"QUALIFIED\":\n    try:\n\
    \        processing_data = '''${process_qualified_lead}'''\n        processing_result\
    \ = json.loads(processing_data)\n        processing_type = \"Qualified Lead Processing\"\
    \n    except:\n        processing_result = {\"status\": \"error\", \"error\":\
    \ \"Failed to parse qualified processing data\"}\nelse:\n    try:\n        processing_data\
    \ = '''${process_unqualified_lead}'''\n        processing_result = json.loads(processing_data)\n\
    \        processing_type = \"Unqualified Lead Processing\"\n    except:\n    \
    \    processing_result = {\"status\": \"error\", \"error\": \"Failed to parse\
    \ unqualified processing data\"}\n\nprint(\"PROCESSING RESULTS:\")\nprint(\"-\"\
    \ * 50)\nprint(f\"Processing Type: {processing_type}\")\nprint(f\"Processing Status:\
    \ {processing_result.get('status', 'Unknown')}\")\n\nif qualification_status ==\
    \ \"QUALIFIED\" and processing_result.get('status') == 'completed':\n    deal_info\
    \ = processing_result.get('deal_created', {})\n    officer_notification = processing_result.get('notification_sent',\
    \ {})\n    \n    print(f\"Deal Created: {deal_info.get('deal_id', 'N/A')}\")\n\
    \    print(f\"Estimated Value: ${deal_info.get('estimated_value', 0):,}\")\n \
    \   print(f\"Assigned Officer: {officer_notification.get('recipient', 'N/A')}\"\
    )\n    print(f\"Priority: {deal_info.get('priority', 'N/A')}\")\n    \nelif qualification_status\
    \ == \"UNQUALIFIED\" and processing_result.get('status') == 'completed':\n   \
    \ followup_info = processing_result.get('followup_scheduled', {})\n    nurturing_info\
    \ = processing_result.get('nurturing_assigned', {})\n    \n    print(f\"Follow-up\
    \ Strategy: {followup_info.get('strategy', 'N/A')}\")\n    print(f\"Next Contact:\
    \ {followup_info.get('scheduled_date', 'N/A')[:10]}\")\n    print(f\"Nurturing\
    \ Campaign: {nurturing_info.get('campaign_id', 'N/A')}\")\n\nprint(\"\")\n\n#\
    \ Final status determination\nif qualification_status == \"QUALIFIED\" and processing_result.get('status')\
    \ == 'completed':\n    final_status = \"SUCCESSFULLY_QUALIFIED\"\n    next_action\
    \ = \"Sales officer will contact lead within 24 hours\"\n    print(\"\u2705 FINAL\
    \ STATUS: Lead Successfully Qualified and Assigned\")\nelif qualification_status\
    \ == \"UNQUALIFIED\" and processing_result.get('status') == 'completed':\n   \
    \ final_status = \"PROPERLY_UNQUALIFIED\"\n    next_action = \"Lead entered into\
    \ nurturing campaign for future qualification\"\n    print(\"\u26A0\uFE0F FINAL\
    \ STATUS: Lead Properly Unqualified and Nurtured\")\nelse:\n    final_status =\
    \ \"PROCESSING_ERROR\"\n    next_action = \"Manual review required due to processing\
    \ errors\"\n    print(\"\u274C FINAL STATUS: Processing Error - Manual Review\
    \ Required\")\n\nprint(f\"Next Action: {next_action}\")\nprint(\"\")\nprint(\"\
    === LEAD PROCESSING COMPLETED ===\")\n\n# Create comprehensive summary\nsummary_report\
    \ = {\n    \"lead_summary\": {\n        \"lead_id\": lead_id,\n        \"contact_name\"\
    : lead_name,\n        \"company\": company_name,\n        \"final_score\": lead_score,\n\
    \        \"qualification_status\": qualification_status,\n        \"processing_timestamp\"\
    : datetime.now().isoformat()\n    },\n    \"qualification_details\": qualification_result,\n\
    \    \"processing_results\": processing_result,\n    \"final_status\": final_status,\n\
    \    \"next_action\": next_action,\n    \"processing_complete\": True\n}\n\nprint(f\"\
    __OUTPUTS__ {json.dumps(summary_report)}\")\n"
  depends_on:
  - process_qualified_lead
  - process_unqualified_lead
  description: Summarize qualification results and generate final status report
  previous_node:
  - process_qualified_lead
  - process_unqualified_lead
  timeout_seconds: 30
- id: end_lead_processed
  name: End - Lead Processed
  type: script
  script: "import json\nfrom datetime import datetime\n\nprint(\"\u2713 LEAD PROCESSING\
    \ WORKFLOW COMPLETED\")\nprint(\"=\" * 60)\nprint(\"\")\n\n# Get final summary\n\
    summary_data = json.loads('''${qualification_summary}''')\nlead_summary = summary_data['lead_summary']\n\
    final_status = summary_data['final_status']\n\nprint(f\"Lead: {lead_summary['contact_name']}\
    \ from {lead_summary['company']}\")\nprint(f\"Final Status: {final_status}\")\n\
    print(f\"Score: {lead_summary['final_score']}/100\")\nprint(f\"Completed: {datetime.now().isoformat()}\"\
    )\nprint(\"\")\n\n# Log completion\ncompletion_log = {\n    \"workflow_completed\"\
    : True,\n    \"completion_timestamp\": datetime.now().isoformat(),\n    \"lead_id\"\
    : lead_summary['lead_id'],\n    \"final_status\": final_status,\n    \"processing_summary\"\
    : summary_data,\n    \"workflow_duration\": \"Approximately 3-5 minutes\",\n \
    \   \"success\": final_status in [\"SUCCESSFULLY_QUALIFIED\", \"PROPERLY_UNQUALIFIED\"\
    ]\n}\n\nif completion_log['success']:\n    print(\"\u2705 Workflow completed successfully\"\
    )\nelse:\n    print(\"\u26A0\uFE0F Workflow completed with issues - manual review\
    \ recommended\")\n\nprint(\"\")\nprint(\"Thank you for using the Lead Qualification\
    \ System!\")\n\nprint(f\"__OUTPUTS__ {json.dumps(completion_log)}\")\n"
  depends_on:
  - qualification_summary
  description: Final step marking lead processing as complete
  previous_node: qualification_summary
  timeout_seconds: 15
inputs:
- name: timezone
  type: string
  default: UTC
  description: Timezone for timestamps (e.g., UTC, America/New_York, Europe/London)
- name: time_format
  type: string
  default: iso
  description: How to display time (iso, human, unix)
- name: lead_id
  type: string
  default: LEAD_001
  required: true
  description: Your reference ID for this lead
- name: lead_name
  type: string
  default: John Smith
  required: true
  description: Lead's full name
- name: lead_email
  type: string
  default: john.smith@company.com
  required: true
  description: Lead's email address
- name: company_name
  type: string
  default: Acme Corporation
  required: true
  description: Company name of the lead
- name: industry
  type: string
  default: Technology
  required: false
  description: Industry sector of the lead's company
- name: annual_revenue
  type: integer
  default: 50000
  required: false
  description: Annual revenue of the lead's company
outputs:
  lead_score:
    type: object
    source: calculate_lead_score
    description: AI-calculated lead scoring results
  similar_leads:
    type: object
    source: get_similar_leads_from_dynamics
    description: Similar leads analysis from Dynamics
  final_processing:
    type: object
    source: end_lead_processed
    description: Final lead processing results and notifications
  workload_analysis:
    type: object
    source: get_sales_officer_workload
    description: Sales officer workload assessment
  historical_analysis:
    type: object
    source: get_historical_data_from_bigquery
    description: Historical data analysis from BigQuery
  initialization_data:
    type: object
    source: get_lead_data_from_crm
    description: System initialization and lead data extraction
  qualification_results:
    type: object
    source: qualification_summary
    description: Lead qualification determination and routing results
version: 2.0
namespace: sales
description: Advanced lead qualification workflow combining data enrichment with AI-powered
  scoring and automated sales assignment
model_clients:
- id: lead_analyst
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 3000
    temperature: 0.1
  provider: openai
- id: lead_scorer
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 2000
    temperature: 0.05
  provider: openai
- id: sales_optimizer
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 4000
    temperature: 0.0
  provider: openai
- id: activity_logger
  config:
    model: gpt-4o-mini
    api_key: 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
    max_tokens: 5000
    temperature: 0.2
  provider: openai
timeout_seconds: 900
Execution ID Status Started Duration Actions
b22ae429... COMPLETED 2025-07-01
17:13:47
N/A View
762905c5... COMPLETED 2025-07-01
13:03:22
N/A View