Zero list members after submitting 10,00 gmails using OfflineUserDataJobType.CUSTOMER_MATCH_WITH_ATTRIBUTES

898 views
Skip to first unread message

Kurt Bo

unread,
Dec 22, 2021, 9:09:07 PM12/22/21
to AdWords API and Google Ads API Forum
I'm importing users into a CustomerMatch UserList and I took the Java example at:

And I modified it to loop over an input file of 10,000 email addresses instead of having just a few hard-coded user identifiers.

And set membership term to the max (10000) instead of 30 days
.setMembershipLifeSpan(10000)


When I run the example which has the job type set to:  CUSTOMER_MATCH_USER_LIST,  I get a 99% match rate after about an hour after the job was processed. And then 4-6 hours later I see 6300+ members in the list.

But when I change the program to use a job type of:
OfflineUserDataJobType.CUSTOMER_MATCH_WITH_ATTRIBUTES

And changed the code that adds the opeations to include LTV attributes like so:

        UserAttribute.Builder userAttributeBuilder = UserAttribute.newBuilder();
        userAttributeBuilder.setLifetimeValueMicros((long) 100.12);
        userAttributeBuilder.setLastPurchaseDateTime("2021-07-01 12:32:45-00:00");
                    
          operations.add(
                  OfflineUserDataJobOperation.newBuilder().setCreate(
                       UserData.newBuilder()
                       .addUserIdentifiers(
                           UserIdentifier.newBuilder()
                               .setHashedEmail(normalizeAndHash(sha256Digest, line))
                       )
                       .setUserAttribute(userAttributeBuilder.build())
                       .build()                        
                  ).build()
          );


The job submits successfully, and I see it RUNNING, and eventually ending with a SUCCESS status. But the member count and match count is always 0 when I include LTV attributes and the job type is:  CUSTOMER_MATCH_WITH_ATTRIBUTES

It has been DAYS since the jobs have been processed.


Am I doing something wrong in the way I'm submitting the attributes?

Do I need to adjust an account setting somewhere?

Any help is greatly appreciated, I feel like I'm going crazy!

Google Ads API Forum Advisor

unread,
Dec 24, 2021, 5:58:49 AM12/24/21
to kurtsa...@gmail.com, adwor...@googlegroups.com
Hi Kurt,

Thank you for posting your concern.

So that I can investigate the issue, could you provide the complete request and response logs with request ID and request header generated on your end for the successful and unsuccessful API transactions for uploading members?

You can provide it via Reply privately to author option. If this option is not available, then send it instead on this email address googleadsa...@google.com.

Regards,
Google Logo
Ernie John Blanca Tacata
Google Ads API Team
 


ref:_00D1U1174p._5004Q2TjyJH:ref

Kurt Bo

unread,
Jan 14, 2022, 6:14:19 PM1/14/22
to Google Ads API and AdWords API Forum
As a follow up for anybody coming across this post in the future, I still do NOT have resolution to this issue.

I added logging and submit logs privately to adwords support. If you need to see how to do that in java, go here:  https://developers.google.com/google-ads/api/docs/client-libs/java/logging    At very  least it can help you verify your code IS sending the data you expect it to to Google.

After reviewing my logs of two runs (one submitting LTV and last purchase date which resulted in zero matches and zero list size, and another not sending ANY attributes and different list type resulting in 6200 matches), the veridct from adwords support was:

Upon checking the attached logs, there appears to be no errors encountered in both uploads. That said, the issue may not be API related.

I was told to contact:    :   https://support.google.com/google-ads/gethelp    that the Google Ads Product Support team should be able to provide further guidance on how adding attributes affects the match rates of uploaded audiences

I have reached out to the Ads Product support team and so far that have not been able to help. They keep trying to say they can't help if you're using the API. And that I should reach out to the API team. But the API team tells me to contact Ads Product support. Attached is a screenshot of some of the less than helpful correspondence.

The API support team also mentioned:

You may see how the user_identifiers collection under the create element only hashed email along with users' spent data. As a result, Google Ads will use both the hashed email and the spent information in the matching process.

However, I'm not quite sure how that affects USER LIST POPULATION. I'm waiting for some more clarifications around that.

I've been assuming that by uploading my data to Google containing LTV and last purchase date, that Google would use this information to prioritize which Customers are the best to target. If I upload 10,000 customers, I would expect the list to contain all 10,000 customers regardless of whether I specified LTV or not  (assuming all 10,000 matched actual active Google accounts). If I wanted to just target customers that purchased >= $5,000 in the last 180 days, I could simply ONLY upload those users to my UserList and have multiple user lists for different segments. So I really don't know why attributes would affect the population/list size. If anybody has insight into this, please, I'd love to hear it, I'm all ears.


Overall, it seems like nobody at Google seems to know the real details about UserList Attributes, WTF!!!!  This is silly, somebody please figure out what's going on and advise.
googleSupportscreenshotRedactedOpt.jpg

Kurt Bo

unread,
Jan 14, 2022, 8:09:43 PM1/14/22
to Google Ads API and AdWords API Forum
I've officially been dumped by the Google Ads Product Team:
===================================================================

Hi Kurt,

Hope you are doing well!

Thank you for patiently waiting while I checked this internally. On checking with my concerned team, we have determined that since the customer match list is uploaded by API,  it is beyond the scope of Google Ads Display and Remarketing team. It would be best if you can contact Google Ad API team through the Google Ads and AdWords API forum or their email alias googleadsa...@google.com.

As per our expertise, we would only be able to help if the customer match list is being uploaded via Google Ads Interface. I wish I could have helped you, however, it is not our area of support where we could help regarding uploads done via API.

I hope this information is helpful. Let me know if you have any further questions regarding Display campaigns and we will be glad to assist you further.

Regards,
Akshay 

NB: If you need to reference this support ticket in the future, the ID number is 2-3802000031...


API Team, please help!


Google Ads API Forum Advisor

unread,
Jan 17, 2022, 7:18:52 AM1/17/22
to kurtsa...@gmail.com, adwor...@googlegroups.com
Hi Kurt,

I understand the inconvenience that you are encountering regarding this issue. That said, allow me now to raise this to the rest of our team so we can take a closer look as to why your CUSTOMER_MATCH_WITH_ATTRIBUTES uploads are not reflecting, even though there are no apparent API errors in your logs.

We'll reach back to you once we have updates on this concern.

Best regards,

Google Logo
Peter Laurence Napa Oliquino
Google Ads API Team
 


ref:_00D1U1174p._5004Q2TjyJH:ref

Google Ads API Forum Advisor

unread,
Jan 19, 2022, 1:28:45 AM1/19/22
to adwor...@googlegroups.com, kurtsa...@gmail.com
Hello Kurt,

I've been working on this API for many years, so I'm jumping in here to help out. First, I'll explain the Customer Match attributes flow and how it is used. Then, I'll cover my observations in your particular case followed by the next steps.

Customer Match attributes flow

This is what I know about the feature when it was first introduced in, I believe, 2020. Customer Match attributes are not tied to a specific user list.
  1. API developers upload Customer Match attributes through an offline data job not tied to a user list.
  2. Then, those Customer Match attributes sit in a pool on the Google Ads account.
  3. Finally, rule-based user lists are created using that pool of Customer Match attributes.
Even though the feature is similarly named to Customer Match, it is not tied to Customer Match lists. I realize that this can be confusing, but as a fellow engineer, I'm sure you know how difficult naming can be. I'm planning on updating the guide on this. You're probably wondering why it appears almost no one knows anything about this feature. This is because this feature has historically been allowlisted with very, very few people on that allowlist who qualify to be on it. That's why the documentation for this feature is sparse. I'm sure you're also wondering why it isn't working for you, so I'll get to that now.

Observations

I took a deep-dive through our source code, back-end database, and logs. This is what I found:
  • This feature is still allowlisted, and your Google Ads account is not on the allowlist. 
  • When you uploaded data through the offline data job, you set the user list in the customer match metadata. When uploading Customer Match attributes, that field should not be set. By setting that user list field, it appears that our validator for the Customer Match attributes feature may not have triggered, which allowed the job to proceed.
  • When you uploaded the data, the job attempted to process the data. I see that the data uploaded and processed. However, because your account is not on the allowlist for the feature, the account was not able to do anything with that feature. Also, it's expected that Customer Match attributes are not tied to any user list, so it's expected that the user list you have would be empty.
Next steps

So, here's what we can do next.  
  1. I'll update the documentation to make it more clear on how the Customer Match attributes feature works, and I'll make it more clear that there is allowlisting associated with that feature. 
  2. I'll follow up with one of my fellow engineers to verify that it is indeed the validator logic for the allowlist not being triggered for this edge case. If that is indeed the case, then that will be updated.
  3. If you would like to be on that allowlist, you would first need an account manager. If you have an account manager, then you can talk to them about requesting to be added to that allowlist. I'm not sure what all the qualifications are since I'm not involved with the allowlisting process for that feature, but I do know there are very few developers on there, so the qualifications may be high.
Regards,
Google Logo
Nadine Wang
Google Ads API Team
 
 

 



ref:_00D1U1174p._5004Q2TjyJH:ref

Kurt Bo

unread,
Jan 19, 2022, 1:06:42 PM1/19/22
to Google Ads API and AdWords API Forum
Nadine,

THANK YOU so much for that information. I had a sneaking suspicion some account setting was at play here!

So from what you've described it sounds like the adjustments I'll be making (assuming we get allowlisted) will be:
  • Still upload my contacts to a user list so that I identify the users that I want Google to be able to target in an automated fashion
    • But ONLY upload the emails/phones in this job, no attributes
    • Use a job type of:    CUSTOMER_MATCH_USER_LIST

  • Then in a SEPARATE JOB than the contact upload,
    • Upload the attributes for the contacts in the previous job
    • Do NOT specify a user list in the upload job
    • Use a job type of:    CUSTOMER_MATCH_WITH_ATTRIBUTES 
Does that sound like a good approach?


I believe I read that to REMOVE attributes from a user I can just set the LTV attribute to $0 and I assume I could set an EMPTY/BLANK  "last purcahse date" value to wipe out that field.
Does that sound correct to you?  (I plan on recording in a database on my side the data I've submit to Google, so if I ever need, I could REMOVE the attributes for all contacts I've previously submit attributes for.)

I guess I'll NEVER get any feedback on the ATTRIBUTE UPLOAD JOB other than the job's partial failure object because there's simply NO LIST that the data is being submit to. It sounds like that data is stored in a separate area so as not to duplicate it. Makes sense. At least when I submit to a customer list I can see its SIZE. But the attributes, I just have to HOPE everything worked. Is there any way to verify that the attributes exist? Is there anything I can do myself to be able to VERIFY the attributes got uploaded? Maybe create a segment based on attributse and see that the size is > 0?  (I'm a developer, not a marketer, so pleaes forgive my unfamiliarity with how campaigns, are setup...)

Thank You, and I'm very much looking forward to the updated documentation!

- Kurt

Google Ads API Forum Advisor

unread,
Jan 19, 2022, 5:33:41 PM1/19/22
to kurtsa...@gmail.com, adwor...@googlegroups.com
Hello Kurt,

I'm glad I could help with solving this mystery. 

Yes, if you are allowlisted, then you would split up the jobs as you say. They are indeed two completely separate workflows.

I would like to note that this is how the Customer Match attributes feature worked when it launched in 2020. It was an experimental feature when it launched back then with that small allowlist. Sometimes, when there is a very small allowlist on a feature like this, changes may happen or the experiment may be rolled back. I'm checking now with someone I know to see what the state of the feature is because the second part I talked about with creating a rule-based user list after uploading seems to have changed recently in the Google Ads UI. That leads me to believe something about this feature is in flux.

For removing, my interpretation of the documentation (https://developers.google.com/google-ads/api/reference/rpc/v7/UserAttribute?hl=en#lifetime_value_bucket) is that you do need to specify the user identifier (since it's required) and also set the value to 0 as you said. 

On the part of knowing if something succeeded or not, you can use a query like this to get the match rate. It appears to work for both Customer Match user list and Customer Match attribute uploads when I tried it out myself on your account: 'SELECT offline_user_data_job.operation_metadata.match_rate_range, offline_user_data_job.status FROM offline_user_data_job WHERE offline_user_data_job.id = <INSERT_JOB_ID>'

Regards,
Nadine, Google Ads API Team

ref:_00D1U1174p._5004Q2TjyJH:ref

Google Ads API Forum Advisor

unread,
Jan 27, 2022, 6:30:16 PM1/27/22
to adwor...@googlegroups.com, kurtsa...@gmail.com
Hello Kurt,

Apologies for the radio silence over here. Google is a big place, so it took me some time to track down the answers on the status of this feature. So, here's the summary. The feature was put out as experimental to an allowlist a few years back. I'm told that at this time the experiment has been put on hold, so it's not being used at this time. Since that's the case, I personally don't think it's worth following up with your account manager at this time for allowlisting. It's rare for me to see something like this happen, which explains why so many people were confused. If there are any changes to the feature that bring it back to active, we'll update the Google Ads API release notes. I'll work on updating the guide soon to reflect all of this.

Thanks,
Reply all
Reply to author
Forward
0 new messages