Before / After

What an AI agent sees on your Vercel store

Same Next.js app. The difference is what gets served when an AI agent arrives — first on the product page, then from your catalog. Left: stock Next.js. Right: with @inception-agents/vercel middleware.

What the product page serves

Before — stock Next.js

<!-- Stock Next.js page response -->
<html>
  <head>
    <title>Acme Outdoor — Trail Running Shoes</title>
    <meta name="description" content="Lightweight trail runners.">
  </head>
  <body>
    <h1>Trail Running Shoes</h1>
    <p>Built for grip. Built for the long haul.</p>
    <button>Add to cart — $129</button>
  </body>
</html>

What ChatGPT / Gemini / Claude sees:

  • No JSON-LD — Gemini deprioritizes the page (it weights JSON-LD 2-3x).
  • No GTIN — Copilot can't match the product to its Knowledge Graph.
  • No aggregateRating — Gemini ranks the product behind competitors with stars.
  • No /agent/* entry points — agents fall back to scraping HTML.

After — Inception Agents middleware

<!-- With @inception-agents/vercel — agent UA detected -->
<html>
  <head>
    <title>Acme Outdoor — Trail Running Shoes</title>
    <meta name="description" content="Lightweight trail runners.">
    <script type="application/ld+json">
      {
        "@type": "Product",
        "name": "Trail Running Shoes",
        "brand": "Acme Outdoor",
        "gtin13": "0123456789012",
        "offers": {
          "@type": "Offer",
          "price": 129,
          "priceCurrency": "USD",
          "availability": "https://schema.org/InStock",
          "shippingDetails": {
            "@type": "OfferShippingDetails",
            "shippingDestination": ["US", "CA"],
            "shippingRate": "0 USD over $50"
          }
        },
        "aggregateRating": {
          "@type": "AggregateRating",
          "ratingValue": 4.7,
          "reviewCount": 482
        }
      }
    </script>
  </head>
  <body>
    <section aria-labelledby="agent-discovery">
      <h2 id="agent-discovery">For AI agents</h2>
      <ul>
        <li><a href="/agent/summary">Executive summary</a></li>
        <li><a href="/agent/query?q=fit">Fit guide</a></li>
        <li><a href="/agent/compare?vs=trail-altra">vs Altra Lone Peak</a></li>
      </ul>
    </section>
    <h1>Trail Running Shoes</h1>
    <p>Built for grip. Built for the long haul.</p>
    <button>Add to cart — $129</button>
  </body>
</html>

What changes for the agent:

  • Full schema.org/Product JSON-LD with offers + reviews + shipping.
  • GTIN-13 — Copilot Knowledge Graph entity match resolves on first fetch.
  • Visible <section> with semantic links to /agent/summary and /agent/compare.
  • Trace cookie set — buyer arrival from this agent gets attributed.

And the intelligence an agent recommends from

The route-through turns your dynamic agent surfaces into a live, queryable catalog. Here's what GET /.well-known/acp/query returns — before, a dead end; after, your real catalog plus the decision-support layer agents use to recommend you.

Before — no catalog endpoint

# GET /.well-known/acp/query?q=trail+running+shoes  — stock Next.js

HTTP/2 404 Not Found

# There is no machine catalog to query. A shopping agent
# falls back to scraping rendered HTML, one product page
# at a time — no structured comparisons, no trade-offs,
# no fit signals. Nothing to recommend from.

What a shopping agent gets:

  • The ACP/UCP endpoints 404 — there's no machine catalog to query.
  • Agents fall back to scraping rendered HTML, one product page at a time.
  • No structured comparisons, trade-offs, or fit signals.
  • Nothing to recommend from — discovery dead-ends at the brochure.

After — your normalized catalog

# GET /.well-known/acp/query?q=trail+running+shoes
{
  "query": "trail running shoes",
  "mode": "search",
  "products": [
    {
      "id": "trail-runner-gtx",
      "title": "Trail Running Shoes",
      "brand": "Acme Outdoor",
      "url": "https://acme-outdoor.com/products/trail-runner-gtx",
      "variants": [
        {
          "id": "trail-runner-gtx-9",
          "title": "US 9 / Slate",
          "price": { "amount": 12900, "currency": "USD" },
          "availability": { "available": true, "status": "in_stock" },
          "barcodes": [ { "type": "gtin", "value": "0123456789012" } ]
        }
      ],
      "reviews": { "average_rating": 4.7, "review_count": 482 },
      "intelligence": {
        "best_for": ["technical descents", "wet-rock grip"],
        "key_tradeoffs": ["heavier than road runners", "runs half a size small"],
        "why_choose_over": { "altra-lone-peak": "Stickier on wet rock; firmer midfoot hold." },
        "ideal_buyer": "Trail runner who prizes grip and stability over plush cushioning.",
        "decision_narrative": "Pick these for technical, wet terrain — and size up half a size."
      }
    }
  ],
  "storeInsights": { "totalProducts": 1240, "bestOverallValue": "trail-runner-gtx" },
  "curatedQueries": [
    { "pattern": "waterproof trail shoes", "topPickSlug": "trail-runner-gtx" }
  ]
}

What changes for the agent:

  • Your catalog, queryable in one request — variants, GTINs, price, availability.
  • The decision-support layer: comparison narratives, trade-offs, ideal-buyer fit.
  • Suggested query expansion + store insights — agents go deeper instead of bouncing.
  • Served at your own domain via the signed route-through — discovered, explored, recommended.

Illustrative payload — real shape, sample data. No live merchant data shown.

How it ships

  1. Connect Vercel — OAuth, ~30 seconds.
  2. Authorize GitHub — we open a 3-file PR on your repo.
  3. Merge the PR — Vercel auto-deploys; middleware + catalog route-through go live.
Make your catalog agent-ready →