Migrer hors de Klaviyo — phase par phase.
Les migrations Klaviyo se jouent sur trois spécificités : les API Profiles + Events paginent par curseur avec un burst de 10 req/s, le moteur Flows n'a pas d'« export » public — il faut rebâtir la logique de trigger depuis l'inventaire UI — et vos webhooks Shopify doivent re-pointer en lockstep avec la bascule, sinon vous double-facturez les boîtes mail de vos clients pendant une semaine.
Les phases, taillées pour Klaviyo
Chaque phase ci-dessous, c'est la version spécifique Klaviyo de notre démarche standard. Même structure à chaque mission, des détails par SaaS.
Audience + Flow audit
1 weekWe inventory every active Flow, every Segment, every signup Form, and every SMS short code. Most stores have 20+ Flows that compounded over years — about half are no longer firing or are sending to inactive segments.
✓Screenshot every active Flow as a single-page reference (the API can't export the trigger logic)✓List every Segment with its filter rules and current size✓Inventory active Forms (popups, embedded) and their UTM rules✓Audit SMS senders (short codes vs long codes, carrier compliance state, opt-in records)✓Map Shopify webhooks currently firing into Klaviyo (orders, refunds, abandoned checkouts, fulfillment)Ce que vous repartez avecA Flow Inventory + Segment Catalogue + the Shopify webhook switchover plan.
Schema + suppression model
1 weekProfiles get a single Postgres table, deduped on email and phone with a unique index. Suppression and unsubscribe state flip booleans instead of inflating a bill. We preserve the Klaviyo `profile_id` for backwards compatibility with anything pointing at it.
✓Design `profiles` table with dedupe on (lower(email)) and (E.164 phone)✓Design `events` (or `profile_events`) table for the activity stream✓Design `suppressions` with reason codes (hard bounce, unsubscribe, complaint, manual)✓Plan the SMS sender flow direct to Twilio (no Klaviyo markup) + 10DLC / short-code compliance✓Decide attribution windows up front so reporting agrees with Shopify + GA4 from day oneCe que vous repartez avecSchema migrations + a documented attribution model + a Twilio sender plan.
Extract via Klaviyo APIs
1-2 weeksProfiles, events, lists, segments and metrics come out via the v2024-XX REST APIs. Throttling matters here — burst at 10 req/sec, sustained ~150 req/min, and segment-level extraction is a separate dance.
✓Authenticate via a Private API Key (server-side only)✓Paginate profiles with the `page[cursor]` parameter (the JSON:API style)✓Pull every event with a `filter=greater-than(datetime,…)` window — chunk by date or you'll time out✓Extract list and segment memberships separately (segments aren't materialised; you re-derive them)✓Throttle to stay under the burst + steady-state limits; the cursor lets you resumeCe que vous repartez avecA re-runnable extract script + a reconciliation report against Klaviyo's own dashboard.
Build + weekly demos
3-5 weeksThree Flows ship in week one (welcome / abandoned cart / post-purchase). Templates become React Email components in your repo. SMS goes direct to Twilio. By end of phase your team is sending the weekly newsletter from the new product.
✓Build the Flows engine on Inngest — every step a typed function with retries✓Templates as React Email / MJML, version-controlled, previewed in CI against Litmus✓Email sends via Amazon SES or Resend (fractions of a cent per send, no contact-tier multiplier)✓SMS via Twilio direct — no markup, you handle 10DLC / short-code registration once and own it✓Reporting in Metabase against the same Postgres — drill-downs agree with the chartCe que vous repartez avecThree live Flows + weekly campaigns running from the new product on a staging domain.
Parallel run + Shopify cutover
1-2 weeksShopify continues to fire webhooks into Klaviyo for a fortnight while the new product mirrors them. Daily reconciliation compares opens, clicks, conversions. Then we switch the webhook endpoints on a Tuesday morning.
✓Dual-write Shopify webhooks via a Cloudflare worker (Klaviyo + new endpoint)✓Daily reconciliation: sends, opens, clicks, attributed revenue✓Move SMS sender identity (short code or 10DLC long code) — the carrier paperwork is the long pole, start week 1✓Suppress all but one Klaviyo Flow during the final week so we're not double-sending✓Cut Shopify webhook endpoints to the new product, leave Klaviyo on as read-onlyCe que vous repartez avecA reconciliation dashboard showing seven days of zero drift + a signed sign-off from the head of marketing.
Cutover + Klaviyo read-only
1 day + 90-day fallbackKlaviyo Flows get paused (not deleted — kept for compliance), Shopify webhooks point cleanly at the new endpoints, the SMS sender identity moves over, auto-renewal cancelled.
✓Pause every Klaviyo Flow (don't delete — Klaviyo holds the unsubscribe records you may need)✓Confirm SMS sender identity has fully migrated to Twilio✓Verify Shopify webhook delivery to the new endpoints with synthetic events✓Lock Klaviyo to read-only / viewer role✓Cancel Klaviyo auto-renewal in writingCe que vous repartez avecCutover Runbook + a confirmed SMS sender migration + a quiet inbox where the renewal email used to land.
Les API Klaviyo qu'on tape vraiment
Les endpoints concrets qu'on utilise pour extraire vos données pendant la phase de parallel run. Les scripts d'extraction restent — ils resservent à chaque renouvellement.
GET https://a.klaviyo.com/api/profiles/GET https://a.klaviyo.com/api/events/GET https://a.klaviyo.com/api/metrics/GET https://a.klaviyo.com/api/lists/GET https://a.klaviyo.com/api/segments/GET https://a.klaviyo.com/api/lists/{list_id}/profiles/GET https://a.klaviyo.com/api/campaigns/GET https://a.klaviyo.com/api/flows/Les pièges propres à Klaviyo
Ce qu'on a appris à la dure (ou ce que la doc minimise). On les met sur la table dès le kick-off, comme ça personne n'est surpris en semaine 6.
- ⚠API rate limits are revision-pinned and ~10 req/sec burst, ~150 req/min steady-state. The events extract is the long pole — chunk by date window and respect the cursor.
- ⚠API revisions are pinned via the `revision: 2024-XX-15` header. Pin the revision in your client and don't auto-upgrade or breaking changes will land mid-migration.
- ⚠Flow logic isn't exportable — you can list Flows and their metadata, but the trigger conditions and step branching are UI-only. Inventory exhaustively in Phase 1.
- ⚠Suppression state is split across hard bounces, unsubscribes, manual suppressions and complaints — pull all four with reason codes preserved or you'll resend to bounces and damage deliverability.
- ⚠SMS sender identity (short code or 10DLC) is the longest lead-time item — start the Twilio paperwork in week one or the cutover stalls waiting on carrier approval.
- ⚠Shopify webhook order matters: orders, refunds, fulfilment can arrive out-of-sequence. Idempotency keys on every write or you'll double-fire abandoned-cart emails.
- ⚠Predictive Analytics (CLV, churn risk) is closed-source on Klaviyo's side — we replace it with explicit SQL on order history, not a copy of the model.
Ce qui reste en place
Une migration marche quand elle est cadrée honnêtement. Voilà ce qu'on ne touche pas — par choix.
- ·Klaviyo's CDP product — most stores don't actually use it; we sync direct from Shopify / your warehouse
- ·Reviews — handled by a dedicated tool (Stamped, Junip, Yotpo) if you need it, not bundled
- ·Predictive Analytics models — replaced with explicit SQL definitions you can read
- ·Mobile push and in-app messages — scoped separately if mobile is a real channel
- ·Klaviyo's native A/B testing UI — replaced with feature flags on the send template
- ·Klaviyo Forms templates — your popups become first-party React components on your own domain
Cadrer une migration Klaviyo.
Dites-nous votre nombre de licences, la date de fin de contrat et les intégrations que vous ne pouvez pas perdre. On revient sous un jour ouvré avec un cadrage forfaitaire et un calendrier calé sur votre renouvellement.
Cadrer une migration Klaviyo
Un jour ouvré. NDA + DPA sur demande.