HubSpot-Formularübermittlungen in Salesforce in Jitterbit Studio synchronisieren
Einführung
HubSpot-Formularübermittlungen treffen als paginierte Liste ein, in der jede Übermittlung ein Array von Name/Wert-Paaren (ein Paar pro Formularfeld) statt eines flachen Datensatzes mit benannten Eigenschaften enthält. Diese Anleitung zeigt, wie man diese Übermittlungen mithilfe der HubSpot Forms Submissions API über den HTTP v2-Connector abruft, sie einzeln durch das SelectNodes-Schleifenmuster von Studio versendet, die E-Mail-Adresse, den Vornamen und den Nachnamen aus dem Werte-Array extrahiert, Salesforce auf einen vorhandenen Lead überprüft und einen Lead-Datensatz basierend auf dem Ergebnis erstellt oder aktualisiert.
Diese Anleitung verwendet:
- Den HTTP v2-Connector zum Aufrufen der HubSpot Forms Submissions API.
- Studio-Zwischenspeicher zum Speichern des vollständigen Übermittlungs-Batches zwischen dem Abrufschritt und der Schleife zur Verarbeitung einzelner Datensätze.
SelectNodesundReadFilezum Durchlaufen gespeicherter XML-Datensätze.SfLookupAllzum Erkennen doppelter Leads nach E-Mail-Adresse.- Die Aktivitäten „Erstellen" und „Aktualisieren" des Salesforce-Connectors zum Schreiben des Lead-Datensatzes.
Diese Anleitung setzt ein HubSpot-Konto mit einer privaten App und einem Zugriffstoken voraus. Man benötigt die GUID des Formulars, dessen Übermittlungen man synchronisieren möchte. Jedes HubSpot-Formular hat eine eindeutige GUID, die in der Formular-Editor-URL oder über die HubSpot Forms API sichtbar ist.
Designmuster
Die Integration läuft in zwei Phasen ab: ein Batch-Abruf, der alle Übermittlungen für ein Formular abruft und als XML speichert, und eine Schleife pro Datensatz, die jede Übermittlung einzeln verarbeitet.
Initialize variables
Set form path"] --> B["HTTP v2 GET
HubSpot submissions
for [$hubspot.form.guid]"] B --> C["Transformation
Write to
temp storage (batch)"] C --> D["Script
ReadFile + SelectNodes
loop over submissions"] D --> E["Per-record operation
(transformation + scripts)"] E --> F{"Email found
in Salesforce?"} F -- Yes --> G["Salesforce
Update Lead"] F -- No --> H["Salesforce
Create Lead
+ optional ZoomInfo enrich"]
Der Batch-Abruf läuft einmal pro Formularsynchronisierung. Die Schleife pro Datensatz läuft einmal pro Übermittlung.
Teil 1: Projektvariablen und die HTTP v2-Verbindung konfigurieren
Schritt 1: Projektvariablen erstellen
Speichern Sie das HubSpot-Zugriffstoken und die Formular-GUID als Projektvariablen, damit sie aktualisiert werden können, ohne Skripte zu bearbeiten. Öffnen Sie das Menü für Projektaktionen und wählen Sie Projektvariablen. Fügen Sie dann folgende hinzu:
| Name | Standardwert | Beschreibung |
|---|---|---|
hubspot.access.token |
(Ihr HubSpot-Zugriffstoken für private Apps) | Bearer-Token zur Authentifizierung aller API-Aufrufe |
hubspot.form.guid |
(Ihre HubSpot-Formular-GUID) | GUID des Formulars, dessen Übermittlungen synchronisiert werden sollen |
Markieren Sie hubspot.access.token als verborgen. Hinweise zum sicheren Speichern von Anmeldedaten finden Sie unter Endpunkt-Anmeldedaten verwalten.
Schritt 2: Die HTTP v2-Verbindung konfigurieren
-
Öffnen Sie in Studio Ihr Projekt und klicken Sie auf die Registerkarte Projektendpunkte und Connectors in der Design-Komponentenpalette.
-
Klicken Sie auf den HTTP v2-Connector, um den Bildschirm zur Verbindungskonfiguration zu öffnen.
-
Verbindungsname: Geben Sie
HubSpot APIein. -
Basis-URL: Geben Sie
https://api.hubapi.comein. -
Autorisierung: Wählen Sie Bearer Token und geben Sie
[$hubspot.access.token]als Token-Wert ein. -
Klicken Sie auf Test, um die Verbindung zu überprüfen, und klicken Sie dann auf Änderungen speichern.
Schritt 3: Die Aktivität „GET Form Submissions" erstellen
-
Ziehen Sie aus der Verbindung HubSpot API eine GET-Aktivität auf die Design-Canvas.
-
Name: Geben Sie
HubSpot - GET Form Submissionsein. -
Pfad: Geben Sie
/form-integrations/v1/submissions/forms/[$hubspot.form.guid]ein.Studio ersetzt
[$hubspot.form.guid]zur Laufzeit durch den Projektvariablenwert. Um ein anderes Formular zu synchronisieren, aktualisieren Sie die Projektvariable, ohne die Aktivitätskonfiguration zu ändern. -
Fügen Sie auf der Registerkarte Anfrage einen Header hinzu:
- Schlüssel:
Content-Type - Wert:
application/json
- Schlüssel:
-
Klicken Sie auf Fertig.
Teil 2: Übermittlungen abrufen und in temporären Speicher schreiben
Schritt 1: Den Abrufvorgang erstellen
Erstellen Sie einen Vorgang namens HubSpot - Fetch Form Submissions mit diesen Schritten in der angegebenen Reihenfolge:
-
Script: Initialisieren Sie die Variablen, die bei der Verarbeitung pro Datensatz verwendet werden:
// Reset per-run staging variables $hubspot.email = ""; $hubspot.firstName = ""; $hubspot.lastName = ""; WriteToOperationLog("Starting HubSpot form submission sync for form: " + [$hubspot.form.guid]); -
GET-Aktivität: Platzieren Sie die Aktivität
HubSpot - GET Form Submissionsals Quellschritt. -
Transformation: Fügen Sie nach der GET-Aktivität eine Transformation mit einer Aktivität Temporary Storage Write als Ziel hinzu. Ordnen Sie das JSON-Quellschema dem Zielschema auf den Schleifenebenen
results/itemundresults/item/values/itemzu, sodass alle Übermittlungsdatensätze in einem einzigen Durchgang in den temporären Speicher geschrieben werden.Benennen Sie die Transformation
HubSpot - Write Submissions to Temp Storageund benennen Sie die Aktivität „Temporary Storage Write"Write HubSpot Submissions.
Die Aktivität „Temporary Storage Write" speichert die Übermittlungsdatensätze als XML. Studio schreibt jedes Element auf der innersten Schleifenebene als DocInfo-Element, das ist das Format, das die Dispatch-Schleife in Teil 3 liest.
Schritt 2: Den Fall behandeln, in dem keine Übermittlungen gefunden werden
Fügen Sie nach der Transformation einen Script-Schritt hinzu. Überprüfen Sie die Übermittlungsanzahl vor dem Starten der Schleife:
$count = Length(SelectNodes(
ReadFile("<TAG>activity:tempstorage/HubSpot Temp Storage/tempstorage_read/Read HubSpot Submissions</TAG>"),
"//DocInfo"
));
If($count == 0,
WriteToOperationLog("No HubSpot submissions found. Exiting.");
CancelOperation("<TAG>operation:HubSpot - Fetch Form Submissions</TAG>");
,
WriteToOperationLog("Found " + $count + " submission(s) to process.");
);
CancelOperation bricht den aktuellen Vorgang sauber ab, ohne einen Fehler auszulösen, wenn keine Übermittlungen vorhanden sind.
Teil 3: Übermittlungen einzeln verteilen
Schritt 1: Das Dispatch-Script hinzufügen
Fügen Sie einen Script-Schritt zum Vorgang HubSpot - Fetch Form Submissions nach der Anzahlprüfung hinzu. Dieses Script liest den gespeicherten Batch, extrahiert einzelne Übermittlungsdatensätze mit SelectNodes und ruft einen Vorgang pro Datensatz einmal pro Übermittlung auf:
data = ReadFile("<TAG>activity:tempstorage/HubSpot Temp Storage/tempstorage_read/Read HubSpot Submissions</TAG>");
nodes = SelectNodes(data, "//DocInfo");
counts = Length(nodes);
WriteToOperationLog("Dispatching " + counts + " submission(s).");
i = 0;
While(i < counts,
node = nodes[i];
// Wrap the single node so the per-record operation has a valid XML source
xml = "<SubmissionBatch><Submissions>" + String(node) + "</Submissions></SubmissionBatch>";
WriteFile(
"<TAG>activity:tempstorage/HubSpot Temp Storage 2/tempstorage_write/Write Single HubSpot Submission</TAG>",
xml
);
FlushFile(
"<TAG>activity:tempstorage/HubSpot Temp Storage 2/tempstorage_write/Write Single HubSpot Submission</TAG>"
);
RunOperation("<TAG>operation:HubSpot - Process Single Submission</TAG>");
i = i + 1;
);
Der Wrapper <SubmissionBatch><Submissions> ist ein fester äußerer Container, der der Quelltransformation des Vorgangs pro Datensatz ein vorhersehbares Stammelement bietet. Der extrahierte DocInfo-Knoten wird zum inneren Element, das die Transformation zuordnet.
FlushFile erzwingt den Abschluss des Schreibvorgangs, bevor RunOperation den Vorgang pro Datensatz aufruft. Ohne Leerung kann der Vorgang die Daten des vorherigen Datensatzes lesen.
Wichtig
RunOperation unterliegt einem Limit auf Agent-Ebene für synchrone Aufrufe, die innerhalb einer einzelnen While-Schleife getätigt werden (50 standardmäßig). Wenn ein Batch mehr als 50 Übermittlungen hat, erreicht diese Dispatch-Schleife dieses Limit auf halbem Weg: RunOperation gibt false für die 51. Übermittlung und danach zurück, und die verbleibenden Übermittlungen im Batch werden nicht verarbeitet. Siehe den Hinweis unter RunOperation für Informationen zum Konfigurieren oder Überschreiben dieses Limits für Formular-GUIDs, die regelmäßig mehr als 50 Übermittlungen pro Synchronisierung erhalten.
Schritt 2: Temporären Speicher für die Verteilung pro Datensatz einrichten
Konfigurieren Sie einen zweiten Endpunkt für temporären Speicher (z. B. HubSpot Temp Storage 2) mit:
- Eine Write-Aktivität namens
Write Single HubSpot Submission. - Eine Read-Aktivität namens
Read Single HubSpot Submission, die als Quelle im Vorgang pro Datensatz verwendet wird.
Die beiden Endpunkte halten den vollständigen Batch und den Puffer pro Datensatz getrennt, sodass die Dispatch-Schleife die Quelldaten, über die sie iteriert, nicht überschreibt.
Teil 4: Feldwerte aus der Übermittlung extrahieren
HubSpot-Formularübermittlungen speichern Feldwerte als values-Array von Name/Wert-Objekten. Der Feldname (email, firstname, lastname) befindet sich im Feld name, und der übermittelte Wert befindet sich im Feld value. Die Transformation muss beide Ebenen durchlaufen (results/item für jede Übermittlung und das verschachtelte values/item für jedes Feld) und das Feld name lesen, um zu wissen, welche Variable gefüllt werden soll.
Schritt 1: Erstelle die Operation pro Datensatz
Erstelle eine Operation mit dem Namen HubSpot - Process Single Submission. Die Quelle ist die Aktivität Read Single HubSpot Submission Temporary Storage Read.
Schritt 2: Erstelle die Feldextraktions-Transformation
Füge der Operation pro Datensatz eine Transformation mit dem Namen HubSpot - Extract Submission Fields hinzu. Definiere zwei Schleifenebenen in der Transformation:
- Äußere Schleife:
results/itemin der Quelle, Zuordnung zum entsprechenden Zielpfad. - Innere Schleife:
results/item/values/itemin der Quelle, verschachtelt innerhalb der äußeren Schleife.
Füge in der inneren Schleife diese Zuordnungsskripte hinzu:
Für den Zielknoten values/item/name:
$hubspot.fieldName = json$results$item.values$item.name$
Für den Zielknoten values/item/value:
If($hubspot.fieldName == "email",
$hubspot.email = json$results$item.values$item.value$
);
If($hubspot.fieldName == "firstname",
$hubspot.firstName = json$results$item.values$item.value$
);
If($hubspot.fieldName == "lastname",
$hubspot.lastName = json$results$item.values$item.value$
);
Für den äußeren Zielknoten results/item/pageUrl (der nach Abschluss der inneren Schleife für jede Übermittlung ausgelöst wird), rufe die Salesforce-Prüfoperation auf:
If(Length(Trim($hubspot.email)) > 0,
$hubspot.email = ToLower(Trim($hubspot.email));
RunOperation("<TAG>operation:HubSpot - Check Salesforce Lead</TAG>");
,
WriteToOperationLog("Submission missing email field. Skipping.");
);
Die pageUrl-Zuordnung wird einmal pro Übermittlungsdatensatz ausgeführt, nachdem alle seine values/item-Kinder verarbeitet wurden. Dies ist der richtige Ort, um die nachgelagerte Salesforce-Operation auszulösen. Die Normalisierung der E-Mail auf Kleinbuchstaben vor der Suche verhindert Fehler bei der Groß-/Kleinschreibung bei der Suche in Salesforce-Datensätzen.
Teil 5: Überprüfe Salesforce auf einen vorhandenen Lead
Schritt 1: Erstelle die Salesforce-Prüfoperation
Erstelle eine Operation mit dem Namen HubSpot - Check Salesforce Lead. Füge einen Script-Schritt als einzigen Operationsschritt hinzu:
$sf.existingLeadId = "";
$result = SfLookupAll(
"<TAG>endpoint:salesforce/Salesforce</TAG>",
"SELECT Id FROM Lead WHERE Email = '"
+ $hubspot.email
+ "' AND IsConverted = false LIMIT 1"
);
If(Length($result) > 0,
$sf.existingLeadId = $result[0][0];
WriteToOperationLog("Existing lead found: " + $sf.existingLeadId);
RunOperation("<TAG>operation:HubSpot - Update Salesforce Lead</TAG>");
,
WriteToOperationLog("No existing lead for: " + $hubspot.email);
RunOperation("<TAG>operation:HubSpot - Create Salesforce Lead</TAG>");
);
SfLookupAll gibt ein zweidimensionales Array zurück: Jedes innere Array ist eine Ergebniszeile, und jedes Element ist ein Feldwert in der Reihenfolge, die in der SELECT-Klausel aufgelistet ist. $result[0][0] ist das Feld Id aus der ersten (und einzigen) zurückgegebenen Zeile. LIMIT 1 verhindert, dass mehrere Treffer einen Array-Indexfehler verursachen, wenn dieselbe E-Mail in mehr als einem Lead-Datensatz vorhanden ist.
IsConverted = false schließt Leads aus, die bereits in Kontakte, Chancen oder Konten konvertiert wurden. Das Aktualisieren eines konvertierten Leads in Salesforce führt zu einem Fehler. Daher ist es sicherer, diese zu überspringen und den Erstellungspfad den Grenzfall bei Bedarf separat behandeln zu lassen.
Für das SOQL-Abfragemuster siehe Salesforce-Datensätze mit SOQL abfragen.
Teil 6: Erstelle oder aktualisiere den Salesforce Lead
Schritt 1: Erstelle den Lead-Datensatz
Erstelle eine Operation mit dem Namen HubSpot - Create Salesforce Lead. Füge einen Transformation-Schritt hinzu, der die Staging-Variablen einer Salesforce-Aktivität Create zuordnet, die auf das Objekt Lead abzielt:
| Quellausdruck | Salesforce Lead-Feld |
|---|---|
$hubspot.firstName |
FirstName |
$hubspot.lastName |
LastName |
$hubspot.email |
Email |
"HubSpot" (Literal) |
LeadSource |
Lege einen Literalwert für LeadSource fest, um alle von dieser Integration erstellten Leads zu kennzeichnen und Berichte zu erstellen.
Die Salesforce Create-Aktivität gibt die neue Datensatz-ID zurück. Erfasse sie zur Verwendung im optionalen Anreicherungsschritt:
$sf.newLeadId = TrimChars(
GetJSONString($jitterbit.response, "/id"),
"\""
);
WriteToOperationLog("Created Salesforce lead: " + $sf.newLeadId);
Rufe nach dem Erfassen der ID die ZoomInfo-Anreicherungsoperation auf, um zusätzliche Felder auszufüllen (siehe Teil 7):
If(Length($sf.newLeadId) > 0,
RunOperation("<TAG>operation:ZoomInfo - Enrich Lead</TAG>")
);
Schritt 2: Aktualisiere den vorhandenen Lead-Datensatz
Erstelle eine Operation mit dem Namen HubSpot - Update Salesforce Lead. Füge einen Transformation-Schritt hinzu, der einer Salesforce-Aktivität Update zugeordnet wird, die auf das Objekt Lead abzielt. Die Update-Aktivität erfordert das Feld Id, um den Datensatz zu identifizieren:
| Quellausdruck | Salesforce Lead-Feld |
|---|---|
$sf.existingLeadId |
Id |
$hubspot.firstName |
FirstName |
$hubspot.lastName |
LastName |
$hubspot.email |
Email |
Nur die Felder zuordnen, die die Integration besitzt. Wenn man Felder aus der Transformation weglässt, bleiben die vorhandenen Werte im Salesforce-Datensatz erhalten.
Teil 7: Neue Leads mit ZoomInfo anreichern
Nach dem Erstellen eines neuen Salesforce-Leads verwendet ein optionaler Anreicherungsschritt ZoomInfo, um die aktuelle Berufsbezeichnung, das Unternehmen und die direkte Telefonnummer des Kontakts auszufüllen. Der Anreicherungsvorgang ruft den ZoomInfo-Anreicherungs-Endpunkt mit der Lead-E-Mail und dem Unternehmensname als Suchschlüssel auf und aktualisiert dann den Salesforce-Lead mit den zurückgegebenen Daten.
Informationen zur ZoomInfo-API-Verbindungseinrichtung und zum Resource-Router-Muster, das in diesem Schritt verwendet wird, finden Sie unter Kontaktdaten mit ZoomInfo anreichern.
Integration überprüfen
-
Öffnen Sie in HubSpot das Formular, das Sie synchronisieren, und senden Sie einen Test-Eintrag mit einer eindeutigen E-Mail-Adresse ein, die nicht in Salesforce vorhanden ist. Führen Sie
HubSpot - Fetch Form Submissionsmanuell aus und überprüfen Sie die Vorgangsprotokolle. Bestätigen Sie, dass das Protokoll die korrekte Anzahl der Einreichungen anzeigt und dassHubSpot - Create Salesforce Leadfür die Test-Einreichung ausgeführt wurde. -
Suchen Sie in Salesforce nach dem Lead-Datensatz anhand der Test-E-Mail-Adresse. Bestätigen Sie, dass
FirstName,LastNameundEmailausgefüllt sind und dassLeadSourceaufHubSpotgesetzt ist. -
Senden Sie einen zweiten Test-Eintrag mit derselben E-Mail-Adresse ein. Führen Sie den Abrufvorgang erneut aus und bestätigen Sie, dass
HubSpot - Update Salesforce Leadstatt des Erstellungsvorgangs ausgeführt wurde und dass der vorhandene Salesforce-Lead aktualisiert und nicht dupliziert wurde. -
Testen Sie den Fall der leeren Einreichung, indem Sie den Vorgang für ein Formular ohne Einreichungen ausführen. Bestätigen Sie, dass die Vorgangsprotokolle „No HubSpot submissions found" anzeigen und dass keine Salesforce-Vorgänge aufgerufen wurden.
-
Um eine Einreichung ohne E-Mail-Feld zu testen, fügen Sie vorübergehend einen Test-Eintrag ohne E-Mail hinzu. Bestätigen Sie, dass das Protokoll „Submission missing email field. Skipping." anzeigt und dass keine Salesforce-Vorgänge für diesen Datensatz ausgeführt wurden.
-
Wenn die GET-Aktivität einen 401-Fehler zurückgibt, bestätigen Sie, dass
[$hubspot.access.token]gesetzt ist und dass das private App-Zugriffstoken nicht abgelaufen ist. HubSpot-Token für private Apps laufen standardmäßig nicht ab, können aber rotiert werden. Überprüfen Sie das Token in den Einstellungen der HubSpot-Private-App. -
Wenn
SelectNodestrotz der von der GET-Aktivität zurückgegebenen Daten null Knoten zurückgibt, bestätigen Sie, dass die Transformation in Teil 2 auf der Ebeneresults/itemeine Schleife durchläuft und dass die Temporary Storage Write-Aktivität vor dem Dispatch-Skript abgeschlossen wurde.