Integrations / Klaviyo
Klaviyo
Email and SMS marketing: profiles, lists, segments and campaigns.
9 actions
OAuth 2
7 read2 write
Calls a.klaviyo.com
Connect
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
| Scope | Why it is requested |
|---|---|
accounts:read | Identify the connected Klaviyo account |
profiles:read | Read profiles (contacts) |
profiles:write | Create and update profiles |
lists:read | Read lists |
lists:write | Create lists |
segments:read | Read segments |
campaigns:read | Read campaigns |
Actions
Create listwriteklaviyo.create_listCreate a new subscriber list with the given name.
Needs scope: lists:write
| Input | Type | Description | |
|---|---|---|---|
name | string | Required | List name |
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
| Input | Type | Description | |
|---|---|---|---|
email | string | Optional | |
phone_number | string | Optional | E.164 format, e.g. +15005550006 |
external_id | string | Optional | Your own id for the person |
first_name | string | Optional | |
last_name | string | Optional | |
properties | object | Optional | Custom properties |
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.
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
| Input | Type | Description | |
|---|---|---|---|
list_id | string | Required | Klaviyo list id |
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
| Input | Type | Description | |
|---|---|---|---|
profile_id | string | Required | Klaviyo profile id |
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
| Input | Type | Description | |
|---|---|---|---|
channel | string | Required | Campaign channel |
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
| Input | Type | Description | |
|---|---|---|---|
page_cursor | string | Optional | Cursor from links.next of the previous page |
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
| Input | Type | Description | |
|---|---|---|---|
filter | string | Optional | Klaviyo filter, e.g. equals(email,"[email protected]") or greater-than(updated,2026-01-01T00:00:00Z) |
page_size | integer | Optional | 1 to 100, default 20 |
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
| Input | Type | Description | |
|---|---|---|---|
page_cursor | string | Optional | Cursor from links.next of the previous page |
await setu.execute({
userId: "user_1",
action: "klaviyo.list_segments",
input: {},
});