← GTM Recipes

CSV · List → Sequencer · CRM

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.

Runs in ListPlus – no agent needed

Trade show leads · 28 contactsscore and checks 0 credits
Paige HollowayCEO · no emailscore 40 · looked up
Daniel BrooksCEO · info@score 40 · looked up
Lauren FosterOwner · @gmail.comscore 30 · not looked up
Ryan MitchellMarketing · disposablescore 0 · not looked up

Template “Find work emails” matches 10 of 28 · with ICP Score ≥ 40, 3 are left

Example · fictional contacts, real prices

Watch it

Setup

Build this workflow.

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.

What does a run cost?

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.

  1. ListPlus runs automatically

    The checks run on their own

    Every row is checked on import: domain typos, role addresses like info@, disposable and personal addresses. No credits.

  2. Your team manual in ListPlus

    Add a score column

    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. Your team manual in ListPlus

    A rule with a brake

    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. ListPlus runs automatically

    Enrich only the fits

    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.

With your agent

Give your agent this brief.

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.

The same call from Claude Code, ChatGPT, Cursor or an n8n HTTP node – MCP and REST offer the same tools.

Agent guide (.md) ↗
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 and sample call

describe_setup · add_column · create_trigger · query_records

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
})

Try it with your data

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.

Create a list