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

# Klaviyo Setup

> Connect Klaviyo with API keys and add Northbeam UTMs so sign-ups and revenue tie back to your campaigns and flows.

When you're done, Northbeam shows the visits, revenue, and orders from your Klaviyo campaigns and flows, plus email and SMS sign-ups from Klaviyo's forms.

<Info>
  **Before you start**, make sure you have:

  * A Klaviyo login that can view and create API keys (**Settings → API Keys**)
  * Access to edit your Klaviyo campaigns and flows
</Info>

<span id="setup-steps" style={{ display: "block", scrollMarginTop: "7rem" }} />

<CardGroup cols={4}>
  <Card title="1. Connect the account" icon="plug" href="#connect-your-klaviyo-account">
    Paste your Klaviyo API keys into Northbeam.
  </Card>

  <Card title="2. Add UTM parameters" icon="link" href="#add-northbeam-parameters-to-your-campaigns-and-flows">
    Add `nb_klid` and UTMs to your campaigns and flows.
  </Card>

  <Card title="3. Add the sign-up event" icon="user-plus" href="#set-up-the-sign-up-event">
    See which channels drive your sign-ups.
  </Card>

  <Card title="4. Confirm tracking" icon="circle-check" href="#confirm-tracking">
    Check that parameters and data are arriving.
  </Card>
</CardGroup>

<Steps titleSize="h2">
  <Step title="Connect your Klaviyo account">
    <span id="step-1-connect-your-klaviyo-account" style={{ display: "block", scrollMarginTop: "7rem" }} />

    <span id="what-does-the-connection-do" style={{ display: "block", scrollMarginTop: "7rem" }} />

    The connection imports all Klaviyo events tagged "new subscriber". They show up under the **Email Sign Ups** metric, along with **Cost per Email Sign Up** and **Email Sign Up Rate**.

    <span id="1a-find-your-public-api-key" style={{ display: "block", scrollMarginTop: "7rem" }} />

    **A. Find your Public API Key**

    1. Log in to Klaviyo.
    2. Go to **Settings → API Keys**.
    3. Copy the **Public API Key**.

    <span id="1b-find-your-private-api-key" style={{ display: "block", scrollMarginTop: "7rem" }} />

    **B. Create a Private API Key**

    1. In Klaviyo, go to **Settings → API Keys**.
    2. Under **Private API Keys**, click **Create Private API Key**.
    3. Name the key something like **Northbeam (Read-only)**.
    4. Set permissions to **Read-only**.
    5. Click **Create**.

    <Frame caption="Settings > API Keys > Private API Key > Read-Only Key">
      <img src="https://mintcdn.com/northbeam/EpMPeQ8Ec2Yrg9EI/images/readme/aaf332f4-Create_private_API_key0.jpg?fit=max&auto=format&n=EpMPeQ8Ec2Yrg9EI&q=85&s=7115d24bcbd14d03c26436b0f26616af" alt="Klaviyo Create Private API Key form with Read-only access selected" style={{ maxWidth: "560px", maxHeight: "440px", width: "auto", height: "auto", margin: "0 auto" }} width="2520" height="1252" data-path="images/readme/aaf332f4-Create_private_API_key0.jpg" />
    </Frame>

    <span id="1c-enter-api-keys-in-northbeam" style={{ display: "block", scrollMarginTop: "7rem" }} />

    **C. Enter the keys in Northbeam**

    Open [Connections](https://dashboard.northbeam.io/settings/connections), select **Klaviyo**, and paste your **Public API Key** and **Private API Key**.

    Klaviyo's own help pages: [Finding your Public API Key](https://help.klaviyo.com/hc/en-us/articles/115005062267) and [Creating a Private API Key](https://help.klaviyo.com/hc/en-us/articles/7423954176283).

    <AccordionGroup>
      <Accordion title="See screenshots">
        <Frame caption="Settings > API Keys > Public API Key">
          <img src="https://mintcdn.com/northbeam/EpMPeQ8Ec2Yrg9EI/images/readme/268a6a64-mceclip0.png?fit=max&auto=format&n=EpMPeQ8Ec2Yrg9EI&q=85&s=5af1ef62e94568d825e095feb2391c74" alt="Klaviyo API Keys page showing the Public API Key" style={{ maxWidth: "560px", maxHeight: "440px", width: "auto", height: "auto", margin: "0 auto" }} width="1385" height="419" data-path="images/readme/268a6a64-mceclip0.png" />
        </Frame>

        <Frame caption="Settings > Connections > Klaviyo">
          <img src="https://mintcdn.com/northbeam/EpMPeQ8Ec2Yrg9EI/images/readme/6131d9fa-Screenshot_2026-01-06_at_8.41.04_AM.png?fit=max&auto=format&n=EpMPeQ8Ec2Yrg9EI&q=85&s=b372ad3a36d01dadde56bc8634899537" alt="Northbeam Connections page with Klaviyo Public and Private API Key fields" style={{ maxWidth: "560px", maxHeight: "440px", width: "auto", height: "auto", margin: "0 auto" }} width="770" height="241" data-path="images/readme/6131d9fa-Screenshot_2026-01-06_at_8.41.04_AM.png" />
        </Frame>
      </Accordion>
    </AccordionGroup>

    **If you skip this step:** sign-up volume is missing, and Email Sign Ups, Cost per Email Sign Up, and Email Sign Up Rate stay empty.
  </Step>

  <Step title="Add Northbeam parameters to your campaigns and flows">
    <span id="klaviyo-insert-the-utms" style={{ display: "block", scrollMarginTop: "7rem" }} />

    <span id="step-2-set-up-northbeam-utm-parameters" style={{ display: "block", scrollMarginTop: "7rem" }} />

    <span id="part-1-setting-account-wide-utms" style={{ display: "block", scrollMarginTop: "7rem" }} />

    <span id="setting-account-wide-utms" style={{ display: "block", scrollMarginTop: "7rem" }} />

    <span id="step-by-step-guide" style={{ display: "block", scrollMarginTop: "7rem" }} />

    Set these as account-wide UTMs in Klaviyo. Northbeam looks for `utm_source`, `utm_medium`, `utm_campaign`, and `nb_klid`.

    | UTM key | Campaign value | Flow value |
    | :- | :- | :- |
    | `utm_source` | Klaviyo\* | Klaviyo\* |
    | `utm_medium` | email\* | email\* |
    | `utm_campaign` | Campaign Name\* | Flow Message Name\* |
    | `nb_klid` | Klaviyo profile ID | Klaviyo profile ID |

    \*These are *recommended* values. You can use your own, but they affect how Klaviyo shows up in your dashboard. The walkthrough video below explains how.

    <Warning>
      The only required value is `nb_klid` = the Klaviyo profile ID, for both campaigns and flows.
    </Warning>

    For more detail on the Sales page, also add:

    * `utm_term`: shows at the **Ad set** level
    * `utm_content`: shows at the **Ad** level

    <AccordionGroup>
      <Accordion title="Watch a walkthrough">
        <iframe src="https://www.loom.com/embed/47532b9080ed46db8dcff6f58495cfe2?sid=e5c5f0e6-8e60-4661-a0d1-e7f4bf461fd7" width="100%" height="450" allowfullscreen />
      </Accordion>
    </AccordionGroup>

    **If you skip this step:** revenue isn't attributed to your Klaviyo campaigns or flows.
  </Step>

  <Step title="Set up the sign-up event">
    <span id="step-3-implement-sign-up-event" style={{ display: "block", scrollMarginTop: "7rem" }} />

    The connection pulls in raw sign-up events. To see which channels drove them (for example, "Facebook Ads drove X email sign-ups"), place the Northbeam [Sign Up Event - Email](/docs/setting-up-klaviyo-for-northbeam) on your site.

    **If you skip this step:** sign-ups show as Unattributed.
  </Step>

  <Step title="Confirm tracking">
    For a full check:

    * **Parameters captured:** follow [Checking UTM tracking](/docs/checking-utm-tracking) to confirm the Northbeam parameters reach your landing pages.
    * **Connection syncing:** follow [Checking platform connections](/docs/checking-api-connections) to confirm the account shows as connected and data is arriving.

    If a check fails, see [Troubleshooting Northbeam data](/docs/troubleshooting-tracking-issues).
  </Step>
</Steps>

## Add Klaviyo spend (optional)

<span id="step-4a-requesting-a-custom-spendsheet-optional" style={{ display: "block", scrollMarginTop: "7rem" }} />

The Klaviyo connection doesn't pull spend or cost data. To get cost-based metrics like ROAS and CAC for Klaviyo, upload your costs with a [Custom Spendsheet](/docs/tracking-for-other-platforms#step-2-upload-costs-via-custom-spend).

<span id="step-4b-re-categorizing-custom-spend-optional" style={{ display: "block", scrollMarginTop: "7rem" }} />

Custom spend lands under a platform called **Other**. Use the [Breakdowns Manager](/docs/manage-breakdowns) to move it into **Klaviyo**.

**If you skip this:** no costs are tied to Klaviyo.

<span id="3-why-do-i-see-a-data-discrepancy" style={{ display: "block", scrollMarginTop: "7rem" }} />

<span id="attribution-models-and-windows" style={{ display: "block", scrollMarginTop: "7rem" }} />

## Need help?

<CardGroup cols={2}>
  <Card title="Klaviyo FAQ" icon="circle-question" href="/docs/channels/klaviyo/faq">
    Common Klaviyo setup and reporting questions.
  </Card>

  <Card title="Troubleshooting Northbeam data" icon="wrench" href="/docs/troubleshooting-tracking-issues">
    Start here if a check above fails.
  </Card>
</CardGroup>
