Shopping Campaigns
Adam Ohren
Agenda
● Google Shopping & Merchant Center
● Content API for Shopping
● AdWords Shopping Campaigns
● Product Partition Trees
● Local Inventory Ads
● Product Partition Utility
Google Shopping &
Merchant Center
Google Shopping
Merchant Center
● View products, but not
edit
● Manage account and
subaccounts
● Data quality and
disapproval
information
● Link to AdWords
accounts
● Tax and delivery
settings
Multi-client Accounts
● Analogous to AdWords
MCCs
● Allows merchants to
manage many sub-
accounts
Data Feeds
● CSV, XML, Google Sheets with product data
● Fetched manually or on a schedule
Content API for
Shopping
Content API
● Manage products, data feeds, users,
accounts
● Can make updates throughout the day
● Instant feedback on some data issues
Content API Example
POST
/content/v2/YOUR_MERCHANT_ID/inventory/online/products/onl
ine:en:GB:book123
{
"price": {
"value": "3.99",
"currency": "USD"
}
}
Updating a product’s price:
Content API for Shopping
https://developers.google.com/shopping-content/
AdWords Shopping
Campaigns
Shopping Campaigns
Shopping Campaigns
● Connects a linked Merchant Center to
AdWords campaign
● Enables Product Listing Ads (PLAs)
● Manages bids based on product hierarchy
Shopping Campaigns Differences
● AdvertisingChannelType is SHOPPING
● Must have a ShoppingSetting which sets
○ The Merchant Center account to use for product data
○ The target country of the products to use
○ Optional priority
● Must have a valid ProductPartition tree
Creating a Shopping Campaign
// Create regular campaign
Campaign c = new Campaign();
c.setAdvertisingChannelType(
AdvertisingChannelType.SHOPPING);
// Set shopping attributes
ShoppingSetting shoppingSetting = new ShoppingSetting();
shoppingSetting.setMerchantId((long) 1234567);
shoppingSetting.setSalesCountry("GB");
shoppingSetting.setCampaignPriority(0);
c.setSettings(new Setting[] {shoppingSetting});
Product Partition
Trees
Product Partitions
Inventory is partitioned by various Product
Dimensions
Product Dimensions
Make bidding decisions based on product data
● Category
● Brand
● Item ID
● Condition
● Product type
● Custom labels
● Product channel v201502
● Product channel exclusivity v201502
Product Dimensions
Category ProductBiddingCategory
Brand ProductBrand
Item ID ProductOfferId
Condition ProductCanonicalCondition
Product type ProductType
Custom labels ProductCustomAttribute
Channel ProductChannel
Channel exclusivity ProductChannelExclusivity
Product Partitions
Product Partitions
Product Partitions
ProductPartition root = new ProductPartition();
root.setPartitionType(ProductPartitionType.SUBDIVISION);
root.setId(-1);
Product Partitions
Root is a subdivision. It has no value and no parent.
ProductBiddingCategory toysDimension = ...
ProductPartition toys = new ProductPartition();
toys.setPartitionType(ProductPartitionType.UNIT);
toys.setParentCriterionId(root.getId());
toys.setCaseValue(toysDimension);
Product Partitions
The Toys category is a unit. It has root as it’s parent.
ProductBrand otherBrand = new ProductBrand();
ProductBiddingCategory otherCat = new
ProductBiddingCategory();
otherCat.setType(ProductDimensionType.BIDDING_CATEGORY_L1);
Product Partitions
To create an Other node, use a dimension with no value
BiddableAdGroupCriterion toysCriterion = new ...
toysCriterion.setAdGroupId(...);
toysCriterion.setCriterion = toys;
toysCriterion.setBiddingStrategyConfiguration(...);
AdGroupCriterionOperation operation = new ...
operation.setOperand(toysCriterion);
operation.setOperation(Operator.ADD);
adGroupCriterionService.mutate(...);
Product Partitions
Create the tree
Local Inventory Ads
Local Inventory Ads
Easily make in-store products available in
shopping campaigns
New LIA Controls in v201502
1. Enable local inventory ads
2. Campaign-level filters for Channel &
ChannelExclusivity
3. Product tree dimensions for Channel &
ChannelExclusivity
Enable Local Inventory Ads
● Opt-in campaigns to serve local
information
Enable Local Inv. Ads Example
Campaign c = new Campaign();
c.setAdvertisingChannelType(AdvertisingChannelType.
SHOPPING);
// Set shopping attributes
ShoppingSetting shoppingSetting = new ShoppingSetting();
shoppingSetting.setMerchantId((long) 1234567);
shoppingSetting.setSalesCountry("GB");
shoppingSetting.setCampaignPriority(0);
shoppingSetting.setEnableLocal(true);
c.setSettings(new Setting[] {shoppingSetting});
Campaign-level Filters
● Use inventory filters to include / exclude
products based on channel dimensions
Campaign-level Filters Example
ProductScope scope = new ProductScope();
ProductChannel channel = new ProductChannel();
channel.setValue(“ONLINE”);
ProductChannelExclusivity channelEx = new
ProductChannelExclusivity();
channelEx.setValue(“SINGLE_CHANNEL”);
scope.setDimensions(new ProductDimension[]{ channel,
channelEx});
Product Tree Dimensions
● Segment product tree by Channel &
ChannelExclusivity
Product Tree Dimensions Example
ProductPartition node1 = new ProductPartition();
node1.setPartitionType(ProductPartitionType.UNIT);
node1.setCaseValue(new ProductChannel(null, "ONLINE"));
node1.setParentCriterionId(root.getId());
ProductPartition node2 = new ProductPartition();
node2.setPartitionType(ProductPartitionType.UNIT);
node2.setCaseValue(new ProductChannel(null, "LOCAL"));
node2.setParentCriterionId(root.getId());
Product Partition
Utility
Product Partition Utility
● Client-side extension that simplifies
creating, mutating, and removing
ProductPartitions
● Added in v201409
● Java client library only
Product Partition Utility
● ProductPartitionTree API
○ Abstracts tree handling
● ProductPartitionNode API
○ Abstracts nodes & properties (bids, dimensions, etc.)
Sample Use Cases
● Rebuild entire trees
● Convert SUBDIVISION <-> UNIT
● Update bids
Creating a ProductPartitionTree
ProductPartitionTree tree = ProductPartitionTree.
.createAdGroupTree(adWordsServices, adWordsSession, adGroupId);
ProductPartitionNode rootNode = tree.getRoot();
...
Construct a ProductPartitionTree using the
static createAdGroupTree method.
Get the root ProductPartitionNode from the
new tree.
Updating a Bid Example
tree.getRoot()
.getChild(ProductDimensions
.createType(ProductDimensionType.PRODUCT_TYPE_L1, "clothing"))
.asBiddableUnit()
.setBid(bid);
List<AdGroupCriterionOperation> operations = tree.getMutateOperations();
Convert UNIT to SUBDIVISION
Convert UNIT to SUBDIVISION - Cont.
ProductPartitionNode shoes = tree.getRoot()
.getChild(createType(ProductDimensionType.PRODUCT_TYPE_L1, "shoes"))
.asSubdivision();
shoes.addChild(createCanonicalCondition(
ProductCanonicalConditionCondition.NEW))
.asBiddableUnit().setBid(1000000L);
shoes.addChild(createCanonicalCondition(
ProductCanonicalConditionCondition.REFURBISHED))
.asBiddableUnit().setBid(1500000L);
shoes.addChild(createCanonicalCondition(null)).asExcludedUnit();
List<AdGroupCriterionOperation> operations = tree.getMutateOperations();
Rebuilding a Tree
List<AdGroupCriterionOperation> operations = tree.getMutateOperations();
tree.getRoot()
.asBiddableUnit()
.setBid(bid);
tree.getRoot()
.removeAllChildren()
.asSubdivision()
tree.getRoot()
.addChild(...);
...
Send Us Feedback!
We're looking for feedback on this utility.
If you use it, we want to hear
from you!
Check out the guide on github:
http://goo.gl/UmN17E
Resources
● Shopping Campaigns Guide
https://developers.google.com/adwords/api/docs/guides/shopping
● Product Partition Utility Example
https://github.com/googleads/googleads-java-lib (see
AddProductPartitionTree.java)

Shopping Campaigns

  • 1.
  • 2.
    Agenda ● Google Shopping& Merchant Center ● Content API for Shopping ● AdWords Shopping Campaigns ● Product Partition Trees ● Local Inventory Ads ● Product Partition Utility
  • 3.
  • 4.
  • 5.
    Merchant Center ● Viewproducts, but not edit ● Manage account and subaccounts ● Data quality and disapproval information ● Link to AdWords accounts ● Tax and delivery settings
  • 6.
    Multi-client Accounts ● Analogousto AdWords MCCs ● Allows merchants to manage many sub- accounts
  • 7.
    Data Feeds ● CSV,XML, Google Sheets with product data ● Fetched manually or on a schedule
  • 8.
  • 9.
    Content API ● Manageproducts, data feeds, users, accounts ● Can make updates throughout the day ● Instant feedback on some data issues
  • 10.
  • 11.
    Content API forShopping https://developers.google.com/shopping-content/
  • 12.
  • 13.
  • 14.
    Shopping Campaigns ● Connectsa linked Merchant Center to AdWords campaign ● Enables Product Listing Ads (PLAs) ● Manages bids based on product hierarchy
  • 15.
    Shopping Campaigns Differences ●AdvertisingChannelType is SHOPPING ● Must have a ShoppingSetting which sets ○ The Merchant Center account to use for product data ○ The target country of the products to use ○ Optional priority ● Must have a valid ProductPartition tree
  • 16.
    Creating a ShoppingCampaign // Create regular campaign Campaign c = new Campaign(); c.setAdvertisingChannelType( AdvertisingChannelType.SHOPPING); // Set shopping attributes ShoppingSetting shoppingSetting = new ShoppingSetting(); shoppingSetting.setMerchantId((long) 1234567); shoppingSetting.setSalesCountry("GB"); shoppingSetting.setCampaignPriority(0); c.setSettings(new Setting[] {shoppingSetting});
  • 17.
  • 18.
    Product Partitions Inventory ispartitioned by various Product Dimensions
  • 19.
    Product Dimensions Make biddingdecisions based on product data ● Category ● Brand ● Item ID ● Condition ● Product type ● Custom labels ● Product channel v201502 ● Product channel exclusivity v201502
  • 20.
    Product Dimensions Category ProductBiddingCategory BrandProductBrand Item ID ProductOfferId Condition ProductCanonicalCondition Product type ProductType Custom labels ProductCustomAttribute Channel ProductChannel Channel exclusivity ProductChannelExclusivity
  • 21.
  • 22.
  • 23.
  • 24.
    ProductPartition root =new ProductPartition(); root.setPartitionType(ProductPartitionType.SUBDIVISION); root.setId(-1); Product Partitions Root is a subdivision. It has no value and no parent.
  • 25.
    ProductBiddingCategory toysDimension =... ProductPartition toys = new ProductPartition(); toys.setPartitionType(ProductPartitionType.UNIT); toys.setParentCriterionId(root.getId()); toys.setCaseValue(toysDimension); Product Partitions The Toys category is a unit. It has root as it’s parent.
  • 26.
    ProductBrand otherBrand =new ProductBrand(); ProductBiddingCategory otherCat = new ProductBiddingCategory(); otherCat.setType(ProductDimensionType.BIDDING_CATEGORY_L1); Product Partitions To create an Other node, use a dimension with no value
  • 27.
    BiddableAdGroupCriterion toysCriterion =new ... toysCriterion.setAdGroupId(...); toysCriterion.setCriterion = toys; toysCriterion.setBiddingStrategyConfiguration(...); AdGroupCriterionOperation operation = new ... operation.setOperand(toysCriterion); operation.setOperation(Operator.ADD); adGroupCriterionService.mutate(...); Product Partitions Create the tree
  • 28.
  • 29.
    Local Inventory Ads Easilymake in-store products available in shopping campaigns
  • 30.
    New LIA Controlsin v201502 1. Enable local inventory ads 2. Campaign-level filters for Channel & ChannelExclusivity 3. Product tree dimensions for Channel & ChannelExclusivity
  • 31.
    Enable Local InventoryAds ● Opt-in campaigns to serve local information
  • 32.
    Enable Local Inv.Ads Example Campaign c = new Campaign(); c.setAdvertisingChannelType(AdvertisingChannelType. SHOPPING); // Set shopping attributes ShoppingSetting shoppingSetting = new ShoppingSetting(); shoppingSetting.setMerchantId((long) 1234567); shoppingSetting.setSalesCountry("GB"); shoppingSetting.setCampaignPriority(0); shoppingSetting.setEnableLocal(true); c.setSettings(new Setting[] {shoppingSetting});
  • 33.
    Campaign-level Filters ● Useinventory filters to include / exclude products based on channel dimensions
  • 34.
    Campaign-level Filters Example ProductScopescope = new ProductScope(); ProductChannel channel = new ProductChannel(); channel.setValue(“ONLINE”); ProductChannelExclusivity channelEx = new ProductChannelExclusivity(); channelEx.setValue(“SINGLE_CHANNEL”); scope.setDimensions(new ProductDimension[]{ channel, channelEx});
  • 35.
    Product Tree Dimensions ●Segment product tree by Channel & ChannelExclusivity
  • 36.
    Product Tree DimensionsExample ProductPartition node1 = new ProductPartition(); node1.setPartitionType(ProductPartitionType.UNIT); node1.setCaseValue(new ProductChannel(null, "ONLINE")); node1.setParentCriterionId(root.getId()); ProductPartition node2 = new ProductPartition(); node2.setPartitionType(ProductPartitionType.UNIT); node2.setCaseValue(new ProductChannel(null, "LOCAL")); node2.setParentCriterionId(root.getId());
  • 37.
  • 38.
    Product Partition Utility ●Client-side extension that simplifies creating, mutating, and removing ProductPartitions ● Added in v201409 ● Java client library only
  • 39.
    Product Partition Utility ●ProductPartitionTree API ○ Abstracts tree handling ● ProductPartitionNode API ○ Abstracts nodes & properties (bids, dimensions, etc.)
  • 40.
    Sample Use Cases ●Rebuild entire trees ● Convert SUBDIVISION <-> UNIT ● Update bids
  • 41.
    Creating a ProductPartitionTree ProductPartitionTreetree = ProductPartitionTree. .createAdGroupTree(adWordsServices, adWordsSession, adGroupId); ProductPartitionNode rootNode = tree.getRoot(); ... Construct a ProductPartitionTree using the static createAdGroupTree method. Get the root ProductPartitionNode from the new tree.
  • 42.
    Updating a BidExample tree.getRoot() .getChild(ProductDimensions .createType(ProductDimensionType.PRODUCT_TYPE_L1, "clothing")) .asBiddableUnit() .setBid(bid); List<AdGroupCriterionOperation> operations = tree.getMutateOperations();
  • 43.
    Convert UNIT toSUBDIVISION
  • 44.
    Convert UNIT toSUBDIVISION - Cont. ProductPartitionNode shoes = tree.getRoot() .getChild(createType(ProductDimensionType.PRODUCT_TYPE_L1, "shoes")) .asSubdivision(); shoes.addChild(createCanonicalCondition( ProductCanonicalConditionCondition.NEW)) .asBiddableUnit().setBid(1000000L); shoes.addChild(createCanonicalCondition( ProductCanonicalConditionCondition.REFURBISHED)) .asBiddableUnit().setBid(1500000L); shoes.addChild(createCanonicalCondition(null)).asExcludedUnit(); List<AdGroupCriterionOperation> operations = tree.getMutateOperations();
  • 45.
    Rebuilding a Tree List<AdGroupCriterionOperation>operations = tree.getMutateOperations(); tree.getRoot() .asBiddableUnit() .setBid(bid); tree.getRoot() .removeAllChildren() .asSubdivision() tree.getRoot() .addChild(...); ...
  • 46.
    Send Us Feedback! We'relooking for feedback on this utility. If you use it, we want to hear from you! Check out the guide on github: http://goo.gl/UmN17E
  • 47.
    Resources ● Shopping CampaignsGuide https://developers.google.com/adwords/api/docs/guides/shopping ● Product Partition Utility Example https://github.com/googleads/googleads-java-lib (see AddProductPartitionTree.java)