342 lines
8.8 KiB
Markdown
342 lines
8.8 KiB
Markdown
|
|
# Lead Scoring Keywords
|
||
|
|
|
||
|
|
General Bots includes native lead scoring capabilities through BASIC keywords, enabling automated lead qualification, AI-enhanced scoring, and CRM integration directly from conversational flows.
|
||
|
|
|
||
|
|
<img src="../assets/gb-decorative-header.svg" alt="General Bots" style="max-height: 100px; width: 100%; object-fit: contain;">
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
Lead scoring assigns numeric values to prospects based on their attributes and behaviors. Higher scores indicate greater sales readiness. General Bots provides both rule-based and AI-enhanced scoring approaches.
|
||
|
|
|
||
|
|
## SCORE LEAD
|
||
|
|
|
||
|
|
Calculate a lead score based on profile and behavior data using configurable rules.
|
||
|
|
|
||
|
|
### Syntax
|
||
|
|
|
||
|
|
```basic
|
||
|
|
score = SCORE LEAD lead_data
|
||
|
|
```
|
||
|
|
|
||
|
|
### Example
|
||
|
|
|
||
|
|
```basic
|
||
|
|
lead_data = NEW OBJECT
|
||
|
|
lead_data.email = "john@company.com"
|
||
|
|
lead_data.name = "John Smith"
|
||
|
|
lead_data.company = "Acme Corp"
|
||
|
|
lead_data.job_title = "VP of Engineering"
|
||
|
|
lead_data.industry = "Technology"
|
||
|
|
lead_data.company_size = "Enterprise"
|
||
|
|
|
||
|
|
score = SCORE LEAD lead_data
|
||
|
|
|
||
|
|
TALK "Score: " + score.score
|
||
|
|
TALK "Grade: " + score.grade
|
||
|
|
TALK "Status: " + score.status
|
||
|
|
TALK "Top recommendation: " + score.recommendations[0]
|
||
|
|
```
|
||
|
|
|
||
|
|
### Return Object
|
||
|
|
|
||
|
|
The `SCORE LEAD` keyword returns an object containing:
|
||
|
|
|
||
|
|
| Property | Type | Description |
|
||
|
|
|----------|------|-------------|
|
||
|
|
| `score` | Integer | Numeric score (0-100) |
|
||
|
|
| `grade` | String | Letter grade (A, B, C, D, F) |
|
||
|
|
| `status` | String | hot, warm, cold, or unqualified |
|
||
|
|
| `breakdown` | Object | Score components by category |
|
||
|
|
| `recommendations` | Array | Suggested next actions |
|
||
|
|
|
||
|
|
### Score Breakdown
|
||
|
|
|
||
|
|
```basic
|
||
|
|
score = SCORE LEAD lead_data
|
||
|
|
|
||
|
|
TALK "Demographic score: " + score.breakdown.demographic
|
||
|
|
TALK "Firmographic score: " + score.breakdown.firmographic
|
||
|
|
TALK "Behavioral score: " + score.breakdown.behavioral
|
||
|
|
TALK "Engagement score: " + score.breakdown.engagement
|
||
|
|
```
|
||
|
|
|
||
|
|
## AI SCORE LEAD
|
||
|
|
|
||
|
|
Use AI/LLM-enhanced scoring for more nuanced lead evaluation.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
score = AI SCORE LEAD lead_data
|
||
|
|
|
||
|
|
TALK "AI Score: " + score.score
|
||
|
|
TALK "Confidence: " + score.breakdown.ai_confidence
|
||
|
|
TALK "Reasoning: " + score.breakdown.ai_reasoning
|
||
|
|
```
|
||
|
|
|
||
|
|
AI scoring considers factors that rule-based scoring might miss, such as company news, market conditions, and subtle signals in communication patterns.
|
||
|
|
|
||
|
|
### When to Use AI Scoring
|
||
|
|
|
||
|
|
AI scoring works best for complex B2B scenarios where context matters significantly. Rule-based scoring is faster and sufficient for high-volume B2C leads with clear qualification criteria.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Use AI for enterprise leads, rules for SMB
|
||
|
|
IF lead_data.company_size = "Enterprise" THEN
|
||
|
|
score = AI SCORE LEAD lead_data
|
||
|
|
ELSE
|
||
|
|
score = SCORE LEAD lead_data
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
## GET LEAD SCORE
|
||
|
|
|
||
|
|
Retrieve an existing lead score from the database.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
score = GET LEAD SCORE "lead-id"
|
||
|
|
TALK "Current score: " + score.score
|
||
|
|
TALK "Last updated: " + score.updated_at
|
||
|
|
```
|
||
|
|
|
||
|
|
## QUALIFY LEAD
|
||
|
|
|
||
|
|
Check if a lead meets the qualification threshold for sales handoff.
|
||
|
|
|
||
|
|
### Default Threshold (70)
|
||
|
|
|
||
|
|
```basic
|
||
|
|
result = QUALIFY LEAD "lead-id"
|
||
|
|
IF result.qualified THEN
|
||
|
|
TALK "Lead is qualified: " + result.status
|
||
|
|
' Notify sales team
|
||
|
|
SEND MAIL TO "sales@company.com" SUBJECT "New Qualified Lead" BODY result
|
||
|
|
ELSE
|
||
|
|
TALK "Lead needs more nurturing. Score: " + result.score
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Custom Threshold
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Enterprise deals require higher qualification
|
||
|
|
result = QUALIFY LEAD "lead-id", 85
|
||
|
|
|
||
|
|
IF result.qualified THEN
|
||
|
|
TALK "Enterprise lead qualified for sales"
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
### Qualification Result
|
||
|
|
|
||
|
|
| Property | Type | Description |
|
||
|
|
|----------|------|-------------|
|
||
|
|
| `qualified` | Boolean | Meets threshold |
|
||
|
|
| `score` | Integer | Current score |
|
||
|
|
| `threshold` | Integer | Applied threshold |
|
||
|
|
| `status` | String | Current lead status |
|
||
|
|
| `gap` | Integer | Points needed if not qualified |
|
||
|
|
|
||
|
|
## UPDATE LEAD SCORE
|
||
|
|
|
||
|
|
Manually adjust a lead's score based on specific actions or behaviors.
|
||
|
|
|
||
|
|
### Add Points
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Lead attended webinar
|
||
|
|
new_score = UPDATE LEAD SCORE "lead-id", 10, "Attended product webinar"
|
||
|
|
TALK "Score updated to: " + new_score.score
|
||
|
|
```
|
||
|
|
|
||
|
|
### Deduct Points
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Lead unsubscribed from newsletter
|
||
|
|
new_score = UPDATE LEAD SCORE "lead-id", -15, "Unsubscribed from email"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Behavioral Scoring
|
||
|
|
|
||
|
|
```basic
|
||
|
|
ON "webinar:attended"
|
||
|
|
UPDATE LEAD SCORE params.lead_id, 15, "Webinar attendance"
|
||
|
|
END ON
|
||
|
|
|
||
|
|
ON "pricing:viewed"
|
||
|
|
UPDATE LEAD SCORE params.lead_id, 20, "Viewed pricing page"
|
||
|
|
END ON
|
||
|
|
|
||
|
|
ON "demo:requested"
|
||
|
|
UPDATE LEAD SCORE params.lead_id, 30, "Requested demo"
|
||
|
|
END ON
|
||
|
|
|
||
|
|
ON "email:bounced"
|
||
|
|
UPDATE LEAD SCORE params.lead_id, -25, "Email bounced"
|
||
|
|
END ON
|
||
|
|
```
|
||
|
|
|
||
|
|
## Complete Lead Nurturing Flow
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' lead-nurturing.bas
|
||
|
|
PARAM email AS string
|
||
|
|
PARAM name AS string
|
||
|
|
PARAM company AS string
|
||
|
|
PARAM source AS string
|
||
|
|
|
||
|
|
DESCRIPTION "Process and score new leads"
|
||
|
|
|
||
|
|
' Build lead profile
|
||
|
|
WITH lead
|
||
|
|
.email = email
|
||
|
|
.name = name
|
||
|
|
.company = company
|
||
|
|
.source = source
|
||
|
|
.created_at = NOW()
|
||
|
|
END WITH
|
||
|
|
|
||
|
|
' Initial scoring
|
||
|
|
score = SCORE LEAD lead
|
||
|
|
|
||
|
|
' Store lead
|
||
|
|
INSERT "leads", lead
|
||
|
|
SET BOT MEMORY "lead_" + email + "_score", score.score
|
||
|
|
|
||
|
|
' Route based on score
|
||
|
|
IF score.status = "hot" THEN
|
||
|
|
' Immediate sales notification
|
||
|
|
SEND MAIL TO "sales@company.com" SUBJECT "Hot Lead: " + name BODY score
|
||
|
|
SEND TEMPLATE "hot-lead-welcome", "email", email, #{name: name}
|
||
|
|
|
||
|
|
ELSEIF score.status = "warm" THEN
|
||
|
|
' Schedule nurture sequence
|
||
|
|
SEND TEMPLATE "welcome", "email", email, #{name: name}
|
||
|
|
SET SCHEDULE DATEADD(NOW(), 3, "day"), "nurture-day-3.bas"
|
||
|
|
|
||
|
|
ELSE
|
||
|
|
' Cold lead - educational content
|
||
|
|
SEND TEMPLATE "educational", "email", email, #{name: name}
|
||
|
|
END IF
|
||
|
|
|
||
|
|
TALK "Lead " + name + " processed with score " + score.score + " (" + score.status + ")"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Lead Scoring Configuration
|
||
|
|
|
||
|
|
Configure scoring weights in your bot's `config.csv`:
|
||
|
|
|
||
|
|
```csv
|
||
|
|
key,value
|
||
|
|
lead-score-job-title-weight,20
|
||
|
|
lead-score-company-size-weight,15
|
||
|
|
lead-score-industry-weight,10
|
||
|
|
lead-score-engagement-weight,25
|
||
|
|
lead-score-behavioral-weight,30
|
||
|
|
lead-score-qualification-threshold,70
|
||
|
|
```
|
||
|
|
|
||
|
|
### Title-Based Scoring
|
||
|
|
|
||
|
|
| Job Title Pattern | Points |
|
||
|
|
|-------------------|--------|
|
||
|
|
| C-Level (CEO, CTO, CFO) | 25 |
|
||
|
|
| VP / Vice President | 20 |
|
||
|
|
| Director | 15 |
|
||
|
|
| Manager | 10 |
|
||
|
|
| Individual Contributor | 5 |
|
||
|
|
|
||
|
|
### Company Size Scoring
|
||
|
|
|
||
|
|
| Company Size | Points |
|
||
|
|
|--------------|--------|
|
||
|
|
| Enterprise (1000+) | 20 |
|
||
|
|
| Mid-Market (100-999) | 15 |
|
||
|
|
| SMB (10-99) | 10 |
|
||
|
|
| Small (1-9) | 5 |
|
||
|
|
|
||
|
|
### Behavioral Actions
|
||
|
|
|
||
|
|
| Action | Typical Points |
|
||
|
|
|--------|---------------|
|
||
|
|
| Demo request | +30 |
|
||
|
|
| Pricing page view | +20 |
|
||
|
|
| Case study download | +15 |
|
||
|
|
| Webinar attendance | +15 |
|
||
|
|
| Blog subscription | +10 |
|
||
|
|
| Email open | +2 |
|
||
|
|
| Email click | +5 |
|
||
|
|
| Unsubscribe | -15 |
|
||
|
|
| Email bounce | -25 |
|
||
|
|
|
||
|
|
## Scheduled Score Decay
|
||
|
|
|
||
|
|
Implement score decay for inactive leads:
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' score-decay.bas
|
||
|
|
SET SCHEDULE "every day at 2am"
|
||
|
|
|
||
|
|
' Find leads with no activity in 30 days
|
||
|
|
stale_leads = FIND "leads", "last_activity < DATEADD(NOW(), -30, 'day') AND score > 20"
|
||
|
|
|
||
|
|
FOR EACH lead IN stale_leads
|
||
|
|
UPDATE LEAD SCORE lead.id, -5, "Inactivity decay"
|
||
|
|
NEXT lead
|
||
|
|
|
||
|
|
TALK "Processed " + LEN(stale_leads) + " stale leads"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Integration with CRM
|
||
|
|
|
||
|
|
Push qualified leads to external CRM systems:
|
||
|
|
|
||
|
|
```basic
|
||
|
|
result = QUALIFY LEAD lead_id
|
||
|
|
|
||
|
|
IF result.qualified THEN
|
||
|
|
' Push to Salesforce
|
||
|
|
crm_payload = NEW OBJECT
|
||
|
|
crm_payload.email = lead.email
|
||
|
|
crm_payload.name = lead.name
|
||
|
|
crm_payload.score = result.score
|
||
|
|
crm_payload.status = "Qualified"
|
||
|
|
|
||
|
|
POST "https://api.salesforce.com/leads", crm_payload
|
||
|
|
|
||
|
|
' Mark as synced
|
||
|
|
UPDATE "leads", "id = " + lead_id, #{crm_synced: true, synced_at: NOW()}
|
||
|
|
END IF
|
||
|
|
```
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
**Start with simple rules.** Begin with basic demographic and firmographic scoring, then add behavioral triggers as you gather data.
|
||
|
|
|
||
|
|
**Align scoring with sales.** Work with your sales team to define what makes a "qualified" lead. Their input ensures scores reflect actual sales readiness.
|
||
|
|
|
||
|
|
**Review and adjust regularly.** Analyze conversion rates by score range monthly. Adjust weights if high-scoring leads aren't converting.
|
||
|
|
|
||
|
|
**Combine rule-based and AI scoring.** Use rule-based scoring for speed and consistency, AI scoring for complex enterprise deals requiring nuanced evaluation.
|
||
|
|
|
||
|
|
**Implement score decay.** Leads that go cold should have their scores decrease over time to keep the pipeline accurate.
|
||
|
|
|
||
|
|
**Track score history.** Store score changes with timestamps and reasons for audit trails and analysis.
|
||
|
|
|
||
|
|
```basic
|
||
|
|
' Log all score changes
|
||
|
|
ON "lead:score:changed"
|
||
|
|
INSERT "score_history", #{
|
||
|
|
lead_id: params.lead_id,
|
||
|
|
old_score: params.old_score,
|
||
|
|
new_score: params.new_score,
|
||
|
|
reason: params.reason,
|
||
|
|
changed_at: NOW()
|
||
|
|
}
|
||
|
|
END ON
|
||
|
|
```
|
||
|
|
|
||
|
|
## See Also
|
||
|
|
|
||
|
|
- [SEND TEMPLATE](./keywords.md) - Nurture campaign emails
|
||
|
|
- [SET SCHEDULE](./keyword-set-schedule.md) - Automated scoring jobs
|
||
|
|
- [ON Keyword](./keyword-on.md) - Event-driven score updates
|
||
|
|
- [GET / POST](./keywords-http.md) - CRM integration
|