Skip to content

Missing field "brand" and "No global identifier provided" in WooCommerce: what they mean, how to fix them

Both notices name properties Google lists as recommended for a merchant listing, not required, so the product stays valid. WooCommerce prints gtin from its "GTIN, UPC, EAN, or ISBN" field and brand from the brand assigned to the product. Fill both in. Where a product has no GTIN, leave it empty.

By
WP Ministry
Published
Tested on
WordPress 7.1.3, WooCommerce 11.2.0, PHP 8.3.35

In short

  • Google lists brand, a GTIN, mpn and sku as recommended for a merchant listing. None is required, and a product snippet asks for none of them.
  • The notices in Search Console are about the markup on the product page. Merchant Center's rules for a feed are stricter and are a separate thing.
  • WooCommerce prints gtin only when the field holds 8, 12, 13 or 14 digits. It checks the length and nothing else.
  • WooCommerce prints brand as soon as a brand is assigned to the product. No code is needed for that.
  • On a variable product, a variation's GTIN is printed only at the address that selects that variation.
  • A product with no GTIN gets an empty field. Never make up an identifier.

Search Console shows Missing field "brand" and "No global identifier provided" for a WooCommerce store when the markup on its product pages has no brand and no GTIN. Google lists both as recommended for a merchant listing, not required, so the products stay valid. WooCommerce prints gtin from the "GTIN, UPC, EAN, or ISBN" field on a product's Inventory tab, and brand from the brand assigned to the product. With both empty it prints neither, which is why the notices are on every product. Fill the two in where a product has them, and leave the GTIN empty where it has none.

What a product page prints was read here from a store with no other plugin active and the Twenty Twenty-Five theme. The numbers used as GTINs on this page are examples. Yours is the number under the product's barcode.

What the two notices mean

Both belong to the Merchant listings report in Search Console, the report for pages where a shopper can buy the product. They are about the structured data in the product page itself: the block of JSON-LD that WooCommerce writes there. What a store outputs and how to fill the gaps covers that whole block and how to test it. This page is about the brand and the product identifiers in it.

This is how Google's documentation classes the four properties in question.

PropertyFor a merchant listingFor a product snippet
brand, as a Brand with a nameRecommendedNot asked for
gtin, or the specific gtin8, gtin12, gtin13, gtin14 or isbnRecommendedNot asked for
mpn, the manufacturer's part numberRecommendedNot asked for
sku, the store's own identifierRecommendedNot asked for

On each one, Google's merchant listing documentation says this:

  • Brand. Give the brand's name when it is known, and at most one.
  • GTIN. Include every global identifier that applies. The generic gtin property is accepted for all of them, though Google recommends the most specific one. The value has to be the number itself, not a GTIN written as a web address. The property names give the lengths: 8, 12, 13 or 14 digits. isbn is valid only on a product that is also marked up as a Book.
  • Part number. It identifies the product for one manufacturer.
  • SKU. It is the merchant's own identifier, one per product, with no spaces in it.

Not eligibility. Google's documentation says the required properties are what make a page eligible for a rich result, and that the recommended ones add information that can give a better experience. Of the non-critical issues its test flags, the same documentation says fixing them helps the quality of the structured data and is not necessary to be eligible.

Google's general guidelines go one step further. They say that the more recommended properties a page provides, the higher the quality of the result is for users, and that the ranking of rich results takes the extra information into consideration. Google gives no measure of how much, and nothing on this page comes with a promised effect.

In Search Console that is the difference between two tables. "Why items are invalid" lists critical issues, which keep an item from appearing as a rich result. "Improve item appearance" lists non-critical ones, and the item stays valid. A notice about a recommended property is of the second kind.

The notice is about the page, not about a feed

Merchant Center has rules of its own for brand and GTIN, and they are stricter. They apply to the product data a store sends to Merchant Center, for example as a feed made by an extension. They are checked in the Merchant Center account, not in Search Console.

Markup on the product pageProduct data sent to Merchant Center
BrandRecommendedRequired for every new product, except movies, books and musical recordings
GTINRecommendedStrongly recommended where the manufacturer assigned one. 8, 12, 13 or 14 digits, with a correct check digit
Part numberRecommendedRequired only where the product has no GTIN from its manufacturer
A product with no identifiersLeave the properties outSend identifier_exists with the value no
Where a gap is reportedSearch Console, as a non-critical issueThe Merchant Center account, as limited visibility or a disapproval

A notice in Search Console is about the left column. Changing what a feed sends does not change the page, and the page can be complete while a feed is not. The rest of this page deals with the markup. Mismatched price in Merchant Center is about the feed's side.

See what a product page prints now

This command asks for a product page and prints the four properties from its markup. It runs in a terminal on the server or on your own computer, wherever curl and grep are installed. Put a product's address between the quotes.

bash
curl -s "https://example.com/product/oak-side-table/" | grep 'application/ld+json' | grep -Eo '"(sku|gtin|mpn|brand)":("[^"]*"|\{[^}]*\}|[0-9]+)'

On a product with a SKU and nothing else filled in, it prints one line.

text
"sku":"OAK-ST-01"

There is no gtin line and no brand line, and those are the two notices. sku is always there, because WooCommerce prints the product's ID number when the SKU field is empty. WooCommerce has no field that feeds mpn.

If the command prints nothing at all, the page has no product markup for a visitor. A store still in coming soon mode is one cause. The guide to what a store outputs has the others.

GTIN

The field in the product editor

Edit the product and open the Inventory tab of the "Product data" box. The field is the second one, under SKU, and its label is "GTIN, UPC, EAN, or ISBN". Type the number from the product's barcode and update the product.

WooCommerce's changelog records the field arriving in version 9.2 and its value going into the markup in 9.3. A store on an older WooCommerce has neither, so update WooCommerce first.

For a catalog of any size, the built-in product export and import carry the same value in a CSV column named "GTIN, UPC, EAN, or ISBN".

What WooCommerce stores

The value is saved with the product under the meta key _global_unique_id. Two things happen on the way in:

  • Characters are removed. WooCommerce keeps digits and hyphens, and an X as the last character for the check digit of a 10-digit ISBN. Spaces and other letters are dropped.
  • A number already in use is refused. Two products, or a product and a variation, cannot hold the same value. The second one is rejected with "Invalid or duplicated GTIN, UPC, EAN or ISBN."

Set it with WP-CLI

The wp wc product update command cannot do it. On the store tested, it answered unknown --global_unique_id parameter: WooCommerce's WP-CLI commands are built from version 2 of its REST API, and the field is in version 3. wp eval can call the same method the product editor uses. These commands need WP-CLI on the server.

First find the product's ID. This lists every product and variation with its ID.

bash
wp post list --post_type=product,product_variation --fields=ID,post_title,post_type

Then set the number. Replace 123 with the ID and the digits with your own.

bash
wp eval '$product = wc_get_product( 123 ); $product->set_global_unique_id( "3234567890126" ); $product->save();'

It prints nothing when it works. A number that another product holds stops it with the error above, and nothing is saved. To read back what is stored:

bash
wp post meta get 123 _global_unique_id

Now the check from earlier prints a second line.

text
"sku":"OAK-ST-01"
"gtin":"3234567890126"

What is printed, and what is left out

WooCommerce strips everything but digits from the stored value and prints gtin only when 8, 12, 13 or 14 digits remain. These values were each saved to the same product in turn.

Saved in the fieldIn the markup
3234567890126, 13 digits"gtin":"3234567890126"
49123456, 8 digits"gtin":"49123456"
323456789012, 12 digits"gtin":"323456789012"
10856435001702, 14 digits"gtin":"10856435001702"
978-1455582341, a 13-digit ISBN with a hyphen"gtin":"9781455582341"
1455582344, a 10-digit ISBNNo gtin
32345678901, 11 digitsNo gtin
323456789012345, 15 digitsNo gtin
3234567890123, 13 digits with a wrong check digit"gtin":"3234567890123"

Three things follow from the table:

  • A value of the wrong length disappears without a message. The product saves, the field shows the value, and the markup has no gtin. If the notice stays after you filled the field in, count the digits.
  • A 10-digit ISBN is accepted by the field and never printed. Merchant Center's guidance is to convert an ISBN-10 to the 13-digit form, and that is the form WooCommerce prints.
  • The length is all WooCommerce checks. A mistyped digit is printed as it stands. Merchant Center's specification asks for a correct check digit and does not accept numbers from GS1's restricted and coupon ranges. Getting the number right is up to you.

Variations

Each variation of a variable product has a field of its own with the same label, in its panel on the Variations tab. It is stored the same way, on the variation, and the WP-CLI command above sets it when given the variation's ID.

Where the number is printed is less obvious. A variable product with two sizes printed this on the store tested:

Address requestedSKU printedGTIN printed
The product's own addressThe parent'sThe one in the parent's Inventory tab, if there is one. Never a variation's
The address that selects a variation, such as ?attribute_pa_size=smallThat variation'sThat variation's
The same, for a variation whose field is emptyThat variation'sNone. The parent's is not passed down

So a variation's GTIN reaches the markup only at an address that names every attribute of that variation. At the product's own address, the only GTIN WooCommerce can print is the parent's, and the parent cannot be given a number that one of its variations already holds. Merchant Center's guidance is that each variant of a product has its own GTIN. Nothing in WooCommerce's fields puts those on the product's own address, so that address prints no gtin unless the parent has a number of its own. WooCommerce variations and SEO covers those addresses and the canonical link each one carries.

Brand

Brands are part of WooCommerce

WooCommerce has had brands built in since version 9.4, and for every store since 9.6, by its changelog. There is nothing to switch on. A store has a Brands screen in the Products menu and a "Product brands" panel on the product editing screen. To see which version a store runs:

bash
wp plugin get woocommerce --field=version

Assign a brand in the dashboard

  1. Step 1: Create the brand

    Go to Products, then Brands. Type the brand's name as customers know it and select "Add New Brand". A slug, a description and an image are optional.

  2. Step 2: Assign it to the product

    Edit the product, find the "Product brands" panel in the side column, tick the brand and update the product. Choose one brand for each product.

  3. Step 3: Or bring them in with a file

    The built-in product import reads a CSV column named "Brands". Export a few products first to get a file with the right columns.

Assign a brand with WP-CLI

wp wc product update has no parameter for brands either: on the store tested it answered unknown --brands parameter. A brand is a term in the taxonomy product_brand, so WP-CLI's own term commands work. Create the brand:

bash
wp term create product_brand "Fernhill Workshop"

Then add it to a product, by the product's ID and the brand's slug. WordPress makes the slug from the name, here in lowercase with a hyphen, and the Brands screen lists it beside each brand.

bash
wp post term add 123 product_brand fernhill-workshop

What the product page prints then

The check now prints a brand line.

text
"sku":"OAK-ST-01"
"gtin":"3234567890126"
"brand":{"@type":"Brand","name":"Fernhill Workshop"}

Assigning the brand is the whole fix. WooCommerce's Brands code adds brand to the product markup itself, and no plugin or snippet is needed for it. The same code adds a logo when the brand has an image. On a variable product the brand is the parent's, at every address.

The brand also appears on the page for visitors: with the theme tested, as "Brands:" and a link under the product's details. That matters because Google's guidelines say not to mark up what a reader cannot see.

Google asks for at most one brand name. If a product has two brands assigned, WooCommerce prints one of them: on the store tested, the one whose name comes first in the alphabet, whichever was assigned first.

One brand for the whole store

A store that makes what it sells has one brand, its own. Merchant Center's guidance for that case is to use the store's name as the brand. Create that brand as above, then add it to every product:

bash
for id in $(wp post list --post_type=product --format=ids); do
  wp post term add "$id" product_brand fernhill-workshop
done

A product that already has another brand ends up with two, so run this only where every product is the same brand. A product added later needs its brand ticked when it is created.

A brand kept in a product attribute

A store set up before brands were built in may keep the brand as a product attribute named Brand. WooCommerce does not read that attribute for the markup. You can assign real brands as above, or fill the gap with a small filter.

WooCommerce passes the finished product markup through the filter woocommerce_structured_data_product. Its own Brands code uses that filter at priority 20 and leaves brand alone when something has already set it. The file below runs after it, at priority 30, and adds a brand only when none is assigned.

Create the folder wp-content/mu-plugins if it is not there, and save this in it as brand-markup.php. WordPress loads every PHP file that sits directly in that folder. A plugin there cannot be switched off in the dashboard, only by removing the file.

wp-content/mu-plugins/brand-markup.php
<?php
/**
 * Plugin Name: Brand markup from the Brand attribute
 */

add_filter( 'woocommerce_structured_data_product', 'example_brand_markup_from_attribute', 30, 2 );

function example_brand_markup_from_attribute( $markup, $product ) {
	if ( ! is_array( $markup ) || ! $product instanceof WC_Product || ! empty( $markup['brand'] ) ) {
		return $markup;
	}

	$name = trim( $product->get_attribute( 'Brand' ) );

	if ( '' !== $name ) {
		$markup['brand'] = array(
			'@type' => 'Brand',
			'name'  => $name,
		);
	}

	return $markup;
}

A mistake in a file in that folder can stop the whole site from loading, so copy it exactly, try it on a staging copy first, and be ready to delete the file over SFTP. To undo it, delete the file.

Three things to know about it:

  • It reads an attribute named Brand, whether that is a global attribute or one added to the single product.
  • Give the attribute one value on each product. With two, WooCommerce joins them into one string, and on the store tested the markup carried Northwood | Southwood as the brand's name. That is not a brand.
  • Select "Visible on the product page" for the attribute, so that the brand in the markup is also on the page.

A product that has no GTIN

Not every product has a GTIN. Merchant Center's help names the kinds that may have none: custom and one-of-a-kind goods, handmade goods, vintage items and antiques, and a store's own brand that nobody else sells. For those:

  • Leave the GTIN field empty. WooCommerce then prints no gtin, which is the accurate markup. The notice stays for that product, and it is a non-critical one.
  • There is nothing to add to the page in its place. Merchant Center has an attribute for this, identifier_exists, which a feed sets to no for a product with no identifiers. Its help page lists it as having no schema.org property, so it does not exist in markup.
  • Give the brand if there is one. For goods you make yourself, Merchant Center's guidance is to use your store's name as the brand. Its page on product identifiers adds that a merchant who is the manufacturer can pair that brand with a part number of its own choosing.
  • A part number is the manufacturer's to assign. If you are not the manufacturer and do not have its part number, leave mpn out as well.

Never make up a GTIN, and do not put your SKU in its place. Merchant Center's wording on identifiers is "don't guess or make up a value", and its specification says a product submitted with an incorrect GTIN is disapproved. On the page, Google's guidelines require structured data to be a true representation of the page's content. Merchant Center describes these identifiers as what tells one product from another across every seller, so an invented one describes the wrong product or none.

Check the result

  1. Step 1: Read the page yourself

    Clear any page cache, then run the curl command from earlier on a product you changed. The gtin and brand lines should be there, with the values you entered.

  2. Step 2: Run the page through Google's test

    Open the Rich Results Test and enter the product's address. Open the merchant listing it finds. The two properties should no longer be listed as missing. The page has to be reachable without logging in.

  3. Step 3: Start validation in Search Console

    In the Merchant listings report, open the issue and select "Validate fix". Google checks a sample of the affected pages first and then the rest as it crawls them again. Its help page says validation can take two weeks or more, depending on how often the site is crawled.

Fix the products in batches if the catalog is large, and check one product from each batch with the command before moving on. If the work is more than you want to take on, WP Ministry's WordPress SEO audit covers WooCommerce stores, and the fixes on the WordPress side are part of the job, up to the hours it includes.

What a plugin or an extension adds

  • An SEO plugin's add-on for stores. Yoast WooCommerce SEO is one example. Its documentation says it adds fields for product identifiers on a Yoast SEO tab in the product data box, and sets brand and manufacturer from taxonomies chosen in its settings. Its help page puts a missing brand down to that setting not being configured. With such a plugin active, look at its settings before WooCommerce's fields, because its documentation says it alters the product markup WooCommerce writes.
  • Google for WooCommerce. Its documentation describes attribute rules that map a store's data to the feed it sends to Merchant Center: Brand from the store's brands or as one fixed value, and GTIN and MPN among the attributes it can fill. That is the right-hand column of the table near the top of this page. Run the check on a product page to see whether your markup changed.

Before adding either for this reason alone, fill in WooCommerce's own two fields and run the check. After adding one, run it again and make sure the page still describes each product once. The guide to what a store outputs has a section on two sets of markup for one product.

Common questions

Is "Missing field brand" an error?

No. Google lists brand as a recommended property of a merchant listing, and a notice about a recommended property is a non-critical issue. The product is still a valid item in the report. Fixing it adds information to the listing and is not needed for the product to be eligible.

Will adding a brand and a GTIN change where my products appear?

Google puts no figure on it. Its guidelines say that recommended properties raise the quality of a result for users and that the ranking of rich results takes the extra information into consideration. The same guidelines say structured data makes a rich result possible and does not make one certain. Add the two because they are true of the product.

My products are handmade and have no barcode. What goes in the GTIN field?

Nothing. Leave it empty, assign your own brand, and accept that the notice about a global identifier stays. It is a non-critical issue, and an invented number is worse than none.

Can I use my SKU as the GTIN?

No. A SKU is the store's own identifier, and a GTIN is a number the manufacturer assigned to the product. WooCommerce already prints the SKU as sku. Merchant Center's guidance says not to put a SKU, or any value specific to your store, in the identifier attributes.

I filled in the field and the notice is still there. Why?

Check the page first with the curl command. If there is no gtin line, the value is not 8, 12, 13 or 14 digits long, or a page cache is serving the old page, or the product is a variable one whose numbers are on its variations. If the line is there, the report has not caught up: Google has to crawl the page again, and validation can take two weeks or more by its own account.

Do I need a Merchant Center account to clear these notices?

No. The notices are about the markup on the product page, and WooCommerce's own fields supply it. Merchant Center reads product data sent to it and reports problems with that data in its own account.

More on this subject

SEO audit, done for you

SEO audit is $249. A written audit, each finding with its source, and up to 2 hours of fixes done and tested again. It starts with a free diagnosis.