4 ready-to-build workflows

AI agent workflows for Sales prospecting & pipeline hygiene

For teams with no RevOps: score inbound with your own ICP rules, follow up past attempt one, keep every deal owning a next step — and never let an agent commit a price.

Each recipe below is expressed only in VegaDūta's real workflow building blocks — Trigger, Agent, Knowledge, Condition, Approval, Output, Tool (MCP), Voice, Device, Loop, Code and Parallel — so it maps 1:1 to something you can assemble in the Workflow designer. Consequential actions always pass a human Approval step.

1. Website form → enriched, scored and routed in minutes

Leads from the website form land in a shared inbox nobody owns. By the time someone opens it, it's Thursday, half are students and job applicants, and the two that mattered have already booked a call with someone else.

Trigger: Webhook (website lead form submission)

How the workflow runs

  1. Trigger

    The form posts to a Webhook. Your website's lead form posts straight into the workflow on a Webhook — first-party and honest, no connector required and none pretended. Every submission enters the same path within seconds of being submitted.

  2. Parallel

    Research while the reply is drafted. A Parallel node runs two things at once: a research pass over public, business-level information about the company, and a first-draft acknowledgement. The lead isn't waiting on the slower branch.

  3. Agent

    Enrich — company facts only. An economy-tier agent gathers business-level facts: what the company does, rough size band, whether they mention a competitor publicly. It never assembles a personal profile, and it never scrapes personal contact details.

  4. Code

    Score it with YOUR ICP rule. A user-defined tool — a SpEL expression over the tool's JSON input — computes the score. Sandboxed by construction: no method calls, no constructors, no bean or type references, no loop in the grammar. A formula tool, not a scripting engine — which is precisely the shape of an ICP score, and it means you tune your own definition of a good lead weekly without a developer or a redeploy.

  5. Condition

    Route by score and intent. A Condition node splits: high-score demo requests to the founder on Slack immediately, mid-score into the nurture cadence, students/applicants/spam closed politely and out of the pipeline.

  6. Approval

    Approve the first outbound reply. An Approval node holds the drafted reply to a real prospect. The agent drafts; a human sends anything going to a prospect.

Channels & connectors

  • Webhook
  • Slack
  • Email
  • WhatsApp
  • Approval / HITL
  • Tool (MCP → your CRM)

Outcome

Every form submission is enriched, scored against your own written ICP rule and routed within minutes, with the genuinely good ones surfacing in Slack while they're still warm.

Why it helps

The mechanism is speed and an explicit rule: the delay that loses inbound leads is queue time, not reply quality, and the scoring being a formula you wrote means routing is consistent on Thursday afternoon and explainable when you disagree with it.

Build spec

2 agents1 economy-tier enrichment agent + 1 standard-tier reply drafter, run in Parallel. Scoring is a user-defined SpEL tool — deterministic, no model call, no per-lead variance. · Pattern: Parallel (enrich ‖ draft) → deterministic SpEL scoring → route → human approves the outbound

System prompt (paste-ready)

You triage inbound leads for {{company}}. Given a form submission {name, work_email, company, message} plus enrichment, return strict JSON {intent: DEMO|PRICING|SUPPORT|JOB_SEEKER|STUDENT|SPAM, summary, what_they_want, employees_band, uses_competitor: true|false|unknown, requested_demo: true|false}. Use ONLY the submission and publicly available business-level facts about the company. Never build a personal profile of the individual, never look for personal contact details, never guess at seniority or salary. Set unknown rather than inferring. Then draft a short first reply that answers their actual question from Knowledge — no pitch, no fabricated familiarity, and no claim that you've read their blog, used their product or admired their work. Never state a price beyond the published page and never offer a discount.

Agent roles & model tiers

  • Enricher (every lead) Economy tier — runs on 100% of submissions including the job applicants, so this is the volume step

    Business-level public facts only, into strict JSON, with `unknown` where the facts aren't there. No personal profiling, no scraped contact details, no inference dressed as fact.
  • Reply drafter (real prospects only) Standard tier with a fallback model — a prospect reads this one

    Short reply grounded in Knowledge, answering what they actually asked. No pitch, no fabricated personalisation, no price or discount commitment.
  • Scorer — NOT an agent User-defined SpEL tool: deterministic, zero model cost, identical every run

    Tenant-authored formula, e.g. `lead_score`: (input.employees > 200 ? 40 : 10) + (input.usesCompetitor ? 30 : 0) + (input.requestedDemo ? 30 : 0). You own the weights — raise the demo weight, add a geography or industry term, and the next lead is scored the new way with no developer and no deploy.

MCP connectors

  • Your CRM — via a Tool (MCP) node to create the lead record (no first-party connector)
  • Your analytics / ad platform — via a Tool (MCP) node if you attribute the source (no first-party connector)
  • Website form — inbound via Webhook (first-party); Slack, Email, WhatsApp — first-party notification and reply channels

Built-in tools

  • user-defined tool `lead_score` (SpEL over the enriched lead JSON — your ICP weights, tunable weekly)
  • web_search (public, business-level company context only)
  • knowledge_search (positioning and objection handling, so the reply answers the real question)
  • http_request (create the lead in your CRM through its API)

Guardrails

  • Enrichment is business-level and public only — no personal profiles, no scraped personal contact details, no purchased data, and `unknown` wherever the fact isn't there rather than an inference presented as fact
  • No fabricated personalisation: the agent may not claim to have read their post, visited their site or used their product
  • No price beyond the published page and no discount — ever, from any agent; commercial commitments route to a human
  • Every outbound reply to a real prospect passes the Approval node before sending; the agent drafts, a human sends
  • Consent and opt-out are checked before the first message, and the reply channel is the one they used or consented to — a form submission is not WhatsApp opt-in
  • Job seekers, students and spam are routed out of the sales pipeline politely and are never added to any nurture cadence

Cost strategy

This is the textbook cost-routing case: enrichment runs on every single submission including the ones that will be closed as job applicants, so it belongs on the economy tier with a hard cap; the reply drafter — standard tier plus a fallback — only ever runs on the qualified slice. Scoring costs nothing at all because it's a SpEL formula rather than a model call, which also means the score doesn't drift between runs.

Output & delivery

The Webhook fires → Parallel enrichment and drafting → the user-defined `lead_score` SpEL tool scores against your own ICP → the Condition node routes (Slack ping for hot demo requests, cadence for mid, polite close for the rest) → the Approval node gates the outbound reply → the lead is written to your CRM via a Tool (MCP) node with the score and its reason attached.

2. Follow-up that survives past attempt one

You send one follow-up. If they don't reply, that's the end of it — not by decision, but because remembering to send a second one on day six while shipping a release is not a thing that happens. Deals you'd have won die of silence.

Trigger: Scheduled (daily sweep of contacts awaiting a reply)

How the workflow runs

  1. Trigger

    Daily sweep, not a mass blast. A scheduled run reads the contacts awaiting a reply from your CRM via a Tool (MCP) node. It is a queue of individuals, deliberately, not a campaign list.

  2. Loop

    One contact at a time. A Loop node handles each contact separately, so every send decision is made on that person's own consent state, history and channel — never on the batch's average.

  3. Code

    Should this person be touched at all?. A user-defined SpEL tool decides eligibility before anything is drafted: consent present, not opted out, attempt count under the cap, minimum gap since the last touch elapsed, channel policy satisfied. A sandboxed formula — no method calls, no constructors, no type references, no loop construct — which is exactly right for a rule you want auditable.

  4. Agent

    Draft a follow-up that adds something. An Agent node drafts a message that says something new — the answer to a question raised on the call, a relevant case study from Knowledge — rather than 'just bumping this'. If it has nothing new to say, it returns nothing and the contact is skipped.

  5. Approval

    Batch approval before anything sends. An Approval node presents the day's drafts together with each recipient's attempt number. Outbound at scale is a human decision — you scan, cut two, and send.

  6. Output

    Send, log, and stop when they say stop. Approved messages go out on the consented channel, the attempt count is written back to the CRM via a Tool (MCP) node, and any reply — especially an opt-out — permanently ends the sequence for that person.

Channels & connectors

  • Email
  • WhatsApp
  • SMS / Twilio
  • Slack
  • Approval / HITL
  • Tool (MCP → your CRM)

Outcome

Follow-ups continue to a defined limit with something new to say each time, on consented channels, and stop the moment someone replies or opts out.

Why it helps

The mechanism is that the second and third touch stop depending on someone remembering — the cap and the consent rule are enforced in the workflow, which is also what keeps persistence from turning into pestering.

Build spec

1 agent1 drafting agent, and it only runs for contacts the SpEL eligibility rule already cleared — the cheapest way to run a cadence is to not generate text for people you shouldn't message. · Pattern: Scheduled sweep → Loop → deterministic eligibility (SpEL) → draft → batch human approval

System prompt (paste-ready)

You draft follow-ups for {{company}}. Given the contact's history {last_message_sent, their_last_reply, call_notes, attempt_number, open_questions[]}, draft ONE short message that adds something they don't already have: the answer to a question they raised, a relevant case study from Knowledge, or a genuinely useful resource. If there is nothing new to say, return {send: false, reason} — a skipped touch is a correct outcome and 'just bumping this to the top of your inbox' is not. Never invent familiarity ('I loved your post about X') and never reference anything you did not receive in the history. Never offer a discount, a price concession or an extended trial. Include a plain one-line opt-out. Reference the attempt number in your own reasoning: by the final attempt, say plainly that this is the last one.

Agent roles & model tiers

  • Follow-up drafter (eligible contacts only) Standard tier, fallback model configured — the message is read by a person deciding whether to take you seriously

    One short message that adds something new, grounded in call notes and Knowledge, with opt-out. Return send:false rather than writing a bump. Never fabricate familiarity, never concede on price.
  • Eligibility + cadence rule — NOT an agent User-defined SpEL tool: deterministic, zero cost, fully auditable

    Tenant-authored formula, e.g. `followup_due`: input.consented && !input.optedOut && input.attemptCount < 4 && input.daysSinceLastTouch >= (input.attemptCount == 1 ? 4 : 9) && !input.replied. You own the cap and the spacing — widen the gap or drop the cap to 3 next week and it applies immediately, no developer, no redeploy.

MCP connectors

  • Your CRM — via a Tool (MCP) node to read the awaiting-reply queue and write back the attempt count (no first-party connector)
  • Email, WhatsApp, SMS (Twilio) — first-party send channels; Slack — where the daily approval batch is reviewed

Built-in tools

  • user-defined tool `followup_due` (SpEL over the contact JSON — consent, opt-out, attempt cap, spacing, replied-state)
  • knowledge_search (case studies, objection handling, the answer to what they actually asked)
  • send_email (the email branch)
  • http_request (read and update the CRM)

Guardrails

  • Hard cap on attempts, enforced by the SpEL rule and not by anyone's memory; the final attempt says plainly that it's the last one
  • Opt-out is permanent, honoured on every channel, and written back to the CRM so no other workflow can re-enter that person into a sequence
  • Any reply — including a negative one — ends the cadence immediately; the workflow never continues a sequence into a live conversation
  • Messaging-platform policy is respected per channel: WhatsApp follow-ups require prior opt-in and an approved template outside the 24-hour window, and an ineligible contact is skipped rather than rerouted to another channel to get around it
  • No scraped or purchased contact lists — every contact in the queue is someone who gave you their details in a real interaction
  • No fabricated personalisation: the agent may not claim to have read, seen or admired anything it wasn't given
  • No discount, price concession or extended trial from an agent — those are a human's to offer, at the Approval node or in person
  • The whole day's batch passes the Approval node before any of it sends

Cost strategy

The ordering is the saving: eligibility is evaluated first as a free, deterministic SpEL expression, so the standard-tier drafting call only happens for contacts who should actually be messaged. On a list where most contacts are inside their spacing window on any given day, that means most days generate very few paid calls. Add a fallback model so a provider outage delays a follow-up rather than dropping it silently.

Output & delivery

The scheduled sweep pulls the awaiting-reply queue from the CRM → the Loop evaluates `followup_due` per contact → eligible contacts get one grounded, additive draft (or a documented skip) → the day's batch is reviewed at one Approval node → approved messages send on the consented channel, attempt counts and opt-outs are written back through a Tool (MCP) node.

3. Every deal owns a next step (weekly pipeline sweep)

Open the CRM and half the deals have no next step, no date and a last-activity in April. Nobody is lying — the pipeline just decays quietly between calls, and the weekly review turns into ten minutes of scrolling and a shared feeling that it's probably fine.

Trigger: Scheduled (weekly, before the pipeline review)

How the workflow runs

  1. Trigger

    Run it before the review, not during. A scheduled run each week pulls all open deals from your CRM via a Tool (MCP) node, so the review starts with a list instead of a scroll.

  2. Loop

    Per deal, not per pipeline. A Loop node walks each open deal on its own facts — stage, last activity, next-step field, expected close date — instead of eyeballing the board.

  3. Code

    Staleness as a rule you wrote down. A user-defined SpEL tool classifies each deal: FRESH / DRIFTING / STALE / GHOST, from your own thresholds. Sandboxed by construction — no method calls, no constructors, no bean or type references, no loop construct in the grammar. It's a classifier formula, and having it as a formula means the definition of 'stale' is written down once and applied identically to every deal, including the ones you like.

  4. Agent

    Propose the concrete next step. An economy-tier agent proposes a specific next action per flagged deal — from the call notes and your Knowledge — not 'follow up'. Where there's genuinely nothing left to do, it proposes closing the deal, which is the step nobody takes voluntarily.

  5. Agent

    Summarise the week. A standard-tier agent rolls it up: what moved, what's drifting, what should close-lost this week, and where the pipeline is thin — in one message you can actually read before the meeting.

  6. Output

    Digest to Slack, nothing auto-changed. The digest posts to Slack with per-deal proposed next steps. Writing them back to the CRM happens only for the ones a human accepts — the agent doesn't edit your pipeline behind you.

Channels & connectors

  • Slack
  • Email
  • Approval / HITL
  • Tool (MCP → your CRM)

Outcome

Every Monday the pipeline arrives pre-classified with a proposed next step per stalled deal and an explicit close-lost list, instead of a board nobody wants to scroll.

Why it helps

The mechanism is a written-down definition of stale applied uniformly: the deals that decay are the ones you avoid looking at, and a rule that runs on all of them removes the selective attention without pretending to know more than your notes do.

Build spec

2 agents1 economy-tier next-step proposer (runs per flagged deal) + 1 standard-tier weekly summariser (runs once). Staleness classification is a user-defined SpEL tool — no model call, no drift between weeks. · Pattern: Loop → deterministic SpEL classification → cheap per-deal proposal → one synthesis → human accepts changes

System prompt (paste-ready)

(Per deal) Propose the single most useful next step for ONE open deal, using only its own record and notes {stage, last_activity_date, next_step, close_date, notes, last_contact_summary}. Return strict JSON {deal_id, classification, proposed_next_step (specific and dated — 'send the security questionnaire answers by Thursday', never 'follow up'), owner_action_required, confidence}. If the notes show nothing left to pursue, propose CLOSE_LOST with the reason from the notes. Never invent activity that isn't in the record, never assume a conversation happened, never infer intent from silence beyond flagging it as silence. You propose only — you never edit the CRM.

Agent roles & model tiers

  • Next-step proposer (per flagged deal) Economy tier — it runs once per stalled deal every week, so this is the recurring volume

    One specific, dated next step per deal from its own record. CLOSE_LOST where the notes support it. Never invent activity. Never write to the CRM.
  • Weekly summariser (once) Standard tier — the one call anyone actually reads

    Roll the per-deal results into a short pre-review digest: what moved, what's drifting, the close-lost candidates, where the pipeline is thin. Use only the provided items and real counts — no estimated forecasts and no invented probabilities.
  • Staleness classifier — NOT an agent User-defined SpEL tool: deterministic, free, identical every week

    Tenant-authored formula, e.g. `deal_staleness`: input.daysSinceActivity > 45 ? 'GHOST' : (input.nextStep == null || input.nextStepDate == null ? 'STALE' : (input.daysSinceActivity > 14 ? 'DRIFTING' : 'FRESH')). Your thresholds, your definition — change 14 to 10 for a faster cycle and the whole pipeline is reclassified on the next run, with no developer and no redeploy.

MCP connectors

  • Your CRM — via a Tool (MCP) node to read open deals and (only on acceptance) write next steps back (no first-party connector)
  • Slack — where the digest lands (first-party); Email — alternative delivery

Built-in tools

  • user-defined tool `deal_staleness` (SpEL over the deal JSON — your thresholds for drifting, stale and ghosted)
  • knowledge_search (what the standard next step is at each stage, per your own sales notes)
  • http_request (read open deals; write accepted next steps back)

Guardrails

  • The agents propose only — no next step, stage change or close-lost is written to the CRM until a human accepts it in the digest; your pipeline is never edited behind you
  • No invented activity and no invented forecast: proposals cite the deal's own notes, and the summary uses real counts rather than estimated probabilities or a made-up close likelihood
  • Silence is reported as silence — the classifier flags an absence of activity, it does not infer that a prospect has decided anything
  • The digest is internal (Slack/Email) — this workflow never messages a prospect; any outreach it suggests goes through the follow-up recipe with its own consent checks and approval
  • Deal data stays inside the workflow: no customer record is sent to a web search or any external tool that isn't your own CRM

Cost strategy

Cost scales with stalled deals, not total deals, because the free SpEL classifier filters first — FRESH deals never reach a model at all. The per-deal proposer sits on the economy tier since it runs weekly across the flagged set; the single standard-tier synthesis is where the reasoning budget goes, and it costs the same whether you have 20 deals or 200.

Output & delivery

The weekly run pulls open deals via a Tool (MCP) node → the Loop applies your `deal_staleness` SpEL rule → flagged deals get a cheap, specific, dated next-step proposal → one standard-tier call writes the pre-review digest → it posts to Slack, and only the proposals a human accepts are written back to the CRM.

4. Demo call → grounded recap and a tailored proposal (price still human)

The same eight demo questions get answered from scratch every time — the integration one, the data-residency one, the 'can we export' one. Afterwards the recap gets written from memory two days later, if at all, and the proposal is last quarter's deck with the name changed.

Trigger: Webhook (call notes or transcript submitted after the demo)

How the workflow runs

  1. Trigger

    Notes or transcript come in. A Webhook fires when the rep submits call notes or a transcript from a recorded, consented call. This is the only input — the workflow never assumes anything about a conversation it wasn't given.

  2. Agent

    Extract what was actually asked. An economy-tier agent pulls the structured facts: questions asked, objections raised, requirements stated, commitments made by the rep, and who is involved in the decision — each tied to the line it came from.

  3. Knowledge

    Answer the recurring eight, from Knowledge. A Knowledge node retrieves the team's own documented answers to the integration, security, export and residency questions. This is what stops the from-scratch rewriting — and it means the answer is the same one the last prospect got.

  4. Parallel

    Recap and proposal, in parallel. A Parallel node runs the recap draft and the proposal draft at once. The recap needs to go out today; the proposal takes longer, and neither should wait for the other.

  5. Approval

    Human approves — always, for price. An Approval node holds both. Any price, discount, term, timeline or scope commitment is a human decision without exception; the agent may reproduce the published pricing and nothing beyond it.

  6. Output

    Send the recap, log the answers. The approved recap goes to the prospect on Email; the questions that Knowledge could not answer are logged, because that list is what your docs are missing and it's why the same eight questions were being improvised in the first place.

Channels & connectors

  • Webhook
  • Email
  • Slack
  • Knowledge base
  • Approval / HITL
  • Tool (MCP → your CRM)

Outcome

A recap with consistent, sourced answers goes out the same day, a tailored proposal draft is ready for review, and the gaps in your own documentation become a visible list.

Why it helps

The mechanism is reuse plus a gap log: the recurring questions get one canonical answer instead of eight improvised ones, and the questions Knowledge can't answer are surfaced rather than quietly re-improvised on the next call.

Build spec

3 agents1 economy-tier extractor + 2 drafters running in Parallel (recap on standard tier, proposal on premium — the only premium call in either pack). The price gate is a workflow node, not a prompt instruction. · Pattern: Extract cheaply → Parallel (recap ‖ proposal) → human approves, with price always human

System prompt (paste-ready)

(Extractor) From demo call notes or a transcript, return strict JSON {questions_asked[{question, line_ref}], objections[{objection, line_ref}], requirements[], commitments_made_by_rep[], stakeholders[], next_step_agreed}. Extract only what is present — never infer a requirement from tone, never assume a budget, never record a commitment that wasn't spoken. If the notes are thin, return what's there and mark the rest missing; a short honest extraction is better than a plausible full one.

Agent roles & model tiers

  • Call extractor Economy tier — structured extraction on every call, no prose required

    Strict JSON of questions, objections, requirements, spoken commitments and stakeholders, each tied to a line reference. Nothing inferred, nothing assumed.
  • Recap writer Standard tier — goes to the prospect today

    Write the recap: what we discussed, answers to their questions taken verbatim-in-substance from Knowledge with citations, the agreed next step, and an explicit 'we'll confirm' for anything uncovered. Never state a price beyond the published page. Never invent a timeline.
  • Proposal drafter Premium tier — the one place in both packs worth it: a tailored commercial document, drafted once, read closely, and edited by a human before it leaves

    Draft a proposal from the extracted requirements and Knowledge case studies. Leave every price, discount, term and timeline as an explicit blank for the human to fill — do not populate them, not even from the published page. No invented references, no logo the case studies don't cover.

MCP connectors

  • Your CRM — via a Tool (MCP) node to attach the recap and update the deal (no first-party connector)
  • Your call-recording tool — inbound via Webhook (no first-party connector)
  • Email — first-party recap channel; Slack — internal review

Built-in tools

  • knowledge_search (documented answers to the recurring questions, security and residency notes, nameable case studies)
  • send_email (the approved recap)
  • http_request (attach the recap and next step to the CRM record)

Guardrails

  • No price, discount, term, timeline or scope commitment from any agent — the proposal drafter leaves them blank by construction and the Approval node is where a human fills and owns them
  • Answers about the product come only from the team's own Knowledge with citations; an undocumented question is written as 'we'll confirm' and logged as a documentation gap, never improvised
  • Nothing is inferred from the call that wasn't said — no assumed budget, no assumed authority, no commitment recorded that wasn't spoken
  • Transcripts are used only where the call was recorded with the participants' consent, and call content is never sent to a web search or any external tool that isn't your own CRM
  • No fabricated familiarity or invented references in the proposal — a case study can only be named if Knowledge says you're allowed to name it
  • The recap goes to the prospect only after human approval; the agent drafts, a human sends

Cost strategy

This is deliberate cost routing across three tiers in one workflow: extraction is economy (it runs on every call and produces JSON), the recap is standard (a person reads it today), and the proposal is the single premium call — justified because it runs rarely, carries commercial weight and is edited by a human anyway. Configure a fallback model on the premium step so an outage downgrades the draft instead of stalling the deal, and cap the transcript window so a two-hour recording can't quietly become the most expensive run of the month.

Output & delivery

Extractor produces structured call facts cheaply → Parallel drafts the recap and the proposal → both land at one Approval node where a human fills in every price and term → the approved recap sends on Email and attaches to the CRM via a Tool (MCP) node → unanswerable questions are logged as the documentation gaps to close before the next demo.

Related industries

Build one of these in minutes

The sandbox gives you a live agent workspace — no account, no card. Or head back to the full catalogue and compare patterns across every industry.

See how VegaDūta compares to n8n, Dify and BotpressWhy VegaDūta's architectureEstimate your WhatsApp API costs