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
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.
- 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.
- 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.
- 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.
- 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) ↗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.