> ## Documentation Index
> Fetch the complete documentation index at: https://docs.connectly.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Klaviyo

> Trigger WhatsApp campaigns from Klaviyo flows using the Connectly API — set up webhooks, map variables, and automate customer messaging from your e-commerce data 🛍️

Klaviyo is a marketing automation platform built for e-commerce. When connected to Connectly and an e-commerce platform like Shopify, you can use real-time customer data to trigger highly targeted WhatsApp campaigns automatically.

## Use cases

<AccordionGroup>
  <Accordion title="Welcome messages">
    Greet new customers when they subscribe or make their first purchase, setting a positive tone for future interactions.
  </Accordion>

  <Accordion title="Abandoned cart reminders">
    Send reminders to customers about items left in their cart to reduce abandonment rates and recover lost sales.
  </Accordion>

  <Accordion title="Order confirmations & shipping updates">
    Send automated order confirmations and real-time shipping updates to keep customers informed post-purchase.
  </Accordion>

  <Accordion title="Customer thank you & feedback">
    Build loyalty with a personalised thank you message after purchase, and follow up with a feedback or survey request.
  </Accordion>

  <Accordion title="Birthday & anniversary messages">
    Foster personal relationships by celebrating customer birthdays and first-purchase anniversaries with special messages and promotions.
  </Accordion>
</AccordionGroup>

***

## Requirements

* A Connectly account with a working WhatsApp business number
* A Klaviyo account
* An e-commerce or CRM platform integrated with Klaviyo (e.g. Shopify, Salesforce, Magento, Wix, WooCommerce — [see the full list](https://www.klaviyo.com/integrations))

***

## Setup

### Step 1: Get your Connectly API key

In the Connectly platform, go to **Settings → General** and scroll down to **API Key and Webhook Secret**. Click **Generate API Key**.

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image13.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=adc481b677405c75cf5ea067da0b2bc3" alt="Connectly Settings — API Key and Webhook Secret section" className="mx-auto" style={{ width:"81%" }} width="1999" height="1083" data-path="images/image13.png" />

Click **Create API Key** to generate and display your key.

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image11.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=a7a4a1e08bcfd8b4d92ba1cb8590c2f5" alt="Create API Key button and Business ID" className="mx-auto" style={{ width:"82%" }} width="1972" height="664" data-path="images/image11.png" />

<Warning>
  The API key is shown **only once**. Copy it immediately and store it somewhere secure (e.g. a password manager). Generating a new key will invalidate the previous one.
</Warning>

***

### Step 2: Get your campaign destination URL and JSON body

You need the campaign's endpoint URL and JSON payload to configure the Klaviyo webhook.

<Tabs>
  <Tab title="New campaign">
    When setting up a new campaign, select **"Use the Connectly API"** on the **Choose Audience** step and click **Next**.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image16.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=bfb0897d2567bd4a73179de68f65a66b" alt="Choose Audience — Use the Connectly API option selected" className="mx-auto" style={{ width:"81%" }} width="1782" height="1078" data-path="images/image16.png" />
  </Tab>

  <Tab title="Existing campaign">
    Navigate to the **Campaigns** section and click the **`<>`** icon next to the campaign you want to connect.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image10.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=93088105ca4c93a19c107d3243dedfa8" alt="Campaigns list with the code icon highlighted" className="mx-auto" style={{ width:"82%" }} width="1842" height="1072" data-path="images/image10.png" />
  </Tab>
</Tabs>

Both options display the **Curl Snippet** panel with your destination URL and JSON body highlighted.

<img alt="Curl snippet showing destination URL and JSON body" lightAlt="Curl snippet showing destination URL and JSON body" darkAlt="Curl snippet showing destination URL and JSON body" className="mx-auto dark:hidden" src="https://mintcdn.com/connectly/0cEXk-736o7p8o6G/images/image6-1.png?fit=max&auto=format&n=0cEXk-736o7p8o6G&q=85&s=66c05e5140994432494eb3d0369d6501" width="1766" height="1076" data-path="images/image6-1.png" />

<img alt="Curl snippet showing destination URL and JSON body" lightAlt="Curl snippet showing destination URL and JSON body" darkAlt="Curl snippet showing destination URL and JSON body" className="mx-auto hidden dark:block" src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image6.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=d59eadbb6bb180a5e73f3f9a31c53859" data-path="images/image6.png" />

***

### Step 3: Create a flow in Klaviyo

Log into Klaviyo, navigate to **Flows**, and click **Create Flow**.

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image19.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=c993d6e67664ff66aab030283de0e8cc" alt="Klaviyo Flows list with Create Flow button" className="mx-auto" style={{ width:"89%" }} width="1972" height="1004" data-path="images/image19.png" />

Choose an existing template or click **Build your own** to set up a custom trigger and filters.

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image7.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=9e5b827f2422ca88efe51dc0085225f0" alt="Klaviyo Create Flow — template options" className="mx-auto" style={{ width:"87%" }} width="1970" height="1026" data-path="images/image7.png" />

***

### Step 4: Add and configure the Webhook node

Drag the **Webhook** node from the left sidebar and drop it into your flow at the point where you want the WhatsApp campaign to be triggered.

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image9.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=ad8aa58e6f710e7b501b623ef2d32027" alt="Klaviyo flow with Webhook node in the sidebar and dropped onto the canvas" className="mx-auto" style={{ width:"83%" }} width="1848" height="1066" data-path="images/image9.png" />

<Note>
  If this is your first time using the Webhook node, Klaviyo will prompt you to set up Multi-Factor Authentication before proceeding.

  <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image4.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=6f3276e337061e519a2bc0455da33c62" alt="Multi-Factor Authentication required prompt" className="mx-auto" style={{ width:"86%" }} width="1042" height="472" data-path="images/image4.png" />
</Note>

Click on the Webhook node to open its settings panel. Fill in the following fields:

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image3.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=999297d13b1f84dbaf2923f0541d66e7" alt="Webhook details panel with Destination URL, Headers, and JSON body fields" className="mx-auto" style={{ width:"82%" }} width="1999" height="1122" data-path="images/image3.png" />

| Field               | Value                                                      |
| ------------------- | ---------------------------------------------------------- |
| **Destination URL** | The URL from your Connectly campaign curl snippet          |
| **Headers — Key**   | `x-api-key`                                                |
| **Headers — Value** | Your Connectly API key                                     |
| **JSON body**       | The JSON payload from your Connectly campaign curl snippet |

***

### Step 5: Map campaign variables

Your JSON body contains placeholder values that need to be replaced with Klaviyo profile properties.

<Steps>
  <Step title="Expand the JSON body to see all variables">
    In the webhook settings panel, click the **Expand** icon on the JSON body section to see the full payload. Each value marked `CHANGE_TO_*` needs to be replaced.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image20.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=87f353c6c60005fd799eafa505df2fe9" alt="Expanded JSON body showing placeholder values to replace" style={{ width:"79%" }} width="1172" height="498" data-path="images/image20.png" />
  </Step>

  <Step title="Open Preview to find Klaviyo variable names">
    Click the **Preview** button in the Settings panel header. The **Preview Profile Info** panel appears, showing all available profile properties. Hover over any property to reveal its Klaviyo variable name, then click to copy it.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image15.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=5b34a6c47e5c2c660027a994c52f988b" alt="Klaviyo Trigger Preview showing profile properties with variable name tooltip" style={{ width:"79%" }} width="1999" height="1117" data-path="images/image15.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image15.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=5b34a6c47e5c2c660027a994c52f988b" alt="Klaviyo Trigger Preview showing profile properties with variable name tooltip" style={{ width:"79%" }} width="1999" height="1117" data-path="images/image15.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image21.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=479b3eb5ba2e8c9f25e66d056433d186" alt="Preview Profile Info panel with variable name tooltip on hover" style={{ width:"63%" }} width="866" height="494" data-path="images/image21.png" />
  </Step>

  <Step title="Replace each placeholder with its Klaviyo variable">
    Go back to the JSON body and replace each placeholder with the corresponding Klaviyo variable. For example, replace `"CHANGE_TO_TARGET_PHONE_NUMBER"` with `"{{ person.phone_number|default:'' }}"` and `"CHANGE_TO_VALUE"` with `"{{ person.first_name|default:'' }}"`.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image18.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=58437a3ff63a088750c566d5360cf898" alt="JSON body with Klaviyo variables replacing the placeholders" style={{ width:"77%" }} width="1946" height="828" data-path="images/image18.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image18.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=58437a3ff63a088750c566d5360cf898" alt="JSON body with Klaviyo variables replacing the placeholders" style={{ width:"77%" }} width="1946" height="828" data-path="images/image18.png" />

    Repeat for every variable in the payload.
  </Step>
</Steps>

***

### Step 6: Test and activate the flow

<Steps>
  <Step title="Use Trigger Preview to review flow logic">
    Click the **Trigger** node to open its settings panel, then click **Preview**. The Trigger Preview tool shows which profiles would enter the flow and whether they pass your filters. Use the search bar to look up a specific test user.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image1.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=36442c8d6ca7e259f7c91165fa77dae3" alt="Klaviyo Trigger Preview panel showing profiles and filter results" style={{ width:"81%" }} width="1892" height="1082" data-path="images/image1.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image1.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=36442c8d6ca7e259f7c91165fa77dae3" alt="Klaviyo Trigger Preview panel showing profiles and filter results" style={{ width:"81%" }} width="1892" height="1082" data-path="images/image1.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image12.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=ec7609cb6f2cf51c39595058865ee6dc" alt="Trigger Preview search results showing Pass/Fail status for profiles" style={{ width:"79%" }} width="1712" height="824" data-path="images/image12.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image12.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=ec7609cb6f2cf51c39595058865ee6dc" alt="Trigger Preview search results showing Pass/Fail status for profiles" style={{ width:"79%" }} width="1712" height="824" data-path="images/image12.png" />
  </Step>

  <Step title="Set messages to Manual mode">
    Click on a flow message node to open its details. Change the status dropdown from **Draft** to **Manual**. In Manual mode, messages are scheduled as if live but held for your review instead of being sent automatically.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image22.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=fc6917346563bf850e7651436a72a160" alt="Flow message details panel with Manual status selected" style={{ width:"79%" }} width="1942" height="1078" data-path="images/image22.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image22.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=fc6917346563bf850e7651436a72a160" alt="Flow message details panel with Manual status selected" style={{ width:"79%" }} width="1942" height="1078" data-path="images/image22.png" />
  </Step>

  <Step title="Review and approve test messages">
    Select the flow message and click **View details** in the Performance section of the right sidebar.

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image14.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=7685274ab5f8b5a4bebea784bac0f0c9" alt="Flow message details with View details button highlighted" style={{ width:"79%" }} width="1974" height="1074" data-path="images/image14.png" />

    <img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image14.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=7685274ab5f8b5a4bebea784bac0f0c9" alt="Flow message details with View details button highlighted" style={{ width:"79%" }} width="1974" height="1074" data-path="images/image14.png" />

    Navigate to the **Recipient activity** tab and click **Needs review**. A list of eligible recipients appears — you can approve or cancel sends individually or for the entire list.

    <img alt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" lightAlt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" darkAlt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" src="https://mintcdn.com/connectly/0cEXk-736o7p8o6G/images/image17-1.png?fit=max&auto=format&n=0cEXk-736o7p8o6G&q=85&s=1c6e88556f342b35a9a1e85858ecde6c" className="dark:hidden" width="1802" height="950" data-path="images/image17-1.png" />

    <img alt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" lightAlt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" darkAlt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" src="https://mintcdn.com/connectly/0cEXk-736o7p8o6G/images/image17.png?fit=max&auto=format&n=0cEXk-736o7p8o6G&q=85&s=e2ed4a0188fd26ff9e0a287da2d5b3c5" className="hidden dark:block" width="1802" height="950" data-path="images/image17.png" />

    <img src="https://mintcdn.com/connectly/0cEXk-736o7p8o6G/images/image17.png?fit=max&auto=format&n=0cEXk-736o7p8o6G&q=85&s=e2ed4a0188fd26ff9e0a287da2d5b3c5" alt="Recipient activity tab showing Needs review filter with Send All and Cancel All buttons" style={{ width:"80%" }} width="1802" height="950" data-path="images/image17.png" />

    <Note>
      When a message status is updated from Manual to Live, recipients in **Waiting** will receive the message automatically at send time. Recipients in **Needs Review** will still require manual approval.
    </Note>
  </Step>

  <Step title="Activate the flow">
    Once you've finished building and testing, click **Save** and then **Review and turn on** in the top right corner.
  </Step>
</Steps>

<Check>
  Check the tutorial video here: [How to adjust variables at Klaviyo](https://drive.google.com/open?id=1qT15UA5qzrdAhgV_TKN89VJm-ZaU8pl7)
</Check>

## Analytics

Campaign results and key metrics are available in the Connectly platform under **Analytics**. Select your campaign and timeframe to view delivery, engagement, and performance data.

<img src="https://mintcdn.com/connectly/U9GE55bnUfKD9gQQ/images/image8.png?fit=max&auto=format&n=U9GE55bnUfKD9gQQ&q=85&s=6419fd65adcf6534e7bf0c69cacca009" alt="Connectly Analytics dashboard showing campaign metrics" className="mx-auto" style={{ width:"87%" }} width="1850" height="964" data-path="images/image8.png" />
