Kommo + Klaviyo: synchronizing CRM contacts and events with email marketing

Klaviyo is an email marketing platform focused on behavioral segmentation: who opened an email, clicked a link, made a repeat purchase. Kommo is a sales pipeline: who is at which stage, when a deal closed, which manager is handling it. Without integration, these data sets exist in isolation. With integration, Klaviyo knows the deal history — and can trigger the right flow at the right moment: an offer after a deal is picked up, onboarding after Won, a win-back after a loss.

What the Kommo + Klaviyo connection delivers

Without integration:
— Klaviyo sees: email opened, clicked, purchased on site
— Does not see: pipeline stage, whether the deal closed, customer LTV from CRM

With integration:
— Contact enters a Kommo deal -> a profile is automatically created/updated in Klaviyo
— Deal Won -> Deal Won event in Klaviyo -> onboarding flow triggered
— Deal Lost -> Deal Lost event -> win-back flow triggered after 30 days
— Deal stage -> profile property crm_stage -> segmentation for targeted campaigns

What is synchronized

Kommo -> Klaviyo:
— Contact email and name -> Klaviyo profile (upsert by email)
— Company name, phone -> profile properties
— Current deal stage -> custom property crm_stage
— Deal amount -> property deal_amount
— Kommo deal ID -> property kommo_deal_id (for tracing)
— Events: Deal Created, Stage Changed, Deal Won, Deal Lost -> Events API

Klaviyo -> Kommo:
— Email interactions (optionally via Klaviyo Webhooks): open, click -> Note in the deal

Architecture

Kommo Webhook: any deal event (create, update, stage_change, won, lost)
  ↓ Backend
  1. GET /api/v4/leads/{id} + contacts
     -> email, name, company, stage, amount
  2. Klaviyo API: POST /api/profile-import
     -> create or update profile
     -> obtain profile_id
  3. Klaviyo API: POST /api/lists/{list_id}/relationships/profiles
     -> add profile to the appropriate list (e.g. 'CRM Leads')
  4. Klaviyo API: POST /api/events
     -> record event (Deal Won, Stage Changed, etc.)
     -> deal data in event properties

Klaviyo REST API: key requests

Klaviyo API uses an API Key (Private Key). All requests go to https://a.klaviyo.com/api/. The revision header with the API version is required.

Create or update a profile:

import requests

KLAVIYO_KEY = 'pk_your_private_key'
HEADERS = {
    'Authorization': f'Klaviyo-API-Key {KLAVIYO_KEY}',
    'revision': '2026-04-15',
    'Content-Type': 'application/json'
}

def upsert_profile(email, first_name, last_name, company, deal_stage, deal_amount, deal_id):
    payload = {
        'data': {
            'type': 'profile',
            'attributes': {
                'email': email,
                'first_name': first_name,
                'last_name': last_name,
                'organization': company,
                'properties': {
                    'crm_stage': deal_stage,
                    'deal_amount': deal_amount,
                    'kommo_deal_id': deal_id
                }
            }
        }
    }
    response = requests.post(
        'https://a.klaviyo.com/api/profile-import',
        headers=HEADERS,
        json=payload
    )
    return response.json()['data']['id']  # profile_id

Add a profile to a list:

def add_to_list(profile_id, list_id):
    requests.post(
        f'https://a.klaviyo.com/api/lists/{list_id}/relationships/profiles',
        headers=HEADERS,
        json={
            'data': [{
                'type': 'profile',
                'id': profile_id
            }]
        }
    )
    # Returns 204 on success

Send an event (Track Event):

def track_event(email, event_name, deal_data):
    payload = {
        'data': {
            'type': 'event',
            'attributes': {
                'profile': {
                    'data': {
                        'type': 'profile',
                        'attributes': {'email': email}
                    }
                },
                'metric': {
                    'data': {
                        'type': 'metric',
                        'attributes': {'name': event_name}
                    }
                },
                'properties': {
                    'deal_name': deal_data['name'],
                    'deal_stage': deal_data['stage'],
                    'deal_amount': deal_data['amount'],
                    'kommo_deal_id': deal_data['id']
                }
            }
        }
    }
    requests.post(
        'https://a.klaviyo.com/api/events',
        headers=HEADERS,
        json=payload
    )

Usage:

# On a Won event from Kommo
profile_id = upsert_profile(
    email='client@company.com',
    first_name='John', last_name='Smith',
    company='ACME Corp',
    deal_stage='Won',
    deal_amount=12000,
    deal_id=98765
)
add_to_list(profile_id, KLAVIYO_CUSTOMERS_LIST_ID)
track_event('client@company.com', 'Deal Won', deal_data)

Segments by pipeline stage

After syncing the crm_stage property in Klaviyo, segments are created:

  • crm_stage = Qualification -> nurture flow with content
  • crm_stage = Negotiation -> case studies and ROI materials
  • crm_stage = Won -> onboarding and cross-sell
  • crm_stage = Lost -> win-back after 30 days

Each segment updates automatically when the stage changes in Kommo — no need to manually move contacts between lists.

Real-world case

SaaS company (EU market, B2B, deal cycle 3–6 weeks):

  • Before: the email marketer manually exported Won deals from Kommo once a week and uploaded them to Klaviyo. Onboarding delay — up to 7 days. Win-back for lost deals — not set up at all.
  • After: Won in Kommo -> within 2 minutes the Klaviyo profile receives a Deal Won event -> onboarding flow starts -> lost deals automatically receive a win-back email after 30 days.
  • Result: onboarding conversion improved by 18% due to timely flow start. The win-back flow recovered 4% of lost deals.

A similar approach was implemented for Brevo (Sendinblue) and Kommo — Klaviyo is stronger in behavioral segmentation, Brevo excels at multi-channel communication (email + SMS).

Who this is relevant for

  • Using Klaviyo for email marketing and Kommo for sales
  • Need event-driven flows based on CRM events: Won, Lost, stage change
  • Deal cycle of 2+ weeks — nurture and onboarding are critical
  • Marketing wants to see lead status from CRM for campaign segmentation
  • Volume: 50+ contacts per month requiring personalized communication

Frequently asked questions

Is there a native Klaviyo and Kommo integration?

No native integration exists. Klaviyo offers native connectors for Shopify, WooCommerce, BigCommerce — e-commerce platforms. For CRMs like Kommo, the integration is built through the REST API. This gives full control over which events and properties are passed.

Klaviyo vs Brevo: which to choose for Kommo integration?

Klaviyo is stronger in behavioral segmentation and event-driven automation — ideal when marketing is built on data-driven triggers. Brevo wins for multi-channel communication (email + SMS + WhatsApp) and lower cost at high volume. For B2B SaaS with a long deal cycle — Klaviyo. For e-commerce and transactional communication — Brevo.

Can data from Klaviyo be synced back to Kommo?

Yes, via Klaviyo Webhooks. Klaviyo sends events (email opened, link clicked, unsubscribed) to your backend URL. The backend updates a Note or custom field in Kommo. This lets the manager see the client’s email activity directly in the deal card.

How to deduplicate profiles in Klaviyo?

Klaviyo deduplicates by email automatically when using POST /api/profile-import. If a profile with that email already exists, it is updated. It is possible to end up with multiple profiles (one by email, another by phone_number) — this is resolved via POST /api/profiles/{id}/merge.

What are the Klaviyo API rate limits?

Profile-import: 75 requests/sec (burst), 750/min (steady). Events API: similar. For a typical Kommo volume (up to 500 deals per month), the limits are not critical. During peak loads — implement a queue with exponential backoff.

Summary

  • Klaviyo REST API: POST /api/profile-import (profile upsert), POST /api/events (deal event), POST /api/lists/{id}/relationships/profiles (add to list)
  • Key events from Kommo: Deal Won, Deal Lost, Stage Changed — each triggers a separate flow in Klaviyo
  • Segments based on the crm_stage property update automatically with every Kommo change
  • Typical development timeline — 2 weeks

If you use Klaviyo and Kommo and want to set up automatic triggers based on pipeline events — describe which flows you need and at which events. Exceltic.dev will propose the architecture and event mapping.

More articles

All →