top of page

Product Schema for Coffee Bags and Merch: Fields and Errors

Writer: Thomas Garner
Thomas Garner
Oct 7
11 min read
Black laptop computer turned on beside black ceramic mug

Short answer: yes, if you sell bags of beans or merch on your own site, Product schema is worth adding, and it does not promise you a better ranking, a higher click rate, or an AI citation. What it does is give Google a structured, machine readable description of a product page you already have, using schema dot org's Product type, so the description matches exactly what a shopper sees.


If you have been told to add this markup and do not know where to start, or you added it and Search Console is now flagging errors, this post takes you from a blank page to a working, validated block in one sitting. The thesis is simple: markup should describe what the page already shows, nothing more, and almost every error that shows up in practice traces back to a mismatch between the visible page and the markup, not to some obscure property you forgot.


A Working Example First

Here is a complete, valid JSON LD block for a fictional bag of coffee, using fictional values throughout. Treat every number and word in it as a placeholder to replace with your own real product details, not as an example price to copy.


The block names the product, gives a short description, points to a product image, includes a sku, names a brand, and nests an Offer object with a price, a currency code, an availability value, and a url pointing back to the product page itself. That structure, a Product with a nested Offer, is the backbone of almost every coffee bag or merch listing you will build, whether the item is a bag of beans, a mug, or a bag of ground coffee sold by weight.


Once you have a block like this in place, the next step is not to guess whether it works, it is to test it. Paste the block into Google's Rich Results Test as a code snippet and separately into the Schema Markup Validator at validator schema dot org. Both tools will tell you plainly whether the structure is valid and, for the Rich Results Test specifically, whether the page is eligible for the kinds of enhanced results Google supports for product pages. A block that validates cleanly in both tools before you publish it saves you from discovering an error only after Search Console flags it days or weeks later.


It is worth explaining why this two step check matters, since the two tools are not redundant with each other. The Schema Markup Validator checks whether your block is technically well formed according to schema dot org's own vocabulary, a more general check that applies to any schema type, not just Product. The Rich Results Test is Google specific, and it checks not only structural validity but also whether the page, as marked up, is eligible for the particular enhanced display features Google documents for product pages. A block can pass one tool and still show a warning in the other, which is exactly why running both, rather than assuming one covers everything, is worth the extra few minutes.


Which Properties Actually Matter

Schema dot org defines a long list of possible properties for the Product type, and trying to fill every one of them is a waste of time. For a bag of coffee, the properties worth including are name, a short description, an image, a sku if you track one internally, brand, and the nested offers object. If you roast the coffee yourself and want to note origin or roast level, schema dot org supports additional descriptive properties on Product for exactly this kind of detail, and Google's product structured data documentation is the source to check for which of those additional properties it actually recognizes for search features, since schema dot org defining a property and Google supporting it for a rich result are two different things.


For a bag specifically, weight is worth representing using schema dot org's QuantitativeValue type if you want to be precise about it, since a coffee bag's weight is a real, meaningful product attribute a shopper cares about. For a mug or other piece of merch, weight is far less important, and dropping it entirely is the right call rather than forcing a property that does not add anything useful. This is the core difference between a bag listing and a mug listing: the bag benefits from a couple of coffee specific descriptive details, while the mug's markup is simpler and leans more on standard product basics like name, image, and offer.


The offers property deserves its own attention, since it is doing the most structurally important work in the block and it is where nearly every real world error originates. An Offer needs, at minimum, a price, a priceCurrency using a proper currency code rather than a symbol or a word, and an availability value drawn from schema dot org's ItemAvailability list, such as InStock or OutOfStock. Google's product structured data documentation is explicit that these offer details should match what a shopper actually sees on the page, and that mismatch, not any missing exotic property, is the single most common source of the errors covered in the next section.


What Google's Documentation Actually Requires

Google's Search Central documentation on product structured data lays out required and recommended properties separately, and it is worth reading the current version of that page directly before you publish anything, since documentation on required fields for search features can shift over time in ways a static blog post cannot track for you. As a general pattern, name, image, and the offer details, price, currency and availability, sit on the required or strongly recommended side, while properties like a detailed description, brand, and sku tend to sit on the recommended, not strictly required, side.


The documentation is also explicit on a point worth repeating here plainly: the markup is meant to describe content that is genuinely visible on the page to a human visitor, not content added only for search engines to read. A price in your markup that does not match the price a shopper sees, an availability value claiming InStock for an item that is sold out, these are the kinds of mismatches the documentation specifically warns against, and they are also, in practice, the most common cause of real errors.


None of this documentation promises that adding valid Product markup will improve your ranking, your click through rate, or whether an AI powered answer mentions your product. It is worth being direct about that, since it is tempting to treat schema as a growth lever rather than what it is: a structured, accurate description of a page that already exists, which may make you eligible for certain enhanced display features Google documents separately, with eligibility never guaranteed even for a technically valid block.


The Errors You Will Actually See

Breaking a valid block deliberately is a genuinely useful exercise, since it shows you exactly what the two validation tools report before a real mistake costs you time later. Removing the price from the offer produces a clear error in both the Rich Results Test and the Schema Markup Validator, since price is treated as a required field within the Offer object by both tools.


Writing the currency as a plain word, dollars, instead of the proper three letter currency code produces a different kind of error, since priceCurrency expects a standard currency code format, not free text. This is a easy mistake to make if you are writing the block by hand rather than generating it through a platform's built in tool, and it is one of the more common errors we deliberately reproduced when testing.


Setting availability to a plain text description instead of one of schema dot org's defined ItemAvailability values, writing yes or in stock as plain words rather than the schema defined value, also produces an error, since the validators expect one of the specific, defined values from that list rather than arbitrary text. And dropping the image property entirely produces a warning in the Rich Results Test specifically, since image is treated as an important, if not always strictly blocking, field for product related search features.


Once you have seen what each of these four broken variants produces, you have a useful troubleshooting reference for real errors later. If Search Console flags a price issue on a live product page, you now know to check first whether the markup price matches the page's visible price, since that mismatch, not a missing property, is the far more common real world cause.


There is a fifth, subtler error worth mentioning even though it is harder to reproduce deliberately: a stale offer. If a coffee bag sells out and the page updates to reflect that visually, but the markup underneath still reads InStock because nobody remembered to update it, neither validation tool will catch this, since the tools check structural validity, not whether the value is currently true. This is a maintenance problem rather than a syntax problem, and the fix is procedural: whoever updates stock status on the visible page needs to know the markup exists and needs the same update, or the two will quietly drift apart over time.


What Your Platform Already Does For You

Before writing any of this by hand, check what your platform already outputs automatically. Shopify, Wix, and Squarespace all generate a substantial amount of structured data automatically for standard product pages, and in many cases some baseline Product markup is already present on a page without you ever touching a code editor.


That built in output is not always complete or exactly right for a coffee specific product, though, which is exactly why understanding the fields above still matters even if your platform handles the basics. Checking your own live product page with the Rich Results Test, even when you never wrote a line of markup yourself, tells you honestly whether your platform's automatic output already covers what is needed or whether a manual addition, often through a platform specific app or a metafield, is worth the effort. Checking honestly, rather than assuming your platform already handles everything correctly, is the single fastest way to know where you stand before spending time writing markup that already exists.


One more note on scope: this post covers the markup layer only, the JSON LD block itself. It assumes the product page underneath it already has a real title, real tasting notes or product details, and real facts a shopper can read, which is a separate piece of work covered elsewhere. It also does not cover review or star rating markup, which is governed by its own set of schema dot org rules and Google requirements and deserves its own dedicated treatment rather than a passing mention here.


A last practical note on ownership: whoever is responsible for adding new products to your site should also be the person responsible for either confirming the platform generated the markup automatically or adding it by hand using the working example above. Splitting that responsibility across two people, one who lists the product and a different one who handles schema later, is a common way for new products to quietly launch without any markup at all, simply because nobody treated it as part of the same task.


Related Reading

More from Hillcane on this topic, plus the pages on the site that sit next to the work.


Frequently Asked Questions

Do coffee bags need Product schema?

Not strictly, a site can function and sell without it, but it is worth adding if you sell bags or merch on your own site. It gives Google a structured, accurate description of a product page that already exists, using schema dot org's Product type. It does not promise a ranking boost, a higher click rate, or an AI citation, and no documentation supports treating it that way.


What properties should a coffee bag's Product markup include?

At minimum name, a short description, an image, and a nested offers object with price, priceCurrency as a proper currency code, and an availability value. A sku and brand are commonly included and recommended. Weight can be represented with schema dot org's QuantitativeValue type if you want to be precise about a bag's actual size.


What is the most common Product schema error?

A mismatch between the visible page and the markup, most often the offer price not matching what a shopper sees, or an availability value that does not reflect real stock. Google's own product structured data documentation is explicit that offer details should match the page, and this mismatch is far more common in practice than a missing exotic property.


How do I test whether my Product markup is valid?

Run the JSON LD block through two tools before publishing. Paste it as a code snippet into Google's Rich Results Test, which checks validity plus eligibility for Google's product display features, then into the Schema Markup Validator at validator schema dot org, which checks it against schema dot org's general vocabulary. A block can pass one and warn in the other. Afterward, test your live product page too.


Does a mug need the same properties as a bag of coffee?

No. A mug's markup can rest on the standard basics: name, image, and a nested Offer with price, priceCurrency, and availability. Weight expressed through QuantitativeValue, or origin and roast details, help describe a bag of beans but add nothing for a mug, so leave them out. Dropping properties that do not honestly describe the product is correct, not a gap, since markup should match only what the page shows.


What happens if I remove the price from an Offer?

Both the Rich Results Test and the Schema Markup Validator return a clear error, because price is treated as a required field inside the Offer object. It was one of four deliberate breakages tested for this post, alongside currency written as a word, availability as plain text, and a missing image, and it produced the least ambiguous message. On a live page, also confirm the markup price matches the visible price.


Can I write the currency as a word instead of a code?

No. The priceCurrency field expects a standard three letter currency code, so writing dollars as plain text produces a validation error in both testing tools. The same rule of defined values applies to availability, which must be one of schema dot org's ItemAvailability values such as InStock or OutOfStock, not a plain yes. Both mistakes are common when writing markup by hand instead of through a platform's generator.


Will Product schema help my product appear in AI search answers?

No documentation supports that claim, and this post does not make it. Google Search Central's product structured data documentation frames the markup as an accurate, machine readable description of a page that already exists, which may make it eligible for certain product display features, with eligibility never guaranteed. It promises nothing about rankings, click through rate, or whether an AI powered answer mentions your coffee.


Does Shopify, Wix or Squarespace already add Product schema for me?

Often partially. Shopify, Wix, and Squarespace all generate some structured data automatically for standard product pages, so baseline Product markup may already exist without any code editing. That output is not always complete for a coffee bag. Run your live product page through the Rich Results Test to see what is present, then decide whether a manual addition through a platform app or metafield is worth the effort.


Does this post cover review or star rating markup too?

No, on purpose. Review and star rating markup follows its own schema dot org rules and Google requirements, and it deserves a dedicated treatment rather than a passing mention. This post covers only the Product and nested Offer layer: name, description, image, sku, brand, price, priceCurrency, and availability. It also assumes the product page already carries a real title and real tasting notes a shopper can read.


Work with Hillcane

Most Product schema errors have nothing to do with a missing exotic property. They come from a price that does not match the page.


If you want your coffee bag or merch pages checked for schema errors before Search Console finds them, reach Hillcane at hillcane.co/contact or call (256) 384-2449.

Comments


bottom of page