CRM Data Enrichment: Rules, Vendors, and Model-Assisted Fields
Overview
Enrichment promises better targeting—but bad merges and stale attributes destroy trust. This guide sets guardrails.
Quick definition
Enrichment combines deterministic rules (trusted sources first) with model-assisted parsing; writes include provenance and confidence for downstream merge.
Definition
Enrichment adds firmographic, technographic, or contact data to records using vendors, public sources, or extraction from unstructured content.
Why it matters
Routing, scoring, and AI features depend on accurate fields. Enrichment without provenance is liability.
Core framework
Step-by-step model as TypeScript interfaces (machine-readable checkpoints).
Source of truth per field
/**
* Source of truth per field
* Decide whether vendor, rep, or system wins conflicts.
*/
export interface CoreFrameworkStep1SourceOfTruthPerField {
/** Order in the core framework (0-based) */
readonly stepIndex: 0;
/** Display title for this step */
readonly title: "Source of truth per field";
/** Narrative checkpoints as published in the guide */
readonly narrative: readonly string[];
}
export const CoreFrameworkStep1SourceOfTruthPerField_NARRATIVE: readonly string[] = [
"Decide whether vendor, rep, or system wins conflicts."
] as const;Staleness policies
/**
* Staleness policies
* Refresh cadence and confidence decay for model-assisted fields.
*/
export interface CoreFrameworkStep2StalenessPolicies {
/** Order in the core framework (0-based) */
readonly stepIndex: 1;
/** Display title for this step */
readonly title: "Staleness policies";
/** Narrative checkpoints as published in the guide */
readonly narrative: readonly string[];
}
export const CoreFrameworkStep2StalenessPolicies_NARRATIVE: readonly string[] = [
"Refresh cadence and confidence decay for model-assisted fields."
] as const;Detailed breakdown
Logic sections encoded as Python functions with structured narrative payloads.
LLM extraction
def logic_block_1_llm_extraction(context: dict) -> dict:
"""Operational logic: LLM extraction"""
# Narrative steps from the guide (logic section)
paragraphs = ["Use for semi-structured email and notes—with human review on high-impact fields."]
return {
"heading": "LLM extraction",
"paragraphs": paragraphs,
"context_keys": tuple(sorted(context.keys())),
}Technical patterns
Source precedence
- Ordered list: `manual_edit` > `billing_system` > `vendor_enrichment` > `model_guess`.
- Never let low-precedence overwrite high without conflict workflow.
Code examples
Merge with precedence
Field-level winner by source rank.
const RANK = { manual: 4, billing: 3, vendor: 2, model: 1 };
export function mergeField(existing, incoming) {
if (RANK[incoming.source] > RANK[existing.source]) return incoming;
return existing;
}System architecture
[CRM change event]
→ [Enrichment orchestrator]
→ [Rules engine → API calls → optional LLM parse]
→ [Provenance store]
→ [CRM patch with metadata]Real-world example
A SaaS team stopped auto-writing industry tags from a vendor after 20% error rate—switched to verified categories only.
Common mistakes
- Silent overwrites of rep-curated data.
- Enrichment without logging source and timestamp.
Related topics
PrimeAxiom designs enrichment pipelines with merge policies—book a data governance session.