Consulte esta guía para obtener información sobre las actualizaciones, las eliminaciones y los informes de las listas de clientes.
Cómo actualizar una lista con offlineUserDataJobService
Después de crear tus listas de clientes y configurar la segmentación, es mejor y actualizarlas con frecuencia.
Para actualizar tus listas con los datos más recientes, suele ser más eficiente agregar o quitar usuarios individuales, en lugar de quitar a todos los usuarios de la lista y subirlos desde cero.
Agrega datos a una lista
Para agregarlo a una lista existente, crea un OfflineUserDataJob
de la misma manera.
que aplicarías al crear una nueva lista de clientes.
Java
private void addUsersToCustomerMatchUserList( GoogleAdsClient googleAdsClient, long customerId, boolean runJob, String userListResourceName, Long offlineUserDataJobId, ConsentStatus adPersonalizationConsent, ConsentStatus adUserDataConsent) throws UnsupportedEncodingException { try (OfflineUserDataJobServiceClient offlineUserDataJobServiceClient = googleAdsClient.getLatestVersion().createOfflineUserDataJobServiceClient()) { String offlineUserDataJobResourceName; if (offlineUserDataJobId == null) { // Creates a new offline user data job. OfflineUserDataJob.Builder offlineUserDataJobBuilder = OfflineUserDataJob.newBuilder() .setType(OfflineUserDataJobType.CUSTOMER_MATCH_USER_LIST) .setCustomerMatchUserListMetadata( CustomerMatchUserListMetadata.newBuilder().setUserList(userListResourceName)); // Adds consent information to the job if specified. if (adPersonalizationConsent != null || adUserDataConsent != null) { Consent.Builder consentBuilder = Consent.newBuilder(); if (adPersonalizationConsent != null) { consentBuilder.setAdPersonalization(adPersonalizationConsent); } if (adUserDataConsent != null) { consentBuilder.setAdUserData(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. offlineUserDataJobBuilder .getCustomerMatchUserListMetadataBuilder() .setConsent(consentBuilder); } // Issues a request to create the offline user data job. CreateOfflineUserDataJobResponse createOfflineUserDataJobResponse = offlineUserDataJobServiceClient.createOfflineUserDataJob( Long.toString(customerId), offlineUserDataJobBuilder.build()); offlineUserDataJobResourceName = createOfflineUserDataJobResponse.getResourceName(); System.out.printf( "Created an offline user data job with resource name: %s.%n", offlineUserDataJobResourceName); } else { // Reuses the specified offline user data job. offlineUserDataJobResourceName = ResourceNames.offlineUserDataJob(customerId, offlineUserDataJobId); } // Issues a request to add the operations to the offline user data job. This example // only adds a few operations, so it only sends one AddOfflineUserDataJobOperations request. // If your application is adding a large number of operations, split the operations into // batches and send multiple AddOfflineUserDataJobOperations requests for the SAME job. See // https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations // and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data // for more information on the per-request limits. List<OfflineUserDataJobOperation> userDataJobOperations = buildOfflineUserDataJobOperations(); AddOfflineUserDataJobOperationsResponse response = offlineUserDataJobServiceClient.addOfflineUserDataJobOperations( AddOfflineUserDataJobOperationsRequest.newBuilder() .setResourceName(offlineUserDataJobResourceName) .setEnablePartialFailure(true) .addAllOperations(userDataJobOperations) .build()); // Prints the status message if any partial failure error is returned. // NOTE: The details of each partial failure error are not printed here, you can refer to // the example HandlePartialFailure.java to learn more. if (response.hasPartialFailureError()) { GoogleAdsFailure googleAdsFailure = ErrorUtils.getInstance().getGoogleAdsFailure(response.getPartialFailureError()); System.out.printf( "Encountered %d partial failure errors while adding %d operations to the offline user " + "data job: '%s'. Only the successfully added operations will be executed when " + "the job runs.%n", googleAdsFailure.getErrorsCount(), userDataJobOperations.size(), response.getPartialFailureError().getMessage()); } else { System.out.printf( "Successfully added %d operations to the offline user data job.%n", userDataJobOperations.size()); } if (!runJob) { System.out.printf( "Not running offline user data job '%s', as requested.%n", offlineUserDataJobResourceName); return; } // Issues an asynchronous request to run the offline user data job for executing // all added operations. offlineUserDataJobServiceClient.runOfflineUserDataJobAsync(offlineUserDataJobResourceName); // BEWARE! The above call returns an OperationFuture. The execution of that future depends on // the thread pool which is owned by offlineUserDataJobServiceClient. If you use this future, // you *must* keep the service client in scope too. // See https://developers.google.com/google-ads/api/docs/client-libs/java/lro for more detail. // Offline user data jobs may take 6 hours or more to complete, so instead of waiting for the // job to complete, retrieves and displays the job status once. If the job is completed // successfully, prints information about the user list. Otherwise, prints the query to use // to check the job again later. checkJobStatus(googleAdsClient, customerId, offlineUserDataJobResourceName); } }
C#
private static string AddUsersToCustomerMatchUserList(GoogleAdsClient client, long customerId, string userListResourceName, bool runJob, long? offlineUserDataJobId, ConsentStatus? adPersonalizationConsent, ConsentStatus? adUserDataConsent) { // Get the OfflineUserDataJobService. OfflineUserDataJobServiceClient service = client.GetService( Services.V17.OfflineUserDataJobService); string offlineUserDataJobResourceName; if (offlineUserDataJobId == null) { // Creates a new offline user data job. OfflineUserDataJob offlineUserDataJob = new OfflineUserDataJob() { Type = OfflineUserDataJobType.CustomerMatchUserList, CustomerMatchUserListMetadata = new CustomerMatchUserListMetadata() { UserList = userListResourceName, } }; if (adUserDataConsent != null || adPersonalizationConsent != null) { // Specifies whether user consent was obtained for the data you are uploading. // See https://www.google.com/about/company/user-consent-policy // for details. offlineUserDataJob.CustomerMatchUserListMetadata.Consent = new Consent(); if (adPersonalizationConsent != null) { offlineUserDataJob.CustomerMatchUserListMetadata.Consent.AdPersonalization = (ConsentStatus)adPersonalizationConsent; } if (adUserDataConsent != null) { offlineUserDataJob.CustomerMatchUserListMetadata.Consent.AdUserData = (ConsentStatus)adUserDataConsent; } } // Issues a request to create the offline user data job. CreateOfflineUserDataJobResponse response1 = service.CreateOfflineUserDataJob( customerId.ToString(), offlineUserDataJob); offlineUserDataJobResourceName = response1.ResourceName; Console.WriteLine($"Created an offline user data job with resource name: " + $"'{offlineUserDataJobResourceName}'."); } else { // Reuses the specified offline user data job. offlineUserDataJobResourceName = ResourceNames.OfflineUserDataJob(customerId, offlineUserDataJobId.Value); } AddOfflineUserDataJobOperationsRequest request = new AddOfflineUserDataJobOperationsRequest() { ResourceName = offlineUserDataJobResourceName, Operations = { BuildOfflineUserDataJobOperations() }, EnablePartialFailure = true, }; // Issues a request to add the operations to the offline user data job. This example // only adds a few operations, so it only sends one AddOfflineUserDataJobOperations // request. // If your application is adding a large number of operations, split the operations into // batches and send multiple AddOfflineUserDataJobOperations requests for the SAME job. // See https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations // and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data // for more information on the per-request limits. AddOfflineUserDataJobOperationsResponse response2 = service.AddOfflineUserDataJobOperations(request); // Prints the status message if any partial failure error is returned. // Note: The details of each partial failure error are not printed here, // you can refer to the example HandlePartialFailure.cs to learn more. if (response2.PartialFailureError != null) { // Extracts the partial failure from the response status. GoogleAdsFailure partialFailure = response2.PartialFailure; Console.WriteLine($"{partialFailure.Errors.Count} partial failure error(s) " + $"occurred"); } Console.WriteLine("The operations are added to the offline user data job."); if (!runJob) { Console.WriteLine($"Not running offline user data job " + "'{offlineUserDataJobResourceName}', as requested."); return offlineUserDataJobResourceName; } // Issues an asynchronous request to run the offline user data job for executing // all added operations. Operation<Empty, OfflineUserDataJobMetadata> operationResponse = service.RunOfflineUserDataJob(offlineUserDataJobResourceName); Console.WriteLine("Asynchronous request to execute the added operations started."); // Since offline user data jobs may take 24 hours or more to complete, it may not be // practical to do operationResponse.PollUntilCompleted() to wait for the results. // Instead, we save the offlineUserDataJobResourceName and use GoogleAdsService.Search // to check for the job status periodically. // In case you wish to follow the PollUntilCompleted or PollOnce approach, make sure // you keep both operationResponse and service variables alive until the polling // completes. return offlineUserDataJobResourceName; }
PHP
private static function addUsersToCustomerMatchUserList( GoogleAdsClient $googleAdsClient, int $customerId, bool $runJob, ?string $userListResourceName, ?int $offlineUserDataJobId, ?int $adPersonalizationConsent, ?int $adUserDataConsent ) { $offlineUserDataJobServiceClient = $googleAdsClient->getOfflineUserDataJobServiceClient(); if (is_null($offlineUserDataJobId)) { // Creates a new offline user data job. $offlineUserDataJob = new OfflineUserDataJob([ 'type' => OfflineUserDataJobType::CUSTOMER_MATCH_USER_LIST, 'customer_match_user_list_metadata' => new CustomerMatchUserListMetadata([ 'user_list' => $userListResourceName ]) ]); // Adds consent information to the job if specified. if (!empty($adPersonalizationConsent) || !empty($adUserDataConsent)) { $consent = new Consent(); if (!empty($adPersonalizationConsent)) { $consent->setAdPersonalization($adPersonalizationConsent); } if (!empty($adUserDataConsent)) { $consent->setAdUserData($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. $offlineUserDataJob->getCustomerMatchUserListMetadata()->setConsent($consent); } // Issues a request to create the offline user data job. /** @var CreateOfflineUserDataJobResponse $createOfflineUserDataJobResponse */ $createOfflineUserDataJobResponse = $offlineUserDataJobServiceClient->createOfflineUserDataJob( CreateOfflineUserDataJobRequest::build($customerId, $offlineUserDataJob) ); $offlineUserDataJobResourceName = $createOfflineUserDataJobResponse->getResourceName(); printf( "Created an offline user data job with resource name: '%s'.%s", $offlineUserDataJobResourceName, PHP_EOL ); } else { // Reuses the specified offline user data job. $offlineUserDataJobResourceName = ResourceNames::forOfflineUserDataJob($customerId, $offlineUserDataJobId); } // Issues a request to add the operations to the offline user data job. This example // only adds a few operations, so it only sends one AddOfflineUserDataJobOperations request. // If your application is adding a large number of operations, split the operations into // batches and send multiple AddOfflineUserDataJobOperations requests for the SAME job. See // https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations // and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data // for more information on the per-request limits. /** @var AddOfflineUserDataJobOperationsResponse $operationResponse */ $response = $offlineUserDataJobServiceClient->addOfflineUserDataJobOperations( AddOfflineUserDataJobOperationsRequest::build( $offlineUserDataJobResourceName, self::buildOfflineUserDataJobOperations() )->setEnablePartialFailure(true) ); // Prints the status message if any partial failure error is returned. // Note: The details of each partial failure error are not printed here, you can refer to // the example HandlePartialFailure.php to learn more. if ($response->hasPartialFailureError()) { // Extracts the partial failure from the response status. $partialFailure = GoogleAdsFailures::fromAny( $response->getPartialFailureError()->getDetails()->getIterator()->current() ); printf( "%d partial failure error(s) occurred: %s.%s", count($partialFailure->getErrors()), $response->getPartialFailureError()->getMessage(), PHP_EOL ); } else { print 'The operations are added to the offline user data job.' . PHP_EOL; } if ($runJob === false) { printf( "Not running offline user data job '%s', as requested.%s", $offlineUserDataJobResourceName, PHP_EOL ); return; } // Issues an asynchronous request to run the offline user data job for executing all added // operations. The result is OperationResponse. Visit the OperationResponse.php file for // more details. $offlineUserDataJobServiceClient->runOfflineUserDataJob( RunOfflineUserDataJobRequest::build($offlineUserDataJobResourceName) ); // Offline user data jobs may take 6 hours or more to complete, so instead of waiting // for the job to complete, retrieves and displays the job status once. If the job is // completed successfully, prints information about the user list. Otherwise, prints the // query to use to check the job again later. self::checkJobStatus($googleAdsClient, $customerId, $offlineUserDataJobResourceName); }
Python
def add_users_to_customer_match_user_list( client, customer_id, user_list_resource_name, run_job, offline_user_data_job_id, ad_user_data_consent, ad_personalization_consent, ): """Uses Customer Match to create and add users to a new user list. Args: client: The Google Ads client. customer_id: The ID for the customer that owns the user list. user_list_resource_name: The resource name of the user list to which to add users. run_job: If true, runs the OfflineUserDataJob after adding operations. Otherwise, only adds operations to the job. offline_user_data_job_id: ID of an existing OfflineUserDataJob in the PENDING state. If None, a new job is created. ad_user_data_consent: The consent status for ad user data for all members in the job. ad_personalization_consent: The personalization consent status for ad user data for all members in the job. """ # Creates the OfflineUserDataJobService client. offline_user_data_job_service_client = client.get_service( "OfflineUserDataJobService" ) if offline_user_data_job_id: # Reuses the specified offline user data job. offline_user_data_job_resource_name = ( offline_user_data_job_service_client.offline_user_data_job_path( customer_id, offline_user_data_job_id ) ) else: # Creates a new offline user data job. offline_user_data_job = client.get_type("OfflineUserDataJob") offline_user_data_job.type_ = ( client.enums.OfflineUserDataJobTypeEnum.CUSTOMER_MATCH_USER_LIST ) offline_user_data_job.customer_match_user_list_metadata.user_list = ( user_list_resource_name ) # 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 ad_user_data_consent: offline_user_data_job.customer_match_user_list_metadata.consent.ad_user_data = client.enums.ConsentStatusEnum[ ad_user_data_consent ] if ad_personalization_consent: offline_user_data_job.customer_match_user_list_metadata.consent.ad_personalization = client.enums.ConsentStatusEnum[ ad_personalization_consent ] # Issues a request to create an offline user data job. create_offline_user_data_job_response = ( offline_user_data_job_service_client.create_offline_user_data_job( customer_id=customer_id, job=offline_user_data_job ) ) offline_user_data_job_resource_name = ( create_offline_user_data_job_response.resource_name ) print( "Created an offline user data job with resource name: " f"'{offline_user_data_job_resource_name}'." ) # Issues a request to add the operations to the offline user data job. # Best Practice: This example only adds a few operations, so it only sends # one AddOfflineUserDataJobOperations request. If your application is adding # a large number of operations, split the operations into batches and send # multiple AddOfflineUserDataJobOperations requests for the SAME job. See # https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations # and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data # for more information on the per-request limits. request = client.get_type("AddOfflineUserDataJobOperationsRequest") request.resource_name = offline_user_data_job_resource_name request.operations = build_offline_user_data_job_operations(client) request.enable_partial_failure = True # Issues a request to add the operations to the offline user data job. response = offline_user_data_job_service_client.add_offline_user_data_job_operations( request=request ) # Prints the status message if any partial failure error is returned. # Note: the details of each partial failure error are not printed here. # Refer to the error_handling/handle_partial_failure.py example to learn # more. # Extracts the partial failure from the response status. partial_failure = getattr(response, "partial_failure_error", None) if getattr(partial_failure, "code", None) != 0: error_details = getattr(partial_failure, "details", []) for error_detail in error_details: failure_message = client.get_type("GoogleAdsFailure") # Retrieve the class definition of the GoogleAdsFailure instance # in order to use the "deserialize" class method to parse the # error_detail string into a protobuf message object. failure_object = type(failure_message).deserialize( error_detail.value ) for error in failure_object.errors: print( "A partial failure at index " f"{error.location.field_path_elements[0].index} occurred.\n" f"Error message: {error.message}\n" f"Error code: {error.error_code}" ) print("The operations are added to the offline user data job.") if not run_job: print( "Not running offline user data job " f"'{offline_user_data_job_resource_name}', as requested." ) return # Issues a request to run the offline user data job for executing all # added operations. offline_user_data_job_service_client.run_offline_user_data_job( resource_name=offline_user_data_job_resource_name ) # Retrieves and displays the job status. check_job_status(client, customer_id, offline_user_data_job_resource_name)
Rita
def add_users_to_customer_match_user_list(client, customer_id, run_job, user_list, job_id, ad_user_data_consent, ad_personalization_consent) offline_user_data_service = client.service.offline_user_data_job job_name = if job_id.nil? # Creates the offline user data job. offline_user_data_job = client.resource.offline_user_data_job do |job| job.type = :CUSTOMER_MATCH_USER_LIST job.customer_match_user_list_metadata = client.resource.customer_match_user_list_metadata do |m| m.user_list = user_list if !ad_user_data_consent.nil? || !ad_personalization_consent.nil? m.consent = client.resource.consent do |c| # 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 ad_user_data_consent.nil? c.ad_user_data = ad_user_data_consent end unless ad_personalization_consent.nil? c.ad_personalization = ad_personalization_consent end end end end end # Issues a request to create the offline user data job. response = offline_user_data_service.create_offline_user_data_job( customer_id: customer_id, job: offline_user_data_job, ) offline_user_data_job_resource_name = response.resource_name puts "Created an offline user data job with resource name: " \ "#{offline_user_data_job_resource_name}" offline_user_data_job_resource_name else client.path.offline_user_data_job(customer_id, job_id) end # Issues a request to add the operations to the offline user data job. This # example only adds a few operations, so it only sends one # AddOfflineUserDataJobOperations request. If your application is adding a # large number of operations, split the operations into batches and send # multiple AddOfflineUserDataJobOperations requests for the SAME job. See # https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations # and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data # for more information on the per-request limits. response = offline_user_data_service.add_offline_user_data_job_operations( resource_name: offline_user_data_job_resource_name, enable_partial_failure: true, operations: build_offline_user_data_job_operations(client), ) # Prints errors if any partial failure error is returned. if response.partial_failure_error failures = client.decode_partial_failure_error(response.partial_failure_error) failures.each do |failure| failure.errors.each do |error| human_readable_error_path = error .location .field_path_elements .map { |location_info| if location_info.index "#{location_info.field_name}[#{location_info.index}]" else "#{location_info.field_name}" end }.join(" > ") errmsg = "error occured while adding operations " \ "#{human_readable_error_path}" \ " with value: #{error.trigger.string_value}" \ " because #{error.message.downcase}" puts errmsg end end end puts "The operations are added to the offline user data job." unless run_job puts "Not running offline user data job #{job_name}, as requested." return end # Issues an asynchronous request to run the offline user data job # for executing all added operations. response = offline_user_data_service.run_offline_user_data_job( resource_name: offline_user_data_job_resource_name ) puts "Asynchronous request to execute the added operations started." puts "Waiting until operation completes." # Offline user data jobs may take 6 hours or more to complete, so instead of # waiting for the job to complete, retrieves and displays the job status # once. If the job is completed successfully, prints information about the # user list. Otherwise, prints the query to use to check the job again later. check_job_status( client, customer_id, offline_user_data_job_resource_name, ) end
Perl
sub add_users_to_customer_match_user_list { my ($api_client, $customer_id, $run_job, $user_list_resource_name, $offline_user_data_job_id, $ad_personalization_consent, $ad_user_data_consent) = @_; my $offline_user_data_job_service = $api_client->OfflineUserDataJobService(); my $offline_user_data_job_resource_name = undef; if (!defined $offline_user_data_job_id) { # Create a new offline user data job. my $offline_user_data_job = Google::Ads::GoogleAds::V17::Resources::OfflineUserDataJob->new({ type => CUSTOMER_MATCH_USER_LIST, customerMatchUserListMetadata => Google::Ads::GoogleAds::V17::Common::CustomerMatchUserListMetadata-> new({ userList => $user_list_resource_name })}); # Add consent information to the job if specified. if ($ad_personalization_consent or $ad_user_data_consent) { my $consent = Google::Ads::GoogleAds::V17::Common::Consent->new({}); if ($ad_personalization_consent) { $consent->{adPersonalization} = $ad_personalization_consent; } if ($ad_user_data_consent) { $consent->{adUserData} = $ad_user_data_consent; } # Specify whether user consent was obtained for the data you are uploading. # See https://www.google.com/about/company/user-consent-policy for details. $offline_user_data_job->{customerMatchUserListMetadata}{consent} = $consent; } # Issue a request to create the offline user data job. my $create_offline_user_data_job_response = $offline_user_data_job_service->create({ customerId => $customer_id, job => $offline_user_data_job }); $offline_user_data_job_resource_name = $create_offline_user_data_job_response->{resourceName}; printf "Created an offline user data job with resource name: '%s'.\n", $offline_user_data_job_resource_name; } else { # Reuse the specified offline user data job. $offline_user_data_job_resource_name = Google::Ads::GoogleAds::V17::Utils::ResourceNames::offline_user_data_job( $customer_id, $offline_user_data_job_id); } # Issue a request to add the operations to the offline user data job. # This example only adds a few operations, so it only sends one AddOfflineUserDataJobOperations # request. If your application is adding a large number of operations, split # the operations into batches and send multiple AddOfflineUserDataJobOperations # requests for the SAME job. See # https://developers.google.com/google-ads/api/docs/remarketing/audience-types/customer-match#customer_match_considerations # and https://developers.google.com/google-ads/api/docs/best-practices/quotas#user_data # for more information on the per-request limits. my $user_data_job_operations = build_offline_user_data_job_operations(); my $response = $offline_user_data_job_service->add_operations( { resourceName => $offline_user_data_job_resource_name, enablePartialFailure => "true", operations => $user_data_job_operations }); # Print the status message if any partial failure error is returned. # Note: The details of each partial failure error are not printed here, you can # refer to the example handle_partial_failure.pl to learn more. if ($response->{partialFailureError}) { # Extract the partial failure from the response status. my $partial_failure = $response->{partialFailureError}{details}[0]; printf "Encountered %d partial failure errors while adding %d operations " . "to the offline user data job: '%s'. Only the successfully added " . "operations will be executed when the job runs.\n", scalar @{$partial_failure->{errors}}, scalar @$user_data_job_operations, $response->{partialFailureError}{message}; } else { printf "Successfully added %d operations to the offline user data job.\n", scalar @$user_data_job_operations; } if (!defined $run_job) { print "Not running offline user data job $offline_user_data_job_resource_name, as requested.\n"; return; } # Issue an asynchronous request to run the offline user data job for executing # all added operations. my $operation_response = $offline_user_data_job_service->run({ resourceName => $offline_user_data_job_resource_name }); # Offline user data jobs may take 6 hours or more to complete, so instead of waiting # for the job to complete, this example retrieves and displays the job status once. # If the job is completed successfully, it prints information about the user list. # Otherwise, it prints, the query to use to check the job status again later. check_job_status($api_client, $customer_id, $offline_user_data_job_resource_name); }
Cómo quitar usuarios individuales mediante identificadores
Para quitar usuarios individuales, haz lo siguiente:
Configura el atributo
remove
en unOfflineUserDataJobOperation
igual a un objetoUserData
.Agrega uno o más objetos
UserIdentifier
a losuser_identifiers[]
repetidos . Se puede utilizar un único identificador de usuario para quitar a un usuario de una lista, incluso si se enviaron más de un identificador que coinciden con el usuario.
Quitar todos los datos de la lista a la vez
Para quitar todos los usuarios de una lista, establece remove_all
en true
en una
OfflineUserDataJobOperation
y, luego,
emitir un
RunOfflineUserDataJob
solicitud con el nombre del recurso asociado a la operación remove_all
.
Ten en cuenta que, cuando se incluye una operación remove_all
, debe ser la primera
una operación única en un trabajo. De lo contrario, la ejecución del trabajo muestra un
INVALID_OPERATION_ORDER
. Para reemplazar completamente los miembros de una lista de usuarios por miembros nuevos, ordena
las operaciones en AddOfflineUserDataJobOperationsRequest
en esta secuencia:
Establece
remove_all
comotrue
en unaOfflineUserDataJobOperation
Por cada miembro nuevo, agrega una operación
create
y configura susUserData
en unOfflineUserDataJobOperation
.
Las operaciones remove_all
se ejecutan por hora y pueden durar hasta 24 horas.
Recomendaciones de actualización de la lista de clientes
Puedes recuperar recomendaciones de tipo
REFRESH_CUSTOMER_MATCH_LIST
para identificar las listas de clientes que no se actualizan desde hace tiempo. Este es
Esto es especialmente útil si usted es un anunciante externo que permite que los usuarios
para administrar listas de clientes.
Para obtener más información sobre cómo trabajar con las recomendaciones, visita el Nivel de optimización y recomendaciones.
Cómo quitar una lista
Usa el
UserListService.mutate_user_lists
método para enviar una operación remove
con el nombre de recurso de la lista de usuarios que deseas quitar.
Actualiza una lista con UserDataService
UserDataService
tiene un límite de 10
operaciones y 100 user_identifiers
en total por solicitud, por lo que es una mejor opción
para realizar pequeñas actualizaciones. Por ejemplo, si cada uno de tus objetos UserData
tiene un
UserIdentifier
por hashed_email
y otra UserIdentifier
por
hashed_phone_number
, entonces tu solicitud puede contener 50 UserData
como máximo
objetos.
UserDataService
contiene el método UploadUserData
, que acepta un
UploadUserDataRequest
Además de
customer_id
, UploadUserDataRequest
acepta una lista de operaciones
para crear contactos y un campo obligatorio llamado
customer_match_user_list_metadata
, que se propaga con el nombre del recurso
de la lista de remarketing a la que deseas orientarte.
Comienza por crear una instancia de UploadUserDataRequest
en la que propagues
customer_id
y customer_match_user_list_metadata
:
Java
// Creates a request to add user data operations to the user list based on email addresses.
String userListResourceName = ResourceNames.userList(customerId, userListId);
UploadUserDataRequest.Builder uploadUserDataRequest =
UploadUserDataRequest.newBuilder()
.setCustomerId(String.valueOf(customerId))
.setCustomerMatchUserListMetadata(
CustomerMatchUserListMetadata.newBuilder()
.setUserList(StringValue.of(userListResourceName))
.build());
Para subir la información de contacto de los usuarios, establece CrmBasedUserListInfo.upload_key_type
a CONTACT_INFO
.
Primero, agrega las operaciones al objeto UploadUserDataRequest
. Cada operación
contiene un campo create
propagado con UserData
objetos que contienen uno o más UserIdentifier
individuales. Cada UserIdentifier
contiene un dato de identificación.
o puede ser de varios tipos diferentes, cada uno de los cuales se describe a continuación.
Para subir direcciones de correo electrónico de clientes, crea una cuenta nueva
UserDataOperation
y propaga su creación
con un objeto UserData
. El objeto UserData acepta una lista de
user_identifiers
Completa el campo hashed_email
con el correo electrónico del cliente
direcciones IP del proveedor.
Java
ImmutableList<String> EMAILS =
ImmutableList.of("client1@example.com", "client2@example.com", " Client3@example.com ");
// Hash normalized email addresses based on SHA-256 hashing algorithm.
List<UserDataOperation> userDataOperations = new ArrayList<>(EMAILS.size());
for (String email : EMAILS) {
UserDataOperation userDataOperation =
UserDataOperation.newBuilder()
.setCreate(
UserData.newBuilder()
.addUserIdentifiers(
UserIdentifier.newBuilder()
.setHashedEmail(StringValue.of(toSHA256String(email)))
.build())
.build())
.build();
userDataOperations.add(userDataOperation);
}
uploadUserDataRequest.addAllOperations(userDataOperations);
La carga del usuario address_info
es similar a la carga de direcciones de correo electrónico de usuarios.
Sin embargo, en lugar de pasar un hashed_email
, propaga el campo address_info
.
con un objeto OfflineUserAddressInfo
que contenga los objetos first_name
, last_name
, country_code
y
postal_code
Al igual que las direcciones de correo electrónico, se consideran first_name
y last_name
información de identificación personal, y se debe generar un hash antes de subir el archivo.
Java
String firstName = "Alex";
String lastName = "Quinn";
String countryCode = "US";
String postalCode = "94045";
UserIdentifier userIdentifierWithAddress =
UserIdentifier.newBuilder()
.setAddressInfo(
OfflineUserAddressInfo.newBuilder()
// First and last name must be normalized and hashed.
.setHashedFirstName(
StringValue.of(toSHA256String(firstName)))
.setHashedLastName(StringValue.of(toSHA256String(lastName)))
// Country code and zip code are sent in plaintext.
.setCountryCode(StringValue.of(countryCode))
.setPostalCode(StringValue.of(postalCode))
.build())
.build();
UserDataOperation userDataOperation =
UserDataOperation.newBuilder()
.setCreate(
UserData.newBuilder()
.addUserIdentifiers(userIdentifierWithAddress)
.build())
.build();
uploadUserDataRequest.addOperations(userDataOperation);
Después de agregar operaciones a la instancia UploadUserDataRequest
, llama al
El método uploadUserData
en UserDataServiceClient
al que se enviará la solicitud
el servidor de la API de Google Ads. Para ver si la solicitud fue exitosa, obtén el
el recuento de operaciones y el tiempo de carga
en el objeto de respuesta. Ten en cuenta que
puede tardar varias horas en completarse con los miembros de la lista.
Java
// Creates the user data service client.
try (UserDataServiceClient userDataServiceClient =
googleAdsClient.getLatestVersion().createUserDataServiceClient()) {
// Add operations to the user list based on the user data type.
UploadUserDataResponse response =
userDataServiceClient.uploadUserData(uploadUserDataRequest.build());
// Displays the results.
// Reminder: it may take several hours for the list to be populated with members.
System.out.printf(
"Received %d operations at %s",
response.getReceivedOperationsCount().getValue(),
response.getUploadDateTime().getValue());
}
Cambiar el nivel de segmentación de la lista
Si necesita cambiar el nivel de segmentación de su lista, por ejemplo, de orientación a nivel del grupo de anuncios a nivel de la campaña, consulte los cambios en los niveles de orientación guía.
Revisa el rendimiento de la lista
Para recopilar datos de rendimiento de sus segmentos de público, realice una búsqueda
solicitud a la ad_group_audience_view
o el recurso campaign_audience_view
.
Por ejemplo, puedes observar conversions
o cost_per_conversion
para
determinar si orientar los anuncios
al segmento de público genera más
conversiones y, luego, ajuste los modificadores de ofertas según corresponda.
SELECT
ad_group_criterion.criterion_id,
metrics.conversions,
metrics.cost_per_conversion
FROM ad_group_audience_view
Recomendamos esperar, al menos, dos semanas antes de optimizar las ofertas en función del tráfico volumen a la cuenta.