Back to the catalogDoc · Tech & platforms

CRM integration basics: make the agent write to the system of record

The value is what happens after the call. Webhooks vs. native connectors vs. direct API, the CRMs you'll actually meet, and idempotency so you never double-book a caller.

A voice agent that answers the call but doesn't write anything down is a party trick. The value clients actually pay for is what happens after the call — the appointment on the calendar, the lead in the pipeline, the note on the record. That's the CRM integration, and it's the part that separates a $500 novelty from a $3K/mo system the client can't rip out. Here's the honest version of how to wire it up.

Two directions, don't confuse them

  • Write (agent → CRM) — the agent creates or updates records: books the appointment, logs the call, adds a lead, files a ticket. This is 80% of the value and where you start.
  • Read (CRM → agent) — the agent looks something up mid-call: "Are you an existing patient?", "What's the status of my order?", "When's my appointment?" This is where the magic-moment demos come from, but it's harder and riskier, so earn it.

Ship reliable writes first. A read that returns the wrong record on a live call is worse than no read at all.

The realistic integration ladder

Most operators over-engineer this. Climb the ladder only as far as the use-case demands:

  1. Webhook to Zapier / Make. The agent fires a webhook at end-of-call (or via a mid-call tool) with structured fields; Zapier or Make routes it into the CRM. No code, works with 6,000+ apps, and it's how most agencies ship their first ten clients. The tradeoff is latency and cost at volume — fine for writes, usually too slow for a real-time read the caller is waiting on.

  2. Native platform integration. Vapi, Retell, Bland, and Synthflow ship built-in tools/actions and sometimes direct CRM connectors (Google Calendar, HubSpot, GoHighLevel). Use these when they exist — fewer moving parts, fewer things to break at 2 a.m.

  3. Direct API (custom function/tool call). The agent calls your own endpoint that talks straight to the CRM's API. This is the option for real-time reads and anything with real logic — availability checks, deduping, conditional routing. More work, but it's the only one that's genuinely fast and controllable.

The CRMs you'll actually meet

  • GoHighLevel — ubiquitous in the agency/local-business world, has calendars, pipelines, and SMS built in. If you serve local service businesses, you'll live here.
  • HubSpot / Salesforce — the B2B and mid-market standard. Well-documented APIs, but Salesforce especially rewards someone who knows it.
  • Vertical-specific systems — dental PMS, medical EHRs (athenahealth, Epic), AMS platforms for insurance, DMS for auto. These are where the deep moats are and where integration is hardest (and often HIPAA-gated). Don't promise a native EHR write on your third build.
  • Calendars — Google Calendar and Calendly cover a huge share of "just book the appointment" use-cases. Start here before you touch a full CRM.

Idempotency, or how not to double-book

The failure that will embarrass you: the webhook retries, or the caller says "yes" twice, and now there are two appointments and a confused client. Design for it from day one:

  • Dedupe on a natural key — phone number + requested time, or an idempotency key you generate per call — so a retry updates instead of duplicating.
  • Confirm the write back to the caller. "You're booked for Thursday at 2 — you'll get a text confirmation." If the write silently failed, you want to know before the caller hangs up.
  • Log every attempt. Store the raw payload and the CRM's response. When a client says "the agent didn't book my caller," you need the receipt.

Map the fields before you build

Get the client's actual CRM in a screen-share during onboarding and write down the exact fields, required vs. optional, and the picklist values (lead source, appointment type, status). Agents guess badly at required fields and enum values, and a rejected write is a lost lead. Map it once, hard-code the enums, and validate before you send.

Where to draw the line

You don't need to integrate everything. Pick the one or two writes that carry the value — booked appointment, captured lead — nail their reliability, and stop. A rock-solid integration on the one thing that matters beats a flaky connection to five systems. Clients renew on the appointment that showed up on their calendar, not on the length of your Zapier zap.