ICP filter in one place
Firmographics, role, region, and three to five disqualifiers stored as a single source of truth.
Guide — — by Mahmoud Zalt
A practical AI sales agent architecture: discovery, enrichment, outreach, follow-ups, with the stack choices, failure modes, and Sistava as the shortcut.
An AI sales agent is not a single chatbot. It is a small system that takes an ICP definition and turns it into booked calls without you babysitting every step. The loop runs in four stages. Discovery: query a data source (Apollo, ZoomInfo, LinkedIn Sales Nav, your own site visitors) for accounts that match your ICP filters. Enrichment: pull person-level signals (role, tenure, recent posts, funding, tech stack) and decide whether this contact is worth a touch. Outreach: draft a first-touch message tuned to the signal, send it through your domain with throttling, and log it to the CRM. Follow-ups: schedule the next steps, watch for replies, classify intent, and either book the meeting or stop the sequence. Each stage has its own failure mode, its own latency budget, and its own cost. The whole system is only as honest as the weakest stage.
Discovery and enrichment are where most outbound stacks quietly bleed money. The pattern that works: keep the ICP definition in one place (a short doc with firmographic filters and three to five disqualifiers), and treat every data source as a candidate generator, not as truth. The agent pulls a candidate list from Apollo or Clay, then enriches with at least two independent sources (LinkedIn for role and tenure, the company site for positioning, a news or funding feed for timing). It scores each candidate against the ICP and disqualifiers, then writes a one-line reason for the score so a human can audit later. Skip this audit trail and you end up with a fast pipeline of wrong people. Sistava bundles the discovery query, the enrichment fan-out, and the score plus reason into the same AI Sales Employee, so you stop reconciling three dashboards.
Firmographics, role, region, and three to five disqualifiers stored as a single source of truth.
Never trust a single provider. Cross-check role, tenure, and signal from at least two feeds.
Every candidate gets a numeric score and a one-line justification a human can audit.
Hard exclusions (wrong region, competitor, ex-customer) run before any draft is generated.
Every candidate is checked against the CRM to avoid touching an open opportunity twice.
Outreach and follow-ups are where deliverability, voice, and CRM hygiene either compound or collapse. The agent has to draft a message that references the actual signal (a hire, a post, a launch), pass a tone check against your brand voice, send through a warmed sending domain, and log the activity to the CRM with the same identifier the next step will use. Follow-ups need a budget (max steps, max days, max sends per day per inbox) and an intent classifier on inbound replies so a positive reply books a meeting and a negative reply ends the sequence cleanly. Most homegrown stacks skip the reply triage and end up nagging people who already said no. The well-designed loop is conservative on volume and sharp on context. CrewAI and LangGraph can absolutely build this. Lindy will do it with less code. Sistava ships the loop already wired to inbox, CRM, and memory.
The hidden glue across the four stages is memory. Without persistent memory, the agent treats every account as new every day. With memory, it remembers that Acme already got a touch from Sales last month, that the contact replied positively but went dark, and that a different colleague at Acme is now the right next move. This is the single biggest gap between a polished demo and a system that actually books meetings. Treat memory as a first-class architectural concern, not a nice-to-have you bolt on later. Lindy and CrewAI both expose memory primitives. Sistava ships memory and a work journal by default, scoped to your workspace.
Once the four loops are running, the question shifts from "can the system send messages" to "can the system make good decisions about which messages not to send". Restraint is what separates an AI Sales Employee from a spam cannon. The next two sections cover the stack you can assemble yourself if you enjoy plumbing, and the failure modes I have personally walked into that you can avoid by reading them before you build. Both lists are written from running the same loop on my own business.
The honest map of the current vendor space: Apollo, ZoomInfo, or LinkedIn Sales Navigator for the candidate list. Clay or Clearbit for the enrichment fan-out and scoring. Instantly, Smartlead, or Lemlist for the sending infrastructure and warming. n8n or Make for the glue between those tools. Lindy or CrewAI for the agent layer that drafts and reasons. HubSpot, Pipedrive, or Salesforce as the CRM of record. Most teams end up stitching five to seven of these together with API keys, webhooks, and a Notion runbook that goes stale by month two. The stack works, but the maintenance tax is the part nobody mentions in the demo. Every API change, every deliverability incident, every CRM field rename becomes a small fire. The reason Sistava exists is that the four loops are tightly coupled, so collapsing them into one workspace removes most of the stitching.
You have a sales engineer, a real ops budget, and unique integrations no platform covers.
You are a solo founder or small team and want the loop running this week without wiring vendors.
Highly custom ICP rules, niche data sources, or a compliance regime that needs vendor isolation.
Standard B2B outbound where speed to first booked meeting matters more than tool sovereignty.
Five failure modes show up almost every time. First, ICP drift: the filter document is updated in one tool but not the others, and the pipeline quietly targets the wrong segment for weeks. Second, double-touch: the same contact gets messaged by two sequences because the CRM dedup runs on a different identifier than the sender. Third, deliverability collapse: the agent ramps volume faster than the warming schedule allows, and the domain reputation tanks for a quarter. Fourth, reply blindness: the system sends step three of a sequence after the prospect already replied to step one, which is the single biggest reason recipients hit "report spam". Fifth, memory loss: an agent restart loses the running context and starts pitching the same accounts from zero. Each of these is preventable, and each of them has burned at least one founder I have spoken to this quarter.
Only if you have engineering capacity and unusual requirements. CrewAI and LangGraph are excellent for custom multi-agent flows, but they put the four loops on you to build, host, and maintain. For standard B2B outbound, an AI Sales Employee like Sistava ships the loops already wired.
n8n is great glue but a weak reasoner. It will move data between Apollo, Clay, and HubSpot reliably, yet you still need an LLM-driven layer to draft, score, and triage. Most teams use n8n for transport and a separate agent (Lindy, CrewAI, or a Sistava AI Employee) for the thinking.
Cap daily sends per inbox, rotate sending addresses, warm new domains for at least four weeks, and never sequence a contact who already replied. Most deliverability collapses happen because reply triage is missing, not because the copy is bad.
Hybrid. Use a tight template skeleton for structure and let the agent fill the signal-specific lines (the reason this prospect made the cut). Pure templates feel like spam, pure freeform drifts off-voice.
Lindy is strong on the agent layer but you still bring Apollo, your CRM, and your sender. Apollo is strong on data and sending but weak on agent reasoning. Sistava collapses the four loops into one AI Sales Employee with memory, channels, and CRM logging in the same workspace.
If you want to see the cold-outreach half of this architecture in deeper operational detail (sender warm-up, sequence design, reply triage, daily caps), the next read goes step by step through the outbound side. It is the practical companion to this architecture overview and the piece I send to founders who tell me they have a list but no system. Treat it as the implementation guide to the outreach and follow-up loops described above.
The framing I keep coming back to: an AI sales agent architecture is not a vendor list, it is a closed loop. Discovery feeds enrichment, enrichment feeds outreach, outreach feeds follow-ups, and the whole thing only works when memory and CRM logging stitch the steps together. You can absolutely assemble this from Apollo plus Clay plus Lemlist plus Lindy plus n8n plus HubSpot, and a few teams I respect have built exactly that. For most solo founders and small teams, the maintenance tax of five to seven vendors is the reason the system never reaches a steady state. Sistava AI Sales Employee exists for that exact gap: the four loops collapsed into one workspace, memory and channels included, billed as one flat monthly plan starting at {PERSONAL_USD}. Pick the path that matches your team size and your patience for plumbing, and start the loop with one ICP and one inbox before you scale anything.