Compliance & Structured Data Guide
Shopify Product Recalls & Safety Notices Structured Data for AI Shopping Agents
A recalled product still showing as "In Stock" in your structured data is a liability — AI shopping agents will keep recommending it until your markup says otherwise. Here's exactly how to signal recalls, safety notices, and remediations through schema.org JSON-LD.
Offer.availability to schema.org/Discontinued, add a recallNotice additionalProperty with the CPSC recall number and remediation instructions, and ping IndexNow immediately. Do not unpublish the page — keep it live with updated markup so consumers can find recall information and AI agents stop recommending the product. When the recall is resolved, revert availability to InStock and add a resolvedAt property.
Why Structured Data Matters During a Recall
When a recall is issued, most Shopify merchants focus on email outreach, social posts, and updating product descriptions. What they miss: AI shopping agents have already crawled and cached the product page as purchasable. Those cached signals persist for days to weeks depending on the agent's recrawl cadence.
The risk is concrete: a user asks ChatGPT Shopping "best baby bouncers under $150" — the recalled product scores well on price, reviews, and description content, and the agent recommends it. The only way to stop this recommendation is to update the machine-readable availability signal in your structured data.
The availability property is the recall kill-switch
Every AI shopping agent that processes schema.org Product markup uses Offer.availability as a prerequisite filter. Products not marked InStock or InLimitedAvailability are suppressed from purchase recommendations. Switching to Discontinued is the fastest machine-readable signal you can send.
| Availability value | AI agent behavior | Use case |
|---|---|---|
schema.org/InStock |
Included in purchase recommendations | Normal active product |
schema.org/InLimitedAvailability |
Included with urgency signal | Low stock, clearance |
schema.org/OutOfStock |
Suppressed from purchase recommendations | Temporarily unavailable |
schema.org/Discontinued |
Suppressed; product treated as end-of-life | Active recall or permanent removal |
schema.org/PreOrder |
Included with delivery-date caveat | Upcoming release |
Core Recall JSON-LD Pattern
The minimum recall update is two changes to your existing Product JSON-LD: set availability to Discontinued and add a recallNotice additionalProperty. Both changes go inside the Product's offers block.
Minimum recall markup
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Bounce-Bright Baby Bouncer Model BB-200",
"sku": "BB-200-BLU",
"offers": {
"@type": "Offer",
"price": "129.00",
"priceCurrency": "USD",
"availability": "https://schema.org/Discontinued",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "recallNotice",
"name": "Product Recall",
"value": "CPSC Recall #26-052: issued 2026-03-10. Remediation: full refund. Contact recalls@example.com or call 1-800-555-0198. See https://www.cpsc.gov/recalls/2026/example for full details."
},
{
"@type": "PropertyValue",
"propertyID": "recallId",
"name": "Recall Identifier",
"value": "CPSC-2026-052"
},
{
"@type": "PropertyValue",
"propertyID": "recallDate",
"name": "Recall Date",
"value": "2026-03-10"
},
{
"@type": "PropertyValue",
"propertyID": "recallRemediation",
"name": "Recall Remediation",
"value": "Full refund — no return of product required"
}
]
}
}
Extended pattern with safetyConsideration and batch/lot
For recalls that affect only specific production batches, add a batchNumber or lotNumber property so AI agents can distinguish recalled vs. non-recalled inventory of the same SKU:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "ThermoFlex Heating Pad HP-400",
"sku": "HP-400",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "recalledBatches",
"name": "Recalled Lot Numbers",
"value": "LOT-2025-A11, LOT-2025-A12, LOT-2025-B01"
},
{
"@type": "PropertyValue",
"propertyID": "safetyConsideration",
"name": "Safety Notice",
"value": "Overheating risk in lots A11, A12, B01 manufactured Oct–Nov 2025. Check bottom label for lot number. If affected, stop use immediately and contact support."
}
],
"offers": {
"@type": "Offer",
"price": "49.00",
"priceCurrency": "USD",
"availability": "https://schema.org/Discontinued"
}
}
Shopify Liquid Implementation
Rather than editing product JSON-LD by hand, use Shopify metafields to store recall state. This approach lets your operations team update recall status through the Shopify admin without touching theme code.
Metafield setup
Create two metafields on the Product namespace:
| Metafield key | Type | Purpose |
|---|---|---|
recall.active | Boolean | true = recall in progress |
recall.notice_json | JSON string | Recall details (id, date, remediation, authority) |
Liquid snippet for product.liquid
{% assign recall = product.metafields.recall %}
{% if recall.active == true %}
{% assign recall_data = recall.notice_json | parse_json %}
"availability": "https://schema.org/Discontinued",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "recallNotice",
"name": "Product Recall",
"value": {{ recall_data.notice | json }}
},
{
"@type": "PropertyValue",
"propertyID": "recallId",
"name": "Recall Identifier",
"value": {{ recall_data.id | json }}
},
{
"@type": "PropertyValue",
"propertyID": "recallDate",
"name": "Recall Date",
"value": {{ recall_data.date | json }}
},
{
"@type": "PropertyValue",
"propertyID": "recallRemediation",
"name": "Recall Remediation",
"value": {{ recall_data.remediation | json }}
}
]
{% else %}
"availability": "https://schema.org/InStock"
{% endif %}
The recall.notice_json metafield value for the baby bouncer example would be:
{
"id": "CPSC-2026-052",
"date": "2026-03-10",
"notice": "CPSC Recall #26-052: issued 2026-03-10. Full refund. Contact recalls@example.com or 1-800-555-0198.",
"remediation": "Full refund — no product return required",
"authority": "US Consumer Product Safety Commission",
"url": "https://www.cpsc.gov/recalls/2026/example"
}
Post-Recall Resolution Markup
When the recall is resolved — replacement units shipped, repair program complete, or the product cleared by the authority — you must update the structured data to remove the recall signal. AI agents cache availability states; without an explicit resolution update, the product remains suppressed for weeks.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Bounce-Bright Baby Bouncer Model BB-200 (2026 Updated Version)",
"offers": {
"@type": "Offer",
"price": "129.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "recallResolved",
"name": "Recall Resolution",
"value": "CPSC Recall #26-052 resolved 2026-05-01. Updated units include redesigned harness buckle. Model suffix changed to BB-200-R."
}
]
}
}
After updating the markup, immediately ping IndexNow and submit the URL to Google Search Console's URL Inspection tool to accelerate the recrawl and clear the safety-concern signal from AI agent caches.
Recall Response Checklist
When a recall is issued, execute these structured data steps in addition to your standard recall response plan:
- Set
Offer.availabilitytoschema.org/Discontinuedin product JSON-LD - Add
recallNoticeadditionalPropertywith recall ID, date, and remediation instructions - Add
recallIdproperty with official recall identifier (CPSC, ACCC, RAPEX number) - If batch-specific recall: add
recalledBatchesproperty with lot/batch numbers - Keep product page live — do not unpublish
- Add visible on-page recall banner (HTML, not just structured data)
- Ping IndexNow immediately after markup update
- Submit to Google Search Console URL Inspection for priority recrawl
- On recall resolution: revert availability to
InStock, addrecallResolvedproperty - Post-resolution: ping IndexNow again and re-submit to Search Console
Frequently Asked Questions
Does Shopify automatically remove recalled products from search results?
No. Shopify has no built-in recall management tied to search engines or AI shopping agents. If a product is recalled, your store's structured data still shows it as InStock and purchasable unless you manually update the Offer.availability to Discontinued or add a recall-notice additionalProperty. AI shopping agents will continue recommending the product from crawled cached data until you update the markup or unpublish the page.
What schema.org properties signal a product recall?
The primary approach is to set Offer.availability to schema.org/Discontinued and add an additionalProperty with propertyID 'recallNotice' on the Product or Offer. Include the recall identifier (CPSC recall number or batch/lot number), the issuing authority, the recall date, and the remediation action (return, replacement, repair). You can also add a safetyConsideration property on the Product with a link to the official recall notice.
How do AI shopping agents respond to recalled product markup?
AI agents that index schema.org availability signals (Google AI Mode, Bing Shopping) will stop recommending products marked Discontinued. ChatGPT Shopping and Perplexity Commerce use availability as a filter — products not InStock or InLimitedAvailability are suppressed from purchase recommendations. Adding the recallNotice additionalProperty also creates a structured signal that AI agents building safety-aware product summaries can cite, reducing the risk of an AI agent recommending a product under active recall.
Should I keep the product page live or unpublish it during a recall?
Keep the page live with updated structured data during an active recall — do not unpublish. Unpublishing removes the page from search, but consumers actively searching for recall information will no longer find the official notice via your store. Instead, update Offer.availability to Discontinued, add the recallNotice additionalProperty with the full remediation instructions and CPSC link, and add a visible on-page banner. This satisfies both SEO and CPSC/ACCC notification requirements while preventing new purchase recommendations.
How do I re-activate structured data after a recall is resolved?
When the recall is resolved, update Offer.availability back to InStock and remove the recallNotice additionalProperty. Add a resolvedAt additionalProperty with the resolution date and a brief note. Submit the URL to IndexNow and Google Search Console to accelerate recrawl. The 'recall resolved' signal is important — without it, AI agents may continue applying a safety-concern filter on the product based on cached structured data.