CPG (consumer packaged goods) is the category AI shopping agents treat most differently from the rest. Average order value is small, purchase frequency is high, and the buyer is typically replenishing something they’ve bought before. AI agents querying CPG products weight bulk-quantity attributes (count, size, refill availability), subscription-readiness, and brand consistency in ways they don’t for other categories.
This guide covers household, cleaning, paper goods, and personal- care CPG (the products that aren’t food, supplements, or beauty — those have their own guides). What’s specific to the CPG model and what surfaces best in replenishment-intent queries.
What CPG includes here
The category cluster covers what doesn’t fit the food, beauty, or supplement guides:
- Household cleaning — laundry detergent, dish soap, surface cleaners, disinfectants
- Paper goods — toilet paper, paper towels, tissues, napkins
- Trash and storage — bags, food storage, organizers
- Personal care — toothpaste, deodorant, soap, razors, feminine care
- Pet consumables — litter, waste bags (pet food has its own guide)
- Light bulbs and batteries — high-purchase-frequency hardware
What’s not in this guide: food, beverages, supplements, beauty, fashion. Each has its own guide because the attribute patterns diverge enough.
The CPG attribute pattern
Three attribute layers that CPG-intent queries depend on:
The quantity layer
The single biggest CPG-specific attribute work. Buyers query with quantity intent: “Tide Pods 81 count”, “9 oz Dawn dish soap”, “family pack toilet paper”.
Three properties to get right:
- Count or pack size — how many units in the package.
- Unit volume / weight — size of one unit (e.g., 12 oz per bottle in a 6-pack of 12 oz bottles).
- Total volume / weight — count × unit; what’s actually shipped.
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Count",
"value": "6"
},
{
"@type": "PropertyValue",
"name": "Unit size",
"value": "12 oz"
},
{
"@type": "PropertyValue",
"name": "Total size",
"value": "72 oz"
}
]
For schema’s first-class size and weight properties (size, weight),
use them when they cleanly map. CPG products often need the
additionalProperty pattern because the count + unit + total trio
doesn’t fit a single field.
The suitability layer
What the product is for and what it’s not for. Examples:
- Surface compatibility for cleaners — wood, stone, stainless, glass.
- Skin compatibility for personal care — sensitive, normal, dry, oily.
- Use case — laundry (HE machines vs. standard), dishwasher (auto-dispense vs. quick-wash), toilet paper (septic safe).
- Allergen and ingredient flags — fragrance-free, dye-free, hypoallergenic, vegan, plant-based.
The suitability layer is often the deciding factor in CPG queries that include constraints (“fragrance-free laundry detergent for sensitive skin”).
The replenishment layer
CPG buyers buy the same product repeatedly. Surfacing replenishment-relevant signals in structured data gives downstream consumers something to filter on:
- Subscription availability — products available via Subscribe-and-Save (Amazon) or Shopify subscription apps.
- Refill availability — refill packs alongside dispensers.
- Single vs. bundle pricing — per-unit cost when buying a 6-pack vs. a single.
For schema, subscription availability has no first-class property.
Use additionalProperty:
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Subscribe and save",
"value": "Available · 15% discount"
}
]
For refills, use a separate Product for the refill SKU and link via
isRelatedTo or isAccessoryOrSparePartFor. The pattern is uniform
across CPG categories where dispenser + refill is the model
(Method, Mrs. Meyer’s, etc.).
The schema pattern
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.title | json }},
"description": {{ product.description | strip_html | json }},
"sku": {{ variant.sku | json }},
"gtin13": {{ variant.barcode | json }},
"brand": {
"@type": "Brand",
"name": {{ product.vendor | json }}
},
"category": "Health & Beauty > {{ product.product_type }}",
"weight": {
"@type": "QuantitativeValue",
"value": {{ product.metafields.product.total_weight | json }},
"unitCode": "ONZ"
},
"additionalProperty": [
{%- if product.metafields.product.count -%}
{
"@type": "PropertyValue",
"name": "Count",
"value": {{ product.metafields.product.count | json }}
},
{%- endif -%}
{%- if product.metafields.product.unit_size -%}
{
"@type": "PropertyValue",
"name": "Unit size",
"value": {{ product.metafields.product.unit_size | json }}
},
{%- endif -%}
{%- if product.metafields.product.fragrance_free -%}
{
"@type": "PropertyValue",
"name": "Fragrance free",
"value": "true"
}
{%- endif -%}
]
}
The unitCode: ONZ is the UN/CEFACT code for ounce; switch to the
appropriate code for grams (GRM), liters (LTR), etc.
Q&A pairs as a sibling FAQPage block
CPG pages typically carry pre-purchase Q&A around frequency of use,
surface or skin compatibility, refill availability, allergens. When
the catalog has this content, render it as a sibling FAQPage
JSON-LD block alongside the Product block, not nested inside it.
See Product schema for Shopify
for the rendering pattern.
The contrarian take
Most CPG SEO content optimizes for storefront keyword discovery (“eco-friendly laundry detergent”, “natural toothpaste”). Discovery queries matter for first-time buyers. They don’t matter for replenishment buyers, who already know the brand and are searching the specific SKU (“Method laundry detergent 4x concentrate 53.5 oz”).
The replenishment buyer is the higher-value customer in CPG. They buy more frequently, churn less, and are easier to acquire when AI agents can confidently match the specific SKU they want. Optimize for the replenishment query first — full GTIN, full quantity attributes, full pack-size data — then layer in the discovery optimization.
Where it breaks
-
Multi-pack pricing. A 6-pack at $36 might price-match better than 6 single bottles at $7 each (= $42), but the buyer searching “12 oz dish soap” expects the per-bottle price. AI agents handle this inconsistently. Surface both — the per-unit price as
unitPriceSpecificationand the pack price asprice:"offers": { "@type": "Offer", "price": "36.00", "priceCurrency": "USD", "priceSpecification": { "@type": "UnitPriceSpecification", "price": "6.00", "priceCurrency": "USD", "referenceQuantity": { "@type": "QuantitativeValue", "value": "12", "unitCode": "ONZ" } } } -
Concentration confusion. “4x concentrated” laundry detergent in a smaller bottle costs the same per load as the older “regular” formula in a bigger bottle. AI agents often present the concentrated version as expensive based on price-per-ounce. Surface load count, not just volume.
-
Subscription as a separate variant. Some platforms (Shopify subscription apps) make the subscription price a separate variant. This breaks the schema pattern — AI agents read one variant’s schema and miss the subscription option. Use a single product with subscription as
additionalProperty, not as a separate variant. -
Recall and reformulation. Cleaning and personal-care products reformulate frequently. The reformulated version often has the same name and packaging. Use
mpnto disambiguate formula versions; downstream consumers comparing versions can rely on it.
What to ship this week
- Audit top-revenue CPG SKUs for the count/unit-size/total-size trio. This is the highest-leverage attribute set.
- Add metafields for the quantity layer + suitability flags (fragrance_free, allergen flags).
- Update the Liquid template to render
additionalPropertyand theweightblock. - Configure the GMC feed with the correct
unit_pricing_measureandunit_pricing_base_measurefields (these are GMC-specific, separate from schema). - For dispenser + refill product pairs, add the
isAccessoryOrSparePartForlink.
For a 100–500 SKU CPG catalog, this is a 3–5 day project. The lift in replenishment-intent queries is typically the biggest absolute traffic gain of any AI surfacing project.