Koppling mellan Klaviyo och Snowflake
Advanced Klaviyo Data Platform ingår inte i Klaviyo:s standardmarknadsföringsapplikation, och en prenumeration krävs för att få tillgång till tillhörande funktionalitet. Gå till vår faktureringsguide för att lära dig mer om hur du köper detta abonnemang.
I den här artikeln använder vi termen "tabell", men vyer, materialiserade vyer och tabeller är alla giltiga Snowflake-objekt som kan importeras. Så länge Klaviyo kan köra SELECT col1 FROM table_name på objektet är du fri att använda vad du än föredrar.
Nyckelorden "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", och "OPTIONAL" i detta dokument ska tolkas enligt beskrivningen i RFC 2119.
Snowflake Administratör InställningSnowflake Administratör Inställning
I det här avsnittet beskrivs de steg som du måste följa i din Snowflake-miljö för att Klaviyo ska kunna importera dina data.
- Generera en privat nyckel genom att köra följande kommando i din lokala terminal:
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
- Generera en publik nyckel som refererar till den privata nyckeln genom att köra följande kommando i terminalen:
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
- Kopiera rsa_key.pub och klistra in den i skriptet nedan för att ersätta platshållaren ' GENERATE_PUBLIC_KEY' för user_rsa_public_key. Skriptet nedan fungerar för Mac-användare, eller så kan du öppna rsa_key.pub i en IDE och kopiera hela innehållet i filen om du föredrar det.
# Mac terminal-kommando för att skriva nyckeln till din terminal och kopiera den till urklipp cat rsa_key.pub | tee /dev/tty | pbcopy
- Kör följande skript i din Snowflake-miljö för att skapa en serviceanvändare som Klaviyo kan använda. Du måste ha behörigheterna securityadmin och sysadmin för att kunna slutföra installationen nedan. Om du vill granska vilka roller du har kör du SHOW GRANTS TO USER <your_username> och kontrollerar att du har båda rollerna listade. Kontakta en systemadministratör om du behöver få din roll justerad.
- Du får gärna uppdatera någon av de variabler som ställdes in i början av skriptet.
- Sammanfattningsvis kommer du att:
- Välj ett befintligt lager eller skapa ett nytt
- Välj en befintlig databas eller skapa en ny för de nya schemana
- Skapa två nya scheman
KLAVIYO_TMP
ochKLAVIYO_IMPORT_FROM_DWH
- Skapa en ny nätverkspolicy och tillåt lista Klaviyo IP-adresser
- Skapa en användare och en roll för Klaviyo
- Detta skript är idempotent (kan köras flera gånger), men kommer inte att skriva över befintliga objekt med motstridiga namn.
BEGIN; -- skapa variabler för användare / lösenord / roll / lager / databas. -- Ändra dessa till vad du föredrar. SET role_name = "KLAVIYO_DATA_TRANSFER_ROLE"; -- alla bokstäver måste vara versaler, t.ex. 'KLAVIYO_DATA_TRANSFER_ROLE' SET user_name = 'KLAVIYO_DATA_TRANSFER_USER'; -- alla bokstäver måste vara versaler, t.ex. 'KLAVIYO_DATA_TRANSFER_USER' SET warehouse_name = 'KLAVIYO_DATA_TRANSFER_WAREHOUSE'; -- alla bokstäver måste vara versaler, t.ex. "KLAVIYO_DATA_TRANSFER_WAREHOUSE" SET database_name = "KLAVIYO_DATABASE"; -- alla bokstäver måste vara versaler, t.ex. "KLAVIYO_DATABAS". Om databasen inte finns kommer en ny att skapas. SET network_policy = "KLAVIYO_DATA_TRANSFER_NETWORK_POLICY"; -- alla bokstäver måste vara versaler, t.ex. 'KLAVIYO_NETWORK_POLICY' SET network_rule = 'KLAVIYO_DATA_TRANSFER_NETWORK_RULE'; -- alla bokstäver måste vara versaler, t.ex. 'KLAVIYO_NETWORK_RULE' /* ersätt GENERATE_PUBLIC_KEY nedan med genererad offentlig nyckel */ -- DO NOT CHANGE SET schema_name_tmp = $database_name || '.KLAVIYO_TMP'; -- DO NOT CHANGE SET schema_name_import = $database_name || '. KLAVIYO_IMPORT_FROM_DWH'; -- ÄNDRA INTE SET full_network_rule_tmp = $schema_name_tmp || '.' || $network_rule; -- ÄNDRA INTE || $network_rule; -- DO NOT CHANGE SET full_network_rule_import = $schema_name_import || '.' || $network_rule; -- DO NOT CHANGE -- ändra roll till sysadmin för lager-/databassteg USE ROLE sysadmin; -- skapa ett lager för dataöverföringstjänsten CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER($warehouse_name) warehouse_size = xsmall warehouse_type = standard auto_suspend = 60 auto_resume = true initially_suspended = true; -- skapa databas för dataöverföringstjänsten CREATE DATABASE IF NOT EXISTS IDENTIFIER($database_name); -- skapa scheman för dataöverföringstjänsten CREATE SCHEMA IF NOT EXISTS IDENTIFIER($schema_name_tmp); CREATE SCHEMA IF NOT EXISTS IDENTIFIER($schema_name_import); -- ändra roll till securityadmin för användar-/rollsteg USE ROLE securityadmin; -- skapa nätverk regel och policy för databas 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, for 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); -- vitlista Klaviyo ip-områden, för 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); -- skapa en roll för dataöverföringstjänsten CREATE ROLE IF NOT EXISTS IDENTIFIER($role_name); GRANT ROLE IDENTIFIER($role_name) TO ROLE sysadmin; -- skapa en användare för dataöverföringstjänsten 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; -- ge servicerollen tillgång till lagret GRANT USAGE ON WAREHOUSE IDENTIFIER($warehouse_name) TO ROLE IDENTIFIER($role_name); -- grant service access to database GRANT övervaka, USAGE ON DATABASE IDENTIFIER($database_name) TO ROLE IDENTIFIER($role_name); -- Grant privileges for KLAVIYO_TMP GRANT USAGE ON SCHEMA IDENTIFIER($schema_name_tmp) TO ROLE IDENTIFIER($role_name); GRANT övervaka, 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); -- Ge privilegier för 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;Uppsättning av Snowflake-data
Uppsättning av Snowflake-data
Ovan har du skapat två nya scheman.
- KLAVIYO_TMP kommer uteslutande att användas av Klaviyo. Du FÅR INTE ändra några tabeller som skapats i detta schema. Klaviyo kommer att ta bort dessa tabeller när de inte längre behövs.
- KLAVIYO_IMPORT_FROM_DWH är där du ska webbutik dina slutliga tabeller för Klaviyo att importera. När du skapar en synk kommer alla tabeller i det här schemat att listas så att du kan välja mellan dem. Därför BÖR du bara webbutik de slutliga tabellerna du vill importera för att undvika förvirring under installationen.
Alla tabeller som du vill importera till Klaviyo måste uppfylla följande kriterier.
Krav på tidsstämpelKrav på tidsstämpel
- Tabeller MÅSTE innehålla ett tidsstämpelfält som anger när raden skapades eller uppdaterades. Ofta kommer detta att vara inserted_at eller updated_at. Du ställer in detta för varje tabell när du skapar synkroniseringen.
- Tidsstämpelfältet MÅSTE vara monotont ökande (dvs. det måste alltid bli större eller förbli detsamma, aldrig bli mindre).
- När du har skapat en synkronisering får du INTE ställa in en rads tidsstämpelvärde till en tidpunkt i det förflutna, annars kanske Klaviyo inte hämtar den raden.
- Tidszonen för det här fältet är inte viktigt för Klaviyo, så länge du följer ovanstående krav
- Klaviyo rekommenderar att du ställer in tidsstämpelfältet med CURRENT_TIMESTAMP() eller en motsvarande funktion. Flera rader kan ha samma tidsstämpel. Se exempel nedan.
INSERT INTO table_name AS SELECT ... , CURRENT_TIMESTAMP() AS inserted_at ...
- Dina tidsstämplar MÅSTE vara i UTC eller innehålla information om tidszon. Om information om tidszon saknas kommer Klaviyo att anta UTC. För anpassade egenskaper förblir dessa tidsstämplar i strängformat, så att du kan tolka dem i den tidszon du föredrar.
Tabellstruktur
- Tabeller BÖR behandlas som append-only (aka insert-only)
- Om du föredrar att uppdatera raderna på plats istället, MÅSTE du uppdatera tidsstämpelfältet så att Klaviyo kan identifiera ändringen.
- Tabeller BÖR beställas på din tidsstämpelkolumn. Snowflake hanterar klustring och partitionering baserat på din inmatningsorder. Detta kommer att bidra till att optimera Klaviyo:s importfrågor, vilket håller nere beräkningskostnaderna i Snowflake
En unik och konsekvent profil
- Du MÅSTE se till att varje profilegenskaper importeras från endast en datakälla (tabell). Klaviyo förhindrar att samma egenskap väljs från olika tabeller under skapandet av synkroniseringen, vilket förenklar detta krav.
- Du BÖR använda samma profilidentifierare (e-post, telefonnummer, externt ID etc.) i alla dina importtabeller för att minimera risken för att dubbla profiler skapas.
- Klaviyo kommer att skapa en ny profil om den profilidentifierare du anger inte matchar en befintlig profil inom Klaviyo.
- Exempel: Tabell1 (E-post, fav_color) + Tabell2 (Telefon, födelsedag)
- Detta kan skapa 2 profiler för samma person om profilen inte finns för närvarande. Om det finns en profil kommer Klaviyo att hantera profilupplösningen och uppdateringen internt.
- Ett sätt att undvika detta problem är att bara använda en enda importtabell för alla dina profiler.
Cirkulär Import-Export Loop Prevention
- Du bör noggrant hantera scenarier där både import- och exportfunktioner används för att förhindra cirkulära import-export-loopar. Se till att din exportprocess inte matar tillbaka data till en tabell som ligger uppströms från din importtabell, eftersom Klaviyo för närvarande inte upptäcker detta scenario.
- Klaviyo har ännu inte någon logik för att upptäcka detta scenario.
- Detta skulle se ut ungefär som:
- Vid varje exportsynkroniseringscykel kommer Klaviyo att exportera alla dina profil
- Sedan lägger du till alla dina exporterade profiler i din importtabell genom en serie omvandlingar.
- Vid varje importsynkroniseringscykel kommer Klaviyo att läsa alla profiler i din importtabell, som så småningom kommer att återexporteras
- Scenarier där detta förmodligen är säkert
- om du bara använder exporttabellen för att begränsa de rader som läggs till i din importtabell
- Om du kontrollerar att exporttabellen inte lägger till rader i din importtabell.
- Vilka är konsekvenserna av en cirkulär import-export-loop?
- Detta kommer att leda till onödiga beräkningskostnader för både dig och Klaviyo.