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.

TL;DR When a product is recalled: set 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.
Legal note: This guide addresses structured data markup for recall visibility. It does not constitute legal advice. CPSC, ACCC, and EU RAPEX have specific notification and posting requirements — consult legal counsel for your recall plan.

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 keyTypePurpose
recall.activeBooleantrue = recall in progress
recall.notice_jsonJSON stringRecall 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:

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.

Related Resources