# Connect Klaviyo

You'll save visitors' answers to Klaviyo profiles, use their data to personalize your website, and connect signup forms to your lists.

Available on the Scale and Pro plans.

Connect Klaviyo to save visitors' answers on their profiles, ready for your follow-up. You can also use an identified visitor's existing profile data to personalize your website, and send new signups to a Klaviyo list.

## Connect Klaviyo

You'll need permission to edit your RightMessage project and create a Klaviyo private API key. Each project connects to one email platform or CRM at a time. Review where you use an existing connection before replacing it.

In Klaviyo's API-key administration, create a private key with the permissions you'll use:

- Profile reading and writing let RightMessage look up contacts and update properties.
- List reading supports the health check and list picker.
- List writing and `subscriptions:write` let signup actions add someone to a list and subscribe them to email marketing.
- Segment reading is needed when you use list or segment memberships in conditions, templates, or code. The connector fetches both membership types when either is needed.

Klaviyo's [subscription API reference](https://developers.klaviyo.com/en/reference/bulk_subscribe_profiles) requires `lists:write`, `profiles:write`, and `subscriptions:write` for subscription writes. Profile access alone isn't enough. Keep the key private. Don't put it in website code or email links.

1. Open your RightMessage project settings and select **Integration**.
2. On **Email platforms & CRMs**, choose **Klaviyo**.
3. Paste the key into **Private API Key**.
4. Click **Connect**.
5. On **Overview**, check connection status. For an authentication issue, check the key and permissions, then replace it and click **Save Changes**.

![Klaviyo connection controls in RightMessage, with no credentials entered](https://rightmessage.com/help/screens/integrations-klaviyo-connection.light.webp)

**Connection status: OK** means RightMessage could read lists. You'll test property updates and subscriptions below. Saving the connection makes Klaviyo available for mappings, but doesn't create them for you.

Prepare a test profile you control and [install the RightMessage snippet](https://rightmessage.com/help/everything-you-need-to-know-about-your-rightmessage-tracking-script) on the page you'll test.

## Recognize subscribers from email links

Add `rm_kl` to your website links in Klaviyo emails. For example, a link to [WorkForge](https://workforge.rightmessage.com) could be:

```text
https://workforge.rightmessage.com/solutions.html?rm_kl={{ email }}
```

Use your own page URL. Klaviyo fills in `{{ email }}` with the recipient's email. RightMessage looks it up and uses the matching profile ID. If the URL already has a query string, append `&rm_kl={{ email }}` instead of another `?`.

1. Send an email to your test profile with the identifying link. Use a send that fills in the merge tag, not an unresolved template URL.
2. Open the received link in a fresh browser session on the page with RightMessage installed.
3. Check that RightMessage identifies the intended Klaviyo profile.
4. Revisit without the parameter to check that the browser is remembered.

RightMessage removes `rm_kl` from the displayed URL after reading it. The original link still contains an email address, so keep personalized links private. Another device needs its own identification.

### If you already use Klaviyo tracking

RightMessage also supports the `_kx` email-click parameter and `$exchange_id` in Klaviyo's `__kla_id` website cookie. Those need to resolve to a known identity. Installing Klaviyo's script doesn't identify every visitor.

RightMessage checks an explicit `rm_kl` link first, then a remembered contact, `_kx`, the Klaviyo cookie, and an inferred email.

When RightMessage learns an email and Klaviyo's JavaScript client is available, it calls that client's identification method. This shares the identity with Klaviyo's on-site tracking. It doesn't replace the API connection or grant marketing consent.

## Choose what to sync

Save choice answers to profile properties. You enter the property name rather than choosing from a predefined custom-field catalog, and it doesn't need to exist on every profile first.

1. Open **Questions** and choose a multiple-choice question.
2. Open **Sync with Klaviyo**.
3. Under **Destination**, enter a custom property name in **Save answers to Klaviyo**, such as `shopping_goal`.
4. Under **Answer → value**, enter the value for each answer, such as `home_office`.
5. Use **Publish** to make the question and flow changes live before your live test.

Multiple selections are saved as comma-separated values, not a Klaviyo array.

For input questions, enter the exact built-in key when the answer belongs in a native profile field:

| If you'd like to save…   | Use one of these keys                                                                                 |
| ------------------------ | ----------------------------------------------------------------------------------------------------- |
| Name and contact details | `first_name`, `last_name`, `phone_number`, `organization`, `title`                                    |
| Profile settings         | `locale`, `image`                                                                                     |
| Location                 | `address1`, `address2`, `city`, `country`, `region`, `zip`, `latitude`, `longitude`, `timezone`, `ip` |

The mapping control is a text box, not a native-field dropdown. RightMessage routes these keys to Klaviyo's built-in or location attributes. Latitude and longitude need numeric values. Other property names remain custom properties.

RightMessage can read custom properties and write mapped answers. It can also read and write supported native fields through explicit mappings. Existing matching mapped values can put an identified visitor in the corresponding RightMessage segments without asking the question again. This connector doesn't import purchase or event history.

### Choose whether to create a profile or subscribe someone

Creating or updating a profile doesn't require a list and doesn't subscribe the person. For an Email question, keep **Identify the visitor** enabled. Choose **Create/Update contact** if you only need a profile, or **Add to list** with the intended list for a signup.

The list action subscribes to email marketing. Saving a phone number doesn't subscribe someone to SMS. Klaviyo's subscription API can remove existing suppressions, so run the signup action only with the person's permission.

RightMessage reads list membership and can add contacts through configured list actions. Klaviyo segments work differently. Their dynamic membership can be read for conditions, but it isn't a writable tag or choice-question destination. If **Add to tag** appears, don't use it to join a Klaviyo segment. The connector can't manually add or remove segment membership.

Follow [Map answers to contact fields and tags](https://rightmessage.com/help/synchronizing-contact-data-with-your-email-platform-or-crm) for shared mapping behavior.

## Check the connection

1. In your identified test browser, answer the mapped question.
2. Open the profile in Klaviyo and check the exact property and value.
3. If you configured a list action, submit a fresh signup with an email you control and the required consent.
4. Check both list membership and email marketing subscription status. Complete double opt-in when required.

RightMessage adds the list relationship, then requests the marketing subscription. A profile or list membership can exist even if that subscription request fails.

### If a signup returns 403

Check that the private key has `subscriptions:write`, even if connection health is good.

1. Replace the key with one granting the required permission.
2. Click **Save Changes**.
3. Repeat the signup and inspect subscription status in Klaviyo.

Double opt-in controls subscription confirmation. It doesn't explain every missing property update. Use **History** to investigate failed operations, then check the profile itself.

If fields load but list or segment conditions don't match, check membership separately. Repeated `429` rate-limit responses can cause RightMessage to return the profile without that membership data. If a new list or segment is missing from a picker, use **Clear Cache** on **Overview**, then reopen it.

When the answer reaches the intended profile and your signup has the expected membership and subscription status, your setup is working. [Verify an integration change](https://rightmessage.com/help/verify-an-integration-change) helps you check each part if something is missing.
