Magento Shared Catalogs Confuse AI Shopping Agents

Jump to section›
Short version: A wholesale buyer asked their assistant to reorder a product on their usual terms. It came back with a price — the wrong one. The agent didn't lie. It read the only price you let it see. On Magento 2, the two features that make wholesale work — shared catalogs and customer-group pricing — both resolve after login. An AI agent shows up as a guest, so it reads the public number, or "call for price," or nothing. Your best-margin tier is the one with the least machine-readable structure. The fix isn't a rebuild.
#Two mechanisms, one blind spot
Magento B2B gets pricing right for humans with two mechanisms working together, and both of them go dark the moment a machine reads the page instead of a person.
Shared catalogs decide which SKUs a company sees. A shared catalog scopes your assortment to a company or website — this buyer's account sees these products, that account sees those. The resolution happens against the logged-in session. To a guest, the public scope is whatever you left open, which is frequently a subset of the real catalog, and sometimes empty. An AI agent is always a guest. So it reads a narrower catalog than you actually sell and treats that narrow view as the whole store.
Customer-group pricing decides which price goes to which group. Tier prices and customer-group prices are bound to the group of the signed-in buyer. The public surface shows a base price, or a "log in for pricing" placeholder, or nothing at all. The agent takes whatever public number it can find and treats it as your store's price — the figure it will quote and compare on the buyer's behalf. That number is almost never what your wholesale buyer actually pays.
Neither of these is a misconfiguration. They're the whole point of B2B on Magento: the right buyer sees the right number, and nobody else sees it. The problem is that "nobody else" now includes the agent doing the buyer's shopping.
#Three places it actually breaks
These are stated at the mechanism level — the same repeatable patterns we see reading public storefronts, not measurements of any one Magento install.
#1. The public price isn't the real price
When the only price on the page is the base or retail number, the agent itemizes your offer with a figure your buyer would never pay. Then it lines you up against a marketplace showing one flat, machine-readable price. Even when you're genuinely cheaper at the buyer's tier, you read as more expensive — or just less legible — to the machine doing the comparison. The tier that wins the deal in real life is the tier the agent can't see, so it loses the comparison it can.
#2. "Call for price" is a machine-readable blank
Hiding the number with "call for price" or "log in for pricing" solves a human problem and creates a machine one. There's no PriceSpecification, no Offer with a price the agent can parse — just a blank where a price should be. An agent doesn't read a blank as "there's a better price behind login." It reads it as no price, and a product with no price is one it drops from the comparison entirely. You didn't protect your pricing; you removed yourself from the shortlist.
#3. The wholesale SKU is missing from the guest scope
If a SKU only resolves inside a shared catalog, a guest — and therefore an agent — may not see it on the public surface at all. The agent concludes you don't sell the product and routes the buyer to a name it already trusts. This is the same seller-authority gap that makes an authorized reseller lose the sale to a marketplace: when a machine can't confirm you carry the item, ambiguity resolves against you. We covered that dynamic in depth in Your Magento 2 B2B Catalog Is Invisible to AI Agents; shared-catalog scoping is one of the concrete mechanisms behind it.
#Don't expose gated pricing — but don't leave a blank
Here's the line that matters: you never need to publish gated pricing to fix any of this.
Gating the real price is correct. What isn't correct is leaving a machine-readable blank where a signal should be. The public surface still has a job — to tell both a human and an agent three things that leak no confidential number:
- This SKU exists — the product is real and you carry it, even if the price is scoped.
- You're an authorized seller — the brand association is a signal, not an implication.
- There's a door to the real price — a trade account, a wholesale application, a "request pricing" path with a stable URL an agent can latch onto.
That's the difference between an agent routing a buyer to your trade-account door and an agent routing them to a marketplace because your page looked empty. It's also the "B2B discovery" signal from the 5-signal agent-readiness checklist — the one most B2B stores miss.
#The fix, without a rebuild
None of this touches checkout logic, ERP, or your gated catalog. It's structured-data and discovery work on the theme, metafield, and attribute layer you already have:
- Machine-readable
Product+Offerat the public scope — declare that the SKU exists and its availability, with B2B intent signalled (eligibleCustomerType/businessFunction) even when the real price stays behind login. A parseable product beats a blank every time. - A seller-authority signal — mark your store as an authorized seller or distributor in structured data, so a guest agent can confirm you carry the item instead of assuming you don't.
- A discovery route to the wholesale door — a public, stable URL for the trade or wholesale entry point that an agent can find and follow, rather than a dead end behind a login wall.
PriceSpecificationas "starting at" or "tier exists," where valid — when you can legitimately signal that tiered or MOQ pricing exists without publishing the gated numbers, do it. It tells the agent there is a price structure here — not a blank.
All of it ships in days, not months, and leaves your gated catalog exactly as gated as it was. What changes is that the agent reading your store finally has enough correct, structured signal to route the buyer to your door instead of someone else's.
You don't need to expose gated pricing to fix this. You need to stop leaving a blank where a signal should be. If you run B2B on Magento — do you know what price an AI agent quotes for you right now?
Send one Magento B2B store URL and we'll run a free async AI-correctness read — we ask live AI agents about your products and send back a named punch-list of exactly where they're reading the wrong price or the wrong scope: luma-e.com/ai-readiness. No call required.