Klaviyo en Snowflake verbinden
Advanced Klaviyo Data Platform is niet inbegrepen in Klaviyo's standaard marketingapplicatie en er is een abonnement nodig om toegang te krijgen tot de bijbehorende functionaliteit. Ga naar onze factureringsgids voor meer informatie over hoe je dit abonnement kunt kopen.
In dit artikel gebruiken we de term "tabel", maar views, gematerialiseerde views en tabellen zijn allemaal geldige Snowflake objecten die geïmporteerd kunnen worden. Zolang Klaviyo SELECT col1 FROM table_name kan uitvoeren op het object, bent u vrij om te gebruiken wat u verkiest.
De sleutelwoorden "MOETEN", "MOETEN NIET", "VERPLICHT", "DIENT", "DIENT NIET", "DIENT", "DIENT NIET", "AANBEVOLEN", "KAN", en "OPTIONEEL" in dit document moeten worden geïnterpreteerd zoals beschreven in RFC 2119.
Sneeuwvlok Beheerder OpstellingSneeuwvlok Beheerder Opstelling
In dit gedeelte worden de stappen beschreven die u moet volgen in uw Snowflake omgeving om Klaviyo uw gegevens te laten importeren.
- Genereer een privésleutel door het volgende commando in je lokale terminal uit te voeren:
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
- Genereer een openbare sleutel die verwijst naar de privésleutel door het volgende commando in je terminal uit te voeren:
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
- Kopieer de rsa_key.pub en plak het in het onderstaande script om de placeholder 'GENERATE_PUBLIC_KEY' waarde voor user_rsa_public_key te vervangen. Het onderstaande script werkt voor Mac-gebruikers, of je kunt rsa_key.pub openen in een IDE en de volledige inhoud van het bestand kopiëren als je dat liever doet.
# Mac terminal commando om de sleutel naar je terminal te schrijven en naar het klembord te kopiëren cat rsa_key.pub | tee /dev/tty | pbcopy
- Voer het volgende script uit in je Snowflake omgeving om een servicegebruiker aan te maken die Klaviyo kan gebruiken. Je moet securityadmin en sysadmin privileges hebben om de onderstaande instellingen te kunnen voltooien. Om te zien welke rol(len) je hebt, voer je SHOW GRANTS TO USER <your_username> uit en controleer je of je beide rollen hebt. bereiken met een systeembeheerder als je je rol moet laten aanpassen.
- Je moet je vrij voelen om update te gebruiken voor de variabelen die aan het begin van het script zijn ingesteld.
- Samengevat zul je:
- Kies een bestaand magazijn of maak een nieuw
- Kies een bestaande database of maak een nieuwe aan voor de nieuwe schema's
- Maak twee nieuwe schema's aan
KLAVIYO_TMP
enKLAVIYO_IMPORT_FROM_DWH
- Maak een nieuw netwerkbeleid en sta de lijst met Klaviyo IP's toe
- Maak een gebruiker en rol aan voor Klaviyo
- Dit script is idempotent (kan veilig meerdere keren worden uitgevoerd), maar zal bestaande objecten met conflicterende namen niet overschrijven.
BEGIN; -- maak variabelen aan voor gebruiker / wachtwoord / rol / magazijn / database. -- Verander deze in wat jij wilt. SET role_name = 'KLAVIYO_DATA_TRANSFER_ROLE'; -- alle letters moeten hoofdletters zijn, bijv. 'KLAVIYO_DATA_TRANSFER_ROLE' SET user_name = 'KLAVIYO_DATA_TRANSFER_USER'; -- alle letters moeten hoofdletters zijn, bijv. 'KLAVIYO_DATA_TRANSFER_USER' SET warehouse_name = 'KLAVIYO_DATA_TRANSFER_WAREHOUSE'; -- alle letters moeten hoofdletters zijn, bijv. 'KLAVIYO_DATA_TRANSFER_WAREHOUSE' SET database_name = 'KLAVIYO_DATABASE'; -- alle letters moeten hoofdletters zijn, bijv. "KLAVIYO_DATABASE". Als deze database niet bestaat, wordt er een nieuwe aangemaakt. SET network_policy = 'KLAVIYO_DATA_TRANSFER_NETWORK_POLICY'; -- alle letters moeten hoofdletters zijn, bijv. 'KLAVIYO_NETWORK_POLICY' SET network_rule = 'KLAVIYO_DATA_TRANSFER_NETWORK_RULE'; -- alle letters moeten hoofdletters zijn, bijv. 'KLAVIYO_NETWORK_RULE' /* vervang GENERATE_PUBLIC_KEY hieronder door gegenereerde publieke sleutel */ -- DO NOT CHANGE SET schema_name_tmp = $database_name || '.KLAVIYO_TMP'; -- DO NOT CHANGE SET schema_name_import = $database_name || '. KLAVIYO_IMPORT_FROM_DWH'; -- NIET WIJZIGEN SET full_network_rule_tmp = $schema_name_tmp || '.' || $network_rule; -- DO NOT CHANGE SET full_network_rule_import = $schema_name_import || '.' || $network_rule; -- NIET WIJZIGEN -- verander de rol in sysadmin voor de stappen in het pakhuis / de database USE ROLE sysadmin; -- maak een pakhuis aan voor de gegevensoverdracht CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER($warehouse_name) warehouse_size = xsmall warehouse_type = standard auto_suspend = 60 auto_resume = true initially_suspended = true; -- creëer database voor data transfer service CREATE DATABASE IF NOT EXISTS IDENTIFIER($database_name); -- creëer schema's voor data transfer service CREATE SCHEMA IF NOT EXISTS IDENTIFIER($schema_name_tmp); CREATE SCHEMA IF NOT EXISTS IDENTIFIER($schema_name_import); -- verander rol in securityadmin voor gebruiker / rol stappen USE ROLE securityadmin; -- maak netwerk aan regel en beleid voor database GRANT USAGE ON DATABASE IDENTIFIER($database_name) TO ROLE securityadmin; GRANT USAGE, CREATE NETWORK RULE ON SCHEMA IDENTIFIER($schema_name_tmp) TO ROLE securityadmin; GRANT USAGE, CREATE NETWORK RULE ON SCHEMA IDENTIFIER($schema_name_import) TO ROLE securityadmin; -- whitelist Klaviyo ip ranges, voor KLAVIYO_TMP schema CREATE NETWORK RULE IF NOT EXISTS IDENTIFIER($full_network_rule_tmp) type = IPV4 value_list = ( '184.72.183.187/32', '52.206.71.52/32', '3.227.146.32/32', '44.198.39.11/32', '35.172.58.121/32', '3.228.37.244/32', '54.88.219.8/32', '3.214.211.176/32' ) comment = 'Klaviyo IP Ranges as of April 2025'; CREATE NETWORK POLICY IF NOT EXISTS IDENTIFIER($network_policy) allowed_network_rule_list = ($full_network_rule_tmp); -- whitelist Klaviyo ip ranges, voor KLAVIYO_IMPORT_FROM_DWH schema CREATE NETWORK RULE IF NOT EXISTS IDENTIFIER($full_network_rule_import) type = IPV4 value_list = ( '184.72.183.187/32', '52.206.71.52/32', '3.227.146.32/32', '44.198.39.11/32', '35.172.58.121/32', '3.228.37.244/32', '54.88.219.8/32', '3.214.211.176/32' ) comment = 'Klaviyo IP Ranges as of April 2025'; CREATE NETWORK POLICY IF NOT EXISTS IDENTIFIER($network_policy) allowed_network_rule_list = ($full_network_rule_import); -- maak rol aan voor gegevensoverdrachtservice CREATE ROLE IF NOT EXISTS IDENTIFIER($role_name); GRANT ROLE IDENTIFIER($role_name) TO ROLE sysadmin; -- maak een gebruiker aan voor de gegevensoverdrachtservice CREATE USER IF NOT EXISTS IDENTIFIER($user_name) type = SERVICE network_policy = $network_policy default_role = $role_name default_warehouse = $warehouse_name rsa_public_key = 'GENERATE_PUBLIC_KEY'; GRANT ROLE IDENTIFIER($role_name) TO USER IDENTIFIER($user_name); ALTER USER IDENTIFIER($user_name) SET NETWORK_POLICY = $network_policy; -- geef service rol toegang tot magazijn GRANT USAGE ON WAREHOUSE IDENTIFIER($warehouse_name) TO ROLE IDENTIFIER($role_name); -- service toegang verlenen tot database GRANT in de gaten houden, USAGE ON DATABASE IDENTIFIER($database_name) TO ROLE IDENTIFIER($role_name); -- Verleen privileges voor KLAVIYO_TMP GRANT USAGE ON SCHEMA IDENTIFIER($schema_name_tmp) TO ROLE IDENTIFIER($role_name); GRANT in de gaten houden, USAGE, CREATE TABLE, CREATE VIEW, CREATE SEQUENCE, CREATE FUNCTION, CREATE PROCEDURE ON SCHEMA IDENTIFIER($schema_name_tmp) TO ROLE IDENTIFIER($role_name); GRANT ALL ON FUTURE TABLES IN SCHEMA IDENTIFIER($schema_name_tmp) TO ROLE IDENTIFIER($role_name); -- Verleen privileges voor KLAVIYO_IMPORT_FROM_DWH GRANT USAGE ON SCHEMA IDENTIFIER($schema_name_import) TO ROLE IDENTIFIER($role_name); GRANT SELECT ON FUTURE TABLES IN SCHEMA IDENTIFIER($schema_name_import) TO ROLE IDENTIFIER($role_name); COMMIT;Snowflake gegevens instellen
Snowflake gegevens instellen
Hierboven heb je twee nieuwe schema's gemaakt.
- KLAVIYO_TMP wordt uitsluitend gebruikt door Klaviyo. Je MOET tabellen die in dit schema zijn aangemaakt NIET wijzigen. Klaviyo zal deze tabellen verwijderen wanneer ze niet langer nodig zijn.
- KLAVIYO_IMPORT_FROM_DWH is waar je je definitieve tabellen voor Klaviyo moet importeren. Wanneer je de synchronisatie aanmaakt, worden alle tabellen in dit schema opgesomd waaruit je kunt kiezen. Daarom ZOU je alleen de uiteindelijke tabellen die je wilt importeren moeten webshoppen om verwarring tijdens het instellen te voorkomen.
Alle tabellen die je wilt importeren naar Klaviyo moeten aan de volgende criteria voldoen.
Vereisten voor tijdstempelsVereisten voor tijdstempels
- Tabellen MOETEN een tijdstempelveld bevatten dat aangeeft wanneer de rij is aangemaakt of bijgewerkt. Vaak zal dit inserted_at of updated_at zijn. Je stelt dit in voor elke tabel tijdens het aanmaken van de synchronisatie.
- Het tijdstempelveld MOET monotoon toenemen (d.w.z. het moet altijd groter worden of hetzelfde blijven, nooit kleiner worden).
- Na het aanmaken van een synchronisatie MOET u de tijdstempelwaarde van een rij NIET instellen op een tijdstip in het verleden, anders haalt Klaviyo die rij mogelijk niet op.
- De tijdzone van dit specifieke veld is niet belangrijk voor Klaviyo, zolang je de bovenstaande vereisten volgt
- Klaviyo raadt aan om het tijdstempelveld in te stellen met CURRENT_TIMESTAMP() of een gelijkwaardige functie. Meerdere rijen kunnen dezelfde tijdstempel hebben. Zie het voorbeeld hieronder.
INSERT INTO table_name AS SELECT ... , CURRENT_TIMESTAMP() AS inserted_at ...
- Je tijdstempels MOETEN in UTC zijn, of informatie over tijdzones bevatten. Als informatie over de tijdzone ontbreekt, zal Klaviyo uitgaan van UTC. Voor aangepaste eigenschappen blijven deze tijdstempels in stringformaat, zodat je ze kunt interpreteren in de tijdzone van je voorkeur.
Tabel Structuur
- Tabellen ZOUDEN behandeld moeten worden als append-only (aka insert-only)
- Als je er de voorkeur aan geeft om de rijen ter plekke te update, MOET je het tijdstempelveld update zodat Klaviyo de wijziging kan identificeren.
- Tabellen ZOUDEN gerangschikt moeten worden op je tijdstempelkolom. Snowflake zorgt voor clustering en partitionering op basis van je invoegvolgorde. Dit helpt de importquery's van Klaviyo te optimaliseren, waardoor de computerkosten in Snowflake laag blijven.
Uniek en consistent profiel
- Je MOET ervoor zorgen dat elke profieleigenschappen uit slechts één gegevensbron (tabel) wordt geïmporteerd. Klaviyo voorkomt dat dezelfde eigenschap uit verschillende tabellen wordt geselecteerd tijdens het aanmaken van de synchronisatie, wat deze vereiste vereenvoudigt.
- Je ZOU dezelfde profielidentificatie(s) (e-mail, telefoonnummer, externe ID, etc.) in al je importtabellen moeten gebruiken om het risico op dubbele aanmaak van profielen te minimaliseren.
- Klaviyo maakt een nieuw profiel aan als de profielidentificatie die je opgeeft niet overeenkomt met een bestaand profiel binnen Klaviyo.
- Voorbeeld: Tabel1 (E-mail, fav_kleur) + Tabel2 (Telefoon, verjaardag)
- Dit kan 2 profielen aanmaken voor dezelfde persoon als het profiel op dit moment nog niet bestaat. Als er een profiel bestaat, zal Klaviyo de profielresolutie en update intern afhandelen.
- Een manier om dit probleem te vermijden is om slechts één invoertabel te gebruiken voor al je profielen.
Preventie van circulaire import-exportlussen
- Je MOET zorgvuldig omgaan met scenario's waarin zowel import- als exportfuncties worden gebruikt om cirkelvormige import-export lussen te voorkomen. Zorg ervoor dat uw exportproces geen gegevens terugvoert naar een tabel die stroomopwaarts staat van uw importtabel, omdat Klaviyo dit scenario momenteel niet detecteert.
- Klaviyo heeft nog geen logica om dit scenario te detecteren.
- Dit zou er ongeveer zo uitzien:
- Bij elke exportsynchronisatie exporteert Klaviyo al je profielen.
- Vervolgens voeg je al je geëxporteerde profiel toe aan je importtabel via een aantal transformaties.
- Bij elke importsynccyclus leest Klaviyo alle profielen in je importeertabel, die uiteindelijk opnieuw worden geëxporteerd.
- Scenario's waarbij dit waarschijnlijk veilig is
- als je de exporttabel alleen gebruikt om de rijen die worden toegevoegd aan je importtabel te beperken
- Als je controleert of de exporttabel geen rijen toevoegt aan je importtabel.
- Wat zijn de gevolgen van een circulaire import-exportlus?
- Dit zal resulteren in onnodige computerkosten voor zowel u als Klaviyo.