Risk Scoring
Separated hard and soft signals ensure bounce-based issues trigger blocks while velocity spikes only log warnings
1. Lead Health Scoring (Pre-Send)
Before a lead even enters the system, it is classified based on intrinsic quality signals. This prevents "trash" data from ever reaching your campaigns.
GREEN
Score: 80-100
Professional business email. Valid domain. No risk signals.
YELLOW
Score: 50-79
Acceptable but risky. Catch-all domain or unknown provider.
RED
Score: 0-49
Disposable domain, role-based (admin@), or blacklisted.
2. Mailbox Risk Scoring (Hard vs Soft)
The Problem with Combined Risk Scores
Traditional systems combine all risk signals into a single score. This causes false positives:
❌ Old System (Combined Score)
Scenario: A clean mailbox sends 100 emails in 1 hour (high velocity)
• Bounces: 0
• Velocity component: 80/100 (very high)
→ Combined risk score: 80
→ Result: Mailbox paused (false positive!)
Problem: High velocity alone shouldn't block a mailbox with zero bounces.
Hard vs Soft Signal Separation
Superkabe separates risk signals into two independent scores:
Hard Signals (Bounce-Based)
These CAN block execution:
- • Bounce rate - Hard bounces / total sends
- • Failure rate - Failures / total sends
Formula:hardScore = (bounceRate × 0.7) + (failureRate × 0.3)
Blocks at: ≥60
Soft Signals (Behavior-Based)
These ONLY log, never block:
- • Velocity - Send rate trends
- • Domain warnings - Historical incidents
Formula:softScore = (velocity × 20) + (domainWarnings × 10)
Logs at: ≥75 (but never blocks)
Comparison: Before vs After
| Scenario | Hard Score | Soft Score | Old System | New System |
|---|---|---|---|---|
| 0% bounces, high velocity | 0 | 80 | ❌ Blocked | ✅ Allowed |
| 5% bounces, low velocity | 65 | 10 | ❌ Blocked | ❌ Blocked |
| 1% bounces, normal velocity | 15 | 35 | ✅ Allowed | ✅ Allowed |
| 3% bounces, high velocity | 45 | 85 | ❌ Blocked | ✅ Allowed (logs warning) |
How It Works in Practice
The execution gate uses only hardScore for blocking decisions:
// Execution Gate Check (simplified)
const avgHardScore = calculateHardScore(healthyMailboxes);
const avgSoftScore = calculateSoftScore(healthyMailboxes);
// ONLY hard score blocks
if (avgHardScore >= 60) {
return {
allowed: false,
reason: "Hard risk score (65) exceeds threshold. Bounce rate too high.",
failureType: "HEALTH_ISSUE"
};
}
// Soft score just logs
if (avgSoftScore >= 75) {
console.log(`⚠️ High velocity detected: ${avgSoftScore} (not blocking)`);
}
return { allowed: true };Risk Components in Detail
Hard Score Calculation
1. Calculate 24h bounce rate:
bounceRate = (bounces_24h / sent_24h) × 1002. Calculate 24h failure rate:
failureRate = (failures_24h / sent_24h) × 1003. Weighted combination:
hardScore = (bounceRate × 0.7) + (failureRate × 0.3)4. Scale to 0-100:
hardScore = min(hardScore × 10, 100)Soft Score Calculation
1. Velocity component (from metrics):
velocityComponent = mailbox.metrics.velocity × 202. Domain warning component:
escalationComponent = domain.warning_count × 103. Sum and cap:
softScore = min(velocityComponent + escalationComponent, 100)✅ Key Benefit
Signal separation eliminates false positives:
- • Clean mailboxes with high send volume stay active
- • Only bounce/failure-based issues trigger pauses
- • Velocity spikes are logged but don't disrupt operations
- • Infrastructure protection focuses on real reputation threats
🔧 Configuration
Thresholds are tunable in the Configuration section:
- •
HARD_RISK_CRITICAL: 60— Blocks execution - •
SOFT_RISK_HIGH: 75— Logs warning only