NewThe tragent CLI is on npm: npx @tragent/cli scan your-store.com

Issue reference

Your product data names no brand

Issue code
SCHEMA_PRODUCT_BRAND_MISSING
Stage
Read the details
Protocol
—
Severity
Low

What it means

tragent reports this at the “Read the details” stage. The question there is “Can it understand what the product is?” Name, description, images and variants have to be readable as data, not just rendered as a page.

What it does to an agent

Agents get through, but your store reads less clearly to them than it could. It is worth fixing once the higher-severity issues are gone.

Shoppers ask for brands, and agents filter on them. "Waterproof boots from Northwind under 150" is a brand filter first, and a product with no brand in its data drops out before price is considered. For a single-brand store the brand is your own name; for a retailer it is the maker's.

This is a low finding because an agent can still buy a product without a brand. It matters most on stores that sell several brands, where it decides whether you appear at all for brand-led questions.

How to fix it

Add Product.brand as {"@type": "Brand", "name": "…"} so agents asked for a brand can find you.

Brand as an object
"brand": { "@type": "Brand", "name": "Northwind" }

On your platform

Shopify

The structured_data filter takes the brand from the product's vendor field. Fill in Vendor on each product in the admin; for a single-brand store, bulk edit it to your brand name.

WooCommerce

If you use product brands, add the first brand to the markup from the brand taxonomy.

PHP
// In your child theme's functions.php, or a small plugin.
add_filter( 'woocommerce_structured_data_product', function ( $markup, $product ) {
    $brands = wp_get_post_terms( $product->get_id(), 'product_brand', array( 'fields' => 'names' ) );
    if ( ! is_wp_error( $brands ) && ! empty( $brands ) ) {
        $markup['brand'] = array( '@type' => 'Brand', 'name' => $brands[0] );
    }
    return $markup;
}, 10, 2 );

Headless or custom

Emit brand as a Brand object with a name. A bare string is accepted by some readers and not others.

In practice

For a retailer, the brand is the maker, and it should match how the maker names itself: "The North Face", not "TNF" or "North Face Inc". Agents group results by brand, and two spellings split your products into two brands, each with half the results. Pick one form per brand and use it in the product data, the feed and the page.

For your own label, use the brand name customers search for, which may not be the company's legal name. If you sell both your own products and others', give each product the right one rather than your store name for everything; an agent asked for a third-party brand should find it under that brand, and your own label should not be diluted by products it did not make.

Brand also feeds the product feeds agents read, such as a Merchant Center feed, which has its own brand attribute. Use the same value in both. When the markup says one brand and the feed another, an agent that reads both has to choose, and it may decide neither source can be trusted and leave the product out of its answer altogether.

Check the fix

  1. Check a product page's JSON-LD for a brand with a name.
  2. Run the scan; the brand finding should be gone or report fewer products.

Run the check that reported SCHEMA_PRODUCT_BRAND_MISSING again after the change. The scan needs no account; an issue found during an AI shopping test needs that test run again.

Terminal
npx @tragent/cli scan https://your-store.com

Common mistakes

  • Using the store's domain as the brand for products made by someone else.
  • Leaving Vendor as the default the import tool set, often the supplier's company name.