Offline-Conversions verwalten

Mit der Google Ads API können Sie Offline-Conversions in Google Ads importieren, um Anzeigen zu erfassen, die zu Offlineverkäufen geführt haben, z. B. am Telefon oder über einen Vertriebsmitarbeiter.

Damit Sie die Vorteile des Imports von Conversion-Daten voll ausschöpfen können, empfehlen wir Ihnen, erweiterte Conversions für Leads zu implementieren. Dabei werden GCLIDs und von Nutzern bereitgestellte Daten verwendet, um die Nachhaltigkeit und Leistung zu maximieren.

Erweiterte Conversions

Mit erweiterten Conversions lässt sich die Genauigkeit der Conversion-Analyse verbessern, da Ihre Conversions um selbst erhobene Conversion-Daten wie E-Mail-Adresse, Name, Privatadresse und Telefonnummer ergänzt werden.

Es gibt zwei Arten von erweiterten Conversions. Weitere Informationen finden Sie im Hilfeartikel Erweiterte Conversions.

Im folgenden Abschnitt erfahren Sie, wie Sie Offline-Conversions optimieren. Diese Funktion wird auch als erweiterte Conversions für Leads bezeichnet.

Was sind erweiterte Conversions für Leads?

Erweiterte Conversions für Leads sind eine optimierte Version des Imports von Offline-Conversions. Dabei werden von Nutzern bereitgestellte Daten wie E-Mail-Adressen verwendet, um importierte Offline-Conversion-Daten zu ergänzen und so die Genauigkeit und Gebotsleistung zu verbessern. Wenn Sie Ihre Offline-Conversions importieren, werden die bereitgestellten gehashten Kundendaten verwendet, um die Conversions der Google Ads-Kampagne zuzuordnen. Dazu werden sie mit denselben Daten abgeglichen, die auf Ihrer Website erfasst wurden, z. B. aus einem Lead-Formular, und mit angemeldeten Kunden, die mit Ihrer Anzeige interagiert haben. Weitere Informationen zur Funktionsweise erweiterter Conversions für Leads finden Sie im Hilfeartikel Erweiterte Conversions für Leads.

Es gibt zwei Möglichkeiten, erweiterte Conversions für Leads zu implementieren, je nachdem, ob Sie das Google-Tag verwenden, um Ereignisse für die Formulareinreichung auf Ihrer Webseite zu erfassen. Für die beste Leistung und Zuverlässigkeit empfehlen wir dringend, das Google-Tag für erweiterte Conversions für Leads zu verwenden.

  • Wenn Sie ganz neu anfangen, beginnen Sie mit dem Abschnitt Voraussetzungen.
  • Wenn Sie bereits Importe von Offline-Conversions eingerichtet haben und auf erweiterte Conversions für Leads umstellen möchten, empfehlen wir Ihnen, mit dem Abschnitt Tagging konfigurieren zu beginnen.
  • Wenn Sie das Google-Tag bereits eingerichtet haben oder es nicht verwenden möchten und mit der Integration der Google Ads API beginnen möchten, fahren Sie mit dem Abschnitt API-Implementierung fort.
  • Wenn Sie von Nutzern bereitgestellte Daten nicht importieren können oder für Ihre Conversions auf externe Attribution angewiesen sind, lesen Sie den Leitfaden für den Import von Offline-Conversions.

Vorbereitung

Führen Sie zuerst die Schritte im Abschnitt „Einstieg“ aus.

Sie müssen erweiterte Conversions für Leads aktivieren und die Nutzungsbedingungen für Kundendaten akzeptieren, bevor Sie sie verwenden können. Sie können prüfen, ob diese Voraussetzungen bereits erfüllt sind, indem Sie die folgende Abfrage an den Google Ads-Conversion-Kunden senden:

SELECT
  customer.id,
  customer.conversion_tracking_setting.accepted_customer_data_terms,
  customer.conversion_tracking_setting.enhanced_conversions_for_leads_enabled
FROM customer

Wenn accepted_customer_data_terms oder enhanced_conversions_for_leads_enabled false ist, folgen Sie der Anleitung in der Google Ads-Hilfe, um diese Voraussetzungen zu erfüllen.

Tagging konfigurieren

Konfigurieren Sie das Google-Tag, um erweiterte Conversions für Leads zu aktivieren. Folgen Sie dazu der Anleitung in der Hilfe. Folgen Sie dieser Anleitung, um erweiterte Conversions für Leads mit Google Tag Manager einzurichten.

API-Implementierung

Im Folgenden finden Sie eine allgemeine Übersicht über den Import erweiterter Conversions für Leads mithilfe der Google Ads API.

  1. Normalisieren und hashen Sie die von Nutzern bereitgestellten Daten, z. B. E-Mail-Adresse, Telefonnummer und Postanschrift.

  2. Füllen Sie ClickConversion-Objekte mit den normalisierten und gehashten von Nutzern bereitgestellten Daten.

  3. Importieren Sie ClickConversion-Objekte mit der ConversionUploadService in die Google Ads API.

  4. Überprüfen Sie Ihre Importe.

Von Nutzern bereitgestellte Daten normalisieren und hashen

Aus Datenschutzgründen müssen die folgenden Daten vor dem Import mit SHA-256 gehasht werden:

  • E-Mail-Adresse
  • Telefonnummer
  • Vorname
  • Nachname
  • Adresse

Um die Hash-Ergebnisse zu standardisieren, müssen Sie vor dem Hashen dieser Werte Folgendes tun:

  • Entfernen Sie Leerzeichen am Anfang und Ende.
  • Verwenden Sie nur Kleinbuchstaben im Text.
  • Formatieren Sie Telefonnummern gemäß dem E164-Standard.
  • Entfernen Sie alle Punkte (.) vor dem Domainnamen in gmail.com- und googlemail.com-E-Mail-Adressen.

Die folgenden Daten dürfen nicht gehasht werden:

  • Land
  • Bundesstaat
  • Stadt
  • Postleitzahl

Codebeispiel

In diesem Beispiel wird gezeigt, wie von Nutzern bereitgestellte Daten normalisiert und gehasht werden.

Java

private String normalizeAndHash(MessageDigest digest, String s)
    throws UnsupportedEncodingException {
  // Normalizes by first converting all characters to lowercase, then trimming spaces.
  String normalized = s.toLowerCase();
  // Removes leading, trailing, and intermediate spaces.
  normalized = normalized.replaceAll("\\s+", "");
  // Hashes the normalized string using the hashing algorithm.
  byte[] hash = digest.digest(normalized.getBytes("UTF-8"));
  StringBuilder result = new StringBuilder();
  for (byte b : hash) {
    result.append(String.format("%02x", b));
  }

  return result.toString();
}

/**
 * Returns the result of normalizing and hashing an email address. For this use case, Google Ads
 * requires removal of any '.' characters preceding {@code gmail.com} or {@code googlemail.com}.
 *
 * @param digest the digest to use to hash the normalized string.
 * @param emailAddress the email address to normalize and hash.
 */
private String normalizeAndHashEmailAddress(MessageDigest digest, String emailAddress)
    throws UnsupportedEncodingException {
  String normalizedEmail = emailAddress.toLowerCase();
  String[] emailParts = normalizedEmail.split("@");
  if (emailParts.length > 1 && emailParts[1].matches("^(gmail|googlemail)\\.com\\s*")) {
    // Removes any '.' characters from the portion of the email address before the domain if the
    // domain is gmail.com or googlemail.com.
    emailParts[0] = emailParts[0].replaceAll("\\.", "");
    normalizedEmail = String.format("%s@%s", emailParts[0], emailParts[1]);
  }
  return normalizeAndHash(digest, normalizedEmail);
}
      

C#

/// <summary>
/// Normalizes the email address and hashes it. For this use case, Google Ads requires
/// removal of any '.' characters preceding <code>gmail.com</code> or
/// <code>googlemail.com</code>.
/// </summary>
/// <param name="emailAddress">The email address.</param>
/// <returns>The hash code.</returns>
private string NormalizeAndHashEmailAddress(string emailAddress)
{
    string normalizedEmail = emailAddress.ToLower();
    string[] emailParts = normalizedEmail.Split('@');
    if (emailParts.Length > 1 && (emailParts[1] == "gmail.com" ||
        emailParts[1] == "googlemail.com"))
    {
        // Removes any '.' characters from the portion of the email address before
        // the domain if the domain is gmail.com or googlemail.com.
        emailParts[0] = emailParts[0].Replace(".", "");
        normalizedEmail = $"{emailParts[0]}@{emailParts[1]}";
    }
    return NormalizeAndHash(normalizedEmail);
}

/// <summary>
/// Normalizes and hashes a string value.
/// </summary>
/// <param name="value">The value to normalize and hash.</param>
/// <returns>The normalized and hashed value.</returns>
private static string NormalizeAndHash(string value)
{
    return ToSha256String(digest, ToNormalizedValue(value));
}

/// <summary>
/// Hash a string value using SHA-256 hashing algorithm.
/// </summary>
/// <param name="digest">Provides the algorithm for SHA-256.</param>
/// <param name="value">The string value (e.g. an email address) to hash.</param>
/// <returns>The hashed value.</returns>
private static string ToSha256String(SHA256 digest, string value)
{
    byte[] digestBytes = digest.ComputeHash(Encoding.UTF8.GetBytes(value));
    // Convert the byte array into an unhyphenated hexadecimal string.
    return BitConverter.ToString(digestBytes).Replace("-", string.Empty);
}

/// <summary>
/// Removes leading and trailing whitespace and converts all characters to
/// lower case.
/// </summary>
/// <param name="value">The value to normalize.</param>
/// <returns>The normalized value.</returns>
private static string ToNormalizedValue(string value)
{
    return value.Trim().ToLower();
}
      

PHP

private static function normalizeAndHash(string $hashAlgorithm, string $value): string
{
    // Normalizes by first converting all characters to lowercase, then trimming spaces.
    $normalized = strtolower($value);
    // Removes leading, trailing, and intermediate spaces.
    $normalized = str_replace(' ', '', $normalized);
    return hash($hashAlgorithm, strtolower(trim($normalized)));
}

/**
 * Returns the result of normalizing and hashing an email address. For this use case, Google
 * Ads requires removal of any '.' characters preceding "gmail.com" or "googlemail.com".
 *
 * @param string $hashAlgorithm the hash algorithm to use
 * @param string $emailAddress the email address to normalize and hash
 * @return string the normalized and hashed email address
 */
private static function normalizeAndHashEmailAddress(
    string $hashAlgorithm,
    string $emailAddress
): string {
    $normalizedEmail = strtolower($emailAddress);
    $emailParts = explode("@", $normalizedEmail);
    if (
        count($emailParts) > 1
        && preg_match('/^(gmail|googlemail)\.com\s*/', $emailParts[1])
    ) {
        // Removes any '.' characters from the portion of the email address before the domain
        // if the domain is gmail.com or googlemail.com.
        $emailParts[0] = str_replace(".", "", $emailParts[0]);
        $normalizedEmail = sprintf('%s@%s', $emailParts[0], $emailParts[1]);
    }
    return self::normalizeAndHash($hashAlgorithm, $normalizedEmail);
}
      

Python

def normalize_and_hash_email_address(email_address):
    """Returns the result of normalizing and hashing an email address.

    For this use case, Google Ads requires removal of any '.' characters
    preceding "gmail.com" or "googlemail.com"

    Args:
        email_address: An email address to normalize.

    Returns:
        A normalized (lowercase, removed whitespace) and SHA-265 hashed string.
    """
    normalized_email = email_address.strip().lower()
    email_parts = normalized_email.split("@")

    # Check that there are at least two segments
    if len(email_parts) > 1:
        # Checks whether the domain of the email address is either "gmail.com"
        # or "googlemail.com". If this regex does not match then this statement
        # will evaluate to None.
        if re.match(r"^(gmail|googlemail)\.com$", email_parts[1]):
            # Removes any '.' characters from the portion of the email address
            # before the domain if the domain is gmail.com or googlemail.com.
            email_parts[0] = email_parts[0].replace(".", "")
            normalized_email = "@".join(email_parts)

    return normalize_and_hash(normalized_email)


def normalize_and_hash(s):
    """Normalizes and hashes a string with SHA-256.

    Private customer data must be hashed during upload, as described at:
    https://support.google.com/google-ads/answer/7474263

    Args:
        s: The string to perform this operation on.

    Returns:
        A normalized (lowercase, removed whitespace) and SHA-256 hashed string.
    """
    return hashlib.sha256(s.strip().lower().encode()).hexdigest()
      

Ruby

# Returns the result of normalizing and then hashing the string using the
# provided digest.  Private customer data must be hashed during upload, as
# described at https://support.google.com/google-ads/answer/7474263.
def normalize_and_hash(str)
  # Remove leading and trailing whitespace and ensure all letters are lowercase
  # before hashing.
  Digest::SHA256.hexdigest(str.strip.downcase)
end

# Returns the result of normalizing and hashing an email address. For this use
# case, Google Ads requires removal of any '.' characters preceding 'gmail.com'
# or 'googlemail.com'.
def normalize_and_hash_email(email)
  email_parts = email.downcase.split("@")
  # Removes any '.' characters from the portion of the email address before the
  # domain if the domain is gmail.com or googlemail.com.
  if email_parts.last =~ /^(gmail|googlemail)\.com\s*/
    email_parts[0] = email_parts[0].gsub('.', '')
  end
  normalize_and_hash(email_parts.join('@'))
end
      

Perl

sub normalize_and_hash {
  my $value = shift;

  # Removes leading, trailing, and intermediate spaces.
  $value =~ s/\s+//g;
  return sha256_hex(lc $value);
}

# Returns the result of normalizing and hashing an email address. For this use
# case, Google Ads requires removal of any '.' characters preceding 'gmail.com'
# or 'googlemail.com'.
sub normalize_and_hash_email_address {
  my $email_address = shift;

  my $normalized_email = lc $email_address;
  my @email_parts      = split('@', $normalized_email);
  if (scalar @email_parts > 1
    && $email_parts[1] =~ /^(gmail|googlemail)\.com\s*/)
  {
    # Remove any '.' characters from the portion of the email address before the
    # domain if the domain is 'gmail.com' or 'googlemail.com'.
    $email_parts[0] =~ s/\.//g;
    $normalized_email = sprintf '%s@%s', $email_parts[0], $email_parts[1];
  }
  return normalize_and_hash($normalized_email);
}
      

ClickConversion-Objekte füllen

Die Sammlung von ClickConversion-Objekten in Ihrem UploadClickConversionRequest entspricht den Conversions, die Sie importieren möchten. Beachten Sie beim Erstellen von ClickConversion-Objekten Folgendes:

gclid

GCLIDs sind Klick-IDs, die aus URL-Parametern erfasst werden, wenn ein Nutzer auf Ihre Anzeige klickt und Ihre Website aufruft.

user_identifiers

Wenn Sie erweiterte Conversions für Leads verwenden, müssen Sie das Feld user_identifiers mit normalisierten und gehashten von Nutzern bereitgestellten Daten ausfüllen. Wenn Sie mehrere Nutzer-IDs haben, erstellen Sie für jede eine separate UserIdentifier. Es können bis zu fünf IDs sein.

conversion_date_time

Das Datum und die Uhrzeit der Conversion.

Der Wert muss eine Zeitzone haben und das Format muss yyyy-mm-dd HH:mm:ss+|-HH:mm sein, z. B. 2022-01-01 19:32:45-05:00 (ohne Sommerzeit).

Die Zeitzone kann einen beliebigen gültigen Wert haben. Sie muss nicht mit der Zeitzone des Kontos übereinstimmen. Wenn Sie Ihre importierten Conversion-Daten jedoch mit den Daten in der Google Ads-Benutzeroberfläche vergleichen möchten, empfehlen wir, denselben Zeitzonenoffset wie in Ihrem Google Ads-Konto zu verwenden, damit die Conversion-Anzahl übereinstimmt. Weitere Informationen und Beispiele finden Sie in der Hilfe. Eine Liste der gültigen Zeitzonen-IDs finden Sie unter Codes und Formate.

conversion_action

Der Ressourcenname der ConversionAction für die Offline-Conversion.

Die Conversion-Aktion muss einen type von UPLOAD_CLICKS haben und im Google Ads-Conversion-Kunden des Google Ads-Kontos vorhanden sein, das mit dem Klick verknüpft ist.

conversion_value

Der Wert der Conversion.

currency_code

Der Währungscode der conversion_value.

consent

Es wird dringend empfohlen, das Feld consent des ClickConversion-Objekts auszufüllen. Andernfalls können Ihre Conversions möglicherweise nicht zugeordnet werden.

order_id

Auch als Transaktions-ID für die Conversion bezeichnet. Dieses Feld ist optional, wird aber dringend empfohlen, da es die Verknüpfung importierter Conversions bei Anpassungen vereinfacht. Wenn Sie sie während des Imports festgelegt haben, müssen Sie sie für alle Anpassungen verwenden. Weitere Informationen zum Minimieren doppelter Conversions durch Transaktions-IDs

custom_variables

Die Werte für benutzerdefinierte Conversion-Variablen.

In Google Ads werden benutzerdefinierte Conversion-Variablen nicht in Kombination mit wbraid oder gbraid unterstützt.

conversion_environment

Die Umgebung, in der diese Conversion erfasst wurde. Beispiel: APP oder WEB.

session_attributes_encoded und session_attributes_key_value_pairs

Sitzungsattribute sind aggregierte Kennungen, die für die Conversion-Attribution verwendet werden. Sie werden zusätzlich zu Klick-IDs (z. B. GCLIDs und GBRAIDs) und von Nutzern bereitgestellten Daten verwendet, die für erweiterte Conversions für Leads von zentraler Bedeutung sind. Es gibt zwei Möglichkeiten, Sitzungsattribute zu importieren: Sie können das codierte Token angeben, das von unserem JavaScript-Code im Browser generiert wird, oder Sie können für jede Kennung einzelne Schlüssel/Wert-Paare angeben.

Wenn Sie die Leistung Ihrer Kampagne maximieren möchten, empfehlen wir, Klick-IDs, von Nutzern bereitgestellte Daten und Sitzungsattribute zusammen mit allen Conversions zu importieren.

Java

This example is not yet available in Java; you can take a look at the other languages.
    

C#

if (!string.IsNullOrEmpty(sessionAttributesEncoded))
{
    clickConversion.SessionAttributesEncoded =
        ByteString.CopyFrom(sessionAttributesEncoded, Encoding.Unicode);
}
else if (!string.IsNullOrEmpty(sessionAttributes))
{
    IEnumerable<SessionAttributeKeyValuePair> parsedSessionAttributes =
        sessionAttributes.Split(';').Select(pair => {
            string[] split = pair.Split('=');
            return new SessionAttributeKeyValuePair()
            {
                SessionAttributeKey = split[0],
                SessionAttributeValue = split[1]
            };
        });

    clickConversion.SessionAttributesKeyValuePairs =
        new SessionAttributesKeyValuePairs();
    clickConversion.SessionAttributesKeyValuePairs.KeyValuePairs
        .AddRange(parsedSessionAttributes);
}
      

PHP

This example is not yet available in PHP; you can take a look at the other languages.
    

Python

# Set one of the session_attributes_encoded or
# session_attributes_key_value_pairs fields if either are provided.
if session_attributes_encoded:
    click_conversion.session_attributes_encoded = session_attributes_encoded
elif session_attributes_dict:
    for key, value in session_attributes_dict.items():
        pair = client.get_type("SessionAttributeKeyValuePair")
        pair.session_attribute_key = key
        pair.session_attribute_value = value
        click_conversion.session_attributes_key_value_pairs.key_value_pairs.append(
            pair
        )
      

Ruby

This example is not yet available in Ruby; you can take a look at the other languages.
    

Perl

# Set one of the session_attributes_encoded or session_attributes_key_value_pairs
# fields if either are provided.
if (defined $session_attributes_encoded) {
  $click_conversion->{sessionAttributesEncoded} = $session_attributes_encoded;
} elsif (defined $session_attributes_hash) {
  while (my ($key, $value) = each %$session_attributes_hash) {
    my $pair =
      Google::Ads::GoogleAds::V19::Services::ConversionUploadService::SessionAttributeKeyValuePair
      ->new({sessionAttributeKey => $key, sessionAttributeValue => $value});
    push @{$click_conversion->{sessionAttributesKeyValuePairs}{keyValuePairs}
    }, $pair;
  }
}
      

Codebeispiel

In diesem Beispiel wird gezeigt, wie Sie Ihre normalisierten und gehashten von Nutzern bereitgestellten Daten auf ein ClickConversion-Objekt festlegen.

Java

// Creates an empty builder for constructing the click conversion.
ClickConversion.Builder clickConversionBuilder = ClickConversion.newBuilder();

// Extracts user email and phone from the raw data, normalizes and hashes it, then wraps it in
// UserIdentifier objects.
// Creates a separate UserIdentifier object for each. The data in this example is hardcoded, but
// in your application you might read the raw data from an input file.

// IMPORTANT: Since the identifier attribute of UserIdentifier
// (https://developers.google.com/google-ads/api/reference/rpc/latest/UserIdentifier) is a
// oneof
// (https://protobuf.dev/programming-guides/proto3/#oneof-features), you must set only ONE of
// hashedEmail, hashedPhoneNumber, mobileId, thirdPartyUserId, or addressInfo. Setting more
// than one of these attributes on the same UserIdentifier will clear all the other members
// of the oneof. For example, the following code is INCORRECT and will result in a
// UserIdentifier with ONLY a hashedPhoneNumber.
//
// UserIdentifier incorrectlyPopulatedUserIdentifier =
//     UserIdentifier.newBuilder()
//         .setHashedEmail("...")
//         .setHashedPhoneNumber("...")
//         .build();

ImmutableMap.Builder<String, String> rawRecordBuilder =
    ImmutableMap.<String, String>builder()
        .put("email", "alex.2@example.com")
        // Phone number to be converted to E.164 format, with a leading '+' as required.
        .put("phone", "+1 800 5550102")
        // This example lets you put conversion details as arguments, but in reality you might
        // store this data alongside other user data, so we include it in this sample user
        // record.
        .put("conversionActionId", Long.toString(conversionActionId))
        .put("conversionDateTime", conversionDateTime)
        .put("conversionValue", Double.toString(conversionValue))
        .put("currencyCode", "USD");

// Adds entries for the optional fields.
if (orderId != null) {
  rawRecordBuilder.put("orderId", orderId);
}
if (gclid != null) {
  rawRecordBuilder.put("gclid", gclid);
}
if (adUserDataConsent != null) {
  rawRecordBuilder.put("adUserDataConsent", adUserDataConsent.name());
}
if (sessionAttributesEncoded != null) {
  rawRecordBuilder.put("sessionAttributesEncoded", sessionAttributesEncoded);
}
if (sessionAttributesMap != null) {
  rawRecordBuilder.put("sessionAttributesMap", sessionAttributesMap);
}

// Builds the map representing the record.
Map<String, String> rawRecord = rawRecordBuilder.build();

// Creates a SHA256 message digest for hashing user identifiers in a privacy-safe way, as
// described at https://support.google.com/google-ads/answer/9888656.
MessageDigest sha256Digest = MessageDigest.getInstance("SHA-256");

// Creates a list for the user identifiers.
List<UserIdentifier> userIdentifiers = new ArrayList<>();

// Creates a user identifier using the hashed email address, using the normalize and hash method
// specifically for email addresses.
UserIdentifier emailIdentifier =
    UserIdentifier.newBuilder()
        // Optional: specify the user identifier source.
        .setUserIdentifierSource(UserIdentifierSource.FIRST_PARTY)
        // Uses the normalize and hash method specifically for email addresses.
        .setHashedEmail(normalizeAndHashEmailAddress(sha256Digest, rawRecord.get("email")))
        .build();
userIdentifiers.add(emailIdentifier);

// Creates a user identifier using normalized and hashed phone info.
UserIdentifier hashedPhoneNumberIdentifier =
    UserIdentifier.newBuilder()
        .setHashedPhoneNumber(normalizeAndHash(sha256Digest, rawRecord.get("phone")))
        .build();
// Adds the hashed phone number identifier to the UserData object's list.
userIdentifiers.add(hashedPhoneNumberIdentifier);

// Adds the user identifiers to the conversion.
clickConversionBuilder.addAllUserIdentifiers(userIdentifiers);
      

C#

// Adds a user identifier using the hashed email address, using the normalize
// and hash method specifically for email addresses.
clickConversion.UserIdentifiers.Add(new UserIdentifier()
{
    HashedEmail = NormalizeAndHashEmailAddress("alex.2@example.com"),
    // Optional: Specifies the user identifier source.
    UserIdentifierSource = UserIdentifierSource.FirstParty
});

// Adds a user identifier using normalized and hashed phone info.
clickConversion.UserIdentifiers.Add(new UserIdentifier()
{
    HashedPhoneNumber = NormalizeAndHash("+1 800 5550102"),
    // Optional: Specifies the user identifier source.
    UserIdentifierSource = UserIdentifierSource.FirstParty
});

// Adds a user identifier with all the required mailing address elements.
clickConversion.UserIdentifiers.Add(new UserIdentifier()
{
    AddressInfo = new OfflineUserAddressInfo()
    {
        // FirstName and LastName must be normalized and hashed.
        HashedFirstName = NormalizeAndHash("Alex"),
        HashedLastName = NormalizeAndHash("Quinn"),
        // CountryCode and PostalCode are sent in plain text.
        CountryCode = "US",
        PostalCode = "94045"
    }
});
      

PHP

// Creates a click conversion with the specified attributes.
$clickConversion = new ClickConversion();

// Extract user email and phone from the raw data, normalize and hash it, then wrap it in
// UserIdentifier objects. Creates a separate UserIdentifier object for each.
// The data in this example is hardcoded, but in your application you might read the raw
// data from an input file.

// IMPORTANT: Since the identifier attribute of UserIdentifier
// (https://developers.google.com/google-ads/api/reference/rpc/latest/UserIdentifier) is a
// oneof
// (https://protobuf.dev/programming-guides/proto3/#oneof-features), you must set only ONE
// of hashedEmail, hashedPhoneNumber, mobileId, thirdPartyUserId, or addressInfo. Setting
// more than one of these attributes on the same UserIdentifier will clear all the other
// members of the oneof. For example, the following code is INCORRECT and will result in a
// UserIdentifier with ONLY a hashedPhoneNumber.
//
// $incorrectlyPopulatedUserIdentifier = new UserIdentifier([
//    'hashed_email' => '...',
//    'hashed_phone_number' => '...'
// ]);

$rawRecord = [
    // Email address that includes a period (.) before the Gmail domain.
    'email' => 'alex.2@example.com',
    // Phone number to be converted to E.164 format, with a leading '+' as required.
    'phone' => '+1 800 5550102',
    // This example lets you input conversion details as arguments, but in reality you might
    // store this data alongside other user data, so we include it in this sample user
    // record.
    'orderId' => $orderId,
    'gclid' => $gclid,
    'conversionActionId' => $conversionActionId,
    'conversionDateTime' => $conversionDateTime,
    'conversionValue' => $conversionValue,
    'currencyCode' => 'USD',
    'adUserDataConsent' => $adUserDataConsent
];

// Creates a list for the user identifiers.
$userIdentifiers = [];

// Uses the SHA-256 hash algorithm for hashing user identifiers in a privacy-safe way, as
// described at https://support.google.com/google-ads/answer/9888656.
$hashAlgorithm = "sha256";

// Creates a user identifier using the hashed email address, using the normalize and hash
// method specifically for email addresses.
$emailIdentifier = new UserIdentifier([
    // Uses the normalize and hash method specifically for email addresses.
    'hashed_email' => self::normalizeAndHashEmailAddress(
        $hashAlgorithm,
        $rawRecord['email']
    ),
    // Optional: Specifies the user identifier source.
    'user_identifier_source' => UserIdentifierSource::FIRST_PARTY
]);
$userIdentifiers[] = $emailIdentifier;

// Checks if the record has a phone number, and if so, adds a UserIdentifier for it.
if (array_key_exists('phone', $rawRecord)) {
    $hashedPhoneNumberIdentifier = new UserIdentifier([
        'hashed_phone_number' => self::normalizeAndHash(
            $hashAlgorithm,
            $rawRecord['phone'],
            true
        )
    ]);
    // Adds the hashed email identifier to the user identifiers list.
    $userIdentifiers[] = $hashedPhoneNumberIdentifier;
}

// Adds the user identifiers to the conversion.
$clickConversion->setUserIdentifiers($userIdentifiers);
      

Python

# Extract user email and phone from the raw data, normalize and hash it,
# then wrap it in UserIdentifier objects. Create a separate UserIdentifier
# object for each. The data in this example is hardcoded, but in your
# application you might read the raw data from an input file.

# IMPORTANT: Since the identifier attribute of UserIdentifier
# (https://developers.google.com/google-ads/api/reference/rpc/latest/UserIdentifier)
# is a oneof
# (https://protobuf.dev/programming-guides/proto3/#oneof-features), you must
# set only ONE of hashed_email, hashed_phone_number, mobile_id,
# third_party_user_id, or address_info. Setting more than one of these
# attributes on the same UserIdentifier will clear all the other members of
# the oneof. For example, the following code is INCORRECT and will result in
# a UserIdentifier with ONLY a hashed_phone_number:
#
# incorrectly_populated_user_identifier = client.get_type("UserIdentifier")
# incorrectly_populated_user_identifier.hashed_email = "...""
# incorrectly_populated_user_identifier.hashed_phone_number = "...""

raw_record = {
    # Email address that includes a period (.) before the Gmail domain.
    "email": "alex.2@example.com",
    # Phone number to be converted to E.164 format, with a leading '+' as
    # required.
    "phone": "+1 800 5550102",
    # This example lets you input conversion details as arguments,
    # but in reality you might store this data alongside other user data,
    # so we include it in this sample user record.
    "order_id": order_id,
    "gclid": gclid,
    "conversion_action_id": conversion_action_id,
    "conversion_date_time": conversion_date_time,
    "conversion_value": conversion_value,
    "currency_code": "USD",
    "ad_user_data_consent": ad_user_data_consent,
}

# Constructs the click conversion.
click_conversion = client.get_type("ClickConversion")
# Creates a user identifier using the hashed email address, using the
# normalize and hash method specifically for email addresses.
email_identifier = client.get_type("UserIdentifier")
# Optional: Specifies the user identifier source.
email_identifier.user_identifier_source = (
    client.enums.UserIdentifierSourceEnum.FIRST_PARTY
)
# Uses the normalize and hash method specifically for email addresses.
email_identifier.hashed_email = normalize_and_hash_email_address(
    raw_record["email"]
)
# Adds the user identifier to the conversion.
click_conversion.user_identifiers.append(email_identifier)

# Checks if the record has a phone number, and if so, adds a UserIdentifier
# for it.
if raw_record.get("phone") is not None:
    phone_identifier = client.get_type("UserIdentifier")
    phone_identifier.hashed_phone_number = normalize_and_hash(
        raw_record["phone"]
    )
    # Adds the phone identifier to the conversion adjustment.
    click_conversion.user_identifiers.append(phone_identifier)
      

Ruby

# Extract user email and phone from the raw data, normalize and hash it,
# then wrap it in UserIdentifier objects. Create a separate UserIdentifier
# object for each. The data in this example is hardcoded, but in your
# application you might read the raw data from an input file.

# IMPORTANT: Since the identifier attribute of UserIdentifier
# (https://developers.google.com/google-ads/api/reference/rpc/latest/UserIdentifier)
# is a oneof
# (https://protobuf.dev/programming-guides/proto3/#oneof-features), you must
# set only ONE of hashed_email, hashed_phone_number, mobile_id,
# third_party_user_id, or address_info. Setting more than one of these
# attributes on the same UserIdentifier will clear all the other members of
# the oneof. For example, the following code is INCORRECT and will result in
# a UserIdentifier with ONLY a hashed_phone_number:
#
# incorrectly_populated_user_identifier.hashed_email = "...""
# incorrectly_populated_user_identifier.hashed_phone_number = "...""

raw_record = {
  # Email address that includes a period (.) before the Gmail domain.
  "email" => "alex.2@example.com",
  # Phone number to be converted to E.164 format, with a leading '+' as
  # required.
  "phone" => "+1 800 5550102",
  # This example lets you input conversion details as arguments,
  # but in reality you might store this data alongside other user data,
  # so we include it in this sample user record.
  "order_id" => order_id,
  "gclid" => gclid,
  "conversion_action_id" => conversion_action_id,
  "conversion_date_time" => conversion_date_time,
  "conversion_value" => conversion_value,
  "currency_code" => "USD",
  "ad_user_data_consent" => ad_user_data_consent,
  "session_attributes_encoded" => session_attributes_encoded,
  "session_attributes_hash" => session_attributes_hash
}

click_conversion = client.resource.click_conversion do |cc|
  cc.conversion_action = client.path.conversion_action(customer_id, conversion_action_id)
  cc.conversion_date_time = conversion_date_time
  cc.conversion_value = conversion_value.to_f
  cc.currency_code = 'USD'

  unless order_id.nil?
    cc.order_id = order_id
  end

  unless raw_record["gclid"].nil?
    cc.gclid = gclid
  end

  # Specifies whether user consent was obtained for the data you are
  # uploading. For more details, see:
  # https://www.google.com/about/company/user-consent-policy
  unless raw_record["ad_user_data_consent"].nil?
    cc.consent = client.resource.consent do |c|
      c.ad_user_data = ad_user_data_consent
    end
  end

  # Set one of the session_attributes_encoded or
  # session_attributes_key_value_pairs fields if either are provided.
  if session_attributes_encoded != nil
    cc.class.module_eval { attr_accessor :session_attributes_encoded}
    cc.session_attributes_encoded = session_attributes_encoded
  elsif session_attributes_hash != nil
    # Add new attribute to click conversion object
    cc.class.module_eval { attr_accessor :session_attributes_key_value_pairs}
    cc.session_attributes_key_value_pairs = ::Google::Ads::GoogleAds::V19::Services::SessionAttributesKeyValuePairs.new

    # Loop thru inputted session_attributes_hash to populate session_attributes_key_value_pairs
    session_attributes_hash.each do |key, value|
      pair = ::Google::Ads::GoogleAds::V19::Services::SessionAttributeKeyValuePair.new
      pair.session_attribute_key = key
      pair.session_attribute_value = value
      cc.session_attributes_key_value_pairs.key_value_pairs << pair
    end
  end    

  # Creates a user identifier using the hashed email address, using the
  # normalize and hash method specifically for email addresses.
  # If using a phone number, use the normalize_and_hash method instead.
  cc.user_identifiers << client.resource.user_identifier do |ui|
    ui.hashed_email = normalize_and_hash_email(raw_record["email"])
    # Optional: Specifies the user identifier source.
    ui.user_identifier_source = :FIRST_PARTY
  end

  # Checks if the record has a phone number, and if so, adds a UserIdentifier
  # for it.
  unless raw_record["phone"].nil?
    cc.user_identifiers << client.resource.user_identifier do |ui|
      ui.hashed_phone_number = normalize_and_hash(raw_record["phone"])
    end
  end
end
      

Perl

# Create an empty click conversion.
my $click_conversion =
  Google::Ads::GoogleAds::V19::Services::ConversionUploadService::ClickConversion
  ->new({});

# Extract user email and phone from the raw data, normalize and hash it,
# then wrap it in UserIdentifier objects. Create a separate UserIdentifier
# object for each.
# The data in this example is hardcoded, but in your application
# you might read the raw data from an input file.
#
# IMPORTANT: Since the identifier attribute of UserIdentifier
# (https://developers.google.com/google-ads/api/reference/rpc/latest/UserIdentifier)
# is a oneof
# (https://protobuf.dev/programming-guides/proto3/#oneof-features), you must set
# only ONE of hashed_email, hashed_phone_number, mobile_id, third_party_user_id,
# or address-info. Setting more than one of these attributes on the same UserIdentifier
# will clear all the other members of the oneof. For example, the following code is
# INCORRECT and will result in a UserIdentifier with ONLY a hashed_phone_number:
#
# my $incorrect_user_identifier = Google::Ads::GoogleAds::V19::Common::UserIdentifier->new({
#   hashedEmail => '...',
#   hashedPhoneNumber => '...',
# });
my $raw_record = {
  # Email address that includes a period (.) before the Gmail domain.
  email => 'alex.2@example.com',
  # Phone number to be converted to E.164 format, with a leading '+' as
  # required.
  phone => '+1 800 5550102',
  # This example lets you input conversion details as arguments,
  # but in reality you might store this data alongside other user data,
  # so we include it in this sample user record.
  orderId            => $order_id,
  gclid              => $gclid,
  conversionActionId => $conversion_action_id,
  conversionDateTime => $conversion_date_time,
  conversionValue    => $conversion_value,
  currencyCode       => "USD",
  adUserDataConsent  => $ad_user_data_consent
};
my $user_identifiers = [];

# Create a user identifier using the hashed email address, using the normalize
# and hash method specifically for email addresses.
my $hashed_email = normalize_and_hash_email_address($raw_record->{email});
push(
  @$user_identifiers,
  Google::Ads::GoogleAds::V19::Common::UserIdentifier->new({
      hashedEmail => $hashed_email,
      # Optional: Specify the user identifier source.
      userIdentifierSource => FIRST_PARTY
    }));

# Create a user identifier using normalized and hashed phone info.
my $hashed_phone = normalize_and_hash($raw_record->{phone});
push(
  @$user_identifiers,
  Google::Ads::GoogleAds::V19::Common::UserIdentifier->new({
      hashedPhone => $hashed_phone,
      # Optional: Specify the user identifier source.
      userIdentifierSource => FIRST_PARTY
    }));

# Add the user identifiers to the conversion.
$click_conversion->{userIdentifiers} = $user_identifiers;
      

In diesem Beispiel wird gezeigt, wie Sie andere erforderliche Felder für ein ClickConversion-Objekt festlegen.

Java

// Adds details of the conversion.
clickConversionBuilder.setConversionAction(
    ResourceNames.conversionAction(
        customerId, Long.parseLong(rawRecord.get("conversionActionId"))));
clickConversionBuilder.setConversionDateTime(rawRecord.get("conversionDateTime"));
clickConversionBuilder.setConversionValue(Double.parseDouble(rawRecord.get("conversionValue")));
clickConversionBuilder.setCurrencyCode(rawRecord.get("currencyCode"));

// Sets the order ID if provided.
if (rawRecord.containsKey("orderId")) {
  clickConversionBuilder.setOrderId(rawRecord.get("orderId"));
}

// Sets the Google click ID (gclid) if provided.
if (rawRecord.containsKey("gclid")) {
  clickConversionBuilder.setGclid(rawRecord.get("gclid"));
}

// Sets the consent information, if provided.
if (rawRecord.containsKey("adUserDataConsent")) {
  // Specifies whether user consent was obtained for the data you are uploading. See
  // https://www.google.com/about/company/user-consent-policy for details.
  clickConversionBuilder.setConsent(
      Consent.newBuilder()
          .setAdUserData(ConsentStatus.valueOf(rawRecord.get("adUserDataConsent"))));
}

// Sets one of the sessionAttributesEncoded or sessionAttributesKeyValuePairs if either is
// provided.
if (rawRecord.containsKey("sessionAttributesEncoded")) {
  clickConversionBuilder.setSessionAttributesEncoded(
      ByteString.copyFromUtf8(rawRecord.get("sessionAttributesEncoded")));
} else if (rawRecord.containsKey("sessionAttributesMap")) {
  List<String> pairings =
      Arrays.stream(rawRecord.get("sessionAttributesMap").split(" "))
          .map(String::trim)
          .collect(Collectors.toList());
  SessionAttributesKeyValuePairs.Builder sessionAttributePairs =
      SessionAttributesKeyValuePairs.newBuilder();
  for (String pair : pairings) {
    String[] parts = pair.split("=", 2);
    if (parts.length != 2) {
      throw new IllegalArgumentException(
          "Failed to read the sessionAttributesMap. SessionAttributesMap must use a "
              + "space-delimited list of session attribute key value pairs. Each pair should be"
              + " separated by an equal sign, for example: 'gad_campaignid=12345 gad_source=1'");
    }
    sessionAttributePairs.addKeyValuePairs(
        SessionAttributeKeyValuePair.newBuilder()
            .setSessionAttributeKey(parts[0])
            .setSessionAttributeValue(parts[1])
            .build());
  }
  clickConversionBuilder.setSessionAttributesKeyValuePairs(sessionAttributePairs.build());
}

// Calls build to build the conversion.
ClickConversion clickConversion = clickConversionBuilder.build();
      

C#

// Adds details of the conversion.
clickConversion.ConversionAction =
    ResourceNames.ConversionAction(customerId, conversionActionId);
clickConversion.ConversionDateTime = conversionDateTime;
clickConversion.ConversionValue = conversionValue;
clickConversion.CurrencyCode = "USD";

// Sets the order ID if provided.
if (!string.IsNullOrEmpty(orderId))
{
    clickConversion.OrderId = orderId;
}

// Sets the Google click ID (gclid) if provided.
if (!string.IsNullOrEmpty(gclid))
{
    clickConversion.Gclid = gclid;
}

if (!string.IsNullOrEmpty(sessionAttributesEncoded))
{
    clickConversion.SessionAttributesEncoded =
        ByteString.CopyFrom(sessionAttributesEncoded, Encoding.Unicode);
}
else if (!string.IsNullOrEmpty(sessionAttributes))
{
    IEnumerable<SessionAttributeKeyValuePair> parsedSessionAttributes =
        sessionAttributes.Split(';').Select(pair => {
            string[] split = pair.Split('=');
            return new SessionAttributeKeyValuePair()
            {
                SessionAttributeKey = split[0],
                SessionAttributeValue = split[1]
            };
        });

    clickConversion.SessionAttributesKeyValuePairs =
        new SessionAttributesKeyValuePairs();
    clickConversion.SessionAttributesKeyValuePairs.KeyValuePairs
        .AddRange(parsedSessionAttributes);
}

      

PHP

// Adds details of the conversion.
$clickConversion->setConversionAction(
    ResourceNames::forConversionAction($customerId, $rawRecord['conversionActionId'])
);
$clickConversion->setConversionDateTime($rawRecord['conversionDateTime']);
$clickConversion->setConversionValue($rawRecord['conversionValue']);
$clickConversion->setCurrencyCode($rawRecord['currencyCode']);

// Sets the order ID if provided.
if (!empty($rawRecord['orderId'])) {
    $clickConversion->setOrderId($rawRecord['orderId']);
}

// Sets the Google click ID (gclid) if provided.
if (!empty($rawRecord['gclid'])) {
    $clickConversion->setGclid($rawRecord['gclid']);
}

// Sets the ad user data consent if provided.
if (!empty($rawRecord['adUserDataConsent'])) {
    // Specifies whether user consent was obtained for the data you are uploading. See
    // https://www.google.com/about/company/user-consent-policy for details.
    $clickConversion->setConsent(
        new Consent(['ad_user_data' => $rawRecord['adUserDataConsent']])
    );
}
      

Python

# Add details of the conversion.
# Gets the conversion action resource name.
conversion_action_service = client.get_service("ConversionActionService")
click_conversion.conversion_action = (
    conversion_action_service.conversion_action_path(
        customer_id, raw_record["conversion_action_id"]
    )
)
click_conversion.conversion_date_time = raw_record["conversion_date_time"]
click_conversion.conversion_value = raw_record["conversion_value"]
click_conversion.currency_code = raw_record["currency_code"]

# Sets the order ID if provided.
if raw_record.get("order_id"):
    click_conversion.order_id = raw_record["order_id"]

# Sets the gclid if provided.
if raw_record.get("gclid"):
    click_conversion.gclid = raw_record["gclid"]

# Specifies whether user consent was obtained for the data you are
# uploading. For more details, see:
# https://www.google.com/about/company/user-consent-policy
if raw_record["ad_user_data_consent"]:
    click_conversion.consent.ad_user_data = client.enums.ConsentStatusEnum[
        raw_record["ad_user_data_consent"]
    ]

# Set one of the session_attributes_encoded or
# session_attributes_key_value_pairs fields if either are provided.
if session_attributes_encoded:
    click_conversion.session_attributes_encoded = session_attributes_encoded
elif session_attributes_dict:
    for key, value in session_attributes_dict.items():
        pair = client.get_type("SessionAttributeKeyValuePair")
        pair.session_attribute_key = key
        pair.session_attribute_value = value
        click_conversion.session_attributes_key_value_pairs.key_value_pairs.append(
            pair
        )
      

Ruby

cc.conversion_action = client.path.conversion_action(customer_id, conversion_action_id)
cc.conversion_date_time = conversion_date_time
cc.conversion_value = conversion_value.to_f
cc.currency_code = 'USD'

unless order_id.nil?
  cc.order_id = order_id
end

unless raw_record["gclid"].nil?
  cc.gclid = gclid
end

# Specifies whether user consent was obtained for the data you are
# uploading. For more details, see:
# https://www.google.com/about/company/user-consent-policy
unless raw_record["ad_user_data_consent"].nil?
  cc.consent = client.resource.consent do |c|
    c.ad_user_data = ad_user_data_consent
  end
end

# Set one of the session_attributes_encoded or
# session_attributes_key_value_pairs fields if either are provided.
if session_attributes_encoded != nil
  cc.class.module_eval { attr_accessor :session_attributes_encoded}
  cc.session_attributes_encoded = session_attributes_encoded
elsif session_attributes_hash != nil
  # Add new attribute to click conversion object
  cc.class.module_eval { attr_accessor :session_attributes_key_value_pairs}
  cc.session_attributes_key_value_pairs = ::Google::Ads::GoogleAds::V19::Services::SessionAttributesKeyValuePairs.new

  # Loop thru inputted session_attributes_hash to populate session_attributes_key_value_pairs
  session_attributes_hash.each do |key, value|
    pair = ::Google::Ads::GoogleAds::V19::Services::SessionAttributeKeyValuePair.new
    pair.session_attribute_key = key
    pair.session_attribute_value = value
    cc.session_attributes_key_value_pairs.key_value_pairs << pair
  end
end    
      

Perl

# Add details of the conversion.
$click_conversion->{conversionAction} =
  Google::Ads::GoogleAds::V19::Utils::ResourceNames::conversion_action(
  $customer_id, $raw_record->{conversionActionId});
$click_conversion->{conversionDateTime} = $raw_record->{conversionDateTime};
$click_conversion->{conversionValue}    = $raw_record->{conversionValue};
$click_conversion->{currencyCode}       = $raw_record->{currencyCode};

# Set the order ID if provided.
if (defined $raw_record->{orderId}) {
  $click_conversion->{orderId} = $raw_record->{orderId};
}

# Set the Google click ID (gclid) if provided.
if (defined $raw_record->{gclid}) {
  $click_conversion->{gclid} = $raw_record->{gclid};
}

# Set the consent information, if provided.
if (defined $raw_record->{adUserDataConsent}) {
  $click_conversion->{consent} =
    Google::Ads::GoogleAds::V19::Common::Consent->new({
      adUserData => $raw_record->{adUserDataConsent}});
}

# Set one of the session_attributes_encoded or session_attributes_key_value_pairs
# fields if either are provided.
if (defined $session_attributes_encoded) {
  $click_conversion->{sessionAttributesEncoded} = $session_attributes_encoded;
} elsif (defined $session_attributes_hash) {
  while (my ($key, $value) = each %$session_attributes_hash) {
    my $pair =
      Google::Ads::GoogleAds::V19::Services::ConversionUploadService::SessionAttributeKeyValuePair
      ->new({sessionAttributeKey => $key, sessionAttributeValue => $value});
    push @{$click_conversion->{sessionAttributesKeyValuePairs}{keyValuePairs}
    }, $pair;
  }
}
      

Erstellen Sie die Anfrage

Nachdem Sie Ihre ClickConversion-Objekte konfiguriert und dem conversions-Feld des UploadClickConversionRequest-Objekts hinzugefügt haben, legen Sie die folgenden Felder fest und übergeben Sie die Anfrage an die UploadClickConversions-Methode auf dem ConversionUploadService.

customer_id
Legen Sie hier den Google Ads-Conversion-Kunden des Kontos fest, auf das die Klicks zurückzuführen sind. Wenn Sie sich nicht sicher sind, welches Konto das richtige ist, sehen Sie sich das Feld customer.conversion_tracking_setting.google_ads_conversion_customer in der Beispielabfrage im Abschnitt Einstieg an.
job_id

Bietet einen Mechanismus, mit dem Sie Ihre Importanfragen mit den Informationen pro Job in der Offlinedatendiagnose verknüpfen können.

Wenn Sie dieses Feld nicht festlegen, weist die Google Ads API jeder Anfrage einen eindeutigen Wert im Bereich [2^31, 2^63) zu. Wenn Sie mehrere Anfragen in einem einzigen logischen Job gruppieren möchten, setzen Sie dieses Feld für jede Anfrage in Ihrem Job auf denselben Wert im Bereich [0, 2^31).

Die job_id in der Antwort enthält die Job-ID für die Anfrage, unabhängig davon, ob Sie einen Wert angegeben oder der Google Ads API erlaubt haben, einen Wert zuzuweisen.

partial_failure

Dieses Feld muss beim Importieren von Conversions auf true gesetzt sein. Beachte bei der Verarbeitung der Antwort die Richtlinien für teilweise Fehler.

Anfrage importieren

Nachdem Sie Ihre ClickConversion-Objekte ausgefüllt und die Anfrage erstellt haben, können Sie den Import einreichen.

Java

// Creates the conversion upload service client.
try (ConversionUploadServiceClient conversionUploadServiceClient =
    googleAdsClient.getLatestVersion().createConversionUploadServiceClient()) {
  // Uploads the click conversion. Partial failure should always be set to true.

  // NOTE: This request contains a single conversion as a demonstration.  However, if you have
  // multiple conversions to upload, it's best to upload multiple conversions per request
  // instead of sending a separate request per conversion. See the following for per-request
  // limits:
  // https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service
  UploadClickConversionsResponse response =
      conversionUploadServiceClient.uploadClickConversions(
          UploadClickConversionsRequest.newBuilder()
              .setCustomerId(Long.toString(customerId))
              .addConversions(clickConversion)
              // Enables partial failure (must be true).
              .setPartialFailure(true)
              .build());
      

C#

// Uploads the click conversion. Partial failure should always be set to true.
// NOTE: This request contains a single conversion as a demonstration.
// However, if you have multiple conversions to upload, it's best to upload multiple
// conversions per request instead of sending a separate request per conversion.
// See the following for per-request limits:
// https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload
UploadClickConversionsResponse response =
    conversionUploadService.UploadClickConversions(
        new UploadClickConversionsRequest()
        {
            CustomerId = customerId.ToString(),
            Conversions = { clickConversion },
            // Enables partial failure (must be true).
            PartialFailure = true
        });

      

PHP

// Issues a request to upload the click conversion.
$conversionUploadServiceClient = $googleAdsClient->getConversionUploadServiceClient();
// NOTE: This request contains a single conversion as a demonstration.  However, if you have
// multiple conversions to upload, it's best to upload multiple conversions per request
// instead of sending a separate request per conversion. See the following for per-request
// limits:
// https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service
$response = $conversionUploadServiceClient->uploadClickConversions(
    // Enables partial failure (must be true).
    UploadClickConversionsRequest::build($customerId, [$clickConversion], true)
);
      

Python

# Creates the conversion upload service client.
conversion_upload_service = client.get_service("ConversionUploadService")
# Uploads the click conversion. Partial failure should always be set to
# True.
# NOTE: This request only uploads a single conversion, but if you have
# multiple conversions to upload, it's most efficient to upload them in a
# single request. See the following for per-request limits for reference:
# https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service
response = conversion_upload_service.upload_click_conversions(
    customer_id=customer_id,
    conversions=[click_conversion],
    # Enables partial failure (must be true).
    partial_failure=True,
)
      

Ruby

response = client.service.conversion_upload.upload_click_conversions(
  customer_id: customer_id,
  conversions: [click_conversion],
  # Partial failure must be true.
  partial_failure: true,
)

if response.partial_failure_error
  puts "Partial failure encountered: #{response.partial_failure_error.message}"
else
  result = response.results.first
  puts "Uploaded click conversion that happened at #{result.conversion_date_time} " \
    "to #{result.conversion_action}."
end
      

Perl

# Upload the click conversion. Partial failure should always be set to true.
#
# NOTE: This request contains a single conversion as a demonstration.
# However, if you have multiple conversions to upload, it's best to
# upload multiple conversions per request instead of sending a separate
# request per conversion. See the following for per-request limits:
# https://developers.google.com/google-ads/api/docs/best-practices/quotas#conversion_upload_service
my $response =
  $api_client->ConversionUploadService()->upload_click_conversions({
    customerId  => $customer_id,
    conversions => [$click_conversion],
    # Enable partial failure (must be true).
    partialFailure => "true"
  });
      

Importe überprüfen

Im Bericht „Erweiterte Conversions für Leads“ sehen Sie den Gesamtstatus Ihrer letzten Importe.

Importierte Conversions werden in Berichten für das Impressionsdatum des ursprünglichen Klicks berücksichtigt, nicht für das Datum der Importanfrage oder das Datum des conversion_date_time der ClickConversion.

Es kann bis zu drei Stunden dauern, bis die Statistiken zu importierten Conversions für die Attribution vom letzten Klick in Ihrem Google Ads-Konto zu sehen sind. Bei anderen Suchattributionsmodellen kann es länger als drei Stunden dauern. Weitere Informationen finden Sie im Leitfaden zur Datenaktualität.

Wenn Sie Berichte zu Conversion-Messwerten für Ihre Kampagnen erstellen, lesen Sie den Hilfeartikel Messwerte der Benutzeroberfläche zuordnen, um die Messwerte der Google Ads-Benutzeroberfläche den Berichtsfeldern der Google Ads API zuzuordnen. Sie können auch die Ressource conversion_action abfragen, um die Gesamtzahl der Conversions und den Conversion-Wert insgesamt für eine bestimmte Conversion-Aktion aufzurufen.

Best Practices

Beachten Sie die folgenden Best Practices, wenn Sie erweiterte Conversions für Leads implementieren.

Alle Conversion-Daten senden, unabhängig von ihrer Vollständigkeit

Damit Sie vollständige und korrekte Conversion-Berichte erhalten, sollten Sie alle verfügbaren Offline-Conversion-Ereignisse importieren – auch solche, die nicht aus Google Ads stammen. Conversions, die nur von Nutzern bereitgestellte Daten enthalten, sind weiterhin nützlich und können sich positiv auf die Optimierung von Google Ads-Kampagnen auswirken.

Wenn Sie einer Conversion eine order_id zuweisen, sollten Sie sie angeben. Wenn Sie die GCLID für eine Conversion haben, empfehlen wir, sie zusätzlich zur user_identifiers zu senden, um die Leistung zu verbessern. Wenn Sie für die Conversion mehr als einen UserIdentifier haben, sollten Sie alle im ClickConversion-Objekt angeben, um die Wahrscheinlichkeit eines Abgleichs zu erhöhen.

Mehrere Conversions in einer einzigen Anfrage senden

Wenn Sie mehrere Conversions importieren möchten, sollten Sie sie in einer einzigen UploadClickConversionsRequest zusammenfassen, anstatt eine Importanfrage pro Conversion zu senden.

Im Leitfaden zu Kontingenten finden Sie Limits für die Anzahl der Conversions pro Anfrage.

Wenn Sie mit der Offlinedatendiagnose mehrere Anfragen in einem logischen Job gruppieren möchten, müssen Sie für alle Anfragen denselben Wert für job_id festlegen. Das kann nützlich sein, wenn Sie mit einem einzelnen Job oder Prozess eine große Anzahl von Conversions über mehrere Anfragen importieren. Wenn Sie für jede dieser Anfragen denselben Wert für job_id festlegen, können Sie einen einzelnen Eintrag für den Job aus job_summaries abrufen. Wenn Sie stattdessen der job_id jeder Anfrage einen systemgenerierten Wert zuweisen lassen, enthält die job_summaries einen separaten Eintrag für jede Anfrage. Das kann die Analyse des Gesamtzustands Ihres Jobs erschweren.

Keine externen Attributionsdaten verwenden

Wenn Sie erweiterte Conversions für Leads verwenden, sollten Sie für die ClickConversion keine external_attribution_data festlegen und keine conversion_action angeben, für die ein externes Attributionsmodell verwendet wird. In Google Ads werden extern zugeordnete Conversions für Importe mit von Nutzern bereitgestellten Daten nicht unterstützt.

Fehlerbehebung

Die Offline-Datendiagnose bietet eine zentrale Ressource, mit der Sie den Gesamtstatus Ihrer Importe kontinuierlich prüfen können. Während der Implementierung können Sie jedoch die Informationen in diesem Abschnitt verwenden, um Fehler zu untersuchen, die im Feld partial_failure_error der Antwort gemeldet wurden.

Zu den häufigsten Fehlern beim Importieren von Conversion-Aktionen gehören Autorisierungsfehler wie USER_PERMISSION_DENIED. Prüfen Sie, ob die Kundennummer in Ihrer Anfrage auf den Google Ads-Conversion-Kunden festgelegt ist, dem die Conversion-Aktion zugewiesen ist. Weitere Informationen finden Sie in unserem Leitfaden zur Autorisierung. In unserem Leitfaden zu häufigen Fehlern finden Sie Tipps zur Behebung dieser verschiedenen Fehler.

Häufige Fehler beheben

Fehler
NO_CONVERSION_ACTION_FOUND

Die angegebene Conversion-Aktion ist entweder nicht aktiviert oder es kann über das im Feld „client_id“ in der Anfrage angegebene Kundenkonto nicht darauf zugegriffen werden. Die Conversion-Aktion in Ihrem Upload muss aktiviert sein und dem Kunden gehören, der die Uploadanfrage sendet.

Dieser Fehler kann auch auftreten, wenn die GCLID in der Anfrage zu einem Kundenkonto gehört, das keinen Zugriff auf die in der Anfrage angegebene Conversion-Aktion hat. Sie können mithilfe der Ressource click_view prüfen, ob eine GCLID zu einem Kundenkonto gehört. Reichen Sie dazu eine Abfrage ein, die nach click_view.gclid und segments.date filtert. Das Datum ist das Datum des Klicks.

INVALID_CONVERSION_ACTION_TYPE Der Typ der angegebenen Conversion-Aktion ist für erweiterte Conversions für Leads nicht zulässig. Achten Sie darauf, dass die in Ihrer Uploadanfrage angegebene ConversionAction den Typ UPLOAD_CLICKS hat.
CUSTOMER_NOT_ENABLED_ENHANCED_CONVERSIONS_FOR_LEADS Achten Sie darauf, dass Sie in den Conversion-Einstellungen erweiterte Conversions für Leads aktiviert haben. Eine Anleitung dazu finden Sie im Leitfaden zu Voraussetzungen.
DUPLICATE_ORDER_ID Die importierten Ereignisse umfassen mehrere Conversions mit derselben Bestell-ID und wurden nicht verarbeitet. Vergewissern Sie sich, dass die Bestell-IDs eindeutig sind, und versuchen Sie es noch einmal.
CLICK_NOT_FOUND Es wurde kein Klick gefunden, der mit den angegebenen Nutzer-IDs übereinstimmt. Die Google Ads API gibt diesen Fehler nur zurück, wenn debug_enabled auf dem UploadClickConversionsRequest true ist.

Wenn bei einer Conversion diese Warnung auftritt, wird sie in der Google Ads API in die successful_event_count der Offlinedatendiagnose aufgenommen. Die Google Ads API enthält einen Eintrag für CLICK_NOT_FOUND in der Sammlung alerts, damit Sie die Häufigkeit dieser Warnung im Blick behalten können.

Dieser Fehler ist zu erwarten, wenn der Klick nicht aus einer Google Ads-Kampagne stammt. Sie können beispielsweise aus SA360 oder DV360 stammen. Weitere mögliche Ursachen:

In seltenen Fällen, in denen der Kunde, der die Daten hochlädt, nicht mit dem Google Ads-Conversion-Kunden übereinstimmt, kann dieser Fehler bedeuten, dass der Kunde, der die Daten hochlädt, die Nutzungsbedingungen für Kundendaten akzeptiert hat, der Kunde, für den die Anzeigen ausgeliefert werden, dies aber nicht getan hat.

Ob ein Konto die Nutzungsbedingungen für Kundendaten akzeptiert hat, können Sie anhand der Ressource customer und des Felds customer.offline_conversion_tracking_info.accepted_customer_data_terms ermitteln.