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.
Connecting 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
- Open Settings → Integrations → Klaviyo.
- Click Connect Klaviyo account.
- Sign in to Klaviyo and review the permissions (see below).
- Approve. Klaviyo sends you back to Ordinary, which stores an encrypted token and begins importing your data.
From the Klaviyo App Marketplace
- On Ordinary’s listing in Klaviyo, click Install.
- 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.
- 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 countsflows:read— flow definitions and per-flow performancemetrics: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 journeyprofiles:read— recipient context, used only to match Klaviyo engagement to your store’s orderslists: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.
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.
- 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 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.