Zaawansowana platforma danych klientów Klaviyo nie jest zawarta w standardowej aplikacji marketingowej Klaviyo, a dostęp do powiązanych funkcji wymaga subskrypcji. Przejdź do naszego przewodnika po rozliczeniach, aby dowiedzieć się, jak kupić ten plan.
Na potrzeby tego artykułu używamy terminu "tabela", ale widoki, widoki zmaterializowane i tabele są prawidłowymi obiektami Snowflake, które można importować. Tak długo, jak Klaviyo może uruchomić SELECT col1 FROM nazwa_tabeli na obiekcie, możesz swobodnie używać tego, co wolisz.
Słowa kluczowe "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" i "OPTIONAL" w tym dokumencie należy interpretować zgodnie z opisem w RFC 2119.
Konfiguracja administratora płatków śniegu
W tej sekcji opisano kroki, które należy wykonać w środowisku Snowflake, aby umożliwić Klaviyo zaimportowanie danych.
- Wygeneruj klucz prywatny, uruchamiając następujące polecenie w lokalnym terminalu:
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
- Wygeneruj klucz publiczny, który odwołuje się do klucza prywatnego, uruchamiając następujące polecenie w terminalu:
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
- Skopiuj plik rsa_key.pub i wklej go do poniższego skryptu, aby zastąpić wartość zastępczą "GENERATE_PUBLIC_KEY" dla user_rsa_public_key. Poniższy skrypt będzie działał dla użytkowników komputerów Mac lub możesz otworzyć rsa_key.pub w IDE i skopiować całą zawartość pliku, jeśli wolisz.
# Polecenie terminala Mac, aby zapisać klucz w terminalu i skopiować go do schowka cat rsa_key.pub | tee /dev/tty | pbcopy
- Uruchom poniższy skrypt w środowisku Snowflake, aby utworzyć użytkownika usługi dla Klaviyo. Musisz mieć uprawnienia securityadmin i sysadmin, aby ukończyć poniższą konfigurację. Aby sprawdzić, jakie role posiadasz, uruchom SHOW GRANTS TO USER <your_username> i upewnij się, że na liście znajdują się obie role. Skontaktuj się z administratorem systemu, jeśli chcesz dostosować swoją rolę.
- Możesz swobodnie aktualizować dowolne zmienne ustawione na początku skryptu.
- Podsumowując, będziesz:
- Wybierz istniejący magazyn lub utwórz nowy
- Wybierz istniejącą bazę danych lub utwórz nową, aby przechowywać nowe schematy.
- Utwórz dwa nowe schematy
KLAVIYO_TMPiKLAVIYO_IMPORT_FROM_DWH. - Utwórz nową politykę sieciową i zezwól na listę Klaviyo adresów IP.
- Utwórz użytkownika i rolę dla Klaviyo
- Ten skrypt jest idempotentny (może być bezpiecznie uruchamiany wiele razy), ale nie nadpisze istniejących obiektów o sprzecznych nazwach.
BEGIN; -- utwórz zmienne dla użytkownika / hasła / roli / magazynu / bazy danych. -- Zmień je na dowolne inne. SET role_name = 'KLAVIYO_DATA_TRANSFER_ROLE'; -- wszystkie litery muszą być wielkie, np. 'KLAVIYO_DATA_TRANSFER_ROLE' SET user_name = 'KLAVIYO_DATA_TRANSFER_USER'; -- wszystkie litery muszą być wielkie, np. 'KLAVIYO_DATA_TRANSFER_USER' SET warehouse_name = 'KLAVIYO_DATA_TRANSFER_WAREHOUSE'; -- wszystkie litery muszą być wielkie, np. 'KLAVIYO_DATA_TRANSFER_WAREHOUSE' SET database_name = 'KLAVIYO_DATABASE'; -- wszystkie litery muszą być wielkie, np. 'KLAVIYO_DATABASE'. Jeśli ta baza danych nie istnieje, zostanie utworzona nowa. SET network_policy = 'KLAVIYO_DATA_TRANSFER_NETWORK_POLICY'; -- wszystkie litery muszą być wielkie, np. 'KLAVIYO_NETWORK_POLICY' SET network_rule = 'KLAVIYO_DATA_TRANSFER_NETWORK_RULE'; -- wszystkie litery muszą być wielkie, np. 'KLAVIYO_NETWORK_RULE' /* replace GENERATE_PUBLIC_KEY below with generated public key */ -- DO NOT CHANGE SET schema_name_tmp = $database_name || '.KLAVIYO_TMP'; -- DO NOT CHANGE SET schema_name_import = $database_name || '. KLAVIYO_IMPORT_FROM_DWH'; -- NIE ZMIENIAJ SET full_network_rule_tmp = $schema_name_tmp || '.' || $network_rule; -- NIE ZMIENIAJ SET full_network_rule_import = $schema_name_import || '.' || $network_rule; -- NIE ZMIENIAJ -- zmień rolę na sysadmin dla kroków magazynu / bazy danych USE ROLE sysadmin; -- utwórz magazyn dla usługi transferu danych CREATE WAREHOUSE IF NOT EXISTS IDENTIFIER($warehouse_name) warehouse_size = xsmall warehouse_type = standard auto_suspend = 60 auto_resume = true initially_suspended = true; -- utwórz bazę danych dla usługi transferu danych CREATE DATABASE IF NOT EXISTS IDENTIFIER($database_name); -- utwórz schematy dla usługi transferu danych CREATE SCHEMA IF NOT EXISTS IDENTIFIER($schema_name_tmp); CREATE SCHEMA IF NOT EXISTS IDENTIFIER($schema_name_import); -- change role to securityadmin for user / role steps USE ROLE securityadmin; -- create network reguła i polityka dla bazy danych 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); -- whitelist Klaviyo ip ranges, for 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); -- utwórz rolę dla usługi transferu danych CREATE ROLE IF NOT EXISTS IDENTIFIER($role_name); GRANT ROLE IDENTIFIER($role_name) TO ROLE sysadmin; -- utwórz użytkownika dla usługi transferu danych 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; -- grant service role access to warehouse GRANT USAGE ON WAREHOUSE IDENTIFIER($warehouse_name) TO ROLE IDENTIFIER($role_name); -- Przyznaj dostęp serwisowy do bazy danych GRANT monitorować, USAGE ON DATABASE IDENTIFIER($database_name) TO ROLE IDENTIFIER($role_name); -- Przyznaj uprawnienia dla KLAVIYO_TMP GRANT USAGE ON SCHEMA IDENTIFIER($schema_name_tmp) TO ROLE IDENTIFIER($role_name); GRANT monitorować, 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); -- Grant privileges for 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;
Konfiguracja danych płatka śniegu
Powyżej utworzyłeś dwa nowe schematy.
- KLAVIYO_TMP będzie używany wyłącznie przez Klaviyo. NIE MOŻESZ modyfikować żadnych tabel utworzonych w tym schemacie. Klaviyo usunie te tabele, gdy nie będą już potrzebne.
- KLAVIYO_IMPORT_FROM_DWH to miejsce, w którym powinieneś sklep internetowy swoje tabele końcowe dla Klaviyo zaimportować. Gdy przejdziesz przez proces tworzenia synchronizacji, wszystkie tabele w tym schemacie zostaną wyświetlone do wyboru. W związku z tym POWINIENEŚ importować tylko tabele końcowe, które chcesz zaimportować, aby uniknąć nieporozumień podczas konfiguracji.
plan Wszystkie tabele, które chcesz zaimportować do Klaviyo muszą spełniać następujące kryteria.
Wymagania dotyczące znacznika czasu
- Tabele MUSZĄ zawierać pole znacznika czasu, które wskazuje, kiedy wiersz został utworzony lub zaktualizowany. Często będzie to inserted_at lub updated_at. Ustawisz to dla każdej tabeli podczas procesu tworzenia synchronizacji.
- Pole znacznika czasu MUSI być monotonicznie rosnące (tj. musi zawsze rosnąć lub pozostawać takie samo, nigdy nie może maleć).
- Po utworzeniu synchronizacji NIE MOŻESZ ustawiać wartości znacznika czasu wiersza na czas w przeszłości, w przeciwnym razie Klaviyo może nie odebrać tego wiersza.
- Strefa czasowa tego konkretnego pola nie jest ważna dla Klaviyo, o ile spełniasz powyższe wymagania
- Klaviyo ZALECA ustawienie pola znacznika czasu za pomocą funkcji CURRENT_TIMESTAMP() lub jej odpowiednika. Wiele wierszy może mieć ten sam znacznik czasu. Zobacz przykład poniżej.
INSERT INTO table_name AS SELECT ... , CURRENT_TIMESTAMP() AS inserted_at ....
- Twoje znaczniki czasu MUSZĄ być w UTC lub zawierać informacje o strefie czasowej. Jeśli brakuje informacji o strefie czasowej, Klaviyo przyjmie UTC. W przypadku właściwości niestandardowych znaczniki czasu pozostają w formacie ciągu znaków, co pozwala na ich interpretację w preferowanej strefie czasowej.
Struktura tabeli
- Tabele POWINNY być traktowane jako tylko dołączane (aka tylko wstawiane).
- Jeśli zamiast tego wolisz zaktualizować wiersze w miejscu, MUSISZ zaktualizować pole znacznika czasu, aby Klaviyo mógł zidentyfikować zmianę.
- Tabele POWINNY być uporządkowane według kolumny znacznika czasu. Snowflake zajmie się klastrowaniem i partycjonowaniem w oparciu o twoją kolejność wstawiania. Pomoże to zoptymalizować zapytania importowe Klaviyo, utrzymując koszty obliczeniowe w Snowflake na niskim poziomie
Unikalność i spójność profilu
- MUSISZ upewnić się, że każdy profil właściwości jest importowany tylko z jednego źródła danych (tabeli). Klaviyo zapobiega wybieraniu tej samej właściwości z różnych tabel podczas tworzenia synchronizacji, upraszczając ten wymóg.
- POWINIENEŚ używać tego samego identyfikatora profilu (e-mail, numer telefonu, identyfikator zewnętrzny itp.) we wszystkich tabelach importu, aby zminimalizować ryzyko utworzenia duplikatów profilu.
- Klaviyo utworzy nowy profil, jeśli podany identyfikator profilu nie pasuje do istniejącego profilu w Klaviyo.
- Przykład: Table1 (Email, fav_color) + Table2 (Phone, birthday)
- Może to spowodować utworzenie 2 profili dla tej samej osoby, jeśli profil ten obecnie nie istnieje. Jeśli profil istnieje, Klaviyo będzie wewnętrznie obsługiwać rozwiązywanie i aktualizację profilu.
- Jednym ze sposobów uniknięcia tego problemu jest użycie tylko jednej tabeli importu dla wszystkich twoich profili.
Zapobieganie pętli import-eksport w obiegu zamkniętym
- POWINIENEŚ ostrożnie zarządzać scenariuszami, w których używane są zarówno funkcje importu, jak i eksportu, aby zapobiec pętlom importu i eksportu. Upewnij się, że proces eksportu nie przekazuje danych z powrotem do tabeli, która znajduje się przed tabelą importu, ponieważ Klaviyo nie wykrywa obecnie takiego scenariusza.
- Klaviyo nie ma jeszcze logiki do wykrywania tego scenariusza.
- Wyglądałoby to mniej więcej tak:
- Podczas każdego cyklu synchronizacji eksportu, Klaviyo wyeksportuje wszystkie twoje profile.
- Następnie dodajesz wszystkie wyeksportowane profile do tabeli importu poprzez serię przekształceń.
- W każdym cyklu synchronizacji importu, Klaviyo odczyta wszystkie profile w twojej tabeli importu, które ostatecznie zostaną ponownie wyeksportowane
- Scenariusze, w których jest to prawdopodobnie bezpieczne
- jeśli używasz tabeli eksportu tylko do ograniczenia wierszy dodawanych do tabeli importu
- Jeśli sprawdzisz, że tabela eksportu nie dodaje wierszy do tabeli importu.
- Jakie są konsekwencje pętli import-eksport?
- Spowoduje to niepotrzebne koszty obliczeniowe zarówno dla Ciebie, jak i Klaviyo.