Lead GenerationDeveloper ToolsApifyPPE PricingData Intelligence

What Is a Send-Decision Engine? Cold Outreach Definition

A send-decision engine returns SEND_NOW / VERIFY_FIRST / SKIP / ENRICH_MORE per prospect — not raw data. Deterministic, auditable, agent-ready.

Ryan Clinton
What Is a Send-Decision Engine? Cold Outreach Definition

The problem: Most outbound tools hand you a CSV and walk away. You get emails, titles, scores, technographics — and zero answers to the only question that matters before you hit send: can I send to this address right now without burning my sender reputation? So a human spends an hour eyeballing rows, an SDR cold-fires at a catch-all domain, the bounce rate tanks the warm-up work, and the campaign quietly underperforms. The data was there. The decision wasn't.

This post defines a category that closes that gap: the send-decision engine.

What is a send-decision engine? A send-decision engine is a tool that takes a prospect or company domain as input and returns a deterministic per-record action — SEND_NOW, VERIFY_FIRST, SKIP, or ENRICH_MORE — with a machine-readable reasoning trace. The decision is the deliverable, not the data behind it.

Why it matters: Sender reputation is fragile. ZeroBounce's 2024 industry report (n=10M+ addresses) puts a healthy bounce rate under 2%; sustained rates above 5% pull domains into spam folders within days. A send-decision engine is the gate that stops a bad address from ever reaching your ESP.

Use it when: you're running cold outreach on lists you don't 100% trust, you're building an AI agent that needs to branch on a stable enum instead of free-text scores, or you're tired of paying per-email-verified for tools that still hand the final decision back to a human.


Quick answer — send-decision engine in 5 bullets:

  1. What it is: A tool that consumes a prospect or domain and emits a per-record action enum (SEND_NOW / VERIFY_FIRST / SKIP / ENRICH_MORE) with deterministic, auditable reasoning fields.
  2. When to use it: Cold outreach campaigns at any volume, AI sales agents that need stable branch tokens, RevOps pipelines that route leads through Zapier / Make / n8n, founders who want a punch list of who to email today and not a database to wade through.
  3. When NOT to use it: You don't have a list of prospects yet (you need a database like Apollo or ZoomInfo first), you only want raw pattern strings (a pattern finder is enough), or your workflow already has a human triaging every record manually.
  4. Typical input/output: Domains in → ranked records with sendDecision.action + decisionRulePath[] + decisionSignals[] + negativeSignals[] out. One line of SQL filters the safe-to-send queue.
  5. Main tradeoff: A decision is opinionated. You're trading "I get to decide every row myself" for "I trust the engine's deterministic rules and override only when I see a flag I disagree with." The reasoning fields are the safety net.

Also known as: outbound deliverability decisioning, send-readiness engine, cold-email gate, decision-grade prospect enrichment, per-record action engine, deterministic outreach decisioner.

Problems this solves:

  • How to stop sending cold emails to catch-all domains that will burn sender reputation
  • How to feed an AI sales agent a stable branch token instead of a confidence number
  • How to gate Zapier / Make / n8n outbound workflows on a single boolean field
  • How to audit why a campaign underperformed by replaying decision rules per record
  • How to compress 30 minutes of human triage into one filter on a single column
  • How to chain enrichment fallbacks deterministically when the first source fails

In this article: What it is · The 4-action contract · Why deterministic · Signals it operates on · What it isn't · Why agents need this · Cost of not having one · FAQ


Key takeaways:

  • A send-decision engine returns a 4-state action enum per record: SEND_NOW / VERIFY_FIRST / SKIP / ENRICH_MORE. The enum is the contract. Branch on it directly.
  • Every decision exposes a decisionRulePath[] — the ordered predicates the engine walked to land on that action. No hidden model, no probabilistic guess, no surprises across runs.
  • It is not a database (Apollo, ZoomInfo) and not a pattern finder (Hunter). It consumes prospects and emits actions; it doesn't discover companies and it doesn't stop at a confidence number.
  • Determinism beats probabilistic scoring for outbound automation because every decision can be replayed, audited, and explained to compliance — a 47-confidence number cannot.
  • Stable enum tokens make this category drop-in for AI agent tool-calling. The agent doesn't reason about the decision; it consumes it.

Common send-decision engine input → output examples:

InputEngine outputWhat you do
stripe.com (active B2B SaaS, team page, MX valid)SEND_NOW, low bounceRiskBucket, confidence: 0.92Email today
shopify.com (catch-all detected, named contact found)VERIFY_FIRST, medium bounceRiskBucketRun a verifier first
nike.com (no personal email, contact form only)ENRICH_MORE, recoveryPlan points to next actorChain enrichment
expired-domain.com (no MX records)SKIP, decisionSignals: ["no-mx"]Drop from list

What is a send-decision engine?

Definition (short version): A send-decision engine is an outbound-tooling category that consumes a prospect record and returns a deterministic per-record action — SEND_NOW, VERIFY_FIRST, SKIP, or ENRICH_MORE — along with a machine-readable reasoning trace.

The decision is the deliverable. The contact data, verification status, and risk flags are the supporting evidence. That ordering is the whole point. A traditional enrichment tool ships you the evidence and asks you to decide. A send-decision engine ships the decision and shows you the evidence so you can override if you disagree.

There are three things a send-decision engine must do to earn the name:

  1. Consume prospects. Domains, names, emails, or some combination. It's not a discovery tool — it sits downstream of one.
  2. Emit a per-record action enum. Stable tokens. The same input today produces the same output tomorrow. No drift.
  3. Expose its reasoning. Every decision carries a decisionRulePath[], named signals (decisionSignals[]), and risks (negativeSignals[]) so the action is auditable.

If a tool returns a 0–100 score and stops, it's a lead scorer. If it returns a verified-status string and stops, it's an email verifier. If it returns a pattern + confidence and stops, it's a pattern finder. None of those are send-decision engines, even though all three are inputs a send-decision engine might consume.

The 4-action contract

The four-action enum is the API contract. Every record gets exactly one. Stable enum tokens are agent-friendly — never parse the prose, branch on the token.

ActionMeaningOperational behaviour
SEND_NOWVerified, low risk, named contact, valid MX, no catch-allEmail today; safe for full automation
VERIFY_FIRSTPromising but at least one signal is unresolved (catch-all flag, single-sample pattern, drift detected)Run a verifier or human-eyeball before sending
SKIPHard fail — no MX, blocked domain, generic-only inbox, compliance flagRemove from the queue entirely
ENRICH_MOREInsufficient data — no personal email found, JS-rendered SPA blocked, no pattern derivableChain to the next-best enrichment actor and re-evaluate

Two practical rules fall out of this:

  • SEND_NOW is gated on real signal, not a score. Email verified, no catch-all flag, personal-email pattern, senior decision-maker, no risk flags, found on the live website. When any of those fail, the action automatically downgrades. Never silently SEND_NOW.
  • ENRICH_MORE is not a polite SKIP. It's a routing instruction that names the next actor to chain — recoveryPlan.nextBestActorSlug is part of the output. The engine's recovery plan is the difference between "your data is bad, sorry" and "here's exactly what to run next."

Why deterministic beats probabilistic for outbound

This is the part most ML-flavoured outbound tools get wrong, and it's the part that matters most when something goes sideways.

A probabilistic lead score collapses every signal into a single number. The number drifts run-to-run because the model gets re-trained, the inputs shift, or the weighting heuristic changes. When a campaign underperforms, you can't replay the score. You can't tell compliance why a particular address was sent. You can't audit it.

A send-decision engine writes out the rule path. decisionRulePath: ["mxValid: true", "confidence >= 0.85", "isCatchAll: false", "drift-aware-downgrade: stable", "action: SEND_NOW"]. Same inputs tomorrow produce the same output. A bad action can be traced to the exact predicate that fired. A good action can be defended.

For outbound at scale, that auditability isn't a nice-to-have:

  • Sender reputation is the asset. Mailgun's deliverability research (May 2024, n=200B+ messages) consistently links bounce rates above 5% to direct domain reputation drops within 72 hours. Every silent SEND_NOW to a catch-all is reputation debt.
  • Compliance teams will ask. "Why did we send to this person?" is a normal question after a complaint. "The model gave it 0.74" is not an answer. "MX valid, pattern stable across 6 runs, named contact at decision-maker level, no catch-all, no risk flags" is.
  • Agents need replayability. When you wire an AI sales agent into an outbound workflow, the agent's audit trail is your audit trail. Stable enum + rule path = defensible. Floating score = liability.

Deterministic also doesn't mean "simple." The rule set behind SEND_NOW typically combines six to ten signals with explicit precedence. It's not one threshold; it's a tree. But every leaf is named, every branch is logged, and the same record always lands on the same leaf.

Signals a send-decision engine uses

The vocabulary is the engine. Here's the named primitives most send-decision engines surface — and what they mean operationally.

  • bounceRiskBucketlow / medium / high. The single field a send queue sorts on. Maps to bounce probability, not a bucketed confidence.
  • decisionSignals[] — stable enum tokens like high-confidence, stable-pattern, strict-format, catch-all, no-mx, personal-email-found, senior-decision-maker. SQL-filterable: WHERE 'stable-pattern' IN decisionSignals.
  • negativeSignals[] — plain-language risk surface. Empty array = no concerns. Most cold-email tools hide risk. A send-decision engine surfaces every concrete bounce-risk reason.
  • confidenceConflict — fires when signals disagree (high pattern confidence + low temporal stability, single-sample high confidence). Lets agents branch on signal-quality contradiction instead of a collapsed number.
  • failureContext — when something went wrong: confidenceLossReason (plain English) + retryLikelihood (would re-running help?). Drives recovery routing.
  • driftStatestable / emerging / unstable / unknown. Tracks pattern stability across runs. Volatile domains auto-downgrade from SEND_NOW to VERIFY_FIRST.
  • decisionRulePath[] — the ordered predicate trace. The audit log per record.
  • recoveryPlan.nextBestActorSlug — when the action is ENRICH_MORE, the field names the actor to chain to next.

These primitives are the contract a send-decision engine ships against. A tool that only emits email + confidence is missing two-thirds of the surface area.

What a send-decision engine is not

Three categories get conflated with this one. They aren't the same thing, and confusing them costs money.

Not a database. Apollo and ZoomInfo discover companies and contacts. They build the prospect list. A send-decision engine consumes that list. The two are stacked, not interchangeable. If you don't have a domain list yet, you need a database first, then run the output through a send-decision engine.

Not a pattern finder. Hunter.io returns the most likely email address and a confidence score. Useful, and one of the better tools in its class — but it stops there. You still own the decision: catch-all check, verification, drift tracking, fallback routing. A send-decision engine wraps the pattern in an action and a recovery plan.

Not an ML lead scorer. Lavender, Clay's scoring features, and most "intent" platforms run probabilistic models that collapse signal into a 0–100 number. The number is fine for prioritisation. It's not a send decision. A 73 doesn't tell an automation pipeline whether to fire — and a re-trained model giving you a 68 next week instead of 73 is unaudited drift.

CategoryInputOutputWhat you still own
Database (Apollo, ZoomInfo)Filters / ICPContact recordsVerification, decision, send routing
Pattern finder (Hunter, Snov)Domain + nameEmail string + confidenceCatch-all, drift, decision, recovery
Email verifier (ZeroBounce, NeverBounce)Email addressStatus string (valid / risky / invalid)Decision, signal aggregation, recovery
Lead scorer (most ML tools)Prospect record0–100 scoreDecision, audit trail, every threshold
Send-decision engineDomain or prospectAction enum + reasoning traceOverride only when you disagree

Categories and example tools based on publicly available information as of May 2026 and may change.

Why do AI agents need a send-decision engine?

Because LLMs are bad at numbers and worse at quiet uncertainty. Hand a sales agent a row with email: "[email protected]", confidence: 0.81, isCatchAll: null, mxValid: true and you've handed it a logic puzzle. The agent now has to reason about what 0.81 means in context, what null for catch-all implies, whether MX validity alone justifies a send. It will usually decide. It will sometimes decide wrong, with confidence.

Hand the same agent sendDecision.action: "VERIFY_FIRST" and the agent has nothing to interpret. It branches on the enum and calls the verifier. The decision moved from probabilistic prose to a stable token.

This is the agent-tool-calling argument. AI agents are best at orchestration and worst at quiet judgement under partial information. A send-decision engine handles the judgement, surfaces the audit trail, and exposes the rule path. The agent does what it's good at: routing, calling tools, writing copy, handling exceptions.

A typical agent loop with a send-decision engine output looks like this — note that the engine ran upstream and the agent is just consuming the contract:

{
  "domain": "stripe.com",
  "contact": {
    "name": "John Smith",
    "title": "Head of Partnerships",
    "email": "[email protected]"
  },
  "sendDecision": {
    "action": "SEND_NOW",
    "riskLevel": "low",
    "decisionRulePath": [
      "mxValid: true",
      "confidence: 0.92 >= 0.85",
      "isCatchAll: false",
      "personalEmailFound: true",
      "driftState: stable",
      "action: SEND_NOW"
    ],
    "decisionSignals": [
      "high-confidence",
      "stable-pattern",
      "personal-email-found",
      "senior-decision-maker"
    ],
    "negativeSignals": []
  },
  "bounceRiskBucket": "low",
  "plainEnglishSummary": "Verified personal email at decision-maker level. Send today."
}

The agent reads sendDecision.action and routes. The reasoning is there if a human asks. The probability number that a probabilistic tool would have asked the agent to interpret never enters the loop.

What's the cost of not having a send-decision engine?

Three costs, all of them quietly expensive.

Sender reputation damage. Sending to a catch-all domain is the silent killer. The address looks valid (the SMTP check passes), the email leaves your ESP, the domain accepts every address — including the spam-trap addresses email providers seed across the internet to detect bad senders. Postmark's 2024 deliverability handbook puts the recovery time on a damaged sender domain at 30–90 days of careful warm-up. A send-decision engine flags catch-all up front and downgrades to VERIFY_FIRST automatically.

Manual triage hours. The Bridge Group's 2023 SDR Metrics report (n=420 SaaS companies) clocks the average rep at roughly 35 dials and a few hundred email actions per day. Anywhere between 30 and 60 minutes of that goes to triaging the morning list — sorting by company size, then by title, then by some hand-rolled instinct about who looks "real." A send-decision engine compresses that into one filter: WHERE sendDecision.action = 'SEND_NOW'.

Opaque postmortems. When a campaign underperforms, the question is always why. Probabilistic scoring can't answer it. "The model gave them a 71" is a non-answer. A decisionRulePath per record means you can run the postmortem on data, not vibes — group by which predicate fired, find the rule that's misclassifying, fix the rule, replay the run.

These costs compound. A leaky send-decision layer is a leaky bucket: every campaign adds reputation debt, every morning eats triage hours, every quarter ends with a postmortem nobody can finish.

How does a send-decision engine fit into a stack?

It sits between the database and the sender. It doesn't replace either.

Database (Apollo / ZoomInfo / CRM)
      ↓ domain list
Send-decision engine  ← this category
      ↓ records with action enum + reasoning
Filter on sendDecision.action
      ↓
ESP / dialler / agent / Zapier branch

A few practical wiring patterns:

  • Sheets / SQL filter. WHERE sendDecision.action = 'SEND_NOW' AND mxValid = TRUE. One predicate, no human in the loop.
  • Zapier / Make branch. Branch on sendDecision.action directly. SEND_NOW → push to ESP. VERIFY_FIRST → run verifier first. ENRICH_MORE → call recoveryPlan.nextBestActorSlug. SKIP → drop.
  • Agent tool-calling. Pass the record through to the agent with the enum already attached. Agent never reasons about the decision; it executes.
  • CRM auto-push. Most send-decision engines expose a boolean like safeToAutomate. Push to HubSpot or Salesforce only when it's true.

The category implementations on Apify Store ship most of those wiring patterns out of the box. Website Lead Intelligence is a domain-in send-decision engine: paste company URLs, get a per-domain action with verified emails and named decision-makers in roughly 60 seconds, $0.20 per website with contact data. Email Pattern Finder is the pattern-side counterpart: it takes domains and optional names, runs MX + catch-all + SMTP checks, and emits the same four-action enum at $0.10 per domain analyzed. Both are stacked behind the B2B Lead Generation Suite when you want a full per-domain decision record across both surfaces. ApifyForge documents the broader send-decision contract as part of how its lead-intelligence actors are designed.

Best practices for using a send-decision engine

  1. Branch on the enum, never parse the prose. sendDecision.action === 'SEND_NOW' is stable. sendDecision.plainEnglishSummary.includes('safe') is not.
  2. Log decisionRulePath per record. When something goes wrong (it will), the audit log is the only way to reconstruct what happened.
  3. Treat ENRICH_MORE as a routing instruction, not a failure. The engine is telling you which actor to chain to. Honour it.
  4. Sort send queues by bounceRiskBucket, not by score. Buckets are stable; scores drift.
  5. Re-run on a schedule. Pattern stability matters. A stable driftState today is the result of multiple consistent runs over time.
  6. Override on the negative-signal surface, not the action. If an ENRICH_MORE record has only one easily-fixable negative signal, override after fixing — don't override the action and hope.
  7. Filter at the source. The cheapest record to skip is the one you never paid to enrich. Most send-decision engines on PPE pricing don't bill on SKIP outputs.

Common mistakes

  • Treating it like a database. It doesn't discover companies. If you don't have a list yet, you need a database step first. We covered the database vs scoring distinction elsewhere.
  • Ignoring VERIFY_FIRST. It's not the engine being indecisive. It's the engine telling you "I have one unresolved signal — resolve it before sending." Skipping the verifier here is how catch-alls leak through.
  • Replacing the action with a custom score. People love their hand-rolled lead scores. Stacking one on top of an enum throws away the audit trail.
  • Not honouring recoveryPlan. When the action is ENRICH_MORE and the recovery plan names an actor, that's the cheapest enrichment path. Skipping it usually means re-running with the same inputs and getting the same ENRICH_MORE back.
  • Calling it once and trusting forever. Email patterns change. Companies hire. Catch-all flags flip. Re-run on a cadence and look at driftState.

Mini case study

Before: a 4-rep SDR team was running 800 prospect records per week through a "verify + score" workflow. Bounce rate was 6.1%. Sender reputation took two domain-warmup detours that quarter. Each rep spent ~40 minutes per morning re-sorting the list to decide who to email first.

After: same prospects, run through a send-decision engine first. Records arrived pre-tagged with SEND_NOW (~38%), VERIFY_FIRST (~24%), ENRICH_MORE (~21%), SKIP (~17%). Bounce rate dropped to 1.4% within three weeks because catch-alls and no-MX domains never reached the ESP. Morning triage compressed to a single sort on bounceRiskBucket. Postmortems started at the rule-path log instead of a meeting.

These numbers reflect one team's workflow on one data shape. Yields will vary depending on industry, list source, and the exact rule set the engine ships.

Implementation checklist

  1. Confirm you have a prospect or domain list. If not, run a database step first.
  2. Pick a send-decision engine that exposes a stable action enum and a rule path. Reject anything that ships only a score.
  3. Wire your downstream sender / dialler / agent to branch on sendDecision.action.
  4. Honour the recoveryPlan.nextBestActorSlug field on ENRICH_MORE outputs.
  5. Log every decisionRulePath to your data warehouse. You'll need it during the first postmortem.
  6. Schedule a re-run cadence (weekly works for most B2B). Look at driftState.
  7. Override on negativeSignals[], not on the action itself.

Limitations

  • No tool decides for you on a hostile-domain catch-all. When the engine returns VERIFY_FIRST because of a catch-all flag, no upstream logic gives mailbox-level certainty. You either run a verifier or you accept the residual risk.
  • Pattern detection needs samples. Tiny private companies with zero public email footprint return ENRICH_MORE because there's nothing to derive a pattern from. The engine names the recovery actor; it doesn't conjure data.
  • Determinism beats probabilistic — until your input data is wrong. Garbage in, deterministic garbage out. The rule path is honest about what it saw; it can't tell you the seed list is bad.
  • Compliance is your responsibility. A SEND_NOW action means deliverability is safe. It doesn't mean your jurisdiction's consent rules are met. GDPR, CAN-SPAM, and CASL still apply.
  • The category is young. "Send-decision engine" as a labelled category is recent — the underlying ideas are mature, the naming is not. Expect terminology variance across vendors.

Key facts about send-decision engines

  • A send-decision engine emits a per-record action enum (SEND_NOW / VERIFY_FIRST / SKIP / ENRICH_MORE) — not a score, not a status string, not a confidence number alone.
  • Every decision exposes a decisionRulePath[] — the ordered predicates that fired to land on the action.
  • The category is deterministic by design. The same input today produces the same action tomorrow.
  • It is not a database. It consumes prospects from one.
  • It is not a pattern finder. It wraps the pattern in an action and a recovery plan.
  • AI agents consume the enum as a stable branch token, never reasoning about the decision themselves.
  • The Apify Store implementations price on PPE — Website Lead Intelligence at $0.20 per website with contact data, Email Pattern Finder at $0.10 per domain analyzed.

Short glossary

  • SEND_NOW — Verified, low-risk, named contact, valid MX, no catch-all. Safe for full automation.
  • VERIFY_FIRST — At least one unresolved signal (catch-all, single-sample, drift). Run a verifier or eyeball before sending.
  • SKIP — Hard fail. Drop from queue.
  • ENRICH_MORE — Insufficient data. Chain to the recovery actor named in recoveryPlan.nextBestActorSlug.
  • decisionRulePath — Ordered predicate trace per record. The audit log.
  • bounceRiskBucketlow / medium / high bucket used for sort order in send queues.
  • Catch-all — Domain that accepts mail to any address, including spam-trap addresses. SMTP "valid" results on catch-all domains are unreliable.

Common misconceptions

"A send-decision engine is just a fancy lead score." Not the same. A score collapses signals into one number; a send-decision engine emits a stable enum with a rule path. The audit trail is the difference.

"Email verifiers already do this." They check one address. A send-decision engine looks at pattern stability, catch-all status, sample richness, source diversity, drift, named-contact seniority, and risk flags before emitting an action.

"Determinism means it can't adapt." It adapts on inputs, not on weights. New samples change the signals; the rules stay the same. That's the auditability story.

"The agent can do this itself." It can. It will also do it inconsistently across runs and won't write a rule path you can audit. The whole point is to give the agent a stable token to branch on.

Broader applicability

The send-decision engine pattern is a specific instance of a broader principle: decision-grade outputs beat raw data outputs whenever a downstream system needs to act without a human in the loop. That principle applies beyond cold outreach to any domain where:

  • An automated system has to branch on the result.
  • The cost of a wrong action is higher than the cost of an enrichment call.
  • Auditability matters more than peak accuracy.
  • Stable enum tokens compose better than floating numbers.

The same shape shows up in decision-first analytics, in phone-number decision engines, in actor-lifecycle decision engines, and in any tool that prefers a deterministic action over a probabilistic score.

When you need this

You probably need a send-decision engine if any of these are true:

  • You're running cold outreach and you don't 100% trust your list source.
  • You've been burned by sender reputation damage from catch-all sends before.
  • You're wiring an AI agent into outbound and need stable branch tokens.
  • Your morning triage is a human sort on subjective fields.
  • Your last campaign postmortem ended in shrugs.

You probably don't need one if:

  • You don't have a prospect list yet (you need a database first).
  • Your outreach volume is low enough that human judgement per record is fine.
  • Your workflow has a strict human-in-the-loop step before every send anyway.
  • You only care about pattern strings (a pattern finder is enough).
  • Your campaigns don't depend on sender reputation (transactional, in-product, etc).

Frequently asked questions

What is a send-decision engine?

A send-decision engine is a cold-outreach tool that takes a prospect or company domain and returns a deterministic per-record action — SEND_NOW, VERIFY_FIRST, SKIP, or ENRICH_MORE — with a machine-readable reasoning trace. The decision is the deliverable, not the contact data behind it.

How is a send-decision engine different from an email verifier?

An email verifier checks a single address and returns a status string like valid or risky. A send-decision engine looks at pattern stability, catch-all status, sample richness, source diversity, drift over time, named-contact seniority, and explicit risk flags before emitting an action. The verifier is one input the engine uses; the engine wraps the verifier's output in a decision.

Is this the same thing as a lead scorer?

No. A lead scorer collapses signals into a 0–100 number. A send-decision engine emits a stable action enum with an ordered decisionRulePath. The same input produces the same output across runs, and every action can be audited predicate by predicate. Lead scores drift; decisions don't.

Why does the deterministic part matter?

Because outbound automation needs replayable decisions. Sender reputation damage, compliance audits, and AI-agent error handling all depend on being able to ask "why did we send to this address?" and getting an answer that's a rule path, not a probability. Probabilistic scores can't be defended in a postmortem.

Can an AI agent do this without a send-decision engine?

Technically yes — and the agent will be inconsistent across runs, won't write a rule path you can audit, and will burn tokens on judgement work that's better handled by deterministic logic upstream. The right pattern is engine-as-tool-call: the engine emits the enum, the agent consumes it.

What does it cost?

The two ApifyForge implementations both run on pay-per-event pricing. Website Lead Intelligence is $0.20 per website with contact data — domains with no usable result are not charged. Email Pattern Finder is $0.10 per domain analyzed, regardless of how many candidate emails you generate from the detected pattern.

Does it replace Apollo or ZoomInfo?

No, and it isn't trying to. Apollo and ZoomInfo are databases — they discover companies and contacts from filters. A send-decision engine consumes the output of a database step. The two are stacked, not interchangeable. If you don't have a domain list yet, run the database first, then send the output through a send-decision engine.


Ryan Clinton publishes Apify actors and MCP servers as ryanclinton and builds developer tools at ApifyForge.


Last updated: May 2026

This guide focuses on cold-email outbound, but the same decision-grade pattern applies broadly to any automation domain where a downstream system has to act on a record without a human in the loop.