Script - Google Shopping Campaign - Auto CPC Bid

322 views
Skip to first unread message

Steve Berg

unread,
Sep 24, 2014, 10:41:29 AM9/24/14
to adwor...@googlegroups.com
Hello,

I would like in my 30 Shopping Campaigns
the offer and the management of the CPC from the Product Groups automate.
For example, the CPC should be low in a low CTR
be in good conversion correspondingly higher.

How would a possible script look like?

Best Regards
- Steve -

Josh Radcliff (AdWords API Team)

unread,
Sep 25, 2014, 1:00:28 PM9/25/14
to adwor...@googlegroups.com
Hi Steve,

Just to clarify - by "script" I'm assuming you mean code that executes methods in the AdWords API, and not AdWords Scripts. All management of product groups in the AdWords API is done via AdGroupCriterionService. The Shopping Guide contains a useful introduction to the concepts involved.

Once you have your product groups set up, you can modify a given product group's CPC bid by sending an AdGroupCriterionService.mutate call containing an AdGroupCriterionOperation where the operator is SET and the operand is a BiddableAdGroupCriterion with:
To monitor the performance of each product group (ProductPartition), you can use the API's Product Partition Report.

Cheers,
Josh, AdWords API Team

Anup Pathak

unread,
Oct 16, 2014, 4:56:00 AM10/16/14
to adwor...@googlegroups.com
Hi Josh,

i want to change product group cpc, i have created product groups by   "item id"

I followed your steps here is code (Python)

     adgroup_criterion_service = adwords_client.GetService('AdGroupCriterionService', version='v201406')

     bid_modifier = '1.5'     
        operations =  [{
                          'xsi_type':'AdGroupCriterionOperation',
                          'operator': 'SET',
                          'operand': {
                                      'xsi_type': 'BiddableAdGroupCriterion',
                                      'adGroupId': ad_group_id,
                                      'criterion': {
                                                    'xsi_type': 'ProductPartition',
                                                    'id': criterion_id
                                                    },
                                       'bidModifier':bid_modifier
                                        
                            }
                          }]
when i am running above code i got Error  "CriterionError.CANNOT_BID_MODIFY_CRITERION_TYPE @ operations[0].operand.bidModifier"

can you please help me to solve this errorr


Thank You!
Anup

Anup Pathak

unread,
Oct 17, 2014, 4:23:14 AM10/17/14
to adwor...@googlegroups.com
Hello Josh,

Issue resolved  Thank You!




On Wednesday, September 24, 2014 8:11:29 PM UTC+5:30, Steve Berg wrote:

Kevin Weitzner

unread,
Apr 29, 2016, 4:31:51 PM4/29/16
to AdWords API Forum
Hi -- I am not certain how the last step should be executed --I am not getting any errors, however CPC for productID is not being set.

See script below:

ad_group_id = '**************'
criterion_id = '******'

def main(client):
    adgroup_criterion_service = client.GetService('AdGroupCriterionService', version='v201603')

    bid_modifier = '15'

    operations =  [{
                          'xsi_type':'AdGroupCriterionOperation',
                          'operator': 'SET',
                          'operand': {
                                      'xsi_type': 'BiddableAdGroupCriterion',
                                      'adGroupId': ad_group_id,
                                      'criterion': {
                                                    'xsi_type': 'ProductPartition',
                                                    'id': criterion_id
                                                    },
                                       'bidModifier':bid_modifier

                            }
                          }]

if __name__ == '__main__':
  adwords_client = adwords.AdWordsClient.LoadFromStorage('******.yaml')
  main(adwords_client)

--

I would like to be able to set the CPC of product Ids themselves by passing the appropriate product ID in the Criterion_ID --- I have thousands of products that I want to try a strategy on.  I believe the last step in the explanation is what I am missing here.

Thanks,
Kevin

Josh Radcliff (AdWords API Team)

unread,
Apr 29, 2016, 5:07:34 PM4/29/16
to AdWords API Forum
Hi Kevin,

You can set bids at the product/item ID level by creating BiddableAdGroupCriterion objects with:

Cheers,
Josh, AdWords API Team

Kevin Weitzner

unread,
Apr 29, 2016, 5:39:46 PM4/29/16
to AdWords API Forum
Hi -- I think I am getting closer...


ad_group_id = '21********63'
criterion_id = '2523931-rou-6'

Function now looks like this -
def main(client):
    adgroup_criterion_service = client.GetService('AdGroupCriterionService', version='v201603')


    bid_modifier = '1.5'
    operations =  [{
                          'xsi_type':'AdGroupCriterionOperation',
                          'operator': 'SET',
                          'operand': {
                                      'xsi_type': 'BiddableAdGroupCriterion',
                                      'adGroupId': ad_group_id,
                                      'criterion': {
                                                    'xsi_type': 'ProductOfferId',
                                                    'value': criterion_id
                                                    },
                                       'bidModifier': bid_modifier

                            }
                          }]
    result = adgroup_criterion_service.mutate(operations)
--

I want to set an absolute CPC bid (variable name bid_modifier from earlier, $1.5) on an individual product ID -
I get this error:
suds.WebFault: Server raised fault: 'Unmarshalling Error: cvc-elt.4.3: Type 'ns0:ProductOfferId' is not validly derived from the type definition, 'Criterion', of element 'ns0:criterion'. '
-

Any ideas on what I have done wrong here

Josh Radcliff (AdWords API Team)

unread,
Apr 29, 2016, 8:28:05 PM4/29/16
to AdWords API Forum
Hi,

It looks like you're missing the intermediate ProductPartition object. You'll want to create one of those with UNIT partition type and set its caseValue to the ProductOfferId. The BiddableAdGroupCriterion.criterion should point to that ProductPartition object instead of directly to the ProductOfferId.

I realize this can be a bit confusing. :) I'd definitely recommend looking at the createUnit function I mentioned earlier, as that handles most of this for you.

Cheers,
Josh, AdWords API Team

Anup Pathak

unread,
Apr 29, 2016, 8:53:56 PM4/29/16
to AdWords API Forum


Hi,
working code for setting cpc bids for Shopping product partitions, I hope this will help you.

        operation = {
                        'xsi_type':'AdGroupCriterionOperation',
                        'operator': 'ADD',

                        'operand': {
                                    'xsi_type': 'BiddableAdGroupCriterion',
                                    'adGroupId': ad_group_id,
                                    'criterion': {
                                                    'xsi_type': 'ProductPartition',
                                                    'id': criterion_id
                                                },
                                    'biddingStrategyConfiguration': {
                                                                     'bids': [{
                                                                               'xsi_type': 'CpcBid',
                                                                               'bid': {
                                                                                         'microAmount': str(bid_modifier)
                                                                                       },
                                                                               }]
                                                                    }
                                    }
                        }

Let me know if you need more help in this!

NOTE : your shopping product partition structure should be proper

Thank You!
Anup Pathak

Kevin Weitzner

unread,
May 2, 2016, 9:56:32 AM5/2/16
to AdWords API Forum
Hi Anup,

I tried your operations and still receive an Unmarshalling Error for my input string (my criterion ID was a product ID.)  So I changed the product groups as such: "All products > lighting, rugs, outdoor, Everything else in 'All products'

Code is as such:


ad_group_id = '2********63'
criterion_id = 'lighting'

def main(client):
    adgroup_criterion_service = client.GetService('AdGroupCriterionService', version='v201603')


    bid_modifier = '1.5'
    operation = {
                        'xsi_type':'AdGroupCriterionOperation',
                        'operator': 'ADD',

                        'operand': {
                                    'xsi_type': 'BiddableAdGroupCriterion',
                                    'adGroupId': ad_group_id,
                                    'criterion': {
                                                    'xsi_type': 'ProductPartition',
                                                    'id': criterion_id
                                                },
                                    'biddingStrategyConfiguration': {
                                                                     'bids': [{
                                                                               'xsi_type': 'CpcBid',
                                                                               'bid': {
                                                                                         'microAmount': str(bid_modifier)
                                                                                       },
                                                                               }]
                                                                    }
                                    }
                        }





    result = adgroup_criterion_service.mutate(operation)




if __name__ == '__main__':
  adwords_client = adwords.AdWordsClient.LoadFromStorage('**********************.yaml')
  main(adwords_client)
---
Image example


I would love to have this work for actual product IDs -- I want to get this working before I attempt to add the ProductOffer -- as I think unmarshalling error means that the schema is incorrect..ideally I can explode all product offer IDs and just set price for those themselves. 
exact error: suds.WebFault: Server raised fault: 'Unmarshalling Error: For input string: "lighting" '

Kevin Weitzner

unread,
May 2, 2016, 10:29:53 AM5/2/16
to AdWords API Forum
Hi Josh,

I understand the requirements, however I am having a difficult time translating this to appropriate Python code which does not result in an unmarshalling error. I have found the Python version of the code you're referencing --

I tried to take this code and add modifications but am receiving this error:
suds.WebFault: Server raised fault: 'Unmarshalling Error: cvc-complex-type.2.3: Element 'ns0:operations' cannot have character [children], because the type's content type is element-only. '
[note: this style of formatting the code makes it very difficult for me to actually follow how to build it in the style that Anup has]

---

ad_group_id = '************'
criterion_id = '2523931-rou-6'

operations = []

#report_downloader = client.GetReportDownloader(version='v201603')
def main(client, parent=None, value=None):
    adgroup_id = '******'
    adgroup_criterion_service = client.GetService('AdGroupCriterionService', version='v201603')
    bid_amount = '1500'


    unit = {
        'xsi_type': 'ProductPartition',
        'partitionType': 'UNIT'
    }

    # The root node has neither a parent nor a value.
    #if parent is not None:
    #  unit['parentCriterionId'] = parent['id']
    #  unit['caseValue'] = value
    unit['caseValue'] = '2434807-rec-7x10'
    if bid_amount is not None and bid_amount > 0:
      bidding_strategy_configuration = {
          'bids': [{
              'xsi_type': 'CpcBid',
              'bid': {
                  'xsi_type': 'Money',
                  'microAmount': str(bid_amount)
              }
          }]
      }

      adgroup_criterion = {
          'xsi_type': 'BiddableAdGroupCriterion',
          'biddingStrategyConfiguration': bidding_strategy_configuration
      }
    else:
      adgroup_criterion = {
          'xsi_type': 'NegativeAdGroupCriterion'
      }

    adgroup_criterion['adGroupId'] = adgroup_id
    adgroup_criterion['criterion'] = unit

    CreateAddOperation(adgroup_criterion)
    result = adgroup_criterion_service.mutate(adgroup_criterion_service)
    return unit

def CreateAddOperation(criterion):
    """Creates an AdGroupCriterionOperation for the given criterion.
    Args:
      criterion: The criterion we want to add.
    """
    operation = {
        'operator': 'ADD',
        'operand': criterion
    }

    operations.append(operation)





if __name__ == '__main__':
  adwords_client = adwords.AdWordsClient.LoadFromStorage('********.yaml')
  main(adwords_client)

---

I do not see where to modify the biddableadgroup criterion to the productpartition type -- this code is much more difficult for me to follow along with :(.

Josh Radcliff (AdWords API Team)

unread,
May 2, 2016, 10:34:27 AM5/2/16
to AdWords API Forum
Hi,

I think the problem is in the line highlighted below.

    adgroup_criterion['adGroupId'] = adgroup_id
    adgroup_criterion['criterion'] = unit

    CreateAddOperation(adgroup_criterion)
    result = adgroup_criterion_service.mutate(adgroup_criterion_service)

Instead of passing adgroup_criterion_service to mutate, please try passing an array containing the operations (adgroup_criterion in your code).

Thanks,
Josh, AdWords API Team

Anup Pathak

unread,
May 2, 2016, 10:35:37 AM5/2/16
to AdWords API Forum
Hi Kevin,


You have to take Criteria id from PRODUCT_PARTITION_REPORT and use that Criteria id,
 you are using wrong criteria id


let me know if you need more help in this!


Thank you!
Anup Pathak

Kevin Weitzner

unread,
May 2, 2016, 10:56:48 AM5/2/16
to AdWords API Forum
Hi Josh,

This did not work :(  I get this error:
suds.WebFault: Server raised fault: 'Unmarshalling Error: cvc-elt.4.3: Type 'ns0:BiddableAdGroupCriterion' is not validly derived from the type definition, 'AdGroupCriterionOperation', of element 'ns0:operations'. '

Kevin Weitzner

unread,
May 2, 2016, 11:12:54 AM5/2/16
to AdWords API Forum
Hi Anup,

Is there a way to obtain criteria Id for actual product IDs for items?  Or is there an easy way to obtain criteria id?  I created a Product_Partition_report for a different adgroup since my actual test one was not showing up (not live campaign).

I got the CriterionId and ran it and got this error:
suds.WebFault: Server raised fault: '[RequiredError.REQUIRED @ operations[0].operand.criterion.partitionType]'

I picked a simple one with no underlying partitions -

I also tried one with subdivsions and got the same error.  Any ideas?  Once I have this working I will try to expand it so that I can explode our ProductIds from what Josh stated earlier.. I'm not sure why this is so difficult for me.
--
Message has been deleted

Kevin Weitzner

unread,
May 2, 2016, 11:23:06 AM5/2/16
to AdWords API Forum
I modified the code and now receive invalid bid error(was receiving invalid parititon type earlier so I added it in):
suds.WebFault: Server raised fault: '[BiddingErrors.INVALID_BID @ operations[0].operand.biddingStrategyConfiguration.bids; trigger:'CpcBid{bid=1.500000, contentBid=null, cpcBidSource=null}']'


I've tried putting in various bids..

operation = {
                        'xsi_type':'AdGroupCriterionOperation',
                        'operator': 'ADD',

                        'operand': {
                                    'xsi_type': 'BiddableAdGroupCriterion',
                                    'adGroupId': ad_group_id,
                                    'criterion': {
                                                    'xsi_type': 'ProductPartition',
                                                    'id': criterion_id,
                                                    'partitionType':'SUBDIVISION'

Kevin Weitzner

unread,
May 2, 2016, 11:26:24 AM5/2/16
to AdWords API Forum
Fixed - changed the operator to "SET" rather than add.

Final code that works... I cannot modify productID level CPCs yet .. so not ideal however this will suffice I think, I am not sure how to utilize suggestions that Josh has offered.
--
def main(client):
    adgroup_criterion_service = client.GetService('AdGroupCriterionService', version='v201603')


    bid_modifier = '1500000'
   #1.50 bid in microns
    operation = {
                        'xsi_type':'AdGroupCriterionOperation',
                        'operator': 'SET',

                        'operand': {
                                    'xsi_type': 'BiddableAdGroupCriterion',
                                    'adGroupId': ad_group_id,
                                    'criterion': {
                                                    'xsi_type': 'ProductPartition',
                                                    'id': criterion_id,
                                                    'partitionType':'SUBDIVISION'
                                                },
                                    'biddingStrategyConfiguration': {
                                                                     'bids': [{
                                                                               'xsi_type': 'CpcBid',
                                                                               'bid': {
                                                                                         'microAmount': str(bid_modifier)
                                                                                       },
                                                                               }]
                                                                    }
                                    }
                        }





    result = adgroup_criterion_service.mutate(operation)




if __name__ == '__main__':
  adwords_client = adwords.AdWordsClient.LoadFromStorage('*************.yaml')
  main(adwords_client)

Kevin Weitzner

unread,
May 2, 2016, 11:45:40 AM5/2/16
to AdWords API Forum
Last and final update.

I tested and I can pull the Criteria ID for item IDs and utilize this code to update their CPC.

Thank you for all your help Josh and Anup.
Reply all
Reply to author
Forward
0 new messages