Engineering
Storefronts for agentic commerce
AI buyers don't scroll. They read the page like a structured document and decide in milliseconds. Here's what changes when your top customer is an agent.

RyanCo-founder, Engineering3 min readA year ago “AI on a storefront” meant a chat widget in the corner. Today it means something different: an agent, sometimes the user’s own, sometimes their wallet’s, sometimes a comparison shopper, landing on your page and making a buy decision without ever rendering it visually.
That changes what a storefront is for.
What an agent actually wants
Crawlers parse markup. Agents reason over structured facts. The lift from one to the other is smaller than people think, most of the work is already in your schema.org Product blob if you took the time to fill it in.
A useful checklist:
| Field | Why it matters to an agent |
|---|---|
name | Disambiguates from other SKUs |
sku / gtin | Universal join key across marketplaces |
price | Filterable |
availability | Lets the agent skip out-of-stock variants |
shippingDetails | Filterable on delivery-by date |
hasMerchantReturnPolicy | Lowers perceived risk |
aggregateRating | Tie-break vs comparable SKUs |
If you only fix one thing, fix shippingDetails. Agents optimising for
“arrives by Friday” need to know your cutoff window, your handling time, and
the carrier transit estimate. Without it, you get filtered out before the
price even gets compared.
Render once, expose twice
The pattern we use across Nomu storefronts:
import { Product, ProductSchema } from "@/lib/commerce";
export default async function ProductPage({ params }) {
const product = await Product.get(params.slug);
return (
<>
{/* The page for humans */}
<ProductHero product={product} />
<ProductDetails product={product} />
{/* The same source of truth, exposed as schema.org JSON-LD */}
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(ProductSchema(product)) }}
/>
</>
);
}
The trick is that ProductSchema(product) reads from the same object the
UI is rendering from. If a field is missing from the JSON-LD, the field is
missing in the data model, not because someone forgot to add it to two places.
What changes about copy
Humans skim. Agents read.
That means the SEO-stuffed product description (“Premium quality candle made with love by our team in Brooklyn from sustainably sourced beeswax”) loses twice: a human skips it, and an agent extracts very little from it.
A short factual description plus structured additionalProperty entries
outperforms both:
const product = {
// ...
description: "Beeswax candle, 8oz, sandalwood + vetiver. 48-hour burn time.",
additionalProperty: [
{ name: "burn-time-hours", value: 48 },
{ name: "wax-type", value: "beeswax" },
{ name: "scent-notes", value: ["sandalwood", "vetiver"] },
{ name: "container-material", value: "ceramic" },
],
};
The human still gets the headline. The agent gets a queryable record.
Frequently asked
The take
Agents are not a new traffic source. They’re a new reader. You don’t need a separate storefront for them, you need the same storefront to be correct as a document and as a page. Build that once and you’re future-proofed for whatever comes next.
We’ll go deeper on the agentic protocol layer in the next post. If you want to be notified, the RSS feed is the canonical channel.