botserver/templates/marketing.gbai/marketing.gbdialog/campaigns/lead-nurture-campaign.bas
Rodrigo Rodriguez (Pragmatismo) a41ff7a7d4 Add documentation and core BASIC language functions
- Add SET_SCHEDULE.md and TEMPLATE_VARIABLES.md documentation
- Implement array functions (CONTAINS, PUSH/POP, SLICE, SORT, UNIQUE)
- Implement math functions module structure
- Implement datetime functions module structure
- Implement validation functions (ISNULL, ISEMPTY, VAL, STR, TYPEOF)
- Implement error handling functions (THROW, ERROR, ASSERT)
- Add CRM lead scoring keywords (SCORE_LEAD, AI_SCORE_LEAD)
- Add messaging keywords (SEND_TEMPLATE, CREATE_TEMPLATE)
2025-11-30 11:09:16 -03:00

235 lines
7.2 KiB
QBasic

' Lead Nurturing Campaign with AI Scoring
' AI-powered lead nurturing with dynamic scoring and personalized messaging
DESCRIPTION "AI-powered lead nurturing campaign with dynamic scoring"
' Campaign Configuration
campaign_name = "lead-nurture-2025"
mql_threshold = 70
sql_threshold = 85
' Form Submit Handler - triggered by landing page submissions
ON FORM SUBMIT "landing-page"
lead_email = fields.email
lead_name = NVL(fields.name, "there")
lead_company = fields.company
lead_phone = fields.phone
lead_source = metadata.utm_source
TALK "New lead captured: " + lead_email
' Score the lead with AI
WITH lead
.email = lead_email
.name = lead_name
.company = lead_company
.source = lead_source
.created_at = NOW()
END WITH
score_result = AI SCORE LEAD lead
TALK "Lead Score: " + score_result.score + " (Grade: " + score_result.grade + ")"
' Save to CRM
SAVE "leads", lead_email, lead_name, lead_company, lead_phone, lead_source, score_result.score, score_result.grade, NOW()
' Route based on score
IF score_result.score >= sql_threshold THEN
CALL hot_lead_workflow(lead, score_result)
ELSE IF score_result.score >= mql_threshold THEN
CALL warm_lead_workflow(lead, score_result)
ELSE
CALL cold_lead_workflow(lead, score_result)
END IF
END ON
' Hot Lead Workflow (Score >= 85)
SUB hot_lead_workflow(lead, score_result)
TALK "HOT LEAD: " + lead.email + " - Sales handoff"
WITH vars
.name = lead.name
.score = score_result.score
.company = NVL(lead.company, "your company")
END WITH
SEND TEMPLATE "hot-lead-welcome", "email", lead.email, vars
IF NOT ISEMPTY(lead.phone) THEN
SEND TEMPLATE "hot-lead-sms", "sms", lead.phone, vars
END IF
CREATE TASK "Contact hot lead: " + lead.email, "sales-team", "high", NOW()
' Slack notification
WITH alert
.text = "HOT LEAD: " + lead.email + " | Score: " + score_result.score
END WITH
POST "https://hooks.slack.com/services/YOUR_WEBHOOK", alert
SET SCHEDULE DATEADD(NOW(), 1, "day"), "hot-lead-followup.bas"
TALK "Hot lead workflow completed"
END SUB
' Warm Lead Workflow (Score 70-84)
SUB warm_lead_workflow(lead, score_result)
TALK "WARM LEAD: " + lead.email + " - Accelerated nurture"
WITH vars
.name = lead.name
.company = NVL(lead.company, "your company")
END WITH
SEND TEMPLATE "warm-welcome", "email", lead.email, vars
SET SCHEDULE DATEADD(NOW(), 3, "day"), "warm-nurture-2.bas"
SET SCHEDULE DATEADD(NOW(), 7, "day"), "warm-demo-invite.bas"
SET SCHEDULE DATEADD(NOW(), 14, "day"), "rescore-lead.bas"
TALK "Warm lead nurture started"
END SUB
' Cold Lead Workflow (Score < 70)
SUB cold_lead_workflow(lead, score_result)
TALK "COLD LEAD: " + lead.email + " - Standard nurture"
WITH vars
.name = lead.name
.company = NVL(lead.company, "your organization")
END WITH
SEND TEMPLATE "cold-welcome", "email", lead.email, vars
SET SCHEDULE DATEADD(NOW(), 7, "day"), "cold-education-1.bas"
SET SCHEDULE DATEADD(NOW(), 14, "day"), "cold-education-2.bas"
SET SCHEDULE DATEADD(NOW(), 21, "day"), "cold-soft-pitch.bas"
SET SCHEDULE DATEADD(NOW(), 30, "day"), "rescore-lead.bas"
TALK "Cold lead nurture started"
END SUB
' Re-score Lead (scheduled)
SUB rescore_lead()
PARAM lead_email AS string
lead_data = FIND "leads", "email = '" + lead_email + "'"
IF ISEMPTY(lead_data) THEN
TALK "Lead not found: " + lead_email
RETURN
END IF
WITH lead
.email = lead_email
.name = lead_data.name
.company = lead_data.company
END WITH
new_score = AI SCORE LEAD lead
old_score = lead_data.score
score_change = new_score.score - old_score
TALK "Lead Rescore: " + lead_email
TALK "Old: " + old_score + " -> New: " + new_score.score + " (" + IIF(score_change >= 0, "+", "") + score_change + ")"
UPDATE "leads", lead_email, new_score.score, new_score.grade, NOW()
IF old_score < mql_threshold AND new_score.score >= mql_threshold THEN
TALK "Lead promoted to MQL: " + lead_email
CALL warm_lead_workflow(lead, new_score)
SEND TEMPLATE "mql-promotion-alert", "email", "marketing@company.com", lead
ELSE IF old_score < sql_threshold AND new_score.score >= sql_threshold THEN
TALK "Lead promoted to SQL: " + lead_email
CALL hot_lead_workflow(lead, new_score)
END IF
END SUB
' Send Nurture Email (utility)
SUB send_nurture_email()
PARAM lead_email AS string
PARAM template_name AS string
PARAM step AS integer
lead_data = FIND "leads", "email = '" + lead_email + "'"
IF ISEMPTY(lead_data) THEN
RETURN
END IF
unsubscribed = FIND "unsubscribes", "email = '" + lead_email + "'"
IF NOT ISEMPTY(unsubscribed) THEN
TALK "Lead unsubscribed: " + lead_email
RETURN
END IF
current_score = GET LEAD SCORE lead_email
IF current_score.score >= sql_threshold THEN
WITH lead
.email = lead_email
.name = lead_data.name
.company = lead_data.company
END WITH
CALL hot_lead_workflow(lead, current_score)
RETURN
END IF
WITH vars
.name = lead_data.name
.company = NVL(lead_data.company, "your organization")
.step = step
END WITH
result = SEND TEMPLATE template_name, "email", lead_email, vars
IF result[0].success THEN
TALK "Nurture email sent: " + template_name + " to " + lead_email
SAVE "email_tracking", lead_email, template_name, step, NOW(), "sent"
UPDATE LEAD SCORE lead_email, 2, "Nurture email " + step + " sent"
ELSE
TALK "Failed to send: " + result[0].error
END IF
END SUB
' Campaign Analytics
SUB get_campaign_analytics()
TALK "Campaign Analytics: " + campaign_name
total_leads = AGGREGATE "leads", "COUNT", "email"
grade_a = AGGREGATE "leads", "COUNT", "email", "grade = 'A'"
grade_b = AGGREGATE "leads", "COUNT", "email", "grade = 'B'"
grade_c = AGGREGATE "leads", "COUNT", "email", "grade = 'C'"
avg_score = AGGREGATE "leads", "AVG", "score"
mql_count = AGGREGATE "leads", "COUNT", "email", "score >= " + mql_threshold
sql_count = AGGREGATE "leads", "COUNT", "email", "score >= " + sql_threshold
emails_sent = AGGREGATE "email_tracking", "COUNT", "id", "status = 'sent'"
TALK "Total Leads: " + total_leads
TALK "Grade A: " + grade_a + " | B: " + grade_b + " | C: " + grade_c
TALK "Avg Score: " + ROUND(avg_score, 1)
IF total_leads > 0 THEN
mql_rate = ROUND((mql_count / total_leads) * 100, 1)
sql_rate = ROUND((sql_count / total_leads) * 100, 1)
TALK "MQL Rate: " + mql_rate + "% | SQL Rate: " + sql_rate + "%"
END IF
TALK "Emails Sent: " + emails_sent
WITH stats
.total_leads = total_leads
.grade_a = grade_a
.grade_b = grade_b
.grade_c = grade_c
.avg_score = avg_score
.mql_count = mql_count
.sql_count = sql_count
END WITH
RETURN stats
END SUB
TALK "Lead Nurturing Campaign Ready: " + campaign_name
TALK "MQL Threshold: " + mql_threshold + " | SQL Threshold: " + sql_threshold