Help · Getting started

Coming from Klaviyo

Most people who set this app up are leaving Klaviyo, and everything they have built is still over there. This page is how you get it out: what to press, what arrives, what does not, and what you should expect to be different afterwards.

It is a migration, not a sync. You import everything once, you can import the changes again as often as you like while you are still sending from both, and then you disconnect. Nothing here is designed to keep the two tools in step for ever, because the point is to leave.

Settings → Imports → Klaviyo is where all of it happens. Imports has a row of its own because an import is not an integration: an integration is something that connects and keeps connecting, and this connects once so that you can leave.

The page is in four parts, in the order you live them:

Delete what you no longer need in Klaviyo before you import. Everything you leave there is imported, and everything imported is one more thing to sort through here.

A store with ten years of Klaviyo behind it is carrying a lot that is simply obsolete: events from apps you removed years ago, designs you will never send again, lists built for one promotion that ended. All of it imports happily, and every piece of it is then one more thing to sift through here. An hour spent deleting in Klaviyo first is an hour you do not spend tidying afterwards.

So before you press Import everything, go through your Klaviyo account and delete what you already know you do not want:

None of this has to be ruthless, and nothing here is a deadline — you can always import again later. Ask the moving question: would you pay to move this?

And afterwards. Thinning first is cheaper, but it is not your only chance. A metric you imported, and every event that came with it, can be removed here from that metric's own page, and designs you imported can be deleted under Content → Templates. What you delete here stays deleted: a second press imports only what Klaviyo has touched since, so it does not come back on its own.

A read-only API key from your own Klaviyo account, and the owner seat here.

In Klaviyo, open Settings → API keys → Create private API key. Choose Read-only. If you would rather pick the access yourself, choose Custom and give it read access to Accounts, Profiles, Lists, Segments, Metrics, Events, Templates and Klaviyo Flows. Those eight are exactly what this app asks for and it never asks for more.

Only your store's owner can connect, and only the owner can see the key's last four characters afterwards. Everyone else on your team sees that a connection exists and can watch it run.

Paste the key, press Connect, and then read the account name we show you back. Nothing is read from Klaviyo until you confirm it is yours. That step is not a formality: a key pasted from the wrong account would import somebody else's audience, and the account name is the only thing that can catch it.

That is true of everything this app does. There is no operation anywhere in it that writes to Klaviyo, changes a record there, or deletes one. Your Klaviyo account is exactly as you left it after a migration, and after every run of changes.

One thing we are careful not to claim. Klaviyo does not let a key's holder ask what that key is allowed to do, so we cannot check whether the key you gave us is genuinely read-only. The card lists what we were in fact able to read with it, under What we were able to read. That list is a record of what happened, not a limit. We cannot check what a key is unable to do.

So create a read-only key rather than reusing a full-access one, and revoke it in Klaviyo when you are done. A key we no longer hold is still a key that exists.

Import everything is the button most people want, and under it is the whole of what will happen: a numbered list of the eight steps, in the order they run. The heading over the list says the same thing in one sentence:

You do not have to come back and press anything else. Each step waits its turn, starts when the one in front of it has finished, and each step gets its own report — so you still get a separate list to read for your segments, your templates and your automations.

The list is the order, and every row says why it comes where it does:

Each name in bold is the word the row wears on the screen, so you can read the two side by side.

That ordering is the most important thing on this page. By the time a profile is written, every restriction Klaviyo holds about that person is already stored here — so no later row can quietly put somebody back on your list. It is not a check that has to be right; it is an order that makes the mistake impossible.

One wording per fact, and never two for the same one. Each row carries a small badge with its state in one word, and anything more than the state — why it stopped, why it is waiting, when it comes back — is written underneath it:

And in the count beside the badge:

The number beside a row is what that step actually imported, with the unit under it. A count of 0 is a real answer — we read Klaviyo and found nobody. Not counted yet is a different answer, and the list keeps them apart.

Lists is the one row with two numbers, because it imports two things. The figure is a count of your lists. Under it, the row says how many people are on them — 50,772 people on them, counted once per list — and "once per list" is the honest part: somebody on three of your lists fills three of those places.

Your segments, templates and automations rows carry two numbers when anything could not be imported. The figure is what arrived, with imported under it, and below that — in red, with a mark — how many did not: 10 imported, then 33 not imported. The row then says it in a sentence: 33 of 43 segments were not imported. The import report names each one and why. A step where everything arrived shows one number and no second line, as it always has.

See the import report appears on a row once that step has finished. A row still waiting has no report, because nothing has happened yet — and neither does a row that stopped, because the report covers the run and has no account of a part that did not finish. What went wrong is on the banner instead.

The row that is working is raised, carries a small mark inside its Importing now badge, and says how far it has come and when we last looked — 14,870 profiles so far · as of 4:12 PM.

The screen asks again every few seconds, so the time moves even during the long stretches where the number does not; that is how you can tell it is still going rather than stuck. A row that has been picked up but has not finished its first batch says so beside the same clock, because a number nobody has taken yet is not a zero:

Nothing on this screen is a guess except the hours on the email-history row below. The number is what has actually arrived.

Your profile event history is the part that takes hours rather than minutes — days, on an account with millions of events behind it — and its row says so while it runs: how far back your history in Klaviyo reaches, how far the import has come, and roughly how much longer it will take at the pace it is actually moving.

The bar measures how much of your history is covered, not how many rows have arrived — events are much denser in recent years than in old ones, so "44% of your history" is not "44% of the rows". The dates under it are the fact; the hours are a courtesy, and until we have measured the pace for a couple of minutes the row says so rather than guessing:

The time we give you is deliberately generous. Because your recent years are so much busier than your early ones, counting the calendar would tell you a cheerful number and then leave you waiting. So we measure how fast rows are actually arriving and how busy the years we have just walked through were, project the rest from that, and then double it and round up. You should finish sooner than we said. The number also never climbs: once we have given you a figure, it only ever comes down.

You can close the page. It keeps going.

While an import is running, the first thing on the screen is its progress — the step that is running, how far it has got, and when it is expected to finish — and under it one sentence that is the whole truth:

We email you when it finishes, or if it needs you, and the note says so:

We wait for the previews. After the last step, every template we imported still needs a preview drawn for its card, and until those are done the progress block says so:

That is the only reason an import can sit at 100% for a few more minutes. The email comes after, so that when you open Templates everything is there to look at.

The message goes to whoever pressed Import, or to your store's owner if we cannot tell. It carries the totals, and its link brings you back to Settings → Imports → Klaviyo — the same screen you started from, opened where you work. If a step stops and needs you, you get a message saying that instead, and it lands on that same screen — so you never have to keep checking to find out either way.

The import does not run in your browser. Closing the tab, signing out, or losing your connection changes nothing about it. Come back to Settings → Imports → Klaviyo whenever you like and the list will tell you where it got to.

Segments, templates and automations each have a quiet Skip this one while they are waiting their turn. It is there for the twelve automations you know you do not want: you decline that step instead of waiting for it.

A skip does not stop anything behind it. The steps after it carry on in order, exactly as if the skipped one had finished. The row then says Skipped by you and offers Import, so you can change your mind whenever you like.

Only a skipped step can be started again on its own. The five that carry your people are not individually runnable — Import everything is theirs — which is why only rows 6, 7 and 8 offer anything.

Klaviyo is not always reachable, and a step that cannot get an answer does not give up on you. Its badge says Paused, and the line under it names why and the time it will try again — a minute at first, then longer if Klaviyo stays quiet, for about a day. Nothing is lost while it waits, and you do not have to do anything: it picks itself back up and carries on from the page it had reached.

A banner at the top of the screen says so, and says what happened. It names the part that stopped, what went wrong, how much is already yours, and what the one button does:

A step tries by itself for hours before it stops. When a request fails we wait and try again — a minute, then five, then longer each time, up to half a day in all. While that is happening the row says Paused, with Klaviyo is not answering under it, and tells you when it comes back, and nothing is asked of you: an unreliable afternoon at somebody else's service is not something you should have to sit and watch. A step stops and asks for you only once all of that waiting has been used up.

When it does, the reason is one of four — requests timed out, we could not reach Klaviyo, Klaviyo answered with an error, or something else went wrong — and the banner says which.

In the list, the step itself says Stopped, wears a tint of its own, and its step number becomes a warning. The line under it opens with the number of failed requests. The steps behind it say Stopped too, and each names what it is waiting on, so nothing is left half-imported quietly.

Resume is the owner’s, along with Import everything, the skips and Disconnect. The held-profile controls under the list are your managers’ too. Everyone else sees the same banner and the same stopped row, and they say so where the button would be:

Import everything waits while something is stopped. It starts a fresh import from the beginning, which is not what you want when a part of one is sitting a page short of where it got to — so while a step is stopped that button is off, and says why:

Resuming costs nothing and takes nothing back. It picks the step up at the exact page it stopped on — a long email-history import does not start again from your oldest year — and then runs the ones that were canceled behind it, in the same order. Anything that had already finished is left alone, and a step you skipped stays skipped. The report you were reading is the one that carries on.

Press Import everything a second time and it is not a second migration: it imports what has changed since last time, and then your segments, templates and automations again.

A done row for segments, templates or automations also offers Import again on its own, for running just that one. Templates and automations each run a whole step at once: one press imports every design you have, or every automation, and you never get part of a step. Segments are the exception: that button asks you which ones first, and there is a section below about the tick-list it opens. A run of one of these is not the migration, and it does not reset the "since last time" clock on your people.

A second press imports only what has changed. Templates and automations resume from where they left off — so pressing Import again on Templates imports the designs Klaviyo has touched since the first run, and nothing else. What that means in practice: if you delete an imported design here, pressing the button again does not import it a second time. The only way to ask for it again is to change it in Klaviyo, so that Klaviyo's own record of it moves.

A segments press made from the tick-list is the one that does not work this way. It looks at every segment in your account, not only the ones Klaviyo has touched since last time, because the list you ticked against was all of them.

A template is imported with its images. Every image in a design is fetched and stored in your store's own images and media, so it no longer loads from Klaviyo's servers. An image we could not fetch is named on that run's report, so you know which design to open.

Every imported segment arrives with the label "Imported", and wears a quiet Imported badge on your segments index, so you can tell at a glance whose rule it is. The label is yours from then on — rename it, add your own beside it, or take it off — and the Label filter still finds the lot of them at once. And if a segment, template or automation arrives with a name something of yours already has, it keeps its own name with (imported) on the end rather than overwriting anything.

Sign-up forms are not imported at all. Rebuild them under Content → Forms.

Your own fields on a profile keep your own names. Any field holding a single value — a date, a note, a balance, a check result — arrives spelled exactly the way you spelled it, and you can build a segment on it like any other property. A field holding a list or a structure rather than one value is not imported, because a rule has nothing to match against it; that run's report names it, so you know which one to split up if you need it.

A handful of fields are the other exception, and they are the ones the import answers for itself: the email address, the name, the phone number, the Klaviyo profile id, and everything about consent. Those come from Klaviyo's own record of them, so if you also kept a field of your own called something like "Email" or "Subscription Status", the import does not write a second, older answer beside the real one. The report names those too, one line each.

A field of yours that means one of those is read as one of those. It is not only the obvious spellings: a field called "Mobile" is read as the phone number, "Customer ID" as the profile id, and "Opt In Date" as the consent date — so none of the three is written a second time as a field you can build a rule on. If one of them is holding something of your own that you need, rename it in Klaviyo before you import, and it is imported as an ordinary field.

Every profile the import creates remembers that it came from Klaviyo. It carries a property called imported_from, with the value klaviyo, and you can build a segment on it like any other property. Somebody your store already knew — from an order, your site, or a form — keeps whatever they had, because the property says where a profile started and they did not start here. Importing changes later never rewrites it.

Pressing Import again on the segments row does not start anything. It opens a box holding your Klaviyo segment names, a tickbox beside each one, and nothing happens in your store until you press Import at the bottom of it. The same box opens from the segments row on a report, and from Import on the segments row if you skipped that step during the migration.

Some boxes are already unticked when it opens — the ones that look like housekeeping rather than an audience: a do-not-send list, a bot or spam-trap list, a segment that only describes people you never email. Each of those says in a few words why it starts unticked, and every one of them is yours to tick again.

One press then does the whole list, both ways, and the box says so above the button:

So a tick on something you do not have yet imports it. A tick on something you already have leaves that same segment where it is, under the name and the labels it has here, and brings only its rule up to date. An untick on something you do not have does nothing at all. And a segment you deleted here and then tick again is imported afresh — you ticked that name on a screen that tells you what a tick does.

Only what is on that screen is touched. If your account holds more segments than we could read in one go, the box says so, and the ones it never reached are neither imported nor deleted:

Two segments with the same rule are imported once. Accounts collect copies of the same audience under different names, and there is no sense in having two of them here. One segment is made, and the report names the one the others joined — "This is the same rule as “Buyers”, so it was not made twice." The name it gives you is the name that segment carries here today, so you can go and find it.

The report says what the press did, on its Segments row: how many are new here, how many were already here and were updated to match, how many were the same rule as another segment, how many you left unticked were deleted here, and how many were left exactly as they are. A number that is zero is not drawn, so an ordinary import's row reads the way it always did.

Import everything does not ask. It is the migration, and it imports every segment in your account the way it always has, deleting nothing — the asking belongs to the segments row's own button, which is where choosing is the point.

Your segments index hides the imported ones until you ask for them. A store arriving from Klaviyo can have forty segments it imported and three it wrote, and the three are the ones you came to that screen for. So the index opens with the imported rows folded away, and says how many:

Show them brings them back and Hide them puts them away again. The choice rides the page's own address, so going back in your browser returns you to the view you were reading. And everywhere you choose an audience — picking who a campaign goes to, for instance — every segment you have is offered, imported or not.

A count that takes too long shows a dash, and usually fills itself in. Some imported rules are heavy enough that counting the people in them does not finish in the time the screen waits. That segment shows a dash instead of a number, and the app tries it again the next day with three times as long, which is enough for almost all of them.

While you are still sending from Klaviyo, it keeps moving. Import everything is what catches your store up: after the first time, it imports what has changed since then. Nothing is kept in sync — it runs once, when you press it.

Press it whenever you like. It is cheap, it is safe to run twice, and the app reminds you when it has been more than a day.

There is a gap, and it only runs one way. Between two runs, somebody can unsubscribe in Klaviyo and this app will go on reading them as subscribed until you press the button again. So during a parallel run, press it before you send — not after.

And nothing travels the other way at all. Klaviyo will not learn about unsubscribes from your store, so export your do-not-mail file and upload it to Klaviyo whenever you import changes.

Your do-not-mail file lives under Audience → Exports. It is the same two files every export gives you, and the second one is everyone you must not email. Uploading it to Klaviyo is the only way an opt-out recorded here reaches the other tool, and it is on you to do it while both are live. This is the price of refusing to write to your Klaviyo account, and we think it is the right trade: a tool that wrote to Klaviyo on your behalf is a tool you can never be sure about.

This is the part that surprises people, so it is worth reading before you start rather than afterwards.

A profile arrives here held unless something vouches for the mailbox. An ordinary Klaviyo profile carries no such fact — it says the person is subscribed, and often when and where they signed up, but nothing about whether the address is still good. So on a real migration the great majority of your people land in the held pool: imported, visible, counted in your reports, and not emailed yet.

Your email history is what changes that, and most of it costs you nothing. Anyone Klaviyo was still reaching in the last 90 days has a working address by the only measure that counts — a mail server accepted a message — and that frees them with no check to pay for. On a list you have mailed in the last few months that is most of it. If somebody's last message did not get through, we hold them back instead.

It happens when we go through your migration with you. You ask, we run it, and it costs nothing; it is not something that runs by itself yet and not something you press. Once it has run, your migration report says how many people it freed and how many are still waiting. Ninety days rather than for ever because mailboxes close: a message that got through last spring says nothing about today.

That leaves a remainder — people Klaviyo had not mailed lately, or had stopped being able to reach. Held is not a refusal and it is not lost work. It is this app saying it has no evidence about that mailbox yet, and there are four ways for it to get one:

None of this appears until your import has finished. While it is still running, the whole panel — the count, the reasons, and the four ways above — is folded away behind a triangle on the import screen, with one sentence inside it saying why: until the import is over we do not yet know which addresses are on hold, so any number we showed you would be a number of a pool still filling. When it finishes, the panel opens and everything in it works.

The screen also tells you when somebody is held only because Klaviyo did not record when and where they agreed. There is no button for that one, and that is deliberate: your word for it is not the record. If you hold that record somewhere else, import those people as a file with Consent Timestamp and Consent Source.

The people you tell us not to email, and the people who unsubscribed, are never in the held pool at all. They are stored as restrictions, not as candidates.

Plenty of stores paid a checking service before they moved. That result is usually saved on each profile as a field of your own — often a word like passed and a note beside it like "The address passed all tests" — and it travels over with everything else. We read it. You paid for that answer and there is no sense in paying for it twice.

We need one thing from you, and only one: when was that check run? It is on Settings → Integrations, under the block that counts who arrived held, and it asks in so many words: When were these addresses checked? Nothing in your old account records it, so you are the only one who knows — the month is close enough.

The card says the rest itself: Your profiles carry a check result but no date. A check is trusted for one year. If you are not sure, leave it blank: those addresses stay on hold and come off hold through an order, a recent delivery, or the test batch. Before you answer, it also tells you how many addresses are waiting on it, so you can see the size of what the date does.

Saving applies the date to the imports that were waiting on it, however many imports you have run, and the card says so when it is done. There is no second button to press. Look for new results on the block below is for anything that arrives later — a file of results you import afterwards — and it is the one to press if the card tells you the re-check did not finish.

A date you correct later reaches only the addresses still on hold. Once an address comes off hold it stays off hold: that is how holding works everywhere in this product, and it is not undone by a second answer. So if you type 2026 where you meant 2019, correct it and the addresses still waiting are put back where they belong — but anyone the wrong date already let out is out, and you can see who on the Profiles screen. Take the extra second on the first answer; the month is close enough, and a month you are sure of beats a year you are not.

It is asked only where the answer does something: if your profiles carried no check result, or you have already answered, you will not be asked. The store's owner records it, because it is their statement about their own list; everyone else reads it.

Until you tell us, those results hold. That is a deliberate choice and we would rather explain it than have you wonder. A result with no date is a statement about a mailbox at an unknown moment. If the check was last month it is worth a great deal; if it was in 2019 it describes addresses that have since closed, and emailing them is the single fastest way to get a store blocked — not throttled, blocked. Guessing on your behalf would be us spending your sending reputation on an assumption. So we ask, once, and the moment you answer, every person whose result still stands comes off hold. Nothing is re-imported and nothing is paid for.

A check older than a year does not count, whichever way we learned the date.

What each result does is the same on this path as on a file, and it is set out in full on the import page: a dated pass comes off hold; an inconclusive, catch-all, greylisted, full-mailbox or role-address result is not a failure and those people stay in the two free doors above; a dead address is set aside; and a note saying somebody is on your own do-not-mail list sets them aside too without changing anything about what they agreed to — that is the do-not-email file's job and nothing else's.

Your own field keeps its name and its value, exactly as you spelled it, so the segments you built on it still work.

If you sent text messages with Klaviyo, those agreements are imported too — and how Klaviyo recorded each one decides what happens here.

People it watched agree arrive ready to text, once your own number is approved. That is two groups: people who texted a keyword to sign up, and people who used one of Klaviyo's own sign-up forms.

Everyone else arrives waiting. People Klaviyo got from a spreadsheet upload, people a staff member switched on by hand, and people written in by another tool through its API. In each of those cases Klaviyo's own record says it did not watch anybody agree, so we do not say that it did. It is not a mistake, nothing is lost, and there is nothing to redo — those rows confirm by themselves the next time each person fills in one of your forms.

People whose agreement Klaviyo recorded as coming from Shopify are decided from your Shopify record instead, not from Klaviyo repeating it.

If you were sending texts somewhere else before Klaviyo, the people on those lists agreed with that service — and all Klaviyo kept is a note that somebody imported them. It cannot tell us how they agreed, because it was not there.

You can. Open Settings, then Text messages: each list you imported where at least half the people agreed to texts has a switch beside it and a line saying how many of the people on it are in that position. Enable it to certify that the people on this list agreed to texts with a previous provider — we record your name and the date against the list, because that is the evidence the phone carriers expect a store to have.

Leave it disabled and nothing is lost: the people on this list wait, exactly as they do now, until each one confirms on one of your own forms.

A certification cannot be withdrawn: the people it confirmed stay confirmed. To stop texting one person, unsubscribe that person on their profile. So enable it when you are ready and not before. It only ever covers the people Klaviyo could not vouch for: anyone who has since unsubscribed stays unsubscribed, and anyone Klaviyo holds no text agreement for at all is not swept in.

Certify the list before your next import, not after. What acts on a certification is the next import that walks the list, so one made afterwards reaches nobody until the import after that.

Only an owner or a manager can certify a list. It is the statement the phone carriers expect about your own people, made in your name, so it is yours to make.

A list where fewer than half the people agreed to texts is not offered, and cannot be certified: being on a newsletter list says nothing about texts, so certifying it would vouch for people nobody asked about. A list you have already certified stays certified, even if fewer people on it agree to texts later.

A profile's own page says which of the two it is, beside the text-message row.

Nothing is texted by any of this. You still need your own approved number, and everyone gets your disclosure text before any marketing text.

Your profile event history is imported as history: sends, opens, clicks, orders, checkouts and refunds, each on the person it belongs to. You can build segments on it from the moment its part of the migration finishes — "anyone who has opened an email in the last 90 days" counts what Klaviyo recorded as well as what you have sent from here, and a segment's own sentence says so.

If you have removed a metric here, the events for it are turned away and counted on that run's report. Events turned away while it was removed are not offered again by a later import.

Three things about it are worth knowing.

It is history, not our record of a send. An open that happened in Klaviyo does not create a message record here. Your reports on campaigns you sent from here count only what you sent from here, which is the only honest thing they can count.

A delivery does not make somebody look active. Importing a year of "we delivered this" would otherwise mark your whole audience as recently active, which is the opposite of the truth. An imported open or click does count.

How far back it goes is Klaviyo's decision, not ours. We read what their API will give us. If your account has an event retention limit, that limit is the floor of what you can import, and there is nothing this app can do about it.

Nothing imported starts an automation. Importing a year of orders does not fire a year of welcome emails at people. This is enforced, not merely intended.

Their email history shows on their profile too. Emails sent, Opens and Clicks at the top of a profile count what you have sent from here — and until you have sent anything, they count what you imported instead, under the same As imported line. The moment you send your first campaign from here, those three become your own numbers. The two are never added together.

What somebody spent before shows on their profile. Total spent and Orders on a profile are added up from the orders your own store has told us about, and somebody you have just imported has none of those yet — so we bring Klaviyo's own count of both across with them, and the profile says As imported on the day we read it. As soon as a real order arrives for that person, their own numbers take over. The two are never added together.

Nothing is dropped silently. Every segment, template and automation that could not be imported whole is named on that run's report, with a sentence saying why. Every report you have ever run is on the page, under Reports:

The report opens with one line for each step it covers — 10 of 43 segments imported. 32 could not be, 1 was not needed. — and then puts what did not happen first: Not imported, then You don’t need this, then Imported, each heading carrying its own count. Every row under them names the thing and the reason.

Segments. Most translate rule for rule — including a rule about what was inside an event, like the SKU that was ordered or the email that was sent, a rule about your Shopify tags, which match here without regard to capitalization, and a yes/no rule on one of your own fields. A yes/no rule compares the word your record holds — “true” or “false” — so the report says so next to it. What cannot be imported is named by the rule, never by the segment: "A rule could not be imported: predicted lifetime value is over $200" tells you what to do about it, where naming the whole segment does not. The rules that cannot be imported, by name: a rule about distance from a postal code, Klaviyo's predictive numbers, a rule about one of their country groupings rather than a country, a rule about a profile field this app has no way to ask about, a rule that compares one of your fields against one of Klaviyo's own internal codes rather than a word you typed, and a rule built on a metric you removed — allow that metric again on Analytics → Metrics, and the rule is imported the next time you import.

A segment with one or more of those rules in it is imported anyway — when the rule is one this app can never ask, which is what all but two of them are. What could not be imported is left out and the segment is flagged on its own page, above its rule:

then the rule in plain words. The report's count for the step says how many arrived that way, as a clause of the imported figure rather than a fourth number — 5 of 7 segments imported. 2 of those imported with a rule left out. 1 could not be. 1 was not needed. — and it names the rule beside each one, in the same words the segment's own page shows you.

The flag is there rather than a refusal because a segment missing one of its rules is a different audience. So you keep the work, and what is held back is the send: open the segment, put what is missing back in the builder, and saving that change clears the flag. It has to be a rule that changes — renaming the segment, or editing its labels, leaves the flag where it is. Until the rule is finished, a campaign cannot be armed with that segment, and its people cannot be added to a list.

A report does not change after you fix the segment. Each report is a record of the run that made it, so it goes on saying that this segment arrived with a rule left out. The segment's own page is the one that tells you where it stands today.

A segment whose rules are all of that kind has nothing left to import. That one is refused whole and named on the report, with each of its rules written out, so you can decide whether to build something like it here by hand. So is a segment whose rule we could not read at all: the report says that plainly, rather than guessing at what it might have meant.

And there is a door beside it: Build it here. Every row on the report that could not be imported carries it, and pressing it opens the segment builder with the name already in the field, no rules at all, and the rule as Klaviyo stored it sitting above the empty rows for you to read while you build.

Nothing is filled in for you, and that is deliberate. A rule this app could not read is a rule it could not read: half of it, quietly put on your screen as though it were the whole, is worse than none of it, because you would have no way of knowing which half was missing. So you get your own name on it, our sentence saying what we could not import, and Klaviyo's own words for the rule — and the segment you save is an ordinary one of yours, unflagged, with nothing marking it as imported.

If the rule was too long to keep a copy of, the panel says so and points you back to Klaviyo to read it there. If Klaviyo sent no rule for that segment at all, it says that instead. Neither one is a blank space you have to guess about.

Two more are held back whole, and both have a way back. A segment with a rule built on a metric you removed is refused entire rather than trimmed: a rule that counts a metric you deleted can never answer, so leaving it out would hand you a segment that quietly means something else. Allow that metric again on Analytics → Metrics — the button there reads Restore, or Allow this name again once the metric's events have been deleted — and import again. That run looks at every segment afresh, so you do not need to change anything in your old tool, and the segment comes over with every rule in it. And a segment with a rule about one of your lists waits for the list. It is named on the report as one that could not be imported this time, and it is imported on its own the next time the import runs, once that list has been imported, with every rule in it.

Already enforced. Some segments exist only to hold back people who bounced, reported spam, or have no consent recorded — which your store does by itself, on every send, without a rule to maintain. Those are reported rather than rebuilt, and named one by one: the report marks each of them You don’t need this, so you can see exactly what you are no longer maintaining. They are also the sort the tick-list starts unticked, which is the same judgment made one step earlier.

Templates. A Klaviyo template arrives as a saved design under Content → Templates, with its images copied into your own images and media so they no longer load from Klaviyo's servers. Its name becomes its subject, because Klaviyo templates do not carry one.

The thing that stops a template being sendable is conditional content — Klaviyo's "if this person, show that" tags. Those are kept exactly as written, which means the design imports and cannot be sent until you take them out or rebuild them here. On that same real account, most templates carried at least one. The commonest by far was a guard around a first name, and that one is translated for you into this app's own way of writing a fallback. The rest — product feeds, loyalty-app lookups, cart line-item loops — have no counterpart here yet, and each one is named on the report so you know which email to open.

A few other things are stripped and named rather than kept: their unsubscribe and preference-center tags, because your emails get this app's own footer; srcset; background images; style, script and link tags; an image whose address we could not reach. A very long template is refused with its measured size and a suggestion to split it.

Automations. Every one arrives as a draft, which is what the row on the list says before you press anything:

That is not caution about the translation. It is that an automation is a standing instruction to mail people, and a standing instruction is yours to give.

An automation refuses whole rather than in part, and here it differs from a segment. A segment is a thing you can open, so it can carry a flag on its own page and wait for you. A step inside an automation has no page of its own and nothing to carry a flag on — so leaving a rule out of one would quietly widen who that automation mails, with nothing anywhere to tell you. It refuses whole instead, and says which rule it was.

It names every reason, not the first one. If an automation carries three things this app cannot rebuild, the report says all three — so you fix them together rather than finding the next one each time you import again. The report gathers the ones that stopped for the same reason under a heading, with a count and a line saying what to do about them, biggest group first.

The report itself is four parts, and it fits on a screen. A table at the top answers every step of the migration at once — what came over, what your store does not need, what did not, and whether that step wants anything from you. Under it is what wants something from you, gathered so one problem is one line however many things it stopped; the names are folded away until you open them. Then the addresses on hold. Then a link to everything that came over, which is a screen of its own with a search and a filter, because four hundred names are a list to look things up in and not a report to read.

What refuses: a text-message step, a webhook step, a back-in-stock delay, a step that branches more ways than this app allows, a subject line carrying Klaviyo's own tags, and an automation started by a Klaviyo form — build the form here first, then point a new automation at it. An email sent to only some of the people who got that far is imported as that step's own send filter, and that filter refuses whole for the reason above, on the same rules the segments step names. Smart sending is left out with a note, because every send here already spaces itself out and respects your store's frequency limit.

Your sign-up forms. Not imported at all — there is no ninth row and there will not be one. Rebuild a sign-up form under Content → Forms, which is where display rules and offers live here.

Klaviyo's own numbers. Their revenue attribution and their reporting are theirs. Your history is imported; their arithmetic over it does not.

Disconnecting is the expected end of this, not a failure. Everything already imported stays in your store; an import in progress stops. Your key is erased from our records at that moment.

Then revoke the key in Klaviyo too. We cannot do that for you, and a key that still exists is a key somebody could use.

Your certifications survive it. Reconnect the same Klaviyo account later and every list you certified is still certified, under the name and date you made it. That statement is your store's, about your own people — it is not something the key carries. Connect a different Klaviyo account and you start with none, because nobody has said anything about that account's lists.

Only the owner can connect a Klaviyo account, confirm it, start a migration, import changes, or disconnect. Only the owner can see the key's last four characters and what it was able to read:

Everyone else can see that a connection exists, watch a migration run, and read every report it produces. Your managers can also work the held-profile controls under the list — Look for new results and Add this batch to your next campaign — because those are part of importing people, not part of the connection. Sending a batch lets held profiles out into the sending drip, so it is a seat that can cause email to go out. Nobody at Carpe Messaging can start one for you.