← Back to Epsilon
Use Cases

Internal Data Enrichment

A sales team has 200 inbound leads per week sitting in a CRM. Before anyone picks up the phone, each lead needs firmographic data from an external API, web research on the company, an ICP fit score, and a one-page brief. The enrichment workflow mixes database queries, API calls, live agent research, and deterministic scoring — and it has to run every Monday morning, not just once.

The Problem

Not every step needs an LLM. But all the steps need to run together.

Lead qualification is a coordination problem disguised as a research problem. Your CRM, a firmographic API, a web research agent, a scoring model, and a report formatter all need to touch the same records in the right order. Writing that glue code by hand — and maintaining it when one data source changes — is the real cost.

How It Works

Six steps. Three kinds of work.

The workflow mixes deterministic lookups, external API calls, and agent-powered research in a single dag run. Epsilon handles the sequencing; each step just does its job.

01

Pull new leads from the CRM

Query the CRM for inbound leads that arrived since the last run. Filter by region, source channel, and minimum company size. This is a plain API call wrapped in a function — no LLM involved. Returns a list of lead IDs with company name, domain, and contact info.

Function call
02

Enrich with firmographic data

For each lead, call a firmographic API to pull company details: employee count, estimated revenue, industry classification, funding stage, tech stack. Deterministic, cacheable, runs in parallel across all leads.

Function call — parallel
03

Run web research on each company

An agent searches for each company to surface context you can't get from a data vendor: recent news, hiring patterns, product launches, competitive positioning. This is where an LLM earns its place — interpreting ambiguous results, resolving company name collisions, and deciding what's relevant to your sale.

Agent — parallel
04

Score ICP fit

Combine the firmographic data with your ideal customer profile to compute a fit score. How closely does this company match your best customers on size, industry, tech stack, and growth signals? The score is a weighted formula across your ICP dimensions — deterministic, not LLM-based.

Function call
05

Assign priority tier

Map the fit score to an outreach tier: hot, warm, or nurture. Hot leads get same-day calls, warm leads go into a sequence, nurture leads get added to a drip. This is a lookup table — deterministic given the fit score and available rep capacity.

Function call
06

Compile lead briefs and QA

An agent assembles all enriched fields into a structured one-page brief per lead: firmographics, fit score, priority tier, research summary, and suggested talking points. A second QA pass checks for missing fields, stale data, and flags any lead whose tier assignment looks off.

Agent + QA loop
Why Epsilon

Orchestration for workflows that aren't all agents.

Mixed step types in one workflow

Most orchestration frameworks assume every step is an LLM call. This workflow has CRM queries, REST API calls, scoring functions, and LLM agents — all in the same run. Epsilon treats them identically: each step reads a task, writes an output, and the dag handles the rest.

Parallel enrichment without the glue

Steps 2 and 3 need to run across every lead simultaneously. With Epsilon's dag topology, you declare the parallelism once in your workflow definition. You don't write thread pools, async handlers, or result collectors — those are infrastructure Epsilon already has.

Runs that replay

Every week is a new run with different leads. When the firmographic API changes its schema, or the ICP weights are updated, you re-run the affected steps without touching the others. All outputs are recorded as artifacts — the team can audit any batch months later.

Running It

One command to start the run.

Point Epsilon at your workflow definition. It handles decomposition, parallelism, the QA loop, and artifact collection.

# kick off the weekly lead enrichment run
$ epsilon runs create --topology dag \
    --task "Enrich and score inbound leads for week of 2026-04-13" \
    --implementation python:lead_enrichment.py:run

run_id: r-7c3b1a  topology: dag  status: running
  step 1/6  crm_pull          running
  step 2/6  firmographic      queued (187 parallel tasks)
  step 3/6  web_research      queued (187 parallel tasks)
  step 4/6  icp_score         queued
  step 5/6  tier_assign       queued
  step 6/6  brief_compile     queued

# watch it go
$ epsilon runs get r-7c3b1a
run_id: r-7c3b1a  status: complete  steps: 6/6
  qa_result: passed  artifacts: 187 lead briefs

# pull the outputs
$ epsilon artifacts list r-7c3b1a
lead_001_brief.json   lead_002_brief.json   ...
tier_summary.csv      qa_log.txt

Ready to stop rebuilding this every quarter?