
Modern inbound is noisy. Forms, chat, events, and trials all feed the same pipe. The fix isn’t another widget. It’s a clean, opinionated flow that turns raw submissions into enriched, de‑duplicated, explainable records your reps can trust.
The outcome you’re aiming for
- Reps see one record per person or account, not six.
- Every record has a fit label, an intent label, a normalized score from 0–100, and a clear “why.”
- Marketing gets analytics on what sources and messages drive qualified demand.
- RevOps gets fewer merges and cleaner attribution.
- Legal gets a data map and consent trail.
The Flow
- Intake: Capture submissions from forms, chat, events, product signups, and APIs. Normalize fields and timestamps on arrival.
- Validation: Reject empty or clearly junk payloads. Normalize phone and country codes. Flag personal domains and disposable emails.
- Enrichment: Call one or more enrichment APIs. Pull firmographics, technographics, and role signals. Cache results and respect provider rate limits and terms.
- Classification: Tag by ICP fit, buying stage, and persona using rules or a lightweight model. Keep the labels simple and human readable.
- Scoring: Compute a 0-100 score from fit and intent signals. Calibrate so 60 always “feels” like 60 across time.
- De‑dupe: Match to existing Leads/Contacts/Companies with weighted fuzzy rules. Decide whether to upsert, convert, or attach activities.
- Reasoning notes: Generate a short, structured explanation of the decision. Store it in CRM so sales can see the evidence, not guess.
- Push: Upsert to Salesforce or HubSpot. Map fields, set ownership, create tasks if needed, and post to Slack for priority cases.
- Logging and QA: Write every step to a data store. Keep failure queues and a simple review UI for mismatches or missing fields.
- Feedback loop: Learn from outcomes. Retrain or refine rules with closed‑won and disqualified data.
Smart de‑dupe that actually works
- Use a composite match score across email exact, email hash, full name + company, domain + title, phone, and enrichment company ID.
- Treat personal domains as weaker signals and boost when IP geolocation and timezone align with the phone.
- Prefer account‑first matching for B2B: match company, then person.
- Apply tiered actions by match strength: 90+ merge/update, 70–89 review queue, below 70 create new.
- Always keep an audit trail: what matched, how strongly, and what changed.
How to Score
Start weighted and transparent. Move to a small gradient‑boosted model once you have data volume.
Normalize to 0-100. Consider bins like
- 80-100 = “High,”
- 50-79 = “Medium,”
- below 50 = “Low.”
Sample signals that tend to travel well:
- Company size and industry fit with your ICP
- Job role seniority and function match
- Website behavior in the last 7 days
- Tech stack overlap with integrations you support
- Source and campaign type
- Email quality and domain type
Keep the “why” visible and useful
Don’t store an LLM’s raw chain of thought. Store a structured evidence summary that anyone can read in under 10 seconds.
Example: Reasoning Notes (store in a long text field in CRM)
{
"summary": "High fit, strong intent from demo request.",
"fit_signals": ["Company size 200–500", "Industry = Healthcare IT", "Role = VP Operations"],
"intent_signals": ["Demo form", "Viewed pricing 2x", "Visited integrations page"],
"score": 88,
"confidence": 0.92,
"dedupe_action": "upsert_contact_attach_to_account",
"rules_triggered": ["ICP_CORE", "PRICING_REPEAT", "ROLE_DECISION_MAKER"],
"next_best_action": "Assign to AE, SLA 2h, send pre‑demo checklist"
}
Keep it under 1,000 characters.
Salesforce and HubSpot mapping that won’t bite later
Core fields to standardize
- Lead_Score__c or hs_lead_score
- Fit_Label__c or persona_fit
- Intent_Label__c or intent_stage
- AI_Reasoning__c or ai_reasoning_notes
- Enrichment_Source__c
- Match_Strength__c
- Data_Consent_Status__c and Consent_Timestamp__c
Push patterns
- Salesforce: Upsert Leads by email external ID. On strong account match, upsert Contact and attach to Account. Use a platform event or the Bulk API for bursts.
- HubSpot: Upsert Contacts by email. Maintain Company association by domain or Company ID. Update lifecycle stage only if your rule allows promotion, never demotion.
Guardrails and trust
- Data minimization: Don’t store everything you can fetch. Store what drives decisions.
- Model cards: Document inputs, known limits, and calibration method.
- Human review: Anything in the gray zone routes to a small queue with side‑by‑side evidence.
Minimal viable setup
Why yes, I do love MVPs.
- One ingestion service with validation.
- One enrichment provider to start, cached.
- One ruleset for fit and one for intent.
- A simple dedupe scorer with thresholds.
- A single “AI Reasoning Notes” field in CRM.
- A Slack alert for High score plus Qualified fit.
Ship it, then iterate. Add a second enrichment source, expand rules, and reshape thresholds as outcome data grows.
Example: field payload to CRM
{
"email": "alex@xyzcompany.com",
"first_name": "Alex",
"last_name": "Jefferson",
"company": "XYZ Co",
"phone": "+15551234567",
"country": "US",
"lead_score": 88,
"fit_label": "ICP Core",
"intent_label": "Demo - High",
"ai_reasoning_notes": "{...see example above...}",
"match_strength": 0.93,
"dedupe_action": "upsert_contact_attach_to_account",
"owner_routing": "AE_East",
"consent_status": "Provided",
"consent_timestamp": "2025-09-18T14:05:00Z",
"source": "Website - Demo",
"utm_source": "linkedin",
"utm_campaign": "q4_brand"
}
Common failure modes to avoid
- Scoring that changes scale over time, confusing the floor.
- Free‑text “reasons” that are too long or vague.
- Aggressive merges that bind different people at the same company.
- Enrichment that overwrites rep‑verified data.
- Lifecycle demotions that break automation.
AI here isn’t a black box. It’s a set of crisp decisions with evidence anyone can read. When your pipeline explains itself, sales moves faster, ops sleeps better, and marketing gets cleaner feedback.