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

TypeScript
/** * 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

TypeScript
/** * 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

Python
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.

TypeScript
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

YAML
[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.

PrimeAxiom designs enrichment pipelines with merge policies—book a data governance session.