Lead Drop-off Re-engagement Workflow

Automated re-engagement workflow for stalled deals with multi-channel approach

Back
Workflow Information

ID: lead_dropoff_reengagement_workflow

Namespace: default

Version: 1.0

Created: 2025-07-01

Updated: 2025-07-01

Tasks: 17

Quick Actions
Manage Secrets
Inputs
Name Type Required Default
scan_interval_hours integer Optional 4
stall_threshold_days integer Optional 7
Outputs
Name Type Source
stalled_deals object Stalled deals identified
escalation_setup object Escalation schedules created
reengagement_results object Re-engagement campaign results
tracking_configuration object Response tracking setup
Tasks
get_stalled_deals_from_crm
script

Scan CRM for deals that have been stalled

Task Outputs: {'name': 'stalled_deals_data', 'value': 'Stalled deals retrieved from CRM'}
check_stalled_deals_found
script

Determine if any stalled deals need processing

Task Outputs: {'name': 'deals_check_result', 'value': 'Stalled deals check completed'}
get_customer_interaction_timeline
script

Retrieve interaction history for stalled deals

Task Outputs: {'name': 'interaction_timelines', 'value': 'Customer interaction timelines retrieved'}
get_deal_stage_history
script

Analyze deal progression through stages

Task Outputs: {'name': 'stage_histories', 'value': 'Deal stage histories analyzed'}
get_competitor_intelligence
script

Gather market and competitor information

Task Outputs: {'name': 'competitor_data', 'value': 'Competitor intelligence gathered'}
analyze_stall_reasons
script

AI analysis of why deals have stalled

Task Outputs: {'name': 'stall_analysis_results', 'value': 'Stall reasons analyzed'}
determine_reengagement_strategy
script

AI-powered strategy selection for re-engagement

Task Outputs: {'name': 'reengagement_strategies', 'value': 'Re-engagement strategies determined'}
personalize_reengagement_message
script

Generate personalized messages for each deal

Task Outputs: {'name': 'personalized_messages', 'value': 'Personalized messages generated'}
send_whatsapp_reengagement
script

Send re-engagement message via WhatsApp

Task Outputs: {'name': 'whatsapp_sent', 'value': 'WhatsApp re-engagement sent'}
send_email_reengagement
script

Send re-engagement message via Email

Task Outputs: {'name': 'email_sent', 'value': 'Email re-engagement sent'}
schedule_followup_call
script

Schedule follow-up call for phone preference

Task Outputs: {'name': 'call_scheduled', 'value': 'Follow-up call scheduled'}
update_deal_with_reengagement_activity
script

Log re-engagement activities in deal records

Task Outputs: {'name': 'deal_updates', 'value': 'Deals updated with re-engagement activities'}
create_sales_alert
script

Create alerts for sales officers about re-engagement

Task Outputs: {'name': 'sales_alerts', 'value': 'Sales alerts created'}
track_engagement_response
script

Monitor and track customer responses to re-engagement

Task Outputs: {'name': 'tracking_setup', 'value': 'Engagement response tracking configured'}
update_reengagement_success_metrics
script

Update analytics with campaign performance

Task Outputs: {'name': 'success_metrics', 'value': 'Re-engagement success metrics updated'}
schedule_escalation_if_no_response
script

Set up automatic escalation for non-responsive customers

Task Outputs: {'name': 'escalation_schedules', 'value': 'Escalations scheduled for non-responsive customers'}
end_no_action_needed
script

Complete workflow when no stalled deals found

Task Outputs: {'name': 'no_action_result', 'value': 'Workflow completed - no action needed'}
Triggers
Scheduled Trigger: Scheduled Stalled Deal Scan
Manual Trigger: Manual Re-engagement Trigger
Webhook Trigger: Deal Stall Detection
POST /webhook/deal-stalled
YAML Source
id: lead_dropoff_reengagement_workflow
name: Lead Drop-off Re-engagement Workflow
tasks:
- id: get_stalled_deals_from_crm
  name: Get Stalled Deals from CRM
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\nfrom\
    \ datetime import timedelta\n\nprint(\"\U0001F50D Scanning CRM for stalled deals...\"\
    )\n\n# Mock stalled deals data\nstalled_deals = {\n    \"total_stalled_deals\"\
    : 3,\n    \"deals\": [\n        {\n            \"deal_id\": \"DEAL_2025_001100\"\
    ,\n            \"customer_id\": \"CUST_456\",\n            \"customer_name\":\
    \ \"InnovateTech Corp\",\n            \"customer_phone\": \"+1234567890\",\n \
    \           \"customer_email\": \"contact@innovatetech.com\",\n            \"\
    deal_name\": \"Enterprise Software License\",\n            \"estimated_value\"\
    : 125000.00,\n            \"probability\": 0.60,\n            \"current_stage\"\
    : \"negotiation\",\n            \"assigned_officer\": \"OFF_001\",\n         \
    \   \"created_at\": \"2025-05-15T10:00:00Z\",\n            \"last_activity\":\
    \ \"2025-06-18T16:30:00Z\",\n            \"days_stalled\": 8,\n            \"\
    preferred_channel\": \"whatsapp\"\n        },\n        {\n            \"deal_id\"\
    : \"DEAL_2025_001101\",\n            \"customer_id\": \"CUST_457\",\n        \
    \    \"customer_name\": \"TechFlow Solutions\",\n            \"customer_phone\"\
    : \"+1987654321\",\n            \"customer_email\": \"admin@techflow.com\",\n\
    \            \"deal_name\": \"CRM Implementation\",\n            \"estimated_value\"\
    : 87500.00,\n            \"probability\": 0.45,\n            \"current_stage\"\
    : \"proposal\",\n            \"assigned_officer\": \"OFF_002\",\n            \"\
    created_at\": \"2025-06-01T14:00:00Z\",\n            \"last_activity\": \"2025-06-17T11:45:00Z\"\
    ,\n            \"days_stalled\": 9,\n            \"preferred_channel\": \"email\"\
    \n        },\n        {\n            \"deal_id\": \"DEAL_2025_001102\",\n    \
    \        \"customer_id\": \"CUST_458\",\n            \"customer_name\": \"Digital\
    \ Dynamics\",\n            \"customer_phone\": \"+1555123456\",\n            \"\
    customer_email\": \"sales@digitaldynamics.com\",\n            \"deal_name\": \"\
    Analytics Platform\",\n            \"estimated_value\": 95000.00,\n          \
    \  \"probability\": 0.55,\n            \"current_stage\": \"closing\",\n     \
    \       \"assigned_officer\": \"OFF_001\",\n            \"created_at\": \"2025-05-20T09:30:00Z\"\
    ,\n            \"last_activity\": \"2025-06-16T15:20:00Z\",\n            \"days_stalled\"\
    : 10,\n            \"preferred_channel\": \"phone\"\n        }\n    ]\n}\n\nprint(f\"\
    \u2705 Found {stalled_deals['total_stalled_deals']} stalled deals\")\nfor deal\
    \ in stalled_deals['deals']:\n    print(f\"   \u2022 {deal['customer_name']}:\
    \ ${deal['estimated_value']:,.0f} - {deal['days_stalled']} days stalled\")\n\n\
    print(f\"__OUTPUTS__ {json.dumps(stalled_deals)}\")\n"
  outputs:
  - name: stalled_deals_data
    value: Stalled deals retrieved from CRM
  packages:
  - json==2.0.9
  - datetime
  description: Scan CRM for deals that have been stalled
- id: check_stalled_deals_found
  name: Check if Stalled Deals Found
  type: script
  script: "#!/usr/bin/env python3\nimport json\n\n# Mock check for stalled deals\n\
    total_deals = 3  # From get_stalled_deals_from_crm\n\nresult = {\n    \"stalled_deals_found\"\
    : total_deals > 0,\n    \"deals_count\": total_deals,\n    \"action_needed\":\
    \ total_deals > 0\n}\n\nif result[\"stalled_deals_found\"]:\n    print(f\"\U0001F6A8\
    \ {total_deals} stalled deals require re-engagement\")\nelse:\n    print(\"\u2705\
    \ No stalled deals found - no action needed\")\n\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  outputs:
  - name: deals_check_result
    value: Stalled deals check completed
  packages:
  - json==2.0.9
  depends_on:
  - get_stalled_deals_from_crm
  description: Determine if any stalled deals need processing
- id: get_customer_interaction_timeline
  name: Get Customer Interaction Timeline
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\nfrom\
    \ datetime import timedelta\n\nprint(\"\U0001F4CA Retrieving customer interaction\
    \ timelines...\")\n\n# Mock interaction timeline data\ninteraction_timelines =\
    \ [\n    {\n        \"customer_id\": \"CUST_456\",\n        \"customer_name\"\
    : \"InnovateTech Corp\",\n        \"total_interactions\": 15,\n        \"touchpoint_history\"\
    : [\n            {\n                \"date\": \"2025-06-18T16:30:00Z\",\n    \
    \            \"type\": \"email\",\n                \"direction\": \"outbound\"\
    ,\n                \"response_received\": False\n            },\n            {\n\
    \                \"date\": \"2025-06-15T14:20:00Z\",\n                \"type\"\
    : \"phone_call\",\n                \"direction\": \"outbound\",\n            \
    \    \"response_received\": False\n            },\n            {\n           \
    \     \"date\": \"2025-06-12T10:15:00Z\",\n                \"type\": \"meeting\"\
    ,\n                \"direction\": \"scheduled\",\n                \"response_received\"\
    : True,\n                \"outcome\": \"positive\"\n            }\n        ],\n\
    \        \"response_patterns\": {\n            \"response_rate\": 0.33,\n    \
    \        \"preferred_channels\": [\"whatsapp\", \"meeting\"],\n            \"\
    best_contact_times\": [\"10:00\", \"14:00\"],\n            \"avg_response_time\"\
    : \"4.2 hours\"\n        }\n    },\n    {\n        \"customer_id\": \"CUST_457\"\
    ,\n        \"customer_name\": \"TechFlow Solutions\",\n        \"total_interactions\"\
    : 12,\n        \"response_patterns\": {\n            \"response_rate\": 0.58,\n\
    \            \"preferred_channels\": [\"email\", \"phone\"],\n            \"best_contact_times\"\
    : [\"09:00\", \"15:00\"],\n            \"avg_response_time\": \"2.8 hours\"\n\
    \        }\n    },\n    {\n        \"customer_id\": \"CUST_458\",\n        \"\
    customer_name\": \"Digital Dynamics\",\n        \"total_interactions\": 18,\n\
    \        \"response_patterns\": {\n            \"response_rate\": 0.44,\n    \
    \        \"preferred_channels\": [\"phone\", \"meeting\"],\n            \"best_contact_times\"\
    : [\"11:00\", \"16:00\"],\n            \"avg_response_time\": \"6.1 hours\"\n\
    \        }\n    }\n]\n\nprint(f\"\u2705 Retrieved interaction timelines for {len(interaction_timelines)}\
    \ customers\")\nfor timeline in interaction_timelines:\n    print(f\"   \u2022\
    \ {timeline['customer_name']}: {timeline['response_patterns']['response_rate']*100:.0f}%\
    \ response rate\")\n\nprint(f\"__OUTPUTS__ {json.dumps(interaction_timelines)}\"\
    )\n"
  outputs:
  - name: interaction_timelines
    value: Customer interaction timelines retrieved
  packages:
  - json==2.0.9
  condition: ${deals_check_result.stalled_deals_found} == true
  depends_on:
  - check_stalled_deals_found
  description: Retrieve interaction history for stalled deals
- id: get_deal_stage_history
  name: Get Deal Stage History
  type: script
  script: "#!/usr/bin/env python3\nimport json\n\nprint(\"\U0001F4C8 Analyzing deal\
    \ stage progression...\")\n\n# Mock deal stage history\ndeal_stage_histories =\
    \ [\n    {\n        \"deal_id\": \"DEAL_2025_001100\",\n        \"customer_name\"\
    : \"InnovateTech Corp\",\n        \"current_stage\": \"negotiation\",\n      \
    \  \"stage_progression\": [\n            {\n                \"stage\": \"qualified\"\
    ,\n                \"duration_days\": 5,\n                \"activities_count\"\
    : 8,\n                \"progression_smooth\": True\n            },\n         \
    \   {\n                \"stage\": \"proposal\",\n                \"duration_days\"\
    : 12,\n                \"activities_count\": 15,\n                \"progression_smooth\"\
    : True\n            },\n            {\n                \"stage\": \"negotiation\"\
    ,\n                \"duration_days\": 15,\n                \"activities_count\"\
    : 6,\n                \"progression_smooth\": False\n            }\n        ],\n\
    \        \"bottlenecks\": [\"budget_approval\", \"technical_concerns\"],\n   \
    \     \"time_in_current_stage\": 15,\n        \"typical_stage_duration\": 8\n\
    \    },\n    {\n        \"deal_id\": \"DEAL_2025_001101\",\n        \"customer_name\"\
    : \"TechFlow Solutions\",\n        \"current_stage\": \"proposal\",\n        \"\
    time_in_current_stage\": 18,\n        \"typical_stage_duration\": 10,\n      \
    \  \"bottlenecks\": [\"feature_requirements\", \"competitor_comparison\"]\n  \
    \  },\n    {\n        \"deal_id\": \"DEAL_2025_001102\",\n        \"customer_name\"\
    : \"Digital Dynamics\",\n        \"current_stage\": \"closing\",\n        \"time_in_current_stage\"\
    : 12,\n        \"typical_stage_duration\": 5,\n        \"bottlenecks\": [\"contract_terms\"\
    , \"legal_review\"]\n    }\n]\n\nprint(f\"\u2705 Analyzed stage history for {len(deal_stage_histories)}\
    \ deals\")\nfor history in deal_stage_histories:\n    print(f\"   \u2022 {history['customer_name']}:\
    \ {history['time_in_current_stage']} days in {history['current_stage']}\")\n\n\
    print(f\"__OUTPUTS__ {json.dumps(deal_stage_histories)}\")\n"
  outputs:
  - name: stage_histories
    value: Deal stage histories analyzed
  packages:
  - json==2.0.9
  depends_on:
  - get_customer_interaction_timeline
  description: Analyze deal progression through stages
- id: get_competitor_intelligence
  name: Get Competitor Intelligence
  type: script
  script: "#!/usr/bin/env python3\nimport json\n\nprint(\"\U0001F50D Gathering competitor\
    \ intelligence...\")\n\n# Mock competitor intelligence\ncompetitor_intelligence\
    \ = {\n    \"market_conditions\": {\n        \"industry_growth\": 0.15,\n    \
    \    \"competitive_intensity\": 0.73,\n        \"market_sentiment\": \"positive\"\
    ,\n        \"seasonal_factor\": 1.08\n    },\n    \"competitor_activity\": [\n\
    \        {\n            \"competitor\": \"CompetitorA\",\n            \"recent_activities\"\
    : [\"pricing_reduction\", \"feature_enhancement\"],\n            \"market_share\"\
    : 0.28,\n            \"threat_level\": \"high\"\n        },\n        {\n     \
    \       \"competitor\": \"CompetitorB\",\n            \"recent_activities\": [\"\
    new_partnership\", \"customer_wins\"],\n            \"market_share\": 0.19,\n\
    \            \"threat_level\": \"medium\"\n        }\n    ],\n    \"urgency_triggers\"\
    : [\n        \"end_of_quarter_budgets\",\n        \"competitor_aggressive_pricing\"\
    ,\n        \"new_feature_launches\"\n    ],\n    \"market_events\": [\n      \
    \  {\n            \"event\": \"industry_conference\",\n            \"date\": \"\
    2025-07-15\",\n            \"impact\": \"high_visibility_opportunity\"\n     \
    \   }\n    ]\n}\n\nprint(f\"\u2705 Competitor intelligence gathered\")\nprint(f\"\
    \   Market growth: {competitor_intelligence['market_conditions']['industry_growth']*100:.1f}%\"\
    )\nprint(f\"   Competitive intensity: {competitor_intelligence['market_conditions']['competitive_intensity']*100:.0f}%\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(competitor_intelligence)}\")\n"
  outputs:
  - name: competitor_data
    value: Competitor intelligence gathered
  packages:
  - json==2.0.9
  depends_on:
  - get_deal_stage_history
  description: Gather market and competitor information
- id: analyze_stall_reasons
  name: Analyze Stall Reasons
  type: script
  script: "#!/usr/bin/env python3\nimport json\n\nprint(\"\U0001F916 Analyzing stall\
    \ reasons with AI...\")\n\n# Mock AI stall analysis\nstall_analyses = [\n    {\n\
    \        \"deal_id\": \"DEAL_2025_001100\",\n        \"customer_name\": \"InnovateTech\
    \ Corp\",\n        \"primary_stall_reason\": \"budget_approval_delay\",\n    \
    \    \"confidence_score\": 0.87,\n        \"contributing_factors\": [\n      \
    \      {\n                \"factor\": \"end_of_quarter_budget_constraints\",\n\
    \                \"weight\": 0.35\n            },\n            {\n           \
    \     \"factor\": \"multiple_stakeholder_approval_needed\",\n                \"\
    weight\": 0.25\n            },\n            {\n                \"factor\": \"\
    competitor_evaluation_in_progress\",\n                \"weight\": 0.20\n     \
    \       }\n        ],\n        \"risk_level\": \"medium\",\n        \"probability_of_loss\"\
    : 0.35\n    },\n    {\n        \"deal_id\": \"DEAL_2025_001101\",\n        \"\
    customer_name\": \"TechFlow Solutions\",\n        \"primary_stall_reason\": \"\
    feature_gap_concerns\",\n        \"confidence_score\": 0.92,\n        \"risk_level\"\
    : \"high\",\n        \"probability_of_loss\": 0.45\n    },\n    {\n        \"\
    deal_id\": \"DEAL_2025_001102\",\n        \"customer_name\": \"Digital Dynamics\"\
    ,\n        \"primary_stall_reason\": \"contract_negotiation_complexity\",\n  \
    \      \"confidence_score\": 0.78,\n        \"risk_level\": \"medium\",\n    \
    \    \"probability_of_loss\": 0.28\n    }\n]\n\nprint(f\"\u2705 Analyzed stall\
    \ reasons for {len(stall_analyses)} deals\")\nfor analysis in stall_analyses:\n\
    \    print(f\"   \u2022 {analysis['customer_name']}: {analysis['primary_stall_reason']}\
    \ (Risk: {analysis['risk_level']})\")\n\nprint(f\"__OUTPUTS__ {json.dumps(stall_analyses)}\"\
    )\n"
  outputs:
  - name: stall_analysis_results
    value: Stall reasons analyzed
  packages:
  - json==2.0.9
  depends_on:
  - get_competitor_intelligence
  description: AI analysis of why deals have stalled
- id: determine_reengagement_strategy
  name: Determine Re-engagement Strategy
  type: script
  script: "#!/usr/bin/env python3\nimport json\n\nprint(\"\U0001F3AF Determining re-engagement\
    \ strategies...\")\n\n# Mock strategy determination\nreengagement_strategies =\
    \ [\n    {\n        \"deal_id\": \"DEAL_2025_001100\",\n        \"customer_name\"\
    : \"InnovateTech Corp\",\n        \"recommended_strategy\": \"value_reinforcement_with_urgency\"\
    ,\n        \"channel_priority\": [\"whatsapp\", \"email\", \"phone\"],\n     \
    \   \"message_strategy\": \"roi_focused_with_timeline_pressure\",\n        \"\
    timing_recommendation\": \"immediate\",\n        \"success_probability\": 0.68,\n\
    \        \"key_messages\": [\n            \"Emphasize ROI and cost savings\",\n\
    \            \"Create urgency with quarter-end pricing\",\n            \"Address\
    \ budget approval process\"\n        ]\n    },\n    {\n        \"deal_id\": \"\
    DEAL_2025_001101\",\n        \"customer_name\": \"TechFlow Solutions\",\n    \
    \    \"recommended_strategy\": \"feature_gap_resolution\",\n        \"channel_priority\"\
    : [\"email\", \"phone\", \"meeting\"],\n        \"message_strategy\": \"technical_solution_focused\"\
    ,\n        \"timing_recommendation\": \"within_24_hours\",\n        \"success_probability\"\
    : 0.58,\n        \"key_messages\": [\n            \"Address specific feature concerns\"\
    ,\n            \"Offer technical deep-dive session\",\n            \"Highlight\
    \ recent product enhancements\"\n        ]\n    },\n    {\n        \"deal_id\"\
    : \"DEAL_2025_001102\",\n        \"customer_name\": \"Digital Dynamics\",\n  \
    \      \"recommended_strategy\": \"executive_intervention\",\n        \"channel_priority\"\
    : [\"phone\", \"meeting\", \"email\"],\n        \"message_strategy\": \"relationship_based_with_flexibility\"\
    ,\n        \"timing_recommendation\": \"within_48_hours\",\n        \"success_probability\"\
    : 0.72,\n        \"key_messages\": [\n            \"Involve executive leadership\"\
    ,\n            \"Offer contract flexibility\",\n            \"Emphasize strategic\
    \ partnership\"\n        ]\n    }\n]\n\nprint(f\"\u2705 Strategies determined\
    \ for {len(reengagement_strategies)} deals\")\nfor strategy in reengagement_strategies:\n\
    \    print(f\"   \u2022 {strategy['customer_name']}: {strategy['recommended_strategy']}\
    \ ({strategy['success_probability']*100:.0f}% success rate)\")\n\nprint(f\"__OUTPUTS__\
    \ {json.dumps(reengagement_strategies)}\")\n"
  outputs:
  - name: reengagement_strategies
    value: Re-engagement strategies determined
  packages:
  - json==2.0.9
  depends_on:
  - analyze_stall_reasons
  description: AI-powered strategy selection for re-engagement
- id: personalize_reengagement_message
  name: Personalize Re-engagement Message
  type: script
  script: "#!/usr/bin/env python3\nimport json\n\nprint(\"\u270D\uFE0F Personalizing\
    \ re-engagement messages...\")\n\n# Mock personalized messages\npersonalized_messages\
    \ = [\n    {\n        \"deal_id\": \"DEAL_2025_001100\",\n        \"customer_name\"\
    : \"InnovateTech Corp\",\n        \"preferred_channel\": \"whatsapp\",\n     \
    \   \"personalized_message\": \"Hi there! I wanted to follow up on our Enterprise\
    \ Software proposal. I understand budget approvals can take time, especially toward\
    \ quarter-end. Our solution could save InnovateTech 25% on operational costs -\
    \ would a quick 15-min call help address any remaining questions? We have special\
    \ Q2 pricing available until June 30th.\",\n        \"subject_line\": \"Quick\
    \ question about your Enterprise Software decision\",\n        \"call_to_action\"\
    : \"Schedule 15-minute call\",\n        \"personalization_elements\": [\n    \
    \        \"company_name_mention\",\n            \"budget_approval_acknowledgment\"\
    ,\n            \"specific_roi_metric\",\n            \"urgency_with_deadline\"\
    \n        ]\n    },\n    {\n        \"deal_id\": \"DEAL_2025_001101\",\n     \
    \   \"customer_name\": \"TechFlow Solutions\",\n        \"preferred_channel\"\
    : \"email\",\n        \"personalized_message\": \"Hi! I've been thinking about\
    \ the feature requirements we discussed for your CRM implementation. Our development\
    \ team has made some exciting enhancements that directly address the workflow\
    \ automation concerns you mentioned. Would you be interested in a technical demo\
    \ to see these new capabilities? I believe they'll exceed your expectations.\"\
    ,\n        \"subject_line\": \"New CRM features that address your workflow concerns\"\
    ,\n        \"call_to_action\": \"Schedule technical demo\"\n    },\n    {\n  \
    \      \"deal_id\": \"DEAL_2025_001102\",\n        \"customer_name\": \"Digital\
    \ Dynamics\",\n        \"preferred_channel\": \"phone\",\n        \"personalized_message\"\
    : \"I wanted to personally reach out about the Analytics Platform contract. I\
    \ understand legal reviews can be complex, and we're committed to making this\
    \ work for Digital Dynamics. Our CEO would be happy to join a call to discuss\
    \ how we can structure this as a strategic partnership. When would be a good time\
    \ to connect?\",\n        \"subject_line\": \"Strategic partnership discussion\
    \ - Analytics Platform\",\n        \"call_to_action\": \"Schedule executive call\"\
    \n    }\n]\n\nprint(f\"\u2705 Personalized messages created for {len(personalized_messages)}\
    \ deals\")\nfor message in personalized_messages:\n    print(f\"   \u2022 {message['customer_name']}:\
    \ {message['preferred_channel']} message ready\")\n\nprint(f\"__OUTPUTS__ {json.dumps(personalized_messages)}\"\
    )\n"
  outputs:
  - name: personalized_messages
    value: Personalized messages generated
  packages:
  - json==2.0.9
  depends_on:
  - determine_reengagement_strategy
  description: Generate personalized messages for each deal
- id: send_whatsapp_reengagement
  name: Send WhatsApp Re-engagement
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\n\n\
    print(\"\U0001F4F1 Sending WhatsApp re-engagement message...\")\n\n# Mock WhatsApp\
    \ sending\nwhatsapp_result = {\n    \"message_id\": \"wamid.HBgLMTIzNDU2Nzg5MDE_reeng...\"\
    ,\n    \"customer_phone\": \"+1234567890\",\n    \"customer_name\": \"InnovateTech\
    \ Corp\",\n    \"message_sent\": True,\n    \"sent_at\": datetime.now().isoformat(),\n\
    \    \"delivery_status\": \"sent\",\n    \"campaign_id\": \"REENG_WA_001\",\n\
    \    \"estimated_delivery\": \"immediate\",\n    \"tracking_enabled\": True,\n\
    \    \"response_expected\": True\n}\n\nprint(f\"\u2705 WhatsApp message sent to\
    \ {whatsapp_result['customer_name']}\")\nprint(f\"   Message ID: {whatsapp_result['message_id']}\"\
    )\nprint(f\"   Status: {whatsapp_result['delivery_status']}\")\n\nprint(f\"__OUTPUTS__\
    \ {json.dumps(whatsapp_result)}\")\n"
  outputs:
  - name: whatsapp_sent
    value: WhatsApp re-engagement sent
  packages:
  - json==2.0.9
  condition: ${personalized_messages[0].preferred_channel} == 'whatsapp'
  depends_on:
  - personalize_reengagement_message
  description: Send re-engagement message via WhatsApp
- id: send_email_reengagement
  name: Send Email Re-engagement
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\n\n\
    print(\"\U0001F4E7 Sending Email re-engagement message...\")\n\n# Mock email sending\n\
    email_result = {\n    \"message_id\": \"MSG_2025_067891\",\n    \"customer_email\"\
    : \"admin@techflow.com\",\n    \"customer_name\": \"TechFlow Solutions\",\n  \
    \  \"subject\": \"New CRM features that address your workflow concerns\",\n  \
    \  \"sent_at\": datetime.now().isoformat(),\n    \"delivery_status\": \"sent\"\
    ,\n    \"campaign_id\": \"REENG_EMAIL_001\",\n    \"tracking_enabled\": True,\n\
    \    \"read_receipt_requested\": True,\n    \"estimated_delivery\": \"immediate\"\
    \n}\n\nprint(f\"\u2705 Email sent to {email_result['customer_name']}\")\nprint(f\"\
    \   Subject: {email_result['subject']}\")\nprint(f\"   Message ID: {email_result['message_id']}\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(email_result)}\")\n"
  outputs:
  - name: email_sent
    value: Email re-engagement sent
  packages:
  - json==2.0.9
  condition: ${personalized_messages[1].preferred_channel} == 'email'
  depends_on:
  - personalize_reengagement_message
  description: Send re-engagement message via Email
- id: schedule_followup_call
  name: Schedule Follow-up Call
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\nfrom\
    \ datetime import timedelta\n\nprint(\"\U0001F4DE Scheduling follow-up call...\"\
    )\n\n# Mock call scheduling\ncall_schedule = {\n    \"task_id\": \"CALL_2025_001789\"\
    ,\n    \"customer_name\": \"Digital Dynamics\",\n    \"customer_phone\": \"+1555123456\"\
    ,\n    \"assigned_to\": \"OFF_001\",\n    \"call_type\": \"reengagement_executive\"\
    ,\n    \"scheduled_for\": (datetime.now() + timedelta(hours=24)).isoformat(),\n\
    \    \"priority\": \"high\",\n    \"call_purpose\": \"Contract negotiation resolution\"\
    ,\n    \"expected_duration\": 30,\n    \"executive_involvement\": True,\n    \"\
    preparation_notes\": \"Review contract terms, prepare flexibility options\"\n\
    }\n\nprint(f\"\u2705 Call scheduled for {call_schedule['customer_name']}\")\n\
    print(f\"   Scheduled: {call_schedule['scheduled_for']}\")\nprint(f\"   Type:\
    \ {call_schedule['call_type']}\")\n\nprint(f\"__OUTPUTS__ {json.dumps(call_schedule)}\"\
    )\n"
  outputs:
  - name: call_scheduled
    value: Follow-up call scheduled
  packages:
  - json==2.0.9
  condition: ${personalized_messages[2].preferred_channel} == 'phone'
  depends_on:
  - personalize_reengagement_message
  description: Schedule follow-up call for phone preference
- id: update_deal_with_reengagement_activity
  name: Update Deal with Re-engagement Activity
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime, timedelta\n\
    \nprint(\"\U0001F4DD Updating deals with re-engagement activities...\")\n\n# Mock\
    \ deal updates\ndeal_updates = [\n    {\n        \"deal_id\": \"DEAL_2025_001100\"\
    ,\n        \"customer_name\": \"InnovateTech Corp\",\n        \"activity_type\"\
    : \"ai_reengagement\",\n        \"channel_used\": \"whatsapp\",\n        \"activity_logged\"\
    : True,\n        \"updated_at\": datetime.now().isoformat(),\n        \"next_follow_up\"\
    : (datetime.now() + timedelta(days=3)).isoformat(),\n        \"reengagement_attempt\"\
    : 1,\n        \"campaign_id\": \"REENG_WA_001\"\n    },\n    {\n        \"deal_id\"\
    : \"DEAL_2025_001101\",\n        \"customer_name\": \"TechFlow Solutions\",\n\
    \        \"activity_type\": \"ai_reengagement\",\n        \"channel_used\": \"\
    email\",\n        \"activity_logged\": True,\n        \"updated_at\": datetime.now().isoformat(),\n\
    \        \"campaign_id\": \"REENG_EMAIL_001\"\n    },\n    {\n        \"deal_id\"\
    : \"DEAL_2025_001102\",\n        \"customer_name\": \"Digital Dynamics\",\n  \
    \      \"activity_type\": \"ai_reengagement\",\n        \"channel_used\": \"phone_scheduled\"\
    ,\n        \"activity_logged\": True,\n        \"updated_at\": datetime.now().isoformat(),\n\
    \        \"call_scheduled\": True\n    }\n]\n\nprint(f\"\u2705 Updated {len(deal_updates)}\
    \ deals with re-engagement activities\")\nfor update in deal_updates:\n    print(f\"\
    \   \u2022 {update['customer_name']}: {update['channel_used']} activity logged\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(deal_updates)}\")\n"
  outputs:
  - name: deal_updates
    value: Deals updated with re-engagement activities
  packages:
  - json==2.0.9
  depends_on:
  - send_whatsapp_reengagement
  - send_email_reengagement
  - schedule_followup_call
  description: Log re-engagement activities in deal records
- id: create_sales_alert
  name: Create Sales Alert
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\n\n\
    print(\"\U0001F6A8 Creating sales alerts...\")\n\n# Mock sales alerts\nsales_alerts\
    \ = [\n    {\n        \"alert_id\": \"ALERT_2025_004567\",\n        \"officer_id\"\
    : \"OFF_001\",\n        \"alert_type\": \"reengagement_sent\",\n        \"severity\"\
    : \"medium\",\n        \"deal_id\": \"DEAL_2025_001100\",\n        \"customer_name\"\
    : \"InnovateTech Corp\",\n        \"message\": \"Re-engagement WhatsApp sent to\
    \ InnovateTech Corp. Deal stalled 8 days, $125K value. Monitor for response.\"\
    ,\n        \"created_at\": datetime.now().isoformat(),\n        \"auto_escalate\"\
    : True,\n        \"escalate_after_hours\": 48,\n        \"recommended_actions\"\
    : [\n            \"monitor_whatsapp_response\",\n            \"prepare_followup_call\"\
    \n        ]\n    },\n    {\n        \"alert_id\": \"ALERT_2025_004568\",\n   \
    \     \"officer_id\": \"OFF_002\",\n        \"alert_type\": \"reengagement_sent\"\
    ,\n        \"severity\": \"high\",\n        \"deal_id\": \"DEAL_2025_001101\"\
    ,\n        \"customer_name\": \"TechFlow Solutions\",\n        \"message\": \"\
    Re-engagement email sent to TechFlow Solutions. Technical demo required. $87.5K\
    \ value.\",\n        \"created_at\": datetime.now().isoformat()\n    }\n]\n\n\
    print(f\"\u2705 Created {len(sales_alerts)} sales alerts\")\nfor alert in sales_alerts:\n\
    \    print(f\"   \u2022 {alert['customer_name']}: {alert['severity']} priority\
    \ alert\")\n\nprint(f\"__OUTPUTS__ {json.dumps(sales_alerts)}\")\n"
  outputs:
  - name: sales_alerts
    value: Sales alerts created
  packages:
  - json==2.0.9
  depends_on:
  - update_deal_with_reengagement_activity
  description: Create alerts for sales officers about re-engagement
- id: track_engagement_response
  name: Track Engagement Response
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\n\n\
    print(\"\U0001F4CA Setting up engagement response tracking...\")\n\n# Mock tracking\
    \ setup\ntracking_setup = {\n    \"tracking_active\": True,\n    \"campaigns_monitored\"\
    : 3,\n    \"tracking_configs\": [\n        {\n            \"campaign_id\": \"\
    REENG_WA_001\",\n            \"customer_id\": \"CUST_456\",\n            \"channel\"\
    : \"whatsapp\",\n            \"tracking_duration_hours\": 72,\n            \"\
    response_indicators\": [\"message_read\", \"reply_received\", \"call_requested\"\
    ],\n            \"auto_escalation\": True\n        },\n        {\n           \
    \ \"campaign_id\": \"REENG_EMAIL_001\",\n            \"customer_id\": \"CUST_457\"\
    ,\n            \"channel\": \"email\",\n            \"tracking_duration_hours\"\
    : 48,\n            \"response_indicators\": [\"email_opened\", \"link_clicked\"\
    , \"reply_received\"]\n        }\n    ],\n    \"tracking_metrics\": {\n      \
    \  \"response_rate_target\": 0.35,\n        \"engagement_score_threshold\": 0.60,\n\
    \        \"success_indicators\": [\"meeting_scheduled\", \"proposal_requested\"\
    , \"positive_sentiment\"]\n    }\n}\n\nprint(f\"\u2705 Tracking setup for {tracking_setup['campaigns_monitored']}\
    \ campaigns\")\nprint(f\"   Target response rate: {tracking_setup['tracking_metrics']['response_rate_target']*100:.0f}%\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(tracking_setup)}\")\n"
  outputs:
  - name: tracking_setup
    value: Engagement response tracking configured
  packages:
  - json==2.0.9
  depends_on:
  - create_sales_alert
  description: Monitor and track customer responses to re-engagement
- id: update_reengagement_success_metrics
  name: Update Re-engagement Success Metrics
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\n\n\
    print(\"\U0001F4C8 Updating re-engagement success metrics...\")\n\n# Mock metrics\
    \ update\nmetrics_update = {\n    \"campaign_batch_id\": \"BATCH_2025_06_25\"\
    ,\n    \"campaigns_sent\": 3,\n    \"total_revenue_at_risk\": 307500.00,\n   \
    \ \"channels_used\": {\n        \"whatsapp\": 1,\n        \"email\": 1,\n    \
    \    \"phone_scheduled\": 1\n    },\n    \"expected_metrics\": {\n        \"response_rate\"\
    : 0.33,\n        \"conversion_rate\": 0.25,\n        \"revenue_recovery_rate\"\
    : 0.28\n    },\n    \"historical_performance\": {\n        \"campaigns_this_month\"\
    : 48,\n        \"success_rate\": 0.31,\n        \"avg_response_time\": \"3.2 hours\"\
    ,\n        \"revenue_recovered_month\": 1250000.00,\n        \"roi\": 15.2\n \
    \   },\n    \"updated_at\": datetime.now().isoformat(),\n    \"next_analysis_scheduled\"\
    : \"2025-06-28T09:00:00Z\"\n}\n\nprint(f\"\u2705 Metrics updated for batch {metrics_update['campaign_batch_id']}\"\
    )\nprint(f\"   Revenue at risk: ${metrics_update['total_revenue_at_risk']:,.0f}\"\
    )\nprint(f\"   Expected recovery rate: {metrics_update['expected_metrics']['revenue_recovery_rate']*100:.0f}%\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(metrics_update)}\")\n"
  outputs:
  - name: success_metrics
    value: Re-engagement success metrics updated
  packages:
  - json==2.0.9
  depends_on:
  - track_engagement_response
  description: Update analytics with campaign performance
- id: schedule_escalation_if_no_response
  name: Schedule Escalation if No Response
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\nfrom\
    \ datetime import timedelta\n\nprint(\"\u23F0 Scheduling escalations for non-responsive\
    \ customers...\")\n\n# Mock escalation scheduling\nescalation_schedules = [\n\
    \    {\n        \"escalation_id\": \"ESC_2025_006789\",\n        \"deal_id\":\
    \ \"DEAL_2025_001100\",\n        \"customer_name\": \"InnovateTech Corp\",\n \
    \       \"escalation_type\": \"no_response_followup\",\n        \"trigger_after_hours\"\
    : 48,\n        \"scheduled_for\": (datetime.now() + timedelta(hours=48)).isoformat(),\n\
    \        \"escalate_to\": \"MANAGER_001\",\n        \"escalation_actions\": [\n\
    \            \"manager_personal_outreach\",\n            \"executive_involvement_consideration\"\
    ,\n            \"account_strategy_review\"\n        ],\n        \"deal_value\"\
    : 125000.00,\n        \"auto_cancel_conditions\": [\"customer_responds\", \"meeting_scheduled\"\
    ]\n    },\n    {\n        \"escalation_id\": \"ESC_2025_006790\",\n        \"\
    deal_id\": \"DEAL_2025_001101\",\n        \"customer_name\": \"TechFlow Solutions\"\
    ,\n        \"trigger_after_hours\": 72,\n        \"scheduled_for\": (datetime.now()\
    \ + timedelta(hours=72)).isoformat(),\n        \"escalate_to\": \"VP_SALES\",\n\
    \        \"deal_value\": 87500.00\n    },\n    {\n        \"escalation_id\": \"\
    ESC_2025_006791\",\n        \"deal_id\": \"DEAL_2025_001102\",\n        \"customer_name\"\
    : \"Digital Dynamics\",\n        \"trigger_after_hours\": 24,\n        \"scheduled_for\"\
    : (datetime.now() + timedelta(hours=24)).isoformat(),\n        \"escalate_to\"\
    : \"MANAGER_001\",\n        \"deal_value\": 95000.00,\n        \"priority\": \"\
    high\"\n    }\n]\n\nprint(f\"\u2705 Scheduled {len(escalation_schedules)} escalations\"\
    )\nfor escalation in escalation_schedules:\n    print(f\"   \u2022 {escalation['customer_name']}:\
    \ {escalation['trigger_after_hours']}h escalation to {escalation['escalate_to']}\"\
    )\n\nprint(f\"__OUTPUTS__ {json.dumps(escalation_schedules)}\")\n"
  outputs:
  - name: escalation_schedules
    value: Escalations scheduled for non-responsive customers
  packages:
  - json==2.0.9
  depends_on:
  - update_reengagement_success_metrics
  description: Set up automatic escalation for non-responsive customers
- id: end_no_action_needed
  name: End - No Action Needed
  type: script
  script: "#!/usr/bin/env python3\nimport json\nfrom datetime import datetime\nfrom\
    \ datetime import timedelta\n\nprint(\"\u2705 No stalled deals found - No action\
    \ needed\")\n\nresult = {\n    \"workflow_outcome\": \"no_action_needed\",\n \
    \   \"stalled_deals_found\": 0,\n    \"next_scan_scheduled\": (datetime.now()\
    \ + timedelta(hours=4)).isoformat(),\n    \"completed_at\": datetime.now().isoformat(),\n\
    \    \"message\": \"All deals are progressing normally\"\n}\n\nprint(f\"Next scan\
    \ scheduled for: {result['next_scan_scheduled']}\")\nprint(f\"__OUTPUTS__ {json.dumps(result)}\"\
    )\n"
  outputs:
  - name: no_action_result
    value: Workflow completed - no action needed
  packages:
  - json==2.0.9
  condition: ${deals_check_result.stalled_deals_found} == false
  depends_on:
  - check_stalled_deals_found
  description: Complete workflow when no stalled deals found
inputs:
- name: scan_interval_hours
  type: integer
  default: 4
  description: Hours between scans for stalled deals
- name: stall_threshold_days
  type: integer
  default: 7
  description: Days of inactivity to consider deal stalled
outputs:
  stalled_deals:
    type: object
    source: get_stalled_deals_from_crm
    description: Stalled deals identified
  escalation_setup:
    type: object
    source: schedule_escalation_if_no_response
    description: Escalation schedules created
  reengagement_results:
    type: object
    source: update_deal_with_reengagement_activity
    description: Re-engagement campaign results
  tracking_configuration:
    type: object
    source: track_engagement_response
    description: Response tracking setup
version: '1.0'
triggers:
- name: Scheduled Stalled Deal Scan
  type: scheduled
  schedule: 0 */4 * * *
  description: Scan for stalled deals every 4 hours
- name: Manual Re-engagement Trigger
  type: manual
  description: Manually trigger re-engagement workflow
- name: Deal Stall Detection
  path: /webhook/deal-stalled
  type: webhook
  config:
    method: POST
    headers:
    - name: Content-Type
      value: application/json
      required: trueim
    authentication: none
  description: Triggered when deal stall is detected
description: Automated re-engagement workflow for stalled deals with multi-channel
  approach
Execution ID Status Started Duration Actions
19e01f3e... COMPLETED 2025-07-01
18:21:47
N/A View
3f9ecdc2... COMPLETED 2025-07-01
18:19:40
N/A View
9a410720... COMPLETED 2025-07-01
18:11:58
N/A View
7252fa91... COMPLETED 2025-07-01
17:48:55
N/A View