Lead Drop-off Re-engagement Workflow
Automated re-engagement workflow for stalled deals with multi-channel approach
Workflow Information
ID: lead_dropoff_reengagement_workflow
Namespace: default
Version: 1.0
Created: 2025-07-01
Updated: 2025-07-01
Tasks: 17
Quick Actions
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
scriptScan CRM for deals that have been stalled
check_stalled_deals_found
scriptDetermine if any stalled deals need processing
get_customer_interaction_timeline
scriptRetrieve interaction history for stalled deals
get_deal_stage_history
scriptAnalyze deal progression through stages
get_competitor_intelligence
scriptGather market and competitor information
analyze_stall_reasons
scriptAI analysis of why deals have stalled
determine_reengagement_strategy
scriptAI-powered strategy selection for re-engagement
personalize_reengagement_message
scriptGenerate personalized messages for each deal
send_whatsapp_reengagement
scriptSend re-engagement message via WhatsApp
send_email_reengagement
scriptSend re-engagement message via Email
schedule_followup_call
scriptSchedule follow-up call for phone preference
update_deal_with_reengagement_activity
scriptLog re-engagement activities in deal records
create_sales_alert
scriptCreate alerts for sales officers about re-engagement
track_engagement_response
scriptMonitor and track customer responses to re-engagement
update_reengagement_success_metrics
scriptUpdate analytics with campaign performance
schedule_escalation_if_no_response
scriptSet up automatic escalation for non-responsive customers
end_no_action_needed
scriptComplete workflow when no stalled deals found
Triggers
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