# How we follow up with every inbound lead The sales agent we run on Kortix — connected to HubSpot, email, and Google Calendar. It researches each new lead, drafts a personalized follow-up, and offers a call slot, with a human approving the send. Canonical page: https://kortix.com/use-cases/lead-follow-up Inbound leads have a short half-life. A form filled out on Tuesday is worth far more if the follow-up goes out Tuesday than if it goes out Friday, but a good follow-up takes research — who the company is, what they do, why they might have signed up — and that research is exactly what gets skipped when the pipeline is full. We handle this by putting an agent on every new lead. It researches the company, drafts a personalized follow-up, and offers a time to talk. This writes up how we run that on Kortix — the connections, the steps, and the guardrails. - **Team:** Kortix - **Connected systems:** HubSpot · Email · Google Calendar - **Trigger:** Scheduled HubSpot sweep (every 15 min) - **Mode:** Trigger-driven · human-gated ## The problem The follow-up that converts is the one that shows we read the form and understood the company. That takes a few minutes of research per lead, and a few minutes times every inbound is more time than a growing team has. So follow-ups either go out generic or go out late, and both lose deals. Templates make the sending fast but not the personalization, which is the part that matters. Booking the call adds another round of back-and-forth on top. The work that moves a lead forward is the work that keeps slipping. ## What we built Our lead pipeline in **HubSpot** is connected to an agent running on Kortix. A scheduled sweep spawns a fresh, isolated session — a cloud sandbox — with scoped access to what a follow-up needs: the lead record, the web for research, our email, and the team calendar. It researches each new lead, drafts a personalized message, and proposes a call slot. A human approves before it sends. ## How it works ### Connect HubSpot as the trigger A scheduled **trigger** sweeps HubSpot every 15 minutes for new leads, and each firing spawns a fresh **session** in its own sandbox. A sweep that turns up several new leads at once still runs as a single session, but each lead is handled as an independent unit — a research or drafting failure on one lead never blocks or corrupts the others. Sessions don't share state between sweeps: the marker written back onto each HubSpot record is what carries forward. ### Give the agent our playbook How we follow up lives as **skills** and **memory** loaded into every session: our positioning, the tone we write in, what a good qualifying question looks like, and follow-ups that landed before. The agent writes to that standard rather than inventing one, and the memory updates as deals move. ### Connect what a follow-up can touch Through scoped **connectors**, brokered server-side so no raw token reaches the model, the agent can: - **Research the company** — it reads the lead's site and public information to understand what they do and why they signed up. - **Read and update HubSpot** — full lead context in, research notes back on the record. - **Draft the email** — a personalized follow-up written to our playbook, ready to send. - **Offer a slot on Google Calendar** — it checks real availability and proposes a specific time to talk. ### Set the guardrails The agent researches and drafts freely, but nothing goes out on its own: every follow-up stops at a **human approval gate** as a draft for a person to review and send. Credentials are encrypted in the secrets manager and injected at runtime, never shown to the model or written to logs. ### Let each lead run With that in place, a new lead arrives already worked: the company researched, the record updated, a personalized email drafted, and a call slot proposed against real availability. The person on sales reviews the draft, adjusts if they want, and sends — instead of starting each follow-up from a blank page. > **The pattern** > Connect the CRM via a **trigger** on new leads, give the agent scoped > **connectors** into HubSpot, email, and the calendar, encode the sales playbook > as **skills** and **memory**, and gate every send behind a human. ## Guardrails Giving an agent the ability to reach out to leads is a brand question as much as a sales one. The relevant controls on Kortix: - **Isolation.** Each sweep runs in its own microVM sandbox — a fresh session that can cover several new leads at once, each handled as an independent unit so a failure on one never blocks the rest. Only the drafts it produces leave the sandbox. - **Scoped secrets.** The HubSpot, email, and Calendar credentials are encrypted in the secrets manager and injected into the sandbox at runtime, never exposed to the model or the logs. - **Human approval gate.** No message reaches a lead without a person reviewing the draft and sending it. - **Everything is code.** The agent's persona, skills, and permissions are files in the repo — versioned and changed through a reviewed **change request**, not a dashboard setting. ## The outcome - **Every lead:** Researched and followed up, not just the easy ones - **Same-day:** Personalized follow-up ready while the lead is still warm - **3 systems:** HubSpot, email, and the calendar in one agent Every inbound lead now arrives with the research done, a personalized draft written, and a call slot offered — waiting for a person to approve rather than sitting untouched. The team spends its time deciding which leads to push instead of doing the same research over and over. The setup relies on four pieces: sandbox isolation per lead, a secrets manager to broker the HubSpot, email, and Calendar tokens, a human approval gate before anything reaches a lead, and memory that improves as deals move.