Back to field notes

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.

Designing storefronts for agentic commerce
Ryan avatarRyanCo-founder, Engineering3 min read

A 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:

FieldWhy it matters to an agent
nameDisambiguates from other SKUs
sku / gtinUniversal join key across marketplaces
priceFilterable
availabilityLets the agent skip out-of-stock variants
shippingDetailsFilterable on delivery-by date
hasMerchantReturnPolicyLowers perceived risk
aggregateRatingTie-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.

Ryan avatar

Ryan

Co-founder, Engineering

Co-founder and engineer at Nomu working on platform infrastructure — runtime, data pipelines, and the agent-readable surfaces every storefront exposes. Writes about backend engineering for commerce, AI infrastructure, and the systems decisions that make a brand scalable.