Webhook tool

Klaviyo AI voice agents that turn callers into subscribers

A Cartesia agent finds the caller's Klaviyo profile by phone number, saves their details with the consent they give on the call, and adds them to a list.

Store phone agent

Answers shopper calls and keeps the Klaviyo profile up to date.

Instructions

Look up the caller by phone number. Ask before signing anyone up for texts or emails, and only save consent after a clear yes. At the end of the call, add the caller to the list that matches what they asked about.

Connected tools

  • Find profileWebhook
  • Save profileWebhook
  • Add to listWebhook

What a Klaviyo AI voice agent can do

Open one to watch a call. The grey lines are the tools the agent calls mid-sentence.

Your service filters Klaviyo profiles on the caller's phone number, so the agent knows a returning shopper before asking anything.

Tool definitions

Webhook tools go to POST /v1/agents/tools. Transfers are a system tool on the agent. Replace the placeholder values in capitals with your own.

Webhook

Find profile

Looks up a Klaviyo profile by phone number.

Show the JSON definition
find_profile
{
  "type": "webhook",
  "name": "find_profile",
  "description": "Finds the caller's Klaviyo profile by phone number. Returns the profile ID and name, or nothing if there is no match.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/klaviyo/profiles",
    "method": "GET",
    "query_params_schema": {
      "properties": {
        "phone": {
          "type": "string",
          "dynamic_variable": "system__caller_id"
        }
      }
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Webhook

Save profile

Creates or updates the profile and records consent.

Show the JSON definition
save_profile
{
  "type": "webhook",
  "name": "save_profile",
  "description": "Creates or updates the caller's Klaviyo profile. Records SMS or email consent only when the caller said yes on this call. Returns the profile ID.",
  "pre_tool_speech": "auto",
  "execution_mode": "immediate",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/klaviyo/profiles",
    "method": "POST",
    "request_body_schema": {
      "type": "object",
      "properties": {
        "first_name": {
          "type": "string",
          "description": "The caller's first name."
        },
        "email": {
          "type": "string",
          "description": "The caller's email, if they gave one."
        },
        "phone": {
          "type": "string",
          "dynamic_variable": "system__caller_id"
        },
        "sms_consent": {
          "type": "string",
          "enum": [
            "yes",
            "not_asked"
          ],
          "description": "yes only if the caller clearly agreed to marketing texts on this call."
        },
        "email_consent": {
          "type": "string",
          "enum": [
            "yes",
            "not_asked"
          ],
          "description": "yes only if the caller clearly agreed to marketing emails on this call."
        }
      },
      "required": [
        "sms_consent",
        "email_consent"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Webhook

Add to list

Adds the profile to a Klaviyo list at the end of the call.

Show the JSON definition
add_to_list
{
  "type": "webhook",
  "name": "add_to_list",
  "description": "Adds the caller's profile to the Klaviyo list that matches their request. Use it once, as the call ends.",
  "pre_tool_speech": "auto",
  "execution_mode": "async",
  "response_timeout_secs": 20,
  "api_schema": {
    "url": "https://api.your-company.com/klaviyo/lists/{list_key}/profiles",
    "method": "POST",
    "path_params_schema": {
      "list_key": {
        "type": "string",
        "description": "The list to use: restock, vip or wholesale."
      }
    },
    "request_body_schema": {
      "type": "object",
      "properties": {
        "profile_id": {
          "type": "string",
          "description": "The profile ID from find_profile or save_profile."
        }
      },
      "required": [
        "profile_id"
      ]
    },
    "authentication": {
      "mode": "bearer",
      "token": {
        "type": "secret",
        "secret_value": "YOUR_SERVICE_TOKEN"
      }
    }
  }
}

Set it up

No native connector. Klaviyo's phone filter and subscribe job take nested JSON:API requests, so the tools call a small service of yours that holds the key. Vendor details read in November 2026.

  1. Create a private API key

    In Klaviyo, create a private key with profiles:read, profiles:write, lists:write and subscriptions:write. Keep it in your service, not in Cartesia.

  2. Run the endpoints

    Your service calls GET /api/profiles with an equals filter on phone_number, POST /api/profile-import, POST /api/profile-subscription-bulk-create-jobs for consent, and POST /api/lists/{id}/relationships/profiles.

  3. Add the tools

    Point the tools at your service with a bearer secret. The list tool runs async, so the goodbye isn't held up.

  4. Test with your own number

    Call from a phone on a test profile, say yes to texts, and check the consent and list membership in Klaviyo.

Before you build

Consent goes through the subscribe call

Klaviyo's profile import request has no consent field, so your service calls Subscribe Profiles, and only when the agent sends a yes.

Double opt-in may apply

If the list uses double opt-in, Klaviyo sends a confirmation message before the profile is subscribed. Have the agent tell callers to expect it.

Pin the revision header

Every Klaviyo API request carries a revision header, such as 2026-10-15. Your service pins one date and moves to a newer one on purpose.

Send phone numbers in E.164

Klaviyo expects phone numbers like +14155550123 for SMS consent. Your service should normalize the caller ID before it saves or filters on it.

Enterprise-grade security

  • HIPAA compliant badge

    HIPAA compliant

  • SOC 2 Type 2 badge

    SOC 2 Type 2

  • GDPR badge

    GDPR

Klaviyo AI voice agent FAQs

How do I connect Klaviyo to an AI voice agent?

Create a Klaviyo private key with profiles:read, profiles:write, lists:write and subscriptions:write, and keep it in a small service of yours. Klaviyo private keys use their own Authorization prefix, so Cartesia's webhook tools call the service with a bearer secret, and the service calls Klaviyo.

Can an AI phone agent sign callers up for Klaviyo SMS?

Yes, when the caller agrees on the call. The agent asks, and your service sends SMS consent to Klaviyo's Subscribe Profiles endpoint only after a clear yes. Check the consent rules that apply where your callers live.

What if the Klaviyo list uses double opt-in?

Klaviyo sends a confirmation message before the profile is subscribed. Have the agent tell callers to expect it, so they confirm. Until they do, the profile exists but isn't subscribed.

Who bills the phone minutes on a Klaviyo voice agent?

Cartesia bills the agent at $0.03/min, plus LLM usage and telephony. Phone minutes depend on the number. Cartesia-provisioned numbers are US only and carry Cartesia's telephony fee. Numbers from your Twilio account or a SIP trunk pay your carrier's rates instead.

What phone number format does Klaviyo need?

E.164, such as +14155550123, for SMS consent. Your service should normalize the caller ID before it saves a profile or filters on it.

Get started today

Talk to an expert.

Connect with a member of our team and learn how Cartesia can help you build world-class voice experiences.

Contact Sales

Start building.

Access our models via API and bring a voice agent into production in minutes.

Try Cartesia