Implementacja

Schemat POST

Żądanie POST wysłane do webhooka będzie miało format JSON o tym schemacie:

Ładunek proto webhooka

// Represent user lead data for single column
message UserLeadColumnData {
  // Human-readable text of the field type (e.g.: Full Name,  What is your
  // preferred dealership?). This field might not always be populated.
  optional string column_name = 1;

  // Column value based on column type
  oneof column_value {
    string string_value = 2;
  }
  // Column ID. Populated for all types of fields. (e.g.: FULL_NAME)
  optional string column_id = 3;
}

// Message to construct webhook JSON payload
message WebhookLead {
  // Unique ID to represent lead
  optional string lead_id = 1;
  // User inputted data per column
  repeated UserLeadColumnData user_column_data = 2;
  // API version
  optional string api_version = 3;
  // Form ID to which lead belonged to.
  optional int64 form_id = 4;
  // Campaign ID that the lead form is associated with
  optional int64 campaign_id = 5;
  // Key to be used by advertiser to verify the request
  // is from Google.
  optional string google_key = 6;
  // Denotes if the lead is a test lead.
  optional bool is_test = 7;
  // Click ID for the lead submission.
  optional string gcl_id = 8;
  // Adgroup ID which generated the lead.
  optional int64 adgroup_id = 9;
  // Creative ID which generated the lead.
  optional int64 creative_id = 10;
  // Asset group ID represents the container for holding assets, associated
  // URLs, hints and criteria that will be used to select assets and for
  // optimization. This field is only populated for Performance Max campaigns.
  int64 asset_group_id = 11;
  // Lead stage at the time of delivery.
  string lead_stage = 12 [(datapol.semantic_type) = ST_NOT_REQUIRED];
  // Lead submit time in ISO-8601 format. Ex- 2024-09-26T12:30:00Z
  string lead_submit_time = 13 [(datapol.semantic_type) = ST_NOT_REQUIRED];
}

Opis pola

Pole Opis
lead_id Unikalny ciąg znaków, który identyfikuje potencjalnego klienta.

Rekomendacja dotycząca postępowania: użyj tej opcji, aby usunąć duplikaty otrzymanych potencjalnych klientów. Będzie on unikalny we wszystkich formularzach. Podczas zgłaszania problemów związanych z konkretnym potencjalnym klientem ten identyfikator będzie wymagany.

api_version Wersja interfejsu API, do której należy ten schemat potencjalnego klienta. Będzie on używany podczas migracji do nowego schematu, więc na razie możesz go zignorować.
form_id Unikalny identyfikator każdego formularza skonfigurowanego w Google Ads. Obecna usługa umożliwia dołączanie formularza na poziomie kampanii (a nie na poziomie grupy reklam lub reklamy).

Implikacje: potencjalnych klientów można dzielić tylko na poziomie form_id (czyli na poziomie kampanii).

Klienci muszą używać 8-bajtowej liczby całkowitej do przetwarzania.

campaign_id Identyfikator kampanii Google Ads lub identyfikator elementu zamówienia (Display & Video 360) dołączonego formularza kontaktowego.

Klienci muszą używać 8-bajtowej liczby całkowitej do przetwarzania.

adgroup_id Identyfikator grupy reklam Google Ads służy do rozróżniania poszczególnych grup reklam w kampanii. (Dostępne tylko w przypadku potencjalnych klientów z reklam wideo i reklam Discovery)

Klienci muszą używać 8-bajtowej liczby całkowitej do przetwarzania.

creative_id Identyfikator kreacji Google Ads służy do odróżniania konkretnej kreacji w grupie reklam. (Dostępne tylko w przypadku potencjalnych klientów z reklam wideo i reklam Discovery)

Klienci muszą używać 8-bajtowej liczby całkowitej do przetwarzania.

gcl_id Identyfikator kliknięcia w Google, unikalny parametr używany do śledzenia każdego kliknięcia reklamy.
google_key Klucz skonfigurowany przez reklamodawcę w każdym formularzu.

Zalecenie: przed przetworzeniem potencjalnego klienta otrzymanego za pomocą webhooka sprawdź, czy wartość google_key jest taka sama jak wartość skonfigurowana w Google Ads. Zwiększy to pewność, że potencjalny klient jest prawidłowy. Zachowaj ten klucz w tajemnicy i zaktualizuj go w Google Ads, jeśli masz powody, aby sądzić, że został on ujawniony.

is_test To pole ma semantykę „opcjonalne”. Jeśli wartość to „true”, traktuj tego potencjalnego klienta jako testowego. Jeśli wartość to „false” lub pole nie występuje, traktuj potencjalnego klienta jako potencjalnego klienta produkcyjnego.
user_column_data Powtarzająca się krotka klucz-wartość przesyłająca dane przesłane przez użytkownika.
  • user_column_data.column_id: typ danych przesłanych przez użytkownika.
  • User_column_data.column_value: W przypadku każdego typu danych wartość będzie wypełniana w zależności od typu danych. Wszystkie nasze obecne typy danych mają wartość user_column_data.string_value.
  • user_column_data.column_name: tekst w języku naturalnym opisujący typ danych przesłanych przez użytkownika. To pole nie zawsze jest wypełnione. Zamiast niego używaj pola column_id .
user_column_data.column_id Zawartość User_column_data.string_value user_column_data.column_name (wycofana)
"FULL_NAME" Imię i nazwisko użytkownika. „Imię i nazwisko”
„FIRST_NAME” Imię użytkownika. „Imię”
„LAST_NAME” Nazwisko użytkownika. „Nazwisko”
"EMAIL" Adres e-mail użytkownika. „Adres e-mail użytkownika”
"PHONE_NUMBER" Numer telefonu użytkownika w formacie E.164, np. "+11234567890". „Telefon użytkownika”
"PHONE_NUMBER_VERIFIED" Informacja, czy numer telefonu użytkownika został zweryfikowany. „Numer telefonu został zweryfikowany”
„POSTAL_CODE” Kod pocztowy użytkownika. „Kod pocztowy”
„COMPANY_NAME” Nazwa firmy użytkownika. „Nazwa firmy”
„JOB_TITLE” Stanowisko użytkownika. „Stanowisko”
"WORK_EMAIL" Służbowy adres e-mail użytkownika. „Służbowy adres e-mail”
"WORK_PHONE" Służbowy numer telefonu użytkownika. „Telefon służbowy”
"STREET_ADDRESS" Ulica i numer domu użytkownika. „Adres”
„CITY” Miasto użytkownika. „Miasto”
„REGION” Region użytkownika. „Region”
"COUNTRY" Kraj użytkownika. „Kraj”
„VEHICLE_MODEL” Który model Cię interesuje? Nie dotyczy
„VEHICLE_TYPE” Jaki typ pojazdu Cię interesuje? Nie dotyczy
"PREFERRED_DEALERSHIP" Wybierz preferowany salon sprzedaży Nie dotyczy
"VEHICLE_PURCHASE_TIMELINE" Kiedy zamierzasz kupić pojazd? Nie dotyczy
„VEHICLE_CONDITION” Jaki stan pojazdu Cię interesuje? Nie dotyczy
„VEHICLE_OWNERSHIP” Czy masz pojazd? „N/A”
„VEHICLE_PAYMENT_TYPE” Jaka forma własności pojazdu Cię interesuje? Nie dotyczy
„COMPANY_SIZE” Jak duża jest Twoja firma? Nie dotyczy
„ANNUAL_SALES” Jaka jest Twoja roczna wielkość sprzedaży? Nie dotyczy
„YEARS_IN_BUSINESS” Od ilu lat działa Twoja firma? Nie dotyczy
„JOB_DEPARTMENT” W jakim dziale pracujesz? Nie dotyczy
"JOB_ROLE" Jakie zajmujesz stanowisko? Nie dotyczy
"EDUCATION_PROGRAM" Jaki program Cię interesuje? Nie dotyczy
„EDUCATION_COURSE” Jaki kurs Cię interesuje? Nie dotyczy
„PRODUCT” Jaki produkt Cię interesuje? Nie dotyczy
"SERVICE" Jaka usługa Cię interesuje? Nie dotyczy
„OFFER” Jaka oferta Cię interesuje? Nie dotyczy
„CATEGORY” Jaka kategoria Cię interesuje? Nie dotyczy
"PREFERRED_CONTACT_METHOD" Wybierz preferowaną metodę kontaktu Nie dotyczy
„PREFERRED_LOCATION” Wybierz preferowaną lokalizację Nie dotyczy
"PREFERRED_CONTACT_TIME" W jakich godzinach najlepiej się z Tobą kontaktować? Nie dotyczy
„PURCHASE_TIMELINE” Kiedy chcesz dokonać zakupu? Nie dotyczy
"YEARS_OF_EXPERIENCE" Ile masz lat doświadczenia w pracy? Nie dotyczy
„JOB_INDUSTRY” W jakiej branży pracujesz? Nie dotyczy
„LEVEL_OF_EDUCATION” Jakie masz wykształcenie? Nie dotyczy
„PROPERTY_TYPE” Jakiego typu nieruchomości szukasz? Nie dotyczy
"REALTOR_HELP_GOAL" Dlaczego potrzebujesz usług agencji nieruchomości? Nie dotyczy
"PROPERTY_COMMUNITY" Jaka społeczność Cię interesuje? Nie dotyczy
„PRICE_RANGE” Jaki przedział cenowy Cię interesuje? Nie dotyczy
„NUMBER_OF_BEDROOMS” Ile sypialni ma mieć dom lub mieszkanie? Nie dotyczy
"FURNISHED_PROPERTY" Czy szukasz w pełni umeblowanej nieruchomości? Nie dotyczy
"PETS_ALLOWED_PROPERTY" Czy szukasz domu lub mieszkania, w którym wolno trzymać zwierzęta? Nie dotyczy
"NEXT_PLANNED_PURCHASE" Jaki produkt zamierzasz kupić w następnej kolejności? Nie dotyczy
"EVENT_SIGNUP_INTEREST" Czy chcesz zarejestrować się na wydarzenie? Nie dotyczy
"PREFERRED_SHOPPING_PLACES" Gdzie chcesz robić zakupy? Nie dotyczy
„FAVORITE_BRAND” Jaka jest Twoja ulubiona marka? Nie dotyczy
"TRANSPORTATION_COMMERCIAL_LICENSE_TYPE" Jakim typem licencji komercyjnej dysponujesz? Nie dotyczy
"EVENT_BOOKING_INTEREST" Czy chcesz zarezerwować miejsce na wydarzenie? Nie dotyczy
„DESTINATION_COUNTRY” Do jakiego kraju chcesz jechać? Nie dotyczy
„DESTINATION_CITY” Do jakiego miasta chcesz jechać? Nie dotyczy
"DEPARTURE_COUNTRY" Z jakiego kraju wyruszasz? Nie dotyczy
„DEPARTURE_CITY” Z jakiego miasta wyruszasz? Nie dotyczy
"DEPARTURE_DATE" Podaj datę wyjazdu. Nie dotyczy
"RETURN_DATE" Którego dnia wracasz? Nie dotyczy
„NUMBER_OF_TRAVELERS” Z iloma osobami podróżujesz? Nie dotyczy
"TRAVEL_BUDGET" Jaki jest Twój budżet na podróż? Nie dotyczy
"TRAVEL_ACCOMMODATION" Gdzie chcesz się zatrzymać w czasie podróży? Nie dotyczy
asset_group_id To pole jest wypełniane tylko w przypadku kampanii Performance Max. Oznacza identyfikator kontenera, który zawiera formularz kontaktowy.

Klienci muszą używać 8-bajtowej liczby całkowitej do przetwarzania.

lead_stage Oznacza to etap potencjalnego klienta w momencie przekazania informacji o nim. To pole jest przydatne do śledzenia etapu ścieżki lub stanu konwersji potencjalnego klienta.
lead_submit_time Jest to sygnatura czasowa przesłania formularza przez użytkownika. Jest ona podana w formacie ISO 8601. Ex- 2024-09-26T12:30:00Z

Nierozpoznane pola i zgodność z przyszłymi wersjami

Aby zapewnić niezawodność integracji webhooka i umożliwić jej dostosowywanie się do przyszłych ulepszeń, warto zaprojektować parser JSON tak, aby ignorował pola w ładunku webhooka, które nie są używane ani rozpoznawane przez Twój system.

Kluczowa rekomendacja: skonfiguruj logikę analizowania JSON tak, aby przetwarzała tylko pola, których potrzebujesz w aplikacji. Nie pisz kodu, który oczekuje stałego zestawu pól lub który nie działa, gdy w ładunku znajdują się nowe, nieoczekiwane pola.

Dlaczego to jest ważne:

  • Zgodność z przyszłymi wersjami: w przyszłych aktualizacjach Google może dodawać do ładunku webhooka nowe, opcjonalne pola, aby udostępniać bardziej szczegółowe dane lub nowe funkcje. Jeśli Twój parser jest zbyt rygorystyczny (np. nie działa w przypadku nieznanych właściwości), integracja może przestać działać, gdy Google wprowadzi takie zmiany, które nie powodują przerw w działaniu.
  • Uproszczona obsługa: skupiając się tylko na punktach danych, których aktywnie używasz, kod integracji pozostaje prostszy i łatwiejszy w obsłudze.

Większość nowoczesnych bibliotek do analizowania JSON oferuje opcje ignorowania nieznanych właściwości domyślnie lub można je skonfigurować tak, aby to robiły.

Obsługa potencjalnych klientów

Podmioty obsługujące potencjalnych klientów powinny odpowiadać za pomocą tych kodów HTTP:

Odpowiedź HTTP Treść odpowiedzi (JSON) Czy błąd można ponowić?
200 {} Nie dotyczy
4XX {"message: Free form error text, describing what was wrong with request"} Nie
5XX {"message: Intermittent retraible error optional message"} Tak

Duplikaty

Nie ma gwarancji, że pojedynczy kontakt do potencjalnego klienta zostanie dostarczony dokładnie raz, dlatego webhook do obsługi kontaktów do potencjalnych klientów powinien prawidłowo obsługiwać duplikaty.