Facing Issues While Creating the Customer Match List

53 views
Skip to first unread message

Abhishek Singh

unread,
May 14, 2024, 9:23:49 AM5/14/24
to Google Ads API and AdWords API Forum
Problem - While Creating the Customer Match List i am finding that Customer List Is getting created but uploads is showing 0 and its not about time because i've waited 2 - 3 days.(Attaching Image)
Screenshot from 2024-05-13 04-26-48.png

CSV
Email,Phone,First Name,Last Name,Country,Zip\n
x...@gmail.com,81-12-3456-7891,john,smith,us,94016\n
a...@gmail.com,81-12-3456-7891,joanna,smith,cn,101300\n

RESPONSE, REQUEST
Number of records read from CSV: 2
Processing record: x...@gmail.com
Processing record: a...@gmail.com
2024-05-13 04:23:05.570  INFO 8206 --- [ault-executor-0] c.g.ads.googleads.lib.request.summary    : SUCCESS REQUEST SUMMARY. Method: google.ads.googleads.v16.services.UserListService/MutateUserLists, Endpoint: googleads.googleapis.com:443, CustomerID: 5084430664, RequestID: Jbr3MMpM8Zu_K5NKBQnOow, ResponseCode: OK, Fault: null.
Created Customer Match user list with resource name: customers/5084430664/userLists/8658557609.

2024-05-13 04:23:22.230  INFO 8206 --- [ault-executor-2] c.g.ads.googleads.lib.request.summary    : SUCCESS REQUEST SUMMARY. Method: google.ads.googleads.v16.services.GoogleAdsService/Search, Endpoint: googleads.googleapis.com:443, CustomerID: 5084430664, RequestID: QUQub7mmT6J2HEMrIQ5BwQ, ResponseCode: OK, Fault: null.
User list 'customers/5084430664/userLists/8658557609' has an estimated 0 users for Display and 0 users for Search.


CODE(JAVA)

public void addCustomerDataFromCSV(GoogleAdsClient googleAdsClient, long customerId, String filePath) {
try {
List<CustomerRecord> customerRecords = CsvParser.parseCsv(filePath);

System.out.println("Number of records read from CSV: " + customerRecords.size());

// Accumulate user data for all records
List<UserData> userDataList = new ArrayList<>();

for (CustomerRecord record : customerRecords) {
System.out.println("Processing record: " + record.getEmail());
// Create user data for each record
UserData userData = createUserDataForRecord(record);
userDataList.add(userData);
}

// Create a single user list containing data from all records
createCustomerMatchUserList(googleAdsClient, customerId, userDataList);
} catch (IOException e) {
e.printStackTrace();
}
}

private UserData createUserDataForRecord(CustomerRecord record) {
// Inside your class or method
MessageDigest sha256Digest;
UserData.Builder userDataBuilder = UserData.newBuilder();

try {
sha256Digest = MessageDigest.getInstance("SHA-256");

// Add email as a UserIdentifier
UserIdentifier hashedEmailIdentifier = UserIdentifier.newBuilder()
.setHashedEmail(normalizeAndHashEmailAddress(sha256Digest, record.getEmail()))
.build();
userDataBuilder.addUserIdentifiers(hashedEmailIdentifier);

// Add phone number as a UserIdentifier
if (record.getPhone() != null && !record.getPhone().isEmpty()) {
UserIdentifier hashedPhoneNumberIdentifier = UserIdentifier.newBuilder()
.setHashedPhoneNumber(normalizeAndHash(sha256Digest, record.getPhone(), true))
.build();
userDataBuilder.addUserIdentifiers(hashedPhoneNumberIdentifier);
}

// Add other fields such as First Name, Last Name, Country, and Zip
OfflineUserAddressInfo addressInfo = OfflineUserAddressInfo.newBuilder()
.setHashedFirstName(normalizeAndHash(sha256Digest, record.getFirstName(), true))
.setHashedLastName(normalizeAndHash(sha256Digest, record.getLastName(), true))
.setCountryCode(record.getCountryCode())
.setPostalCode(record.getPostalCode())
.build();
UserIdentifier addressIdentifier = UserIdentifier.newBuilder()
.setAddressInfo(addressInfo)
.build();
userDataBuilder.addUserIdentifiers(addressIdentifier);


} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
// Handle the exception
e.printStackTrace();
}

return userDataBuilder.build();
}


private void createCustomerMatchUserList(GoogleAdsClient googleAdsClient, long customerId, List<UserData> userDataList) {
try (UserListServiceClient userListServiceClient =
googleAdsClient.getLatestVersion().createUserListServiceClient()) {
// Create the user list
UserList userList = UserList.newBuilder()
.setName("Customer Match list") // Provide a name for the list
.setDescription("A list of customers that originated from email addresses")
.setMembershipLifeSpan(30) // Set the membership lifespan as required
.setCrmBasedUserList(
CrmBasedUserListInfo.newBuilder()
.setUploadKeyType(CustomerMatchUploadKeyTypeEnum.CustomerMatchUploadKeyType.CONTACT_INFO))

.build();

// Create the operation to add users
List<OfflineUserDataJobOperation> operations = new ArrayList<>();
for (UserData userData : userDataList) {
operations.add(OfflineUserDataJobOperation.newBuilder().setCreate(userData).build());
}

// Add the user list with all users
MutateUserListsResponse response = userListServiceClient.mutateUserLists(
Long.toString(customerId), ImmutableList.of(UserListOperation.newBuilder().setCreate(userList).build()));

System.out.printf("Created Customer Match user list with resource name: %s.%n",
response.getResults(0).getResourceName());

// Fetch the user list details
String userListResourceName = response.getResults(0).getResourceName();
fetchAndPrintUserListDetails(googleAdsClient, customerId, userListResourceName);

} catch (Exception e) {
e.printStackTrace();
}
}

private void fetchAndPrintUserListDetails(GoogleAdsClient googleAdsClient, long customerId, String userListResourceName) {
try (GoogleAdsServiceClient googleAdsServiceClient =
googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
// Create a query to retrieve the user list details
String query = String.format(
"SELECT user_list.size_for_display, user_list.size_for_search "
+ "FROM user_list "
+ "WHERE user_list.resource_name = '%s'",
userListResourceName);

// Issue the search request to fetch user list details
SearchGoogleAdsRequest request = SearchGoogleAdsRequest.newBuilder()
.setCustomerId(Long.toString(customerId))
.setQuery(query)
.build();

// Execute the search request
GoogleAdsServiceClient.SearchPagedResponse response = googleAdsServiceClient.search(request);

// Print the user list details
for (GoogleAdsRow googleAdsRow : response.iterateAll()) {
UserList userList = googleAdsRow.getUserList();
System.out.printf("User list '%s' has an estimated %d users for Display and %d users for Search.%n",
userList.getResourceName(), userList.getSizeForDisplay(), userList.getSizeForSearch());
}

} catch (Exception e) {
e.printStackTrace();
}
}


private String normalizeAndHash(MessageDigest digest, String s, boolean trimIntermediateSpaces)
throws UnsupportedEncodingException {
String normalized = s.toLowerCase();
if (trimIntermediateSpaces) {
normalized = normalized.replaceAll("\\s+", "");
} else {
normalized = normalized.trim();
}
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();
}

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,true);
}

CustomerRecord.java

public class CustomerRecord {
private String email;
private String phone;
private String firstName;
private String lastName;
private String countryCode;
private String postalCode;

public CustomerRecord(String email, String phone, String firstName, String lastName, String countryCode, String postalCode) {
this.email = email;
this.phone = phone;
this.firstName = firstName;
this.lastName = lastName;
this.countryCode = countryCode;
this.postalCode = postalCode;
}

public String getEmail() {
return email;
}

public String getPhone() {
return phone;
}

public String getFirstName() {
return firstName;
}

public String getLastName() {
return lastName;
}

public String getCountryCode() {
return countryCode;
}

public String getPostalCode() {
return postalCode;
}

}

CsvParser.java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CsvParser {

public static List<CustomerRecord> parseCsv(String filePath) throws IOException {
List<CustomerRecord> customerRecords = new ArrayList<>(); // Update the type here
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
// Skip the header if present
br.readLine();
while ((line = br.readLine()) != null) {
String[] data = line.split(",");
if (data.length >= 2) {
String email = data[0].trim();
String phone = data[1].trim();
String firstName = (data.length >= 3) ? data[2].trim() : "";
String lastName = (data.length >= 4) ? data[3].trim() : "";
String countryCode = (data.length >= 5) ? data[4].trim() : "";
String postalCode = (data.length >= 6) ? data[5].trim() : "";
customerRecords.add(new CustomerRecord(email, phone, firstName, lastName, countryCode, postalCode));
}
}
}
return customerRecords;
}
}

Google Ads API Forum Advisor

unread,
May 15, 2024, 8:18:27 AM5/15/24
to abhishe...@coditation.com, adwor...@googlegroups.com
Hi,

Thank you for reaching out to the Google Ads API support team.

Note that the provided logs are incomplete and don't include the details on how you are uploading the user data. So, in order to assist you further, kindly provide us with the "complete API logs" (request and response with request-id and request header) generated at your end while working with Customer Match.

If you are using a client library and haven't enabled the logging yet, I would request you to enable logging for the specific client library that you are using. You can refer to the guides Java.NetPHPPythonRuby or Perl to enable logging at your end. For REST interface requests, you can enable logging via the curl command by using the -i flag.

Also, I would recommend you to follow this guide on Get Started with Customer Match for more information about creating and targeting a customer list.

 
This message is in relation to case "ref:!00D1U01174p.!5004Q02tIyAz:ref" (ADR-00234928)

Thanks,
 
Google Logo Google Ads API Team


Reply all
Reply to author
Forward
0 new messages