Setu Recipes: reusable workflows across every app.Browse templates

Integrations / Klaviyo

Klaviyo

Email and SMS marketing: profiles, lists, segments and campaigns.

9 actions OAuth 2 7 read2 write Calls a.klaviyo.com

Connect

TypeScript
const conn = await setu.connections.initiate({ userId: "user_1", toolkit: "klaviyo" });
console.log(conn.connectUrl); // show this to your user
await conn.waitUntilActive();

Permissions requested

ScopeWhy it is requested
accounts:readIdentify the connected Klaviyo account
profiles:readRead profiles (contacts)
profiles:writeCreate and update profiles
lists:readRead lists
lists:writeCreate lists
segments:readRead segments
campaigns:readRead campaigns

Actions

Create listwriteklaviyo.create_listCreate a new subscriber list with the given name.

Needs scope: lists:write

InputTypeDescription
namestringRequiredList name
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.create_list",
  input: {
    "name": "<name>"
  },
});
Create or update profilewriteklaviyo.create_or_update_profileCreate a profile, or update the one that matches the email, phone number or external id. Fields you omit are left unchanged.

Needs scope: profiles:write

InputTypeDescription
emailstringOptional
phone_numberstringOptionalE.164 format, e.g. +15005550006
external_idstringOptionalYour own id for the person
first_namestringOptional
last_namestringOptional
propertiesobjectOptionalCustom properties
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.create_or_update_profile",
  input: {},
});
Get accountreadklaviyo.get_accountGet the connected Klaviyo account's id and organization name.

Needs scope: accounts:read

No input.

TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.get_account",
  input: {},
});
Get listreadklaviyo.get_listGet one list by id, including its name and opt-in process.

Needs scope: lists:read

InputTypeDescription
list_idstringRequiredKlaviyo list id
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.get_list",
  input: {
    "list_id": "<list_id>"
  },
});
Get profilereadklaviyo.get_profileGet one profile by its Klaviyo id, with email, phone and name.

Needs scope: profiles:read

InputTypeDescription
profile_idstringRequiredKlaviyo profile id
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.get_profile",
  input: {
    "profile_id": "<profile_id>"
  },
});
List campaignsreadklaviyo.list_campaignsList campaigns for one channel (email, sms or mobile_push). Klaviyo requires the channel filter.

Needs scope: campaigns:read

InputTypeDescription
channelstringRequiredCampaign channel
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.list_campaigns",
  input: {
    "channel": "<channel>"
  },
});
List listsreadklaviyo.list_listsList the account's subscriber lists with ids and names.

Needs scope: lists:read

InputTypeDescription
page_cursorstringOptionalCursor from links.next of the previous page
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.list_lists",
  input: {},
});
List profilesreadklaviyo.list_profilesList or look up profiles (contacts). Use a filter like equals(email,"[email protected]") to find one by email. Returns ids, emails and names.

Needs scope: profiles:read

InputTypeDescription
filterstringOptionalKlaviyo filter, e.g. equals(email,"[email protected]") or greater-than(updated,2026-01-01T00:00:00Z)
page_sizeintegerOptional1 to 100, default 20
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.list_profiles",
  input: {},
});
List segmentsreadklaviyo.list_segmentsList the account's segments with ids and names.

Needs scope: segments:read

InputTypeDescription
page_cursorstringOptionalCursor from links.next of the previous page
TypeScript
await setu.execute({
  userId: "user_1",
  action: "klaviyo.list_segments",
  input: {},
});