Logo Wyomind Magento workshop

Add-ons for Magento®

Export quickly and safely a valid and well-structured data feed of your complete catalog of products from your Magento 2 website to your Google Merchant Account thanks to Simple Google Shopping, an extension built by a Google partner.

  • Lifetime Upgrade
  • 6 Months Support
  • 30 Days Money-Back
429 Reviews

This extension is built by a

Google Shopping specialized partner

expand

What are Google Merchant and Google Shopping?

In order to use Simple Google Shopping, you should be aware of what Google Merchant and Google Shopping are.

Here is some basic knowledge about Google Shopping and data feed management.

What are Google Shopping and Google Merchant?

Google Shopping is a free Google service allowing customers to find and compare products they want to buy online. If you are an online merchant, you can submit all your products to Google Shopping and attract potential customers by allowing them to view your products more easily.

Google Merchant Center is a too that helps you upload your store and products data to Google and so make it available for Google Shopping ads and other services of Google Learn more on how to get started with Merchant Center.

How to create my Google Merchant Account?

In order to submit your products to Google Shopping, you need to create a Google Merchant Account. Click on the following link for further information on creating an account: https://support.google.com/merchants/answer/188924?hl=en

Once you account created, you'll have access to the Google Merchant interface. There you can manage all your product data feeds and plan any daily, weekly or monthly updating tasks.

What is a products data feed?

A data feed is a file made up of a unique group of attributes that define each one of your products. This allows customers to search and find your items more easily. This file is similar to a RSS data feed but includes some specific XML tags used by Google Merchant Center or any other shopping engine.

To know more about the product data feeds, feel free to have a look to the Google Merchant Center support site: https://support.google.com/merchants/answer/188478?hl=en

How to create a products data feed?

Simple Google Shopping and Data Feed Manager are two Magento 2 extensions that allow you to quickly configure, generate and automate several product data feeds.

How to use Simple Google Shopping?

STEP 1: Configure Simple Google Shopping in a general way

Before being able to configure your data feeds, you should configure the extension in a general way. To do so, go to:
Stores  SettingsConfiguration WyomindSimple Google Shopping 

Cron job reporting

In the Cron job reporting tab, you can activate the cron job reporting and fill in an email address to receive the reports. You can also rename the reports as you want. 

Core Settings

In the Core Settings tab, you'll need to configure a certain number of fields.
  • Items in preview:
    By default there are 10 items in preview, if you want you can reduce or increase that number.
  • Items in buffer:
    By default, products are inserted into the file on the server every 10 items but you can reduce or increase that number.
  • Items in SQL request:
    By default, there are 1500 items in each MySql query.
  • Number of advanced filters:
    By default, you have 10 advanced filters. If you need more, you can at any time increase that value.
  • Use of OR/AND statements in advanced filters:
    OR/AND statements can be used in the advanced filters simply by enabling that option. 
  • Include not in menu categories:
    You can also include the categories of products that are not in the menu. 
  • Memory limit size (M):
    The default memory limit is 1024.
  • Use canonical urls:
    You have the choice between several options. You can choose to use the shortest category url, the longest one or the product url.

For example, if you have a "T-shirt" in 2 categories: "New arrivals" and "Shirts", the urls may be
Product Url = http://mywebsite.com/t-shirt.html
Shortest category url = http://www.mywebsite.com/men/shirts/t-shirt.html
Longest category url = http://mywebsite.com/men/new-arrivals/t-shirt.html

  • Enable log reporting:
    You can also enable the log reporting.

STEP 2: Configure your data feeds with Simple Google Shopping

To create and configure your data feeds, go to:
ProductsSimple Google Shopping

Your data feeds will be listed according to IDs. You will find the name of the file, its path as well as the link to the data feed file. You should also get a message that sums up the number of products exported, the time it took and the number of errors and warnings in your data feed.

The status of your data feed will vary according to the situation:

  • Pending: the data feed has never been generated or the scheduled hour is passed (waiting for the execution of the cron task)
  • Success: successful generation of the data feed, manually or automatically (the generation corresponds with a schedule)
  • Hold: in the process of generation (latency, indeterminate status)
  • Processing: generation progression percentage
  • Error: the generation is stopped

You should find the date and the hour of the last generation of the data feed as well as the Store view taken into account for the data feed.

From the Action dropdown, you'll be able to:

  • Generate
  • Edit
  • Preview (10 products)
  • Show Report
  • Delete

Click on Create new data feed  to configure your data feed as you want.

The Tool Box

When creating a data feed, you should see a black box on the right of your screen. The Simple Google Shopping extension includes that tool to help you configure your feed and see what is wrong.

The toolbox is inevitably a very useful tool. This will help you to configure your data feed more quickly.

Below are the different options of the toolbox.

Library

If you click on that button, a library of your store attributes will be displayed. This makes it easier to find very quickly which attribute you need to add into your pattern.

Preview

When clicking on it, you'll see a preview of your data feed. It's very useful to see if the values of your attributes are correctly retrieved or if the filters you've defined are working as expected.

Report

You can get reports on the errors and warnings of your data feeds.

Those reports do not replace the error reports from Google and are by no means a guarantee that your data feed will be approved by the Google team. This will help you to save time by quickly identifying the main problems of your data feed and by making the necessary changes.

  • In orange will be displayed the warnings such as: Missing recommended attribute: product_type.
  • In red will be displayed the error that you must correct to be able to submit your data feed: Missing required attribute:
    google_product_category.

Next to these errors or warnings, you should see the number of items that are concerned.

By default, the reports will give the 10 first examples ( sku ) that are concerned with each error and warning. You can change that by editing the Items in preview in:
StoresSettingsConfigurationWyomindSimple Google ShoppingCore Settings

The reports are also available from the action dropdown, in:ProductsSimple Google Shopping.

Configuration

In that first tab is the main configuration of the data feed. To customize your feed, you'll find several fields to fill in.

  • Filename
    Enter a name for the file.
  • Path
    Define the path where you want the data feed to be generated. For example:
    /feeds/
  • Store View
    Define which store view is concerned.
  • Website url
    Add your website url.
  • Title
    Add a title to your feed.
  • Description
    Add a description to your data feed.
  • XML pattern
    This is probably the most important field as this is where you will configure your pattern.

For a good understanding, check how to manage your data feed templates

Categories filter

In the Categories tab, you will find 2 subtabs that will allow you to manage your categories.

You can filter your categories according to two different ways:

  • Exclude all products from the selected categories.
  • Include all products from the selected categories.

Note that if you don't select any category, all products will be exported.

For example, if you wish to include only products of the Gear category, you can configure your filters in two different ways.

First of all by ticking the Include option that will allow you to include all categories that you have selected.Or via the Exclude option that will exclude all categories that you have selected.

You are able to include or exclude your categories depending on:

  • Parent categories only
    In the case where you have a configurable product with simple variants associated. The configurable has a category assigned but not the variants.
  • Product categories only
    If you have categories assigned to simple variants but not to the configurable product.
  • Product and parent categories
    In the case where you have both situations.

Category selection and mapping

In that subtab, you can select and map your categories to Google ones. This step is very important so that Google can make a link between their product categories and yours.

What is the category mapping?

The Google product taxonomy is a tree of categories that will help you generate values for the Google product category attribute listing all possibilities.

Categories names you are using in your Magento aren't always the same than the ones used by Google Merchant to reference your products.

This means you have to find out which Google Merchant categories have the best matching with yours, according to the Google product taxonomy.

For example, if you're selling furnitures like coffee tables, you'll have a Coffee table category in your Magento admin. But Google Merchant doesn't handle this kind of category. The closest Google product category could be Kitchen & Dining Room Table.

How to map your categories to Google ones? 

Simple Google Shopping provides you with an easy way to input Google product categories that are matching yours.

In your data feed configuration, go in the Categories tab. Then, in the Category selection and mapping section, you'll find a treeview of all your categories.

First select the Google Taxonomy source on which the category mapping is based.

Taxonomy files for the main countries are directly included in the extension to allow you to map your categories more easily. You can also have a look to the below documentation to know how to add a new taxonomy file.

For each category, you have a little arrow followed by mapped as. There, you'll be able to start typing a keyword in order to display a list of all categories including that keyword. You simply need to select the one you need.

How to add a taxonomy file?

With Simple Google Shopping, you have the possibility to change the file on which the category mapping is based.

Taxonomy files for the main countries are directly included to allow you to map your categories more easily. You can also add a new taxonomy file.

From that page, choose the language you want to use for your taxonomy at the bottom right. Then, in the Downloadable taxonomy, open the Plain Text link that contains full category names.

Save that file and paste it in:
Magento 2 Root DirectoryappcodeWyominDSimple Google ShoppingdataGoogleTaxonomies

Don't forget to apply the permissions 644 to the file.

You'll then be able to choose that specific taxonomy from your data feed configuration.

How to include the Google category to the XML template?

Finally, so that the Google category is retrieved in your data feed, you must add the following attribute to the XML template:

<g:google_product_category>{{product.google_product_category}}</g:google_product_category>

Please note that this attribute is different from Product Type.

<g:product_type> is for the categories that you have defined independently in your Magento back-office.You can easily fill this XML section using {{object.categories}}. This will then retrieve for each one of your products, the category you have assigned to it.

Read also: https://support.google.com/merchants/answer/6324406?hl=en

Filters

Simple Google Shopping for Magento 2 also allows you to filter your products on several levels according to their attribute sets or their visibility for example.

Product Type

First of all, you can choose to include products to your feed according to their type. For example, only include simple, virtual and downloadable products.

Attribute Set

You have the choice to include several attribute sets. In our case, we've decided to include only the Default and Gear attribute sets. 

Product Visibility

Then, choose the products that will be included to the feed between the products that are not visible individually, products from the Catalog, the Search results, or both. 

Advanced Filters

In the Advanced filters, you can go further by setting more personalized filters. For example, we wanted to include only products which price is higher than 0, and which SKU is not null.

Here again, you have the possibility to configure your advanced filters according to several options.

  • LIKE / NOT LIKE

name like %shirt: will include all products which name ends with 'shirt'.
name like Apple%: will include all products which name starts with 'Apple'.
name like %women%: will include all products which name contains the 'women' character string.

name not like %shirt: won't include any product which name ends with 'shirt'.
name not like Apple%: won't include any product which name starts with 'Apple'.
name not like %women%: won't include any product which name contains the 'women' character string.

  • IS NULL / IS NOT NULL

is null: the value is null. Eg: Special price is null: will include all products that don't have special prices. is not null: the value is not null. Eg: SKU is not null: will include all products which SKU is not null.

  • IN / NOT IN

Size in S L: will include only products from these 2 sizes. 
Size not in S L: will include all products which size is not S or L.

You can activate the AND/OR statement in the Core Settings from:StoresSettingsConfigurationWyomindSimple Google Shopping.

Cron Schedule

Simple Google Shopping for Magento 2 provides you with a fully configurable schedule in the Cron Schedule tab of each data feed pattern configuration.

You just have to tick the days and hours when you want your data feed to be generated.

If you're facing some difficulties with scheduled tasks, or if you think your data feed is not automatically generated, have a look to our faq.

STEP 3: Generate and download the data feeds

Generate the data feeds manually

Simple Google Shopping allows you to generate the data feeds manually or automatically. 

Manually

You can generate your data feeds manually from the action dropdown of the data feeds grid. 

You also have the possibility to do it from the configuration panel by clicking on Generate 

With the cron tasks

In order to automatically generate the data feeds through the cron tasks, you must first make sure that the main cron task is enabled on your server.

Data Feed Manager - Cron Success

If not, you should see a warning message in Simple Google Shopping.

Then, you need to select a least one day and one time frame from the Cron schedule tab for each data feed that must be updated.

Generate the data feeds through CLI

You can easily use the Command Line Interface to generate the data feeds.

To generate all the data feeds:

bin/magento wyomind:simplegoogleshopping:generate


To generate one data feed from a given id:

bin/magento wyomind:simplegoogleshopping:generate int DATA_FEED_ID


To generate several data feeds from a given list of ids:

bin/magento wyomind:simplegoogleshopping:generate  int DATA_FEED_ID [, int DATA_FEED_ID] [, int DATA_FEED_ID]...


To list all data feeds including status, name, last update:

bin/magento wyomind:simplegoogleshopping:list

Download the generated data feed

When a data feed is ready to be downloaded, the link is displayed in both, the data feed grid and the data feed page at the top of the page. To download the data feed, select Save link as after a right-click on the link. You should also find the file in your ftp client if the directory where the data feed is stored is not publicly accessible.

Note that the random parameter at the end of the url avoids caching issues when you download the data feed from your Magento

Manage your data feed templates with Simple Google Shopping

10 Things to know when creating an XML data feed with Simple Google Shopping

  1. An XML data feed is using opening and closing tags that include a value.
    <g:id>123456</g:id><price>45.99 USD</price>​

  2. A data feed template is made of several tags including dynamic or fixed values.
    <g:id>{{product.sku}}</g:id><g:brand>Fixed Brand</g:brand>

  3. Dynamic values are called variables and use the attribute codes of your Magento website preceded with the object. The variable must be enclosed using double brackets.
    <g:id>{{product.sku}}</g:id><price>{{parent.price}}</price>

  4. Between every opening and closing tags, you can also include some fixed values. Fixed values are simply text.
    <g:brand>YOUR BRAND</g:brand>

  5. You have also the possibility to add several variables and fixed values in a same tag.
    <title>{{parent.name}}, available in {{product.color}} for only ${{product.price}}</title>

  6. Some Magento 2 attributes like price, image or url may have further configuration options or parameters that will correspond to your specific data feed needs.
    <price>{{product.price currency=EUR vat_rate=20}}</price>​

  7. You're allowed to use PHP code if you want to customize the pattern. Check how to add PHP scripts into your patterns.
    <tag>{{product.name output="wyomind_strtolower($self)"}}</tag>            

  8. The syntactic coloration in Simple Google Shopping will also help you to avoid many errors in your pattern.
  9. You can use one or more fallback variables in case of the previous is empty or null. If attributeA exists then the value will be attributeA, otherwise, the value will be attributeB...
    {{product.color | product.colour}}​

  10. CDATA are recommended. CDATA stands for Character Data. It means that the data in between these tags include data that could be interpreted as XML markup, but should not be (Wikipedia article).
    <description>
    <![CDATA[<p>Fantastic <b>Watch</b>, that not only tells you what time it is,but also gives the weather trends</p>]]>
    </description>​

How is a variable structured?

To modify your pattern as you want, before anything you need to respect a particular syntax. Indeed, in order to retrieve attributes, the Simple Google Shopping extension uses a specific structure. Then it is essential that you know how the variable is built to be able to configure your data feed according to your needs.

The above screen details the different components of a variable.

  • object
    Defines what is the target for the attribute to retrieve. It can be a simple product, a parent, configurable, bundle or grouped one.  
  • attribute
    Defines the code of the attribute to retrieve. For example, the price, the url...
  • parameters
    Defines some additional parameters for specific attributes such as the currency or the VAT rate.
  • value
    Defines the different values available for the previous parameter.

Attribute specifications

The data feed pattern is totally customizable.

Any of the basic attributes in Magento 2 can be used in the data feed pattern. You can also add the attributes that you have created from the back-office.

OBJECTS

In order to retrieve the value of an attribute, you need to define which object is targeted. Below are the different types of objects that you can use.

{{product.attribute_code}}

Retrieves the attribute for the product.

For example:

{{product.sku}}
{{product.color}} 

{{parent.attribute_code}}

Retrieves the parent attribute value.

The parent value is retrieved only if the simple (item) product is associated with a parent product, if not, nothing is retrieved.

The parent product may be a configurable, a grouped or a bundle product. The first parent product that matches the simple product is used to get the attribute value.

For example:

{{parent.product_type}}
{{parent.brand}} 

{{configurable.attribute_code}}

Retrieves the first configurable parent attribute value.

The configurable product value is retrieved only if the simple product is associated to a configurable product, if not, nothing is retrieved.

For example:

{{configurable.image_link}}
{{configurable.url}} 

{{grouped.attribute_code}}

Retrieves the first grouped parent attribute value.

The grouped product value is retrieved only if the simple product is associated to a grouped product, if not, nothing is retrieved.

For example:

{{grouped.google_product_category}}
{{grouped.url}} 

{{bundle.attribute_code}}

Retrieves the first bundle parent attribute value.

The bundle product value is retrieved only if the simple product is associated to a bundle product, if not, nothing is retrieved.

For example:

{{bundle.sale_price}}
{{bundle.price}} 

PRODUCT IDENTIFIERS

You'll find below the attributes the most commonly used to identify the products in data feeds patterns.

{{object.sku}}

Retrieves the sku of the product.

For example:

{{product.sku}} 

{{object.brand}}

Retrieves the brand of the product.

For example:

{{product.brand}}

Attention, this attribute is an example and can differ according to the configuration of your Magento 2 store.

{{object.manufacturer}}

Retrieves the brand of the product.

For example:

{{product.manufacturer}} 

BASIC INFORMATION

You'll find below the attributes that are generally used to define basic information of products in the data feeds.

{{object.name}}

Retrieves the name of the product.

For example:

{{product.name}} 

{{object.description}}

Retrieves the description of the product.

For example:

{{product.description}} 

{{object.short_description}}

Retrieves the short description of the product.

For example:

{{product.short_description}} 

{{object.condition}}

Retrieves the condition of the product.

For example:

{{product.condition}} 

{{object.weight}}

Retrieves the weight of the product.

For example:

{{product.weight}} 

PRICES AND PROMOTIONS

Below is a list of the price attributes that you can use in your feed pattern. For most of them, you can add some parameters in order to define the currency used or the VAT to apply for example.

{{object.price}}

Retrieves the best price among all the prices defined.

If prices are exclusive of VAT and the product is liable to a unique VAT rate, the price retrieved will include this rate. Otherwise, the price exclusive of tax is retrieved.

For example:

{{product.price}}


You also have the possibility to use some parameters with this attribute:

  • currency = automatically converts the original product price to a specified currency. It uses an exchange rate that you have already stored in your admin panel. By default, your local currency is used.
  • vat_rate = is a floating value between 0.00 and 100.00 that represents an arbitrary VAT rate to apply. This parameter rewrites the VAT rule for the product except if the product doesn't have any tax class.


Here are some examples:


To convert the prices to EUR and apply a 20% VAT rate:

{{product.price currency=EUR vat_rate=20}}


To convert the prices to USD and not apply any VAT rate:

{{product.price currency=USD vat_rate=0}}  


If the prices of your catalog are already including VAT:

{{product.price currency=USD}} 


To use an ISO2 code corresponding to one of the countries for which you specified a VAT rate in your tax settings:

{{product.price currency=EUR vat_rate=FR}}


This code may also be completed by an area code:

{{product.price currency=USD vat_rate=US/NY}}


To deduce the VAT corresponding to a country/area:

{{product.price currency=GBP vat_rate=-GB}}


To retrieve prices including different price values for simple products associated to a configurable one:

{{parent.price currency=EUR vat_rate=20}} 

{{object.normal_price}}

Retrieves the base price and ignores any other existing price value.

For example:

{{product.normal_price}}

You also have the possibility to use some parameters with this attribute: see {{object.price}}

{{object.special_price}}

Retrieves the special price if exists. If this price doesn't exist the value is null.

For example:

{{product.special_price}}

You also have the possibility to use some parameters with this attribute: see {{object.price}}

{{object.price_rules}}

Retrieves the price including the catalog price rules if indicated, if not, nothing is retrieved.

If prices are exclusive of VAT and the product is liable to a unique VAT rate, the price retrieved will include this rate. Otherwise, the price exclusive of tax is retrieved.

For example:

{{product.price_rules}}

You also have the possibility to use some parameters with this attribute: see {{object.price}}

{{object.sale_price}}

Retrieves the best promotional between price rules and special prices).

For example:

{{product.sale_price}}

You also have the possibility to use some parameters with this attribute: see {{object.price}}

{{object.sale_price_effective_date}}

Retrieves the sale price effective date as 2011-03-01T13:00-0800/2011-03-11T15:30-0800. If no date is defined or if the dates defined don't match with the current date, the value is null.

For example:

{{product.sale_price_effective_date}} 

{{object.has_special_price}}

Retrieves either 1 if a special price exists or 0 if not.

You also have the possibility to use some parameters with this attribute:

  • yes = value to retrieve if a special price exists. By default 1.
  • no = value to retrieve if no special price exists. By default 0.

For example:

{{product.has_special_price yes="Special price" no="No special price"}} 

{{object.has_sale_price}}

Retrieves either 1 if a promotional price exists or 0 if not.

You also have the possibility to use some parameters with this attribute:

  • yes = value to retrieve if a promotional price exists. By default 1.
  • no = value to retrieve if no promotional price exists. By default 0.

For example:

{{product.has_sale_price yes="Sale price" no="No sale price"}} 

{{object.min_price}}

Retrieves the minimum price. That attribute is used for bundle or grouped products.

If prices are exclusive of VAT and the product is liable to a unique VAT rate, the price retrieved will include this rate. Otherwise, the price exclusive of tax is retrieved.

For example:

{{product.min_price}}

You also have the possibility to use some parameters with this attribute: see {{object.price}}

{{object.max_price}}

Retrieves the maximum price. That attribute is used for bundle or grouped products.

If prices are exclusive of VAT and the product is liable to a unique VAT rate, the price retrieved will include this rate. Otherwise, the price exclusive of tax is retrieved.

For example:

{{product.max_price}}

You also have the possibility to use some parameters with this attribute: see {{object.price}}

{{object.promotion_id}}

Retrieves the product promotion id if exists.

For example:

<g:promotion_id>{{product.promotion_id}}</g:promotion_id>

To know more about the use of this attribute, check out our doc on Google Merchant Promotions extension.

LINKS

Below are listed the attributes that are generally used to retrieve any kind of link.

{{product.url_config}}

Retrieves URL to pre-select the simple product attributes from its configurable.

For example:

 {{product.url_config}}

{{object.url}}

Retrieves the product’s canonical absolute url.

For example:

{{product.url}} 

{{object.image_link}}

Retrieves the product’s main image.

You also have the possibility to use some parameters with this attribute:

  • index = index of any additional images to retrieve. By default 0 (the main image).

For example:

{{product.image_link index=2}} 

{{object.host}}

Retrieves the host url, for example https://www.website.com.

Example with the small_image attribute:

{{product.host}}/media/catalog/{{product.small_image}} 

{{object.uri}} or {{object.url_key}}

Retrieves the product canonical relative url.

For example:

https://www.mywebsite.com/mystore_code/{{product.uri}} 

CATEGORIES

To retrieve the categories of your products, you can check the below attributes.

{{object.categories}}

Display the category paths in which the product may be found.

All category paths are listed under the categories attribute from the shortest to the longest path as in the below example:

  1. Default Category
  2. Default CategorySales
  3. Default CategoryClothes
  4. Default CategoryClothesMen
  5. Default CategoryClothesMenPants
  6. Default CategorySalesSpring and Summer Sales


In order to display a specific category path you have the possibility to use some parameters with this attribute:

  • nth: display the nth category path, if not specified the 1st category is used by default. Negative values are allowed.
  • from: display a category path starting from the nth category level, if not specified the 1st category level is used by default. Negative values are allowed.
  • length: display a category path limited to the given number of category levels, if not specified the whole path is display by default.
  • separator: the character used to separate each category level.


For example:

{{product.categories nth="1"}}

Shows the first category path : Default Category

{{product.categories nth="-1"}}

Shows the last category path: Default CategorySalesSpring and Summer Sales

{{product.categories nth="3"}}

Shows the 3th category path: Default CategoryClothes

{{product.categories nth="-2"}}

Shows the before last category path: Default CategorYClothesMenPants

{{product.categories nth="-2" from="2"}}

Shows the before last category path from the 2nd category level: ClothesMenPants

{{product.categories nth="-1" from="-1"}}

Shows the last category path from the last category level: Spring and Summer Sales

{{object.category_mapping}}

Retrieves any new category that you have assigned (in the Categories tab) to the item’s own product category. If no mapping is assigned to the first category found, the second category will be used etc…

You also have the possibility to use some parameters with this attribute:

  • index = index of the category mapping


For example:

{{product.category_mapping index=0}}
{{product.category_mapping index=1}}
{{product.category_mapping index=2}}
{{product.category_mapping index=3}}
{{product.category_mapping index=4}}

This will retrieve a maximum of 5 category mappings in 5 separate tags.

{{object.google_product_category}}

Retrieves the Google category that you have assigned (in the Categories section) to the first category found for the product (index 0).

For example:

{{product.google_product_category}}

To find the Google categories that match with your categories: https://support.google.com/merchants/answer/160081?hl=en

AVAILABILITY

The below attributes are often used to retrieve the availability of your products, for example the quantity.

{{object.qty}}

Retrieves the available quantity.

The quantity retrieved for configurable products is based on the sum of simple products.

You also have the possibility to use some parameters with this attribute:

  • float = is the number of decimals.

For example:

{{product.qty float=2}} 

{{object.availability}}

Retrieves either "in stock" if the product is in stock, "out of stock" if the product is out of stock or "available for order" if the product is backorderable.

You also have the possibility to use some parameters with this attribute:

  • in_stock = value to retrieve if the product is in stock
  • out_of_stock = value to retrieve if the product is out of stock
  • backorderable = value to retrieve if the product is backorderable

The availability depends not only on the stock status but on the quantity available as well.

For example:

{{product.availability in_stock="In Stock" out_of_stock="No more Stock" backorderable="Can be ordered"}}

{{object.is_in_stock}}

Retrieves either "in stock" if the product is in stock, "out of stock" if the product is out of stock.

You also have the possibility to use some parameters with this attribute:

  • in_stock = value to retrieve if the product is in stock
  • out_of_stock = value to retrieve if the product is out of stock

This attribute depends only on the stock status and doesn't take into account the quantity available.

For example:

{{product.is_in_stock in_stock="In Stock" out_of_stock="No more Stock"}}

PRODUCT VARIANTS

In the case where you're using product variations (color, size or gender) then you can use the following attributes. Attention, these attributes are examples and can differ according to the configuration of your Magento 2 store.

{{object.gender}}

Retrieves the gender of the product.

For example:

{{product.gender}} 

{{object.age_group}}

Retrieves the age group of the product.

For example:

{{product.age_group}} 

{{object.color}}

Retrieves the color of the product.

For example:

{{product.color}} 

{{object.size}}

Retrieves the size of the product.

For example:

{{product.size}} 

{{object.material}}

Retrieves the material of the product.

For example:

{{product.material}} 

{{object.pattern}}

Retrieves the pattern of the product.

For example:

{{product.pattern}} 

GENERAL PARAMETERS

Below are listed all the parameters that you can use with any attribute in your data feeds.

{{object.attribute prefix="value"}}

The prefix is what will be displayed before the attribute value only if it is not null, otherwise nothing is retrieved.


Below are some examples:


To add the currency symbol before the price and not retrieve anything when the value of the attribute is null:

{{product.price currency=USD vat_rate=0 prefix="$"}}


To add the weight unit before the attribute value and not retrieve anything when that value is null:

{{product.weight prefix="LBS "}}

{{object.attribute suffix="value"}}

The suffix is what will be displayed after the attribute value only if it is not nul, otherwise nothing is retrieved.


Below are some examples:


To add the currency code after the price and not retrieve anything when the value of the attribute is null:

{{product.price currency=USD vat_rate=0 suffix=" USD"}}


To add the weight unit after the attribute value
and not retrieve anything when that value is null:

{{product.weight suffix=" LBS"}}

{{object.attribute as="myVariable"}}

The as parameter allows you to store the value of a given attribute into a variable for a later use in one of your PHP script or in a condition (see if parameter).
Notice, the attribute call even if it uses the as parameter will produce an output in the data feed expect if you add the output attribute with the value null (see output parameter)


Here are a few examples:


Display the product name and store the value in a variable $name:

<!-- Product name is displayed and stored under a new variable "name" -->
<name>{{product.name as="name"}}</name>

$name can be then used in a PHP script latter in the template

<?php
/* If variable $name is equal to "Apple", then display "Apple" then display "Banana" 
*/
if($name=="Apple") return $name;else return "Banana";
?>


Store the visibility of a product and use it in a condition for another attribute

<!-- Product visibility is stored under a new variable "visibility" and the attribute doesn't display -->
{{product.visibility as="visibility" output="null"}}
<!-- If the product is not visible individually (1) then we display the parent product url, otherwise we use the product url--> 
<url>{{parent.url if="visibility==1" | product.url}}</url>

{{object.attribute if="condition"}}

The if parameter allows you to define one or more necessary conditions to display the given attribute in the data feed.

One condition is built with 3 items :

  • the variable to check :
    a product attribute
    a variable previously stores thanks to the as parameter (see as parameter)
  • the comparison statement
    == equal
    <= lower or equal to
    => hieght or equal to
    < lower than
    > higher than
    != different from
  • the value


Example:

<!-- Product description will be displayed only if product brand is equal to "Apple" -->
<name>{{product.description if="product.brand==Apple"}}</name>            
<!-- Product weight will be displayed only if the product is not virtual AND not downloadable-->
<weight>{{product.weight if="product.type_id!=virtual" if="product.type_id!=downlodable"}}</weight>            

{{object.attribute output="functions"}}

The output parameter allows you to define the output format for a given attribute.

You can use the basic functions (see basic functions), the advanced functions (see advanced functions) or any php functions.


You must refer to the attribute by using the $self variable as the function's parameter.

Example :

<!-- Get the product name with the first letter of each word in uppercase -->
<name>{{product.name output="ucwords($self)"}}</name>


If you want to use several functions, those must be imbricated as you do for with PHP:

Example :

<!-- Remove all html tags from the description and limit the description to the first 100 characters -->
<name>{{product.description output="substr(strip_tags($self),0,100)"}}</name>


You can also use null to display an empty string or you can use any string to display a specific message:

Example :

<!-- If product price is lower than $10 then display "Free Shipping"-->
<shipping_cost>{{product.price if="product.price<10" output="'Free Shipping'"}}</shipping_cost>

{{object.attribute php="functions"}}

The php parameter acts exactly as the output parameter.

The php parameter is not supported anymore from Simple Google Shopping v11.0.0 and Data Feed Manager v8.0.0

BASIC FUNCTIONS

You can use any of the native php functions as well as all of the following ones with the default attributes that are defined in your Magento 2 back-office and also any attribute you have defined for your products (eg: name, description, short_description, weight, size, color…) apart from those which generate XML.


The syntax to use in order to include php functions in the variables is:

{{object.attribute output=”function(parameters)”}}


You can also apply one or more functions to all of these attributes by using the following syntax:

{{object.attribute output=”function1(function2(function3($self,parameters)))”}}


All options are executed in the written order:

<title>{{product.name}}</title>
<title>{{product.name output="wyomind_strtoupper($self)"}}</title>
<title>{{product.name output="wyomind_strtoupper(wyomind_substr($self,20,'...'))"}}</title>

This will produce:

<title>Affirm Water Bottle</title>
<title>AFFIRM WATER BOTTLE</title>
<title>AFFIRM WATER...</title>

float($self,$decimal)

Converts a numeric value to a floating number.

You need to define some parameters:

  • decimal = number of floating number. By default: 0

For example:

<g:shipping_weight> {{product.weight output="float($self,2)"}}kg </g:shipping_weight>

cleaner($self)

Removes all characters that don't belong to the UTF-8 charset.

For example:

<g:title>{{product.name output="cleaner($self)"}}</g:title>

inline($self)

Removes all EOL characters from the value.

For example:

<description> {{product.description output="inline($self)"}} </description>

IMPROVED FUNCTIONS

The improved functions are used in the same way as the basic php functions but offer more possibilities. They are a rewrite of the native php functions but have been improved for a specific use of the Simple Google Shopping extension.

wyomind_strtoupper($self)

Transforms the value to uppercase.

For example:

<g:title>{{product.name output="wyomind_strtoupper($self)"}}</g:title>

wyomind_strtolower($self)

Transforms the value to lowercase.

For example:

<tag>{{product.name output="wyomind_strtolower($self)"}}</tag>

wyomind_implode($separator,$self)

Joins all array elements in a string.

You need to define some parameters:

  • separator = string used between each value. By default: ,

This function may be useful for multi-select attributes like climate, activity general...

For example:

<activity> {{product.activity_general output="wyomind_implode('-',$self)"}} </activity>

Will give: Outdoor-Running-Warmup-Lounge-Gym

wyomind_html_entity_decode($self)

Converts all HTML entities to their applicable characters.

For example:

<description> {{product.description output="wyomind_html_entity_decode($self)"}} </description>

wyomind_strip_tags($self)

Removes all HTML tags.

For example:

<description> {{product.description output="wyomind_strip_tags($self)"}} </description>

wyomind_htmlentities($self)

Converts all applicable characters to HTML entities.

For example:

<description> {{product.description output="wyomind_htmlentities($self)"}} </description>

wyomind_substr($self,$length,$end)

Truncates the value.

You need to define some parameters:

  • length = maximum length of the value
  • end = string that will be added at the end of the string. By default: ...


For example:

<description> {{product.description output="wyomind_substr($self,50,'...')"}} </description>


If there are HTML tags in your descriptions, you may need to use in combination with this function:

<description> {{product.description output="wyomind_strip_tags(wyomind_substr($self,50,'...'))"}} </description>

API PHP for Simple Google Shopping

With Simple Google Shopping you can use PHP scripts in different ways to fully customize and control the data feed output.

  • Inline PHP scripts 
    Scripts that are added directly to the data feed template surrounded by PHP tags (<?php ... ?>).
    Those scripts are used with Data Feed Manager only.

  • Custom attributes
    Scripts that can be called by using the custom attribute name just like you do for any attribute in your data feed template.
  • Custom functions
    Functions that can be called by using the function name and additional parameters and that can be applied to any attribute in your data feed template.

API coding standards

The Simple Google Shopping PHP API uses the exact same syntax and standards than any PHP coding.

Attribute calls

For performance reasons, Simple Google Shopping only loads in the collection of products the attributes that are explicitly required in the data feed template.
This means that only the attributes that are called using the template placeholders, {{scope.attribute_code}}, will be added to the collection of products.

As a consequence, when you try to access the value of an attribute from the $product object, you must be sure that the attribute has been added to the collection.
Most of the time when the returned value is null for a given attribute, it means the attribute is not loaded in the collection of products.

The best way to be sure that all the attributes you need are well loaded in the collection, is to add at the beginning of your template a simple script that lists all the attributes required.

<?php
/* list of required attributes
* {{product.attribute_1}} {{product.attribute_2}} {{product.attribute_3}} {{product.attribute_4}}...
*/
?>


Then you should be able to get the values of these attributes in your PHP script:

<?php 
return $product->getAttribute1();
?>
<?php 
return $product->getAttribute2()
;?>
<?php 
return $product->getAttribute3();
?>
...

PHP functions in attribute calls

You can use any PHP function to apply in the attribute calls even if the function requires one or more additional arguments, for instance:

{{product.name output="str_replace('Apple','Banana',$self)}}


You can use several consecutive functions:

{{product.ean output="str_pad(str_replace('X','0',$self),10,'0',STR_PAD_LEFT)}}

Conditional values

To output values based on different conditions, use PHP conditional statements:

  • if/else
    <?php
    /* attribute {{product.sku}} required */ 
    if ($product->getSku()=="abc")
    {
    return "Alphabetic";
    }
    elseif($product->getSku()=="123")
    {
    return "Numeric";
    }
    else{return "Mixed";
    }
    ?>
  • switch/case
    <?php
    /* attribute {{product.sku}} required 
    */ 
    switch($product->getSku()){
    case "abc":
    return "Alphabetic";
    break;
    case "123":
    return "Numeric";
    break;
    default:
    return "Mixed";}
    ?>

Opening and closing tags

When using the PHP API inline directly in your data feed template, you must use the opening and closing PHP tags (<? php ... ?>)

<?php 
if($product->getData('size')=="X-Large") {return "XL";
}
?>

Outputting a value

  • Return
    Any value that you want to output in your data feed, must be returned with the return instruction.
<?php 
return "Don't miss! ".$product->getTitle(); 
?>
/* This script adds for each product in data feed  a new ouput line
*  Don't miss! Iphone 5
*  Don't miss! Galaxy note 7
*  ...
*/
  • echo, var_dump, print_r
    Any value printed in the data feed through these functions will be rendered at the top of the data feed and will not be added to the final file.
    Such functions must be used for debugging purposes.
<?php 
var_dump($product->getTitle()); 
?>
/* This script adds for each product in data feed  a new debugging trace
*  String(8) "Iphone 5"
*  String(13) "Galaxy note 7"
*  ...
*/

Variables scope

All variables available in PHP scripts have a local scope, this means they can't be shared between several scripts.

If you wish to share a variable with different scripts all along the data feed generation process, then the variable must be set as a global variable.

<?php global $increment;$increment++;return $increment;
/* This script will output a incremental $variable* 1* 2* 3* ...*
/?>

API Objects, Variables and Methods

Object $product

$product is an instance of Mage_Catalog_Model_Product. It contains all methods available by default and some other specific to Simple Google Shopping.

The list below includes the main methods available to use:

  • $product->getCategoriesArray()
    Retrieves an array of arrays that describes the categories to which belongs the products
  • $product->getCategoryIds()
    Lists all category ids in which the product may be found
  • $product->getVisibility()
    Returns the visibility of the product (1 = not visible individually, 2 = catalog, 3 = search, 4 = catalog and search)
  • $product->getStatus()
    Returns the status of the product (1 = enabled, 2 = disabled)
  • $product->getData($attributeCode)
    Returns the value of the given attribute code
  • $product->getAttributeText($attributeCode)
    Returns the textual value of the given attribute code

Object $this

$this is an instance of Wyomind_simplegoogleshopping_Model_Feed.

It provides a few useful methods: 

  • $this->hasParent($product, $type="parent")
    Returns a Boolean value whether a product has a parent from the give type (parent, configurable, grouped, bundle) or not
  • $this->getParent($product, $type="parent", $strict=false)
    Returns a product object of the given parent type (parent, configurable, grouped, bundle) if available or the product object passed as 1st parameter when $strict parameter is set on false. 
  • $this->skip()
    Skips the current product, useful to filter out some products based on specific condition

Manage your Google Shopping data feeds in your Google Merchant Account

Each store is different, this is why you must pay a particular attention to how is configured your data feed to be sure that it matches your own needs. We highly encourage you to check how to use Simple Google Shopping before starting using our extension and before submitting your data to Google Merchant.

Be careful, a wrong configuration or an invalid data feed may result in the suspension of your Google Merchant Center account.

Create a data feed in Google Merchant

To create a data feed, click on the PLUS icon from your Google Merchant Center account in:
ProductsFeeds

Basic information

Start with filling in the basic information:

  • Type
    The "Products" feed type is to submit your Google Shopping product information.
  • Country of Sale
    Choose the country where the products included in your data feed are sold and will be shipped. Note that these items must meet the requirements for the country of sale you submit to, including the feed specifications and policies.
  • Language
    It is the language of the content in your feed. Each country of sale has accepted content languages.
  • Destinations
    Select which Google products can display the items in your data feed. For example, tick: 
    Shopping ads

Once it's filled in, click on Continue .

Name and input method

You can continue with the name and the input method of your data feed.

  • Primary feed name 
    This is the name of the data feed as it will appear in your merchant account and help you understand the content of the feed.
    Note that the feed name does not need to match the name of the actual file you’re submitting.

Now choose how to connect your data to Merchant Center. You have several options:

  • Google sheets
    If you're updating your product data via a Google Sheet.
    Note that the changes will automatically be applied to your account.

  • Scheduled Fetch
    If you're hosting a file on your website that contains data and scheduling a regular time for Google to fetch updates.
    Note that updates are only applied to your account when the fetch occurs.

  • Upload
    If you prefer keeping a file on your computer that contains data and regularly uploading it to your account through SFTP, FTP, Google Cloud Storage, or manually.
  • Content API
    If you're using the Content API for Shopping to automatically upload product listings.

Click on Continue .

Using the Simple Google Shopping extension, we advise choosing the Scheduled Fetch or the Upload method.

Setup for Scheduled Fetch

If you have selected the Scheduled Fetch to connect your data to Merchant Center, fill in the below info:

  • File name
    This is the exact file name that you can find in the File name column from:
    Catalog
    Simple Google Shopping
    F
    or example:
    Googleshopping_full.xml
  • Fetch Frequency
    Choose to update your data daily, weekly or monthly.

Note that Fetch frequency must be synchronized with your catalog updates. A daily fetch frequency requires to monitor your data feeds daily.

  • Fetch Weekday/Date
    Choose the day of the week/month when to update your data feed.
  • Fetch Time
    Choose the time when Google must fetch the data feed.
  • Time zone
    Select your locale time zone
  • File URL
    Add the URL that appears in the File link column when the data feed is generated from:

    CatalogSimple Google Shopping
  • Login and Password
    Add your login and password in the case where the data feed is protected with http authentication.

Click on Continue .

Be careful to synchronize the fetching time with the data feed generation time. For example, when the data feed is generated at 01:00 AM, Google should fetch the data feed at 02:00 AM.

Setup for Upload

If you've selected the Upload method, fill in:

  • File name
    This is the exact file name that you can find in the File name column from:
    Catalog
    Simple Google Shopping
    F
    or example:
    Googleshopping_full.xml
  • Upload a file now
    You can now directly upload or drop your file.

Click on Continue .

Fetch data

The data feed should then be displayed in the data feed list from:
ProductsFeeds

Open the new data feed and click on Fetch Now .

Fix the errors and warnings of the data feed

Once the data has been fetched a report is generated including errors and warning that must be fixed.

You can have a clear overview of your products status from the Diagnostics tab. Check how many products are: 

  • Active
  • Expiring
  • Pending
  • Disapproved

Errors

Here is below a few examples of the common errors in Google Merchant Center. 

Note that the errors will appear with a red exclamation mark.

Invalid URL

All the errors linked to the URL are due to the fact that you didn't specify the URL of your website in your Google Merchant Center account or it is not claimed, so go to:
Google Merchant Center 
 Business InformationAbout Your BusinessWebsite

Missing shipping information

If you get this error, it is because you didn't configure a shipping rule in your Google Merchant Center account or if you did, you didn't do it for the target country.

For that, go to:
Shipping  Services

Here you can add a new rule just by clicking on the  button.

Then, fill in the different settings and click on Save .

Insufficient product identifiers: Missing brand attribute

That error occurs when products don't have a brand. For example, clothing items need a "brand" value.

You can first check that you're using the right attribute in your data feed template. For example, you may be using:

<g:brand>{{product.manufacturer}}</g:brand>

instead of:

<g:brand>{{product.brand}}</g:brand>

 

Otherwise, you can add an attribute from your Magento backoffice and define a brand for each one of those products from your admin:
MagentoManage products

 

In the case where all your products have the same brand, you can also define in your data feed configuration that all products will get the brand XXX by writing:

<g:brand>XXX</g:brand>

 

In the case where your products don't have enough identifiers, you can define that there is no identifier existing by replacing:

 <g:identifier_exists>true</g:identifier_exists>

 by:

<g:identifier_exists>false</g:identifier_exists>

Missing required attribute: age group

That error is due to the age group. In the case where you sell items for only one age group (adult), you could edit the data feed template with:

<g:age_group>adult</g:age_group>

 

In the case where you're selling products for adults and for children, you will need to add an attribute from your Magento backoffice (for example age_group) and specify the age group for each one of your products in your Magento admin:
MagentoManage products

 and keep in your data feed template:

<g:age_group>{{product.age_group}}</g:age_group>

Missing required attribute: color

Concerning that error, it means that there is no "color" value found for some products.

You can first check that you're using the right attribute in your data feed template. For example:

<g:color>{{product.colour}}</g:color>

instead of:

<g:color>{{product.color}}</g:color>

 

Also, you may not have defined a color value for a particular product in your Magento admin:
MagentoManage products

Currency is not supported in the given country in attribute: price

When currency is not supported in the given country, it means the currency defined in the data feed template in not the same as the currency of your products.

For example, the currency defined in the template is in EUR whereas your products prices are in USD. In that case, every EUR must be changed into USD in your data feed template.

Missing required attribute: size

When size attribute is missing, you can first check that your products have an attribute for size.

For example, for the shoes category, the attribute for size may differ. You can have a look in the black box, in your data feed template configuration, to see if there is already an existing size attribute for shoes by clicking on  Attributes Library .
As you can see, the size attribute for shoes exists under the name of shoe_size. Then you can add it to your data feed template as below: 

<g:size>{{product.size}}{{product.shoe_size}}</g:size>

Warnings

With Google Merchant Center, you can also have an overview of the warnings. Warnings are not penalizing because your products are inserted to Google Shopping however it is better no to have some.  

Note that the warnings will appear with an orange warning sign.

Missing recommended attribute: image link

That warning means that some of the products don't have image link.

You can have a look at some products involved. The problem may be that the products are variants of configurable ones.

The solution would be to modify the template  in order to get the image links of the parent products and to replace:

{{product.image_link}}

 by:

{{parent.image_link | product.image_link}}

Missing recommended attribute: description

When a description is missing, you can simply edit the product directly from your Magento backoffice:
MagentoManage products 

Missing recommended attribute: google product category 

When Google product category is missing, it means that you didn't map your categories with Google ones.

For that, go in the Categories tab of your data feed template, from:
 Catalog 
Simple Google Shopping