What is klaviyo setup, and what decisions are hard to reverse later?
Klaviyo setup is the initial connection between your store and Klaviyo, plus the handful of decisions made in the first week that are expensive to undo: how the catalogue syncs, where and how consent gets captured, and whether a customer resolves to one profile or several. Most of what happens after setup, campaigns, flows, segmentation, is easy to change on a Tuesday afternoon. Catalogue structure, consent capture and identity resolution are not; get any of the three wrong and the fix later is a cleanup project, not a settings change.
The intended reader here runs Klaviyo on Shopify Plus or a comparable subscription platform, at $3M to $30M in revenue, connecting Klaviyo for the first time or replatforming from another ESP, where the catalogue is large enough that sync errors matter and the customer base is large enough that identity resolution problems compound rather than staying anecdotal. A team running a handful of SKUs and a few hundred customers faces the same catalogue and identity risks covered here, just at a smaller scale, and is still worth reading this before scaling past the point where fixing them is simple.
Automated flows already account for 41% of email revenue across Klaviyo’s own base of 183,000+ brands (Klaviyo, vendor-reported), and every one of those flows is only as reliable as the plumbing underneath it. The proprietary part of this article is the actual setting values worth checking during install, and the specific step, a legacy tracking snippet left running alongside the new integration, that quietly breaks flow triggers for months without anyone noticing.
What do you need ready before you start a klaviyo shopify setup?
You need Shopify admin access with permission to install apps and edit theme code, access to your domain’s DNS records to add the sending-domain entries Klaviyo requires, and a decision, made before you start, about where marketing consent will be captured: at Shopify checkout, through a Klaviyo sign-up form, or both. Walking into a klaviyo shopify setup without that consent decision made in advance is how teams end up with three different capture points using three different default states.
You also need to know whether you are bringing historical customer data with you, from a previous ESP or from years of Shopify order history, because that decision affects whether you import a static file first or let Klaviyo’s own backfill handle it, covered in Step 6. Decide this before connecting anything, since importing on top of an existing sync is where duplicate event data usually comes from.
Step 1: Connect your Klaviyo account and verify the sending domain
Create the Klaviyo account, then go straight to domain verification before touching the Shopify integration. Klaviyo’s Domains settings page generates DKIM CNAME records and an SPF include value specific to your account; add both to your domain’s DNS through whoever manages it, Shopify, a registrar, or an internal ops team, and confirm they’ve propagated before sending anything beyond a test email. Skipping this step doesn’t stop you from sending, but it puts every early campaign at risk of landing in spam while your domain has no authentication history behind it.
Check your domain’s DMARC policy while you’re in there. A policy set to reject or quarantine without Klaviyo’s records correctly in place will silently drop or spam-file mail that looks unauthenticated to the receiving server, and you’ll see it first as a low open rate, long before anyone thinks to check DNS.
Step 2: Install Klaviyo in Shopify without duplicating tracking
Install Klaviyo through Shopify’s official app listing rather than a manually pasted script; the app handles OAuth, catalogue sync and on-site tracking together, and is the path Klaviyo actively supports. Before you install it, open your theme code and search for a legacy Klaviyo JavaScript snippet, usually a script tag referencing klaviyo.js or an inline function call, left over from a previous integration attempt or a migration nobody finished cleaning up. If you find one, note it and remove it once the new app’s tracking is confirmed working, not before.
Running both at once is the single most common way a klaviyo shopify setup goes wrong quietly: on-site events like Viewed Product and Added to Cart fire twice per action, and nothing in Klaviyo’s interface flags this as an error, since two events firing is technically valid, just wrong. The result shows up later as engagement figures that look unusually high and flow triggers, abandoned checkout in particular, that fire more aggressively than the actual behaviour warrants.
Step 3: Sync your product catalogue and check it before you trust it
Enable catalogue sync in the integration’s settings inside Klaviyo, and give it time to pull your full product feed: title, price, image, URL, category tags and item ID mapped to your Shopify product and variant IDs. Klaviyo generally syncs published, active products rather than drafts or archived listings, so compare its Catalog item count against your published product count in Shopify admin, not your full backend count, when you check that the numbers line up.
A gap between the two counts usually traces to one of three causes: variants without a price set, since a blank or zero price gets a product rejected from the feed; products missing a primary image; or bundle or kit products built through a third-party app that don’t map cleanly to Shopify’s native product structure. Fix the underlying product data in Shopify rather than trying to patch it from the Klaviyo side, since the sync will simply pull the same broken data again on its next pass.
Running Shopify Markets with multiple currencies or multiple published storefronts adds another failure point worth checking early: confirm whether Klaviyo is syncing one catalogue for the whole account or treating each market as a separate feed. Teams that assume a single shared catalogue sometimes find the same item ID resolving to different prices depending on which market synced most recently, and that mismatch quietly corrupts any email template that pulls a live product price rather than a price fixed at send time.
Step 4: Capture marketing consent so it holds up later
Consent capture happens in more places than most teams expect, and each one sets a slightly different type of consent with a different failure mode if it’s misconfigured.
| Capture method | Where it happens | Consent type set | Risk if misconfigured |
|---|---|---|---|
| Shopify checkout marketing checkbox | Native checkout, before or during payment | Email marketing consent | Default state varies by market; doesn't capture SMS consent on its own |
| Klaviyo sign-up form or flyout | On-site embed, pop-up or footer | Email or SMS consent, set directly by Klaviyo | Silently stops capturing if the form's connected list ID is wrong |
| SMS keyword or text-to-join | Off-site, via a published keyword | SMS marketing consent | Disclosure wording is compliance-relevant; confirm current requirements with counsel |
| CSV or manual import | Back-end, by staff | Whatever the file states | Easy to mark a row "subscribed" without an actual consent record behind it |
This table is a starting checklist, not a compliance opinion: confirm the specific wording, disclosure and record-keeping requirements for your markets with counsel, particularly for SMS, where consent rules are stricter than email in most jurisdictions. The practical setup task is making sure every one of these methods that you actually use writes to the correct consent property in Klaviyo, checked by sending a test opt-in through each one and confirming the resulting profile shows the expected consent state.
Step 5: Resolve identities before you build a single flow
Identity resolution is how Klaviyo decides whether two events, a guest checkout and a later account sign-up, a pop-up email capture and a purchase three weeks later, belong to the same person or become two separate profiles. Klaviyo merges profiles primarily on an exact match of email address, secondarily on phone number, and on any customer identifier your integration sends explicitly. An exact match means exact: a typo, a “+newsletter” Gmail alias, or a different email entered at checkout than the one used to sign up for a discount pop-up, all create separate profiles that Klaviyo has no way to know belong to the same customer.
Mismatched capture matters most for brands running a lead-capture pop-up alongside the main store, since the pop-up often collects an email before any purchase, under conditions the checkout flow doesn’t see. If that pop-up email differs even slightly from the one used at checkout, you get two profiles: one with the purchase history and one with the original consent and engagement history, and neither has the full picture. Every flow, and in one sentence, every segment built later, assumes one profile per person, which is why this is worth resolving before any tiering work begins.
Phone numbers cause a related problem in a different shape: a number saved in a ten-digit local format at checkout and the same number saved in full international format through an SMS keyword sign-up can read as two different values even though they reach the same handset. Standardise phone capture to one format across every entry point, and check Klaviyo’s own guidance on phone number formatting before assuming SMS and email consent will link automatically to the same profile.
The practical fix is to standardise capture: use the same email field validation and, where possible, the same identifier across every capture point, and periodically export a list of profiles sharing a phone number or a near-identical email to check for obvious duplicates by hand, since Klaviyo will not surface these automatically.
Step 6: Bring in historical order data without corrupting profiles
You generally have two ways to bring in the past: let the official integration’s automatic backfill pull recent order history when you first connect, or import older data separately through a CSV or an API backfill. Check Klaviyo’s own integration documentation or support for the current backfill window before assuming a fixed depth, since this is a setting Klaviyo controls and can change.
If you import historical orders separately, do it once and record that you’ve done it: re-running the same import, or letting a backfill run alongside a manual import covering the same period, creates duplicate Placed Order events for the same order. That inflates order counts on the affected profiles, which distorts anything built later that counts order frequency, from a simple repeat-customer filter to more advanced modelling. If you suspect a duplicate import has already happened, check a handful of known repeat customers’ order counts in Klaviyo against their actual order history in Shopify before building anything that depends on order counts being accurate.
Step 7: Verify the setup before you turn on live sends
Place one real test order through your live storefront after every previous step is complete, and confirm three things: the Placed Order event appears on the correct profile within a reasonable window, the product referenced in that order resolves to the correct catalogue item rather than showing as an unknown item, and the consent state on that profile matches what you expect given how the test order was placed.
Then send a one-recipient seed campaign to your own inbox, not the full list, before anything goes out broadly. This catches template rendering issues, broken merge fields and image links, problems that are cheap to fix before a send and expensive to explain after one.
What’s the setup step most teams get wrong?
The step most teams get wrong is leaving a legacy tracking snippet live in theme.liquid after installing the official Klaviyo app, so on-site events fire twice for every visitor action. It causes no visible error, no failed sync, nothing in Klaviyo’s dashboard flags it, but every flow trigger built afterwards inherits inflated activity data from day one, and an abandoned-checkout flow in particular can end up firing off weaker signals than intended, treating a page view as meaningful intent it wasn’t.
Check for this specifically before building your first flow: open the theme code, search for any script referencing klaviyo.js or a manually pasted tracking function, and remove it once you’ve confirmed the official app’s own tracking is active and correctly attributing events.
What breaks later if identity resolution is wrong from day one?
Fragmented purchase history is the main cost: a customer who has genuinely ordered five times can look like five separate first-time buyers if each order landed on a different profile, which breaks any flow or filter that depends on accurate order counts. Suppression can leak too: someone who unsubscribed on one profile keeps receiving mail on a duplicate they didn’t know existed, which is a deliverability and trust problem as much as a data one.
By the time this gets noticed, usually months in, fixing it is a manual cleanup project: identifying duplicate profiles, checking which one holds the accurate consent and purchase record, and merging them individually rather than in one bulk operation. It is far cheaper to standardise capture at setup than to untangle it afterwards.
How long does a proper klaviyo setup take?
There is no fixed number of days worth planning a launch date around. The honest answer depends on how large and how clean your product catalogue already is, how many separate consent capture points exist across your storefront and marketing, and how much historical data needs checking before import. A brand with a tidy catalogue and a single consent capture point can verify everything in this article within days; one with years of accumulated data across multiple platforms should treat it as a staged rollout with a verification checkpoint at the end of each stage, not a single sprint.
What should you check every week for the first month?
Check that the catalogue item count in Klaviyo still matches your published product count in Shopify, since a theme change or a bulk product edit can silently break the mapping for a subset of items. Check the integration’s sync status for any reported errors, rather than assuming silence means everything is fine. Watch bounce and spam-complaint rates on your early sends for signs the domain authentication isn’t fully settled, and spot-check a handful of known repeat customers to confirm their profiles still show a single, accurate order history rather than starting to fragment.
If any of these weekly checks turns up a problem, catalogue drift, a sync error, a suppression mismatch, hold off turning on additional flows until it’s resolved rather than layering more automation onto plumbing you already know is unreliable. A flow built on top of a catalogue sync error just automates the error at scale, and working out which of ten live flows is sending the wrong price is a slower fix than pausing new flow launches for a day at the start.
Every flow and segment built after this depends on the layer described here being right, which makes it a lifecycle flows problem at its root: get catalogue sync, consent capture or identity resolution wrong, and every flow built afterwards inherits the mistake. Once the plumbing is verified, run the expected return on a properly built flow structure through the flow revenue calculator, and check whether your catalogue size and order volume put you in the range this setup work is built for in our notes for scaling brands.
Sources
- Klaviyo, analysis of 183,000+ brands: automated flows generate 41% of email revenue (vendor-reported).