# Connecting Klaviyo

> How to connect Klaviyo to Ordinary, what you can do once it's connected, and exactly what data Ordinary reads from your Klaviyo account.

Source: https://help.tryordinary.com/integrations/klaviyo

---

> Connecting Klaviyo requires the **Starter plan or higher**. Free-tier
> stores still see organic and pixel attribution, but no email/SMS
> campaign performance.

Klaviyo brings your email and SMS campaign and flow performance into
Ordinary, alongside your paid-ad and organic channels. Once connected,
every campaign and flow you've sent shows up in **Campaigns → Klaviyo**
with sends, opens, clicks, and the orders and revenue Ordinary
attributes to them.

The integration is **read-only**. Ordinary reads performance data out of
Klaviyo to power your reports — it never creates, edits, or sends
anything in your Klaviyo account.


## Before you start

- You're on **Starter or higher**.
- **Shopify is connected first.** Ordinary builds Klaviyo reporting on
  top of your Shopify orders, so you need an active Shopify connection
  before you can connect Klaviyo. If you start the Klaviyo connection
  without Shopify, Ordinary sends you to connect Shopify first and then
  brings you right back to finish Klaviyo automatically.
- You have **admin access** to the Klaviyo account (you'll see a consent
  screen during sign-in).

## How to connect

You can start from either side.

### From Ordinary

1. Open **Settings → Integrations → Klaviyo**.
2. Click **Connect Klaviyo account**.
3. Sign in to Klaviyo and review the permissions (see below).
4. Approve. Klaviyo sends you back to Ordinary, which stores an
   encrypted token and begins importing your data.

### From the Klaviyo App Marketplace

1. On Ordinary's listing in Klaviyo, click **Install**.
2. If you don't have an Ordinary account yet, you'll create one (or sign
   in). If your login manages more than one Ordinary workspace, you'll
   pick which workspace to connect.
3. You're returned to the Klaviyo permission screen to approve, then
   back to Ordinary.

## Permissions Ordinary requests

Ordinary requests the **least-permissive, read-only** set of scopes that
covers cross-channel reporting:

- `accounts:read` — your account name and ID (required by Klaviyo for
  every app)
- `campaigns:read` — campaign metadata and send counts
- `flows:read` — flow definitions and per-flow performance
- `metrics:read` — your tracked metric definitions (Opened Email,
  Clicked Email, Placed Order, etc.)
- `events:read` — per-event engagement (individual opens, clicks, and
  orders) used to reconstruct the buyer journey
- `profiles:read` — recipient context, used only to match Klaviyo
  engagement to your store's orders
- `lists:read` — list membership context for segmentation reporting

There are **no write scopes**. Adding a scope later would require you to
re-authorize, because Klaviyo doesn't support expanding permissions on
an existing grant.

## What data Ordinary reads from Klaviyo

For transparency (and to answer the common security question), here is
exactly what flows between the two systems:

**Read from Klaviyo (read-only):**

- **Campaigns** — name, status, send time, and aggregate performance
  (recipients, delivered, opens, clicks, unsubscribes, bounces, spam
  complaints, and attributed conversions).
- **Flows** — name, status, trigger type, and the same performance
  metrics, cumulative since the flow was created.
- **Metrics** — the list of event types your account tracks, so opens,
  clicks, and "Placed Order" map correctly.
- **Engagement events** — individual open / click / order events
  (including Klaviyo's click identifier) so a campaign can be tied to
  the orders it influenced.
- **Profiles** — recipient identifiers used only to match Klaviyo
  engagement to your Shopify orders. Used at processing time; not
  surfaced as a contact list in Ordinary.
- **Account details** — account name, sending email, and public API key.

**Written to Klaviyo:** nothing. The integration never writes.

**Stored in Ordinary:** the campaign, flow, metric, and engagement data
above, used to render your reports. Access and refresh tokens are
**encrypted at rest**; all transfer happens over HTTPS. See
[Data handling and privacy](https://help.tryordinary.com/concepts/data-handling-and-privacy).

## What happens right after you connect

- A **365-day historical backfill** runs automatically — campaigns,
  flows, day-by-day metric snapshots, and engagement events. Most
  merchants see meaningful data within 5–15 minutes; a full year of flow
  history fills in over the next ~10–20 minutes.
- **Hourly** from then on, Ordinary refreshes campaign metadata, captures
  per-day metric snapshots, and pulls recent engagement events.
- The **Re-import** button on Settings → Integrations → Klaviyo can pull
  a wider window (up to two years) on demand.

## Where Klaviyo data shows up

- **Campaigns → Klaviyo** — the full campaign and flow list with all
  metrics, per-campaign drill-downs, and the "Ordinary Orders / Revenue"
  columns showing how each performed under Ordinary's attribution model.
  See [Campaigns — Klaviyo](https://help.tryordinary.com/features/campaigns-klaviyo).
- **Attribution reports** — Klaviyo touches participate in your selected
  multi-touch attribution model alongside Meta, Google, organic, and
  other sources.

## Troubleshooting

**"Reconnect required" prompt.** Klaviyo refresh tokens expire after 90
days of inactivity and are also revoked if you change your Klaviyo
password or remove Ordinary from Klaviyo's authorized apps. Click
**Reconnect** on Settings → Integrations → Klaviyo to re-authorize.

**An "unreviewed app" warning during consent.** While Ordinary's Klaviyo
listing is completing review, you may see this warning on the consent
screen. It's expected and doesn't affect your data, which is encrypted
in transit and at rest regardless.

**A campaign shows in Klaviyo but not Ordinary.** Confirm it's marked
**Sent** (Draft, Scheduled, and Sending don't import yet), that its send
time falls within the connected window, and wait for the next hourly
sync.

**Attributed orders look lower than Klaviyo's own number.** Expected —
the two use different methods. See "Why two revenue numbers?" on the
[Campaigns — Klaviyo](https://help.tryordinary.com/features/campaigns-klaviyo) page.

## Disconnecting

**Settings → Integrations → Klaviyo → Disconnect.** This revokes the
token and stops syncs. Historical data already imported stays in
Ordinary; new campaigns and events stop landing immediately. You can
also remove Ordinary from your Klaviyo account (Settings → Authorized
apps → Ordinary → Remove) — Ordinary detects the revoked token on the
next sync and shows the "Reconnect required" prompt.
