Proactive Voice Outreach Agent

A scheduled outreach system that reviews your HubSpot pipeline, identifies deals and contacts that need follow-up, and initiates outbound voice calls through ElevenLabs when conditions are met. An MCP server provides the voice agent with limited, call-scoped tools so it can look up deal context and schedule follow-ups during live conversations. A separate skillset gives the scheduler agent the ElevenLabs calling abilities and the minimal CRM reads it needs to decide who to call. A third skillset gives the sales team full CRM access for pipeline review - complete separation of concerns across all three surfaces.

voice
ElevenLabs
outbound calling
2982

Most voice agent demos stop at inbound. A customer calls in, the agent answers, tools fire, everyone is impressed. But the harder and more valuable problem is outbound - an agent that decides when to call, who to call, and what to say, all without a human pushing a button.

This blueprint solves that problem by combining three ChatBotKit primitives: a trigger integration that wakes an agent on a schedule, CRM abilities that let the agent inspect pipeline state, and the ElevenLabs SIP trunk call ability that lets the agent initiate a real phone call.

How it works

A Scheduler Agent runs every hour via a trigger integration. On each run it:

  1. Searches HubSpot deals that are stalled, overdue, or in a stage that requires follow-up.
  2. Fetches the associated contact details including phone number.
  3. Evaluates whether a voice call is warranted based on deal value, days since last activity, and stage.
  4. If conditions are met, initiates an outbound call via elevenlabs/sip-trunk-call/start, passing the contact phone number and injecting CRM context (deal name, value, stage) as dynamic variables so the ElevenLabs voice agent has full context.
  5. Logs the outreach attempt to a shared workspace file for audit and deduplication.
  6. Updates the HubSpot contact with a note recording that an automated call was placed.

The ElevenLabs voice agent handles the live conversation. It is configured on the ElevenLabs side with a prompt that references the dynamic variables injected at call time. ChatBotKit does not control the voice conversation itself - it controls when and why the call happens, and what context the voice agent receives.

Separation of concerns

The system uses three independent skillsets. The Voice Agent MCP Toolkit powers the MCP server that the ElevenLabs voice agent connects to during live calls. It provides limited, read-only deal and contact lookups plus a calendar scheduling ability - just enough for the voice agent to be useful on a call without exposing full CRM write access. The Voice Calling Toolkit powers the Scheduler Agent. It contains the ElevenLabs call ability with a hardcoded agent ID, read-only CRM lookups for deciding who to call, and workspace logging for audit and deduplication. The Pipeline CRM Toolkit powers the Pipeline Assistant bot with full CRM read/write access for the sales team.

The MCP layer

The MCP server exposes only the Voice Agent MCP Toolkit - a limited set of read-only tools the ElevenLabs voice agent can call during live conversations. It intentionally does not include calling abilities, CRM write access, or workspace operations. The voice agent gets just enough context to have a productive conversation without overstepping.

Safeguards

The scheduler writes a call log to the shared workspace before placing each call. On subsequent runs it reads the log to avoid calling the same contact twice within a configurable cooldown window. The backstory instructs the agent to never call outside business hours and to cap outbound calls per run.

Extending the system

  • Add slack/message/send to notify your sales team when a call is placed.
  • Add sendgrid/email/send to send a follow-up email after each call.
  • Swap HubSpot for Salesforce or Pipedrive by changing the CRM abilities.
  • Add a second trigger on a different schedule for different deal stages.
  • Connect a Telegram or Slack integration to the scheduler bot so you can ask "who did you call today?" conversationally.

Backstory

Common information about the bot's experience, skills and personality. For more information, see the Backstory documentation.

You are the Outreach Scheduler. You run on a recurring schedule to review the sales pipeline and initiate outbound voice calls when follow-up conditions are met. ## OPERATING PROCEDURE 1. PIPELINE REVIEW - Search HubSpot deals in stages that warrant follow-up (e.g. appointmentscheduled, qualifiedtobuy, decisionmakerboughtin) - Focus on deals with no activity in the last 3+ days - Prioritize by deal value and days since last contact 2. CONTACT LOOKUP - For each qualifying deal, fetch the associated contact - Verify the contact has a phone number - Check the call log at /logs/call-log.jsonl to confirm the contact was not called in the last 48 hours 3. CALL DECISION - Only call during business hours (9AM-5PM in the contact's timezone, default to US Eastern) - Maximum 5 outbound calls per scheduled run - Never call the same contact more than once per 48 hours - Skip contacts with no phone number 4. CALL EXECUTION - Use the Start Outbound Call ability to initiate the call - The agent ID and phone number ID are hardcoded in the ability so you only need to provide: - toNumber: the contact's phone in E.164 format - dynamicVariables: JSON with dealName, dealValue, dealStage, contactName, contactEmail - The ElevenLabs voice agent will use these variables to personalize the conversation 5. LOGGING - After each call attempt, append an entry to /logs/call-log.jsonl with: contactId, dealId, phone, timestamp, status - Update the HubSpot contact with a note about the call 6. SUMMARY - Write a run summary to /logs/outreach-${EARTH_DATE}.md with stats: deals reviewed, calls placed, calls skipped (with reasons) ## RULES - Never fabricate CRM data. Only act on data returned by abilities. - If a deal search returns no results, end the run early. - If you hit the call cap, stop and log remaining candidates for the next run. - The current date is ${EARTH_DATE}.

Skillset

This example uses a dedicated Skillset. Skillsets are collections of abilities that can be used to create a bot with a specific set of functions and features it can perform.

  • Look Up Deal

    Retrieve deal details so the voice agent can reference the deal context during a live call.
  • 📄

    Look Up Contact

    Retrieve contact details so the voice agent can reference customer information during a live call.
  • 🛂

    Schedule Follow-Up

    Schedule a follow-up event in Google Calendar when the customer agrees to a next step during the call.
  • 🇮🇹

    Search Deals

    Search HubSpot deals with filters to find pipeline opportunities that need follow-up.
  • Fetch Deal

    Retrieve full details for a specific HubSpot deal by ID.
  • Search Contacts

    Search HubSpot contacts by filters to find associated contact details for deals.
  • 🎐

    Fetch Contact

    Retrieve full details for a specific HubSpot contact by ID including phone number and recent activity.
  • 🅰️

    Update Contact

    Update a HubSpot contact record, such as adding a note about an outbound call attempt.
  • 📅

    Read Outreach Log

    Read call logs and outreach summaries to review what the scheduler has done.
  • 🇮🇹

    Search Deals

    Search HubSpot deals to find pipeline opportunities that need outbound follow-up calls.
  • 🎐

    Fetch Contact

    Retrieve contact details including phone number to determine whether an outbound call should be placed.
  • 🎬

    Log Call Note

    Update a HubSpot contact with a note recording that an automated outbound call was placed.
  • Start Outbound Call

    Initiate an outbound voice call through ElevenLabs SIP trunk using the hardcoded outreach agent. The only dynamic input is the destination phone number and optional CRM context passed as dynamic variables.
  • 🇩🇪

    Read Outreach Log

    Read call logs and outreach summaries from the shared workspace for deduplication and reporting.
  • 🇩🇪

    Write Outreach Log

    Write call log entries, outreach summaries, and deduplication state to the shared workspace.

Terraform Code

This blueprint can be deployed using Terraform, enabling infrastructure-as-code management of your ChatBotKit resources. Use the code below to recreate this example in your own environment.

Copy this Terraform configuration to deploy the blueprint resources:

Next steps:

  1. Save the code above to a file named main.tf
  2. Set your API key: export CHATBOTKIT_API_KEY=your-api-key
  3. Run terraform init to initialize
  4. Run terraform plan to preview changes
  5. Run terraform apply to deploy

Learn more about the Terraform provider

A dedicated team of experts is available to help you create your perfect chatbot. Reach out via or chat for more information.