# Score first, then enrich – only the ones that fit.

Enriching every row costs money, and only some of them fit your ideal customer. The checks catch unusable addresses, a score column rates every contact, and a rule looks up the email only from a minimum score – with a maximum price per contact, charged only on a hit.

https://listplus.ai/en/gtm-workflows/lead-scoring-before-enrichment

## Inputs and connections

A list with name, company, job title and email – from a CSV, an export or your CRM. You set up the score and the rule once; after that every new contact runs through on its own.

Runs entirely in ListPlus. Prefer to automate it? Your agent creates the score column and the rule with add_column and create_trigger – paused until you approve it.

## Steps

1. **The checks run on their own** (ListPlus · runs automatically). Every row is checked on import: domain typos, role addresses like info@, disposable and personal addresses. No credits.
2. **Add a score column** (Your team · manual in ListPlus). Via “+ Column” → Score: decision maker +40, business email +20, personal address −10 – or your own criteria. Tiers A, B, C come as a column of their own.
3. **A rule with a brake** (Your team · manual in ListPlus). Template “Find work emails” plus an AND condition “ICP Score at least 40”. In the example the template matches 10 of 28 contacts; with the brake, 3 are left.
4. **Enrich only the fits** (ListPlus · runs automatically). The rule looks up the email with at most 10 credits per contact and replaces empty and invalid values. Only a hit is charged; new contacts run through on their own.

## Expected sample result

The template “Find work emails” matches 10 of 28 contacts; with ICP Score ≥ 40, 3 are left. One address is found, the other two get no hit and cost nothing – 7 lookups are dropped before a credit is spent.

## Costs and boundaries

Checks, score and rule cost nothing. The email lookup per fitting contact: expected 2.39 credits, at most 9 credits ($0.32 on Pro) – charged only on a hit, and the rule caps it at the budget per contact you set.

A rule fills empty cells only by default – for invalid addresses set “Replace empty and invalid values”. A hit from name and company only counts when its employer doesn't contradict; otherwise nothing is written.

## Agent prompt

In my list “Trade show leads”, add a score column (decision maker +40, business email +20, personal email −10) and a paused rule: ICP Score at least 40 → find the work email, budget 10 credits per contact, replace empty and invalid values. Tell me how many contacts the rule matches before I switch it on.

## Tools

`describe_setup`, `add_column`, `create_trigger`, `query_records`

MCP: https://listplus.ai/mcp
REST: https://listplus.ai/a/v1/{action}
API: https://listplus.ai/a

## Sample calls

These calls use fictional IDs. Use the IDs returned by your workspace.

```text
add_column({
  "list_id": "<shared_list_id>",
  "columns": [
    {
      "kind": "score",
      "title": "ICP Score",
      "criteria": [
        {
          "label": "Decision maker",
          "points": 40,
          "when": {
            "groups": [
              [
                {
                  "field": {
                    "kind": "contentType",
                    "key": "job_title"
                  },
                  "op": "seniorityIs",
                  "values": [
                    "c_level",
                    "vp"
                  ]
                }
              ]
            ]
          }
        },
        {
          "label": "Business email",
          "points": 20,
          "when": {
            "groups": [
              [
                {
                  "field": {
                    "kind": "contentType",
                    "key": "email"
                  },
                  "op": "business"
                }
              ]
            ]
          }
        },
        {
          "label": "Personal email",
          "points": -10,
          "when": {
            "groups": [
              [
                {
                  "field": {
                    "kind": "contentType",
                    "key": "email"
                  },
                  "op": "freemail"
                }
              ]
            ]
          }
        }
      ]
    }
  ]
})
create_trigger({
  "list_id": "<shared_list_id>",
  "name": "From score 40: find the email",
  "on": "match",
  "conditions": {
    "groups": [
      [
        {
          "field": {
            "kind": "column",
            "name": "icp_score"
          },
          "op": "greaterThanOrEqual",
          "values": [
            "40"
          ]
        }
      ]
    ]
  },
  "actions": [
    {
      "kind": "enrich",
      "fields": [
        "email"
      ],
      "budget_per_record": "10",
      "fill": "empty_or_invalid"
    }
  ],
  "activate": false
})
```
