Home › Blog › Trust signals for AI agents
Shopify trust signals for AI shopping agents: return policy, warranty, certifications, and seller rating schema
AI shopping agents don't just pick the cheapest product — they recommend stores they can verify as trustworthy. Return policy, warranty, certifications, and seller rating are the 4 trust signals that decide whether ChatGPT Shopping, Perplexity, or Google AI Mode recommends your store or your competitor's.
In this guide
- Why AI agents are trust-first recommendation engines
- Signal 1: MerchantReturnPolicy — the most commonly missing trust signal
- Signal 2: WarrantyPromise and warranty additionalProperty
- Signal 3: hasCertification — safety and sustainability trust
- Signal 4: Organization AggregateRating (seller rating)
- Putting it together: a complete trust-layer Liquid snippet
- 5 common trust schema mistakes
- FAQ
Why AI agents are trust-first recommendation engines
When someone asks ChatGPT Shopping "where can I buy a good cast-iron skillet under $80?" the agent doesn't run a price comparison. It runs a trust check. It asks: which stores in my knowledge base have verified product data, documented post-purchase policies, and a credible seller reputation? Then it picks the cheapest option from that verified set.
This is fundamentally different from how Google Shopping worked. Google Shopping ranked products on price, relevance, and bid. AI agents rank stores on verifiability. A store with a clear return policy, a real warranty commitment, and certified product claims is more likely to be recommended than a cheaper competitor who has none of those signals documented in structured data — even if the product data itself is otherwise identical.
The reason comes down to liability. When an AI agent recommends a specific store and that purchase goes wrong (item doesn't ship, return is refused, product breaks), the agent's trust in that store degrades. Modern AI shopping recommendation models penalize stores that create post-purchase friction. The way agents pre-screen for post-purchase risk is by reading trust schema before making a citation.
The four trust signals that AI agents read most consistently are: MerchantReturnPolicy (return policy terms in schema.org), WarrantyPromise (guarantee signals on products), hasCertification (safety and sustainability certifications), and Organization AggregateRating (seller-level reputation, distinct from product reviews). Each maps to a different layer of post-purchase risk.
Signal 1: MerchantReturnPolicy — the most commonly missing trust signal
MerchantReturnPolicy is a schema.org type that documents your store's return terms in a machine-readable format. It attaches to an Offer via the hasMerchantReturnPolicy property. Despite being the highest-leverage trust signal (ChatGPT Shopping and Perplexity both parse it explicitly), 73% of Shopify stores have no return policy schema at all.
The minimum viable MerchantReturnPolicy block has four fields: returnPolicyCategory (the key trust gate), merchantReturnDays (the window), returnMethod, and returnFees. Here's what a standard 30-day free-returns policy looks like:
{
"@type": "MerchantReturnPolicy",
"@id": "https://yourstore.com/#return-policy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn",
"applicableCountry": "US"
}
The returnPolicyCategory field is the one AI agents read for a binary trust decision. The four valid values form a trust hierarchy:
| Value | Meaning | Trust impact |
|---|---|---|
| MerchantReturnFiniteReturnWindow | Returns accepted within N days | High — most recommended |
| MerchantReturnUnlimitedWindow | Returns accepted at any time | Highest — premium trust signal |
| MerchantReturnNotPermitted | No returns accepted | Low — negative signal for most categories |
| MerchantReturnUnspecified | Policy unspecified | Neutral — same as missing schema |
For Shopify stores, the cleanest way to inject MerchantReturnPolicy is to add it as a nested object inside your Offer JSON-LD block in sections/main-product.liquid. This scopes the policy to the product level, which is where AI agents look for it during product-page crawls.
Related
- Shopify checkout extensibility structured data — payment methods, BNPL, and return policy in the checkout signal cluster
- Offer availability states deep dive — the full schema.org availability enum and how it interacts with trust signals
Signal 2: WarrantyPromise and warranty additionalProperty
For electronics, appliances, tools, and premium goods, warranty commitment is as important as price. A buyer asking Perplexity "best standing desk under $600 with a 5-year warranty" is giving you an explicit filter — if you don't have warranty data in structured form, you're invisible for that query even if your desk is $550 with a 7-year warranty listed on your product page in plain text.
Schema.org's WarrantyPromise type is the official vehicle. It has two key properties: durationOfWarranty (a QuantitativeValue) and warrantyScope (an enum describing what's covered).
{
"@type": "Product",
"name": "{{ product.title | json }}",
...
"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
"value": 2,
"unitCode": "ANN"
},
"warrantyScope": "https://schema.org/WarrantyScope/LabourAndParts"
}
}
The warrantyScope enum has four values worth knowing:
| Value | Meaning |
|---|---|
| LabourAndParts | Full coverage — parts and labour included |
| Labor | Labour only — buyer pays for replacement parts |
| PartsOnly | Parts only — buyer pays for installation/repair labour |
| WarrantyScope (base) | Use when scope is explicitly "limited" — less preferred |
For stores where warranty terms are stored as metafields, the durationOfWarranty.value can be injected dynamically. If product.metafields.warranty.duration_months exists, divide by 12 for years or use unitCode: "MON". If warranty varies by variant (common for electronics with extended-protection bundles), loop through variants and inject per-variant warranty in the hasVariant array.
Alongside WarrantyPromise, add a parallel additionalProperty entry. Some AI agents parse additionalProperty arrays more broadly than they parse the formal warranty property:
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "warrantyDuration",
"value": "2 years"
},
{
"@type": "PropertyValue",
"name": "warrantyScope",
"value": "parts and labour"
}
]
Related
- Shopify warranty and guarantee schema — complete implementation guide — WarrantyPromise with Liquid metafields, lifetime warranty encoding, extended protection plans
Signal 3: hasCertification — safety and sustainability trust
For children's products, food, cosmetics, textiles, and anything with a sustainability claim, certifications are the most credible trust signal available. A buyer asking "is this sunscreen reef-safe?" or "is this toy CPSC-compliant?" is doing a compliance check, not a price check. If your products carry real certifications (GOTS, USDA Organic, B Corp, CE Marking, CPSC, 1% for the Planet), schema.org's hasCertification property is how you make those certifications machine-readable.
The Certification type has four useful properties: name (required), issuedBy (the certifying Organization), about (what it certifies), and optionally url or sameAs linking to the cert's public database entry.
{
"@type": "Product",
"name": "{{ product.title | json }}",
...
"hasCertification": [
{
"@type": "Certification",
"name": "GOTS Certified Organic",
"issuedBy": {
"@type": "Organization",
"name": "Global Organic Textile Standard (GOTS)",
"sameAs": "https://www.global-standard.org/"
},
"about": {
"@type": "Thing",
"name": "Organic textile processing and social criteria"
}
},
{
"@type": "Certification",
"name": "OEKO-TEX STANDARD 100",
"issuedBy": {
"@type": "Organization",
"name": "OEKO-TEX Association",
"sameAs": "https://www.oeko-tex.com/"
}
}
]
}
For stores that carry certified products alongside non-certified ones, use product tags or a product.metafields.certifications.list JSON metafield to gate the hasCertification block conditionally in Liquid. Injecting empty or fabricated certification schema is a trust signal violation — AI agents cross-check against certifying body databases for premium certification types.
Store-level sustainability certifications (B Corp, 1% for the Planet, carbon-neutral operations) belong on the Organization type in theme.liquid, not on individual products. This is the correct semantic scope: your B Corp status certifies your business, not each product individually.
{
"@type": "Organization",
"name": "Your Store Name",
"url": "https://yourstore.com/",
"hasCertification": [
{
"@type": "Certification",
"name": "Certified B Corporation",
"issuedBy": {
"@type": "Organization",
"name": "B Lab",
"sameAs": "https://www.bcorporation.net/"
}
}
]
}
Related
- Product safety certifications schema — 7-category certification table: children's, electronics, food, personal care, textiles, water-contact, medical
- Carbon offset and eco-shipping schema — B Corp, 1% for the Planet, and plastic-free packaging signals for sustainability-conscious shoppers
Signal 4: Organization AggregateRating — seller-level trust
Product reviews tell agents "this product is good." Seller ratings tell agents "this store is reliable." They're distinct signals with distinct schema placements. Product AggregateRating lives inside the Product type on product pages. Seller AggregateRating lives inside the Organization type in theme.liquid — it appears on every page of your site.
The minimum viable seller AggregateRating block:
{
"@type": "Organization",
"name": "Your Store Name",
"url": "https://yourstore.com/",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "2341",
"bestRating": "5",
"worstRating": "1"
}
}
The source data for seller AggregateRating depends on where your customers leave store-level reviews. Trustpilot provides an API endpoint for your score. Google Customer Reviews (enabled through the Google channel in Shopify admin) feeds into Google's shopping trust graph. Yotpo's store reviews widget, if enabled separately from product reviews, provides aggregate seller rating data. The Shopify admin dashboard shows your store's overall review rating if you use Shopify Reviews.
The most important thing: keep the reviewCount accurate and synced. An Organization AggregateRating with a stale count (e.g., showing 156 reviews when you now have 2,340) is a low-trust signal to AI agents that cross-check against the platform source. Use a metaobject or a server-side variable to inject the real count dynamically, or update it manually each month. Never hardcode a round number like "100 reviews" — it reads as fabricated.
Perplexity Commerce is the most aggressive reader of seller-level AggregateRating among the major AI shopping agents. Its recommendation model weights post-purchase confidence signals heavily, and a store with a high seller rating but no product ratings will still outperform a store with strong product ratings and no seller rating in Perplexity's recommendation logic for certain query types (e.g., "best place to buy X" vs. "best X").
Related
- Shopify seller rating aggregate schema — Organization AggregateRating vs. Product AggregateRating, review platform API references (Trustpilot, Yotpo, Judge.me, Okendo), Google Customer Reviews setup
- AggregateRating on Shopify: which review apps inject it correctly — the per-app toggle guide for product-level AggregateRating
Putting it together: a complete trust-layer Liquid snippet
These four trust signals operate at two levels. Return policy and warranty live inside the product Offer. Certifications split between product level (product-specific certs) and organization level (store-wide certs). Seller rating lives at organization level in theme.liquid.
Here's a combined snippet for sections/main-product.liquid that layers all product-level trust signals into the existing Offer block:
{% comment %} Trust layer — add inside the Offer object in your main Product JSON-LD {% endcomment %}
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"@id": "https://{{ shop.domain }}/#return-policy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn",
"applicableCountry": "US"
}
{% if product.metafields.warranty.duration_years %}
,"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
"value": {{ product.metafields.warranty.duration_years }},
"unitCode": "ANN"
},
"warrantyScope": "https://schema.org/WarrantyScope/LabourAndParts"
}
{% endif %}
{% assign cert_tags = product.tags | join: ',' %}
{% if cert_tags contains 'certified-organic' or cert_tags contains 'gots' %}
,"hasCertification": [
{
"@type": "Certification",
"name": "GOTS Certified Organic",
"issuedBy": {
"@type": "Organization",
"name": "Global Organic Textile Standard (GOTS)",
"sameAs": "https://www.global-standard.org/"
}
}
]
{% endif %}
And in theme.liquid, the organization-level trust block that persists across every page:
{% comment %} Organization trust block in theme.liquid global JSON-LD {% endcomment %}
{
"@type": "Organization",
"name": {{ shop.name | json }},
"url": "https://{{ shop.domain }}/",
{% if shop.metafields.store_trust.seller_rating %}
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": {{ shop.metafields.store_trust.seller_rating | json }},
"reviewCount": {{ shop.metafields.store_trust.review_count | json }},
"bestRating": "5",
"worstRating": "1"
},
{% endif %}
{% if shop.metafields.store_trust.is_b_corp == "true" %}
"hasCertification": [{
"@type": "Certification",
"name": "Certified B Corporation",
"issuedBy": {
"@type": "Organization",
"name": "B Lab",
"sameAs": "https://www.bcorporation.net/"
}
}],
{% endif %}
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer service",
"availableLanguage": "English"
}
}
This pattern keeps trust data DRY: the metafields (store_trust.seller_rating, store_trust.review_count, store_trust.is_b_corp, warranty.duration_years) are maintained in the Shopify admin, and the Liquid templates inject them at render time. No redeployment needed when your review count increases or you earn a new certification.
5 common trust schema mistakes
/policies/refund-policy/ page. That page isn't linked semantically to your Product JSON-LD. An AI agent crawling a product page and looking for hasMerchantReturnPolicy inside the Offer object won't find it unless you explicitly add it to the Offer in your product template.MerchantReturnUnspecified as the category — treating it as a "safe default." It isn't. Unspecified is a negative signal: it tells the agent your return terms are unclear. If you accept returns, document the exact window and use MerchantReturnFiniteReturnWindow with a real merchantReturnDays value.hasCertification block with just "name": "Organic" is a bare assertion. Any store could write that. The trust value comes from the issuedBy Organization with a sameAs pointing to the certifying body's domain — it's the chain of authority that makes the certification verifiable. AI agents that check certifications follow the sameAs link.{% if product %} to inject warranty schema, you'll inject it on clearance items, refurbished units, and consumables that carry no warranty. An AI agent that recommends your store based on "2-year warranty" and the buyer discovers the specific product they bought was final-sale and explicitly excluded from the warranty will penalize your store's trust score. Gate warranty schema on product.metafields.warranty.duration_years != blank or a product tag like has-warranty.FAQ
Does MerchantReturnPolicy schema affect my CatalogScan score?
Not directly — CatalogScan's 15-signal model doesn't yet score MerchantReturnPolicy or WarrantyPromise as standalone signals. But these trust signals feed into the Offer signal cluster and are increasingly weighted by AI agent recommendation models. We recommend adding them for future-proofing and for AI agents like Perplexity Commerce that factor post-purchase confidence into recommendations.
What's the difference between WarrantyPromise and warranty additionalProperty?
WarrantyPromise is a schema.org type that Google formally recognizes for Rich Results in certain categories. The additionalProperty approach is more broadly parsed by AI agents that read Offer.additionalProperty arrays for trust signals. Use both: WarrantyPromise as the primary type, reinforced by additionalProperty for maximum coverage across agents.
Which AI shopping agents read these trust signals?
Perplexity Commerce reads MerchantReturnPolicy and seller AggregateRating most aggressively. ChatGPT Shopping reads Offer.hasMerchantReturnPolicy for return policy verification. Google AI Mode inherits trust signals from your Google Merchant Center feed. All three agents crawl hasCertification for category-specific trust (medical, organic, children's products).
Do I need real certifications to use hasCertification schema?
Yes. Only use hasCertification for certifications your products actually hold. Injecting false certification schema is a trust signal violation that AI agents can cross-check against the certifying body's public database for premium certification types.
Should I add trust schema to every product or just the home page?
Both — but for different signals. MerchantReturnPolicy and seller-level Organization AggregateRating belong in theme.liquid so they appear on every page (they describe the store). Warranty, product certifications, and product AggregateRating belong in the product template (sections/main-product.liquid) as product-specific signals.
Related reading
- AggregateRating on Shopify: which review apps inject it correctly and which silently break it
- How to audit Shopify structured data: the exact 3-tool verification workflow
- Shopify warranty and guarantee schema — complete implementation guide
- Product safety certifications structured data
- Shopify seller rating aggregate schema
- Carbon offset and eco-shipping schema
- All 15 CatalogScan signals explained
- Shopify Agentic Storefronts readiness checklist
See which trust signals your store is missing
Run a free CatalogScan to get a signal-by-signal breakdown in 90 seconds.
Run a free scan Browse all 15 signals