Optimization Guide
Ecommerce Product Launch & Drop Schema for AI Shopping Agents
AI shopping agents answering "upcoming streetwear drops this week," "new sneaker release date," and "limited edition restocks from outdoor brands" need structured launch date and drop window signals — not countdown timers or JavaScript reveal animations. Shopify has no native structured data for launch dates, leaving every product drop invisible to AI launch-intent queries before it goes live.
availability: PreOrder with availabilityStarts (ISO 8601 datetime) to declare launch date. For timed drops, add availabilityEnds to signal the close window. Declare limited edition attributes via additionalProperty: isLimitedEdition: true, limitedEditionName, and availableUnits. For restocks, update OutOfStock to PreOrder + availabilityStarts. Drive all date values from metafields.
Why Product Drops Are Invisible to AI Before Launch
The product drop model — releasing limited quantities of a product at a specific date and time — is a dominant commerce pattern in streetwear, sneakers, beauty, gaming accessories, and collectibles. Brands like Supreme, Nike SNKRS, Alo Yoga, and thousands of DTC brands structure their entire release calendar around drops. These launches drive some of the highest-intent shopping traffic across categories.
Yet Shopify's default product JSON-LD has no concept of a launch date. When a brand publishes a product page ahead of a drop — the standard practice for building anticipation and collecting waitlist signups — Shopify outputs a standard Offer with no availabilityStarts, no pre-launch availability state, and no signals about the release window. AI agents reading this structured data cannot distinguish a "drops in 3 days" product from a permanently out-of-stock product.
The result: AI shopping agents answering "upcoming sneaker drops this week" or "new limited edition releases from outdoor brands" cannot surface these products because there is no machine-readable launch date in the structured data. The announcement exists on social media, on the brand's email list, in a JavaScript countdown timer — but not in the schema that AI agents consume.
Product launch query types requiring structured data
| Query type | Example | Required signal | AI shopping behavior |
|---|---|---|---|
| Upcoming launch date | "when does the new Jordan 1 drop" | availabilityStarts ISO 8601 datetime |
Returns launch date/time from the PreOrder Offer |
| Drop window query | "limited sneaker drops this weekend" | availabilityStarts + availabilityEnds |
Surfaces drops whose launch window falls within the queried timeframe |
| Limited edition filter | "limited edition outdoor gear this season" | isLimitedEdition: true + availability: PreOrder |
Filters upcoming products with limited edition designation |
| Restock inquiry | "when does [product] restock" | OutOfStock → PreOrder + availabilityStarts (restock date) |
Returns restock date from the updated PreOrder Offer |
| Brand drop calendar | "upcoming drops from [brand]" | Multiple products with PreOrder + availabilityStarts |
Aggregates all upcoming launches from a brand into a drop calendar view |
Shopify default vs. launch-aware JSON-LD
{
"@type": "Offer",
"price": "180.00",
"availability": "OutOfStock"
// launch date: hidden in JS timer
// limited edition: in title text only
// restock date: unknown to AI agents
}
{
"@type": "Offer",
"price": "180.00",
"availability": "PreOrder",
"availabilityStarts":
"2026-07-04T10:00:00-05:00",
"availabilityEnds":
"2026-07-04T18:00:00-05:00",
"additionalProperty": [{
"propertyID": "isLimitedEdition",
"value": "true"
}]
}
Product Launch JSON-LD Patterns
Pre-launch product with future availability date
The baseline launch pattern: declare availability: PreOrder with availabilityStarts set to the exact launch datetime in ISO 8601 format. Include timezone offset to ensure AI agents can normalize to any local timezone in queries:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trail Runner X — Carbon Plate Edition",
"description": "Limited run of 500 pairs. Carbon fiber plate, race-ready stack height. Drops July 4 at 10am CT.",
"brand": { "@type": "Brand", "name": "PeakPace" },
"offers": {
"@type": "Offer",
"price": "220.00",
"priceCurrency": "USD",
"availability": "https://schema.org/PreOrder",
"availabilityStarts": "2026-07-04T10:00:00-05:00",
"url": "https://yourstore.com/products/trail-runner-x-carbon"
}
}
Timed drop window — opens and closes
For drops with a defined purchase window (opens Saturday at 10am, closes Saturday at 6pm or sells out), declare both availabilityStarts and availabilityEnds. This distinguishes a timed drop from a standard pre-order that ships on a future date and allows AI agents to surface urgency ("last chance to buy" window):
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Capsule Drop — Desert Colorway Hoodie",
"brand": { "@type": "Brand", "name": "SunburnStudio" },
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "isLimitedEdition",
"name": "Limited edition",
"value": "true"
},
{
"@type": "PropertyValue",
"propertyID": "limitedEditionName",
"name": "Drop name",
"value": "Desert Capsule — Summer 2026"
},
{
"@type": "PropertyValue",
"propertyID": "availableUnits",
"name": "Units available",
"value": {
"@type": "QuantitativeValue",
"value": 200,
"unitText": "units"
}
}
],
"offers": {
"@type": "Offer",
"price": "95.00",
"priceCurrency": "USD",
"availability": "https://schema.org/PreOrder",
"availabilityStarts": "2026-07-19T10:00:00-07:00",
"availabilityEnds": "2026-07-19T22:00:00-07:00"
}
}
Restock launch for previously sold-out product
For restock events, update the Offer from OutOfStock to PreOrder with availabilityStarts set to the restock datetime. Add isRestock: true additionalProperty so AI agents can distinguish a restock from a new product launch in calendar queries:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Camp Mug — Forest Green",
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "isRestock",
"name": "Restock event",
"value": "true"
},
{
"@type": "PropertyValue",
"propertyID": "restockQuantity",
"name": "Restock units",
"value": {
"@type": "QuantitativeValue",
"value": 150,
"unitText": "units"
}
}
],
"offers": {
"@type": "Offer",
"price": "42.00",
"priceCurrency": "USD",
"availability": "https://schema.org/PreOrder",
"availabilityStarts": "2026-07-28T09:00:00-05:00"
}
}
Drop collection — multiple products in one launch
For multi-product drops, link products to a shared drop collection via isPartOf pointing to the collection URL. Each product carries its own Offer with launch signals, but the shared collection URL lets AI agents aggregate all products from the same drop in a single response:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Desert Capsule — Canvas Tote",
"isPartOf": {
"@type": "Collection",
"name": "Desert Capsule — Summer 2026",
"url": "https://yourstore.com/collections/desert-capsule-summer-2026"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "isLimitedEdition",
"value": "true"
},
{
"@type": "PropertyValue",
"propertyID": "dropNumber",
"name": "Drop number",
"value": "Drop 04 — Summer 2026"
}
],
"offers": {
"@type": "Offer",
"price": "58.00",
"priceCurrency": "USD",
"availability": "https://schema.org/PreOrder",
"availabilityStarts": "2026-07-19T10:00:00-07:00",
"availabilityEnds": "2026-07-19T22:00:00-07:00"
}
}
Shopify Liquid implementation with metafields
Store launch dates in a launch.* metafield namespace. Gate on a product tag to avoid injecting pre-launch schema on standard always-available products:
{% if product.tags contains 'drop' or product.tags contains 'limited-edition' %}
{% assign launch = product.metafields.launch %}
{% assign availability_starts = launch.drop_date.value %}
{% assign availability_ends = launch.drop_close.value %}
{% assign is_limited = launch.is_limited_edition.value %}
{% assign drop_name = launch.drop_name.value %}
{% assign units = launch.available_units.value %}
{% endif %}
Drop launch state reference
| Launch state | availability | availabilityStarts | availabilityEnds |
|---|---|---|---|
| Announced, not yet live | PreOrder |
Future launch datetime | Drop close datetime (if timed) |
| Drop live, in window | InStock |
Remove / leave past date | Drop close datetime |
| Drop closed / sold out | OutOfStock |
Remove | Remove |
| Restock announced | PreOrder |
Restock datetime | Omit (open-ended restock) |
| Always-available standard product | InStock |
Omit | Omit |
Common Mistakes
1. Leaving availability as OutOfStock before launch instead of PreOrder
The most common drop schema mistake: setting availability: OutOfStock on a pre-launch product because it genuinely cannot be purchased yet. OutOfStock tells AI agents the product existed but is no longer available — not that it is about to launch. Use availability: PreOrder with availabilityStarts to signal "available from this date forward." OutOfStock is for products that were in stock and sold out; PreOrder is for products not yet purchasable but coming soon.
2. Hardcoding launch dates in the Liquid template
Writing "availabilityStarts": "2026-07-04T10:00:00-05:00" directly in product.liquid means every future date change requires a template deployment. For brands running multiple drops per month, this is operationally untenable. Store launch dates in metafields (launch.drop_date) so merchandising teams can update dates in the Shopify admin without touching code.
3. Missing the timezone offset in availabilityStarts
Declaring "availabilityStarts": "2026-07-04T10:00:00" without a timezone offset is ambiguous — AI agents and schema processors may interpret it as UTC, off by several hours from your intended launch time. Always include the timezone offset (e.g., -05:00 for US Central, +00:00 for UTC, +01:00 for CET). A launch that actually opens at 10am CT appearing as 3pm UTC in AI agent responses causes missed purchases from internationally timed audiences.
4. Forgetting to update schema after the drop closes
Leaving availability: PreOrder and a past availabilityStarts date after a drop has sold out signals to AI agents that the product is still available for pre-order. Customers sent to your page will find an OutOfStock product with no indication of when (if ever) it will return. Use a metafield-driven Liquid template that checks whether the launch date is in the past and switches to OutOfStock automatically, or set a webhook to update the metafield when the drop closes.
5. Not declaring isLimitedEdition on limited drops
Drops without isLimitedEdition: true are structurally identical to standard pre-orders in AI agent data. A user asking "upcoming limited edition streetwear drops" will not see your drop if it lacks the limited edition signal — even if the product title says "limited edition." The signal must be in structured data, not natural language description, to be machine-readable for AI filtering.
Implementation Checklist
- Use
availability: "https://schema.org/PreOrder"on products before their launch date - Set
availabilityStartsto the exact launch datetime in ISO 8601 format with timezone offset - For timed drops, add
availabilityEndswith the drop close datetime - Declare
additionalProperty: isLimitedEdition: trueon limited-edition drops - Add
limitedEditionNameadditionalProperty with the drop or collection name - Add
availableUnitsQuantitativeValue if total production quantity is known - For drop collections, link products via
isPartOfto the collection URL - Store all launch dates in metafields — never hardcode dates in Liquid templates
- Update
availabilityfrom PreOrder to InStock when drop goes live, and to OutOfStock when drop closes
Frequently Asked Questions
How do I declare a product launch date in Shopify JSON-LD?
Use availability: "https://schema.org/PreOrder" with availabilityStarts set to the launch datetime in ISO 8601 format including timezone (e.g., "2026-07-04T10:00:00-05:00"). This signals to AI agents the exact date and time the product becomes purchasable. Drive from a metafield so you can update dates without template changes.
How do I mark a product as limited edition in Shopify structured data?
Use additionalProperty with propertyID: "isLimitedEdition" and value "true". Add limitedEditionName (the drop name) and availableUnits (total production quantity as a QuantitativeValue) to give AI agents the full context for surfacing your drop in "limited edition" filter queries.
What is the difference between PreOrder and a product drop in schema.org?
schema.org has no dedicated Drop type — drops use PreOrder with availabilityStarts. The distinction between a standard pre-order and a timed drop is availabilityEnds: a timed drop Offer has both availabilityStarts (opens) and availabilityEnds (closes). A standard pre-order has only availabilityStarts. AI agents use this to distinguish "buy during this window" from "buy now, ships later."
How do I handle restock launches for previously sold-out products?
Update the existing product's Offer from availability: OutOfStock to availability: PreOrder with availabilityStarts set to the restock date. Add additionalProperty: isRestock: true and optionally restockQuantity QuantitativeValue. After the restock goes live, update to InStock and remove availabilityStarts.
Does Shopify output launch date or drop schema in its default JSON-LD?
No. Shopify's default product JSON-LD does not include availabilityStarts, availabilityEnds, or any launch signals. Even products scheduled via Shopify's native product scheduling feature don't get this data in structured output. Brands running product drops must manually add launch schema in product.liquid driven by metafields.