Teaching a Shop Assistant to Know What It Sells

A shop assistant is only as good as its grasp of the products: which variants exist, what each costs, whether it is in stock, what suits a need. How we measure that for an online shop, what we fixed so far, and what comes next.

Blog 23 October 2026Simon Mavsar

A visitor asks a shop assistant "Do you still have this coffee?", "What do you have for children?" or "Do you have this T-shirt in XL?". A good answer names the right products, the right variant, the price, whether it is in stock and a link. A weak one names something close, leaves out half the facts, or worse, makes them up.

Here is one example: a shop assistant built on Neurotko, our agent platform, for a shop that runs on Shopware. Nothing in the approach is tied to Shopware: it needs a product feed and the shop's own pages, which most shop systems provide. From the first day it knew roughly what the shop sells. Knowing it exactly took more work, and the work is not done. This post is about how we measure that knowledge and what we changed so far.

The Problem in One Example

A visitor asks, in German, "Do you have dog food?". In our first full test run the assistant named three products, each with a "from" price, and added that its data said nothing about stock. All three were in stock, and the shop's product feed said so.

After the fixes below, the same question gets all six products of the range, the price of every variant, "all in stock" and a link to each.

That is the problem in one sentence: the facts were in the knowledge base, but the search did not hand them to the model. A language model can only answer from the excerpts it is given. When the search gives it a category page instead of the product data, or the product's name without its variants, the answer is vague or incomplete even though the knowledge base holds everything.

Two Sources, Each Missing Half

The assistant reads one knowledge base filled from two places:

  • The product feed from the shop: every product and variant with its price, stock, size and EAN. Exact, but it says nothing about who a product is for or how it fits the shop's themes.
  • The crawled shop pages: categories, theme pages, product pages, the home page. They tell you which products suit children, make good gifts or belong together, but they carry no stock, often only a "from" price, and sometimes facts the feed lacks, such as a pack size.

A good answer needs both. "What do you have for children?" needs the theme page to know which products count, and the feed to say what each one costs, in which variants, and whether it is there.

Measure First

Before changing anything we wrote 22 test questions. The shop sells in German, so most are in German, with English and Slovenian to test the reply language. They cover a named product, a gift idea, the cheapest item, sizes and variants, what the shop sells at all, and questions the assistant must not answer by guessing (shipping costs, order status). Each answer scores 2, 1 or 0. Any invented product, price or stock counts as a hard fail on its own, whatever the total.

A script checks every link, price and stock claim against the feed export; nobody checks by eye. Language models vary from run to run, so for each change that mattered we ran the set three times and compared.

The seven hardest questions (14 points in all) became the yardstick. In the first full run with the search index on, the assistant scored 5 of 14 on them, with one hard fail: a postcard quoted at 2.49 EUR that costs 1.20 EUR. 2.49 EUR is the price of a magnet the shop sells, so the price most likely came from a nearby line on a category page.

What We Fixed So Far

We turned on tracing for single questions to see exactly which excerpts the search put in front of the model. Each fix came from such a trace, not from a guess. Stock is the clearest example, because it is the fact visitors care about most and the one that went missing most often, but each fix brought back more than stock.

  1. The cleanup removed facts. To get rid of menus and footers, the indexer drops lines that repeat across many pages. "Availability: in stock" repeats in hundreds of feed files, so it went too. Feed files now skip that cleanup.
  2. A product came back in pieces. The indexer split each feed file at its headings, so the search often returned a product's name without its variants, prices, stock and EAN. A product of normal size is now one piece. This was the biggest gain: 5 to 9 of 14, with no hard fail. A question about a coffee now gets both pack sizes with their prices and stock, and a dog food question gets every variant.
  3. Category pages pushed the feed aside. For "everything under 10 euros" a crawled list with "from" prices ranked above the exact feed data of the same products. The index now marks such a list when the feed already covers its products, and the search ranks it after every other hit. Nothing is lost from the index: what only the list knows can still be found.
  4. Pages now bring in the products they name. For "anything for children" the search found the shop's children's page, which links to soft toys, pencils and backpacks, but not those products' feed data: nothing in a feed says "for children". The search now follows the product links in the excerpts it chose and adds those products' feed data, within a fixed limit. The children's question now names real products with price and stock in every run.
StepHardest 7 questions (of 14)Hard fails
First full run (fix 1 already in)51
One piece per product90
Covered lists ranked last (average of 3 runs)8.70
Pages bring in their products90

Across all 22 questions, the product questions went from 81 % to 91 % of the possible points, with no invented product, price or link. Questions about shipping, order status, off-topic requests and a demand for a discount code were answered correctly before and still are.

All four changes went into Neurotko itself, not into one shop's setup, so every knowledge base with a product feed gets them.

What We Learned

  • Read the trace before you fix. More than once our first explanation was wrong. This week a question lost its suggested alternative in two of three runs, and we suspected the newest search change. The trace showed the search had put the alternative in front of the model every time; the model chose not to mention it. That calls for a prompt change, not a search change, and without the trace we would have changed the wrong thing.
  • One run proves little. A single question moved between every variant and only the lowest price under the very same setup. Three runs and a criterion written down before the run kept us honest.
  • The feed and the pages work as partners. The pages know what a product is for; the feed knows its exact facts. Each fix made the two work together instead of competing for the same space in the prompt.

Work in Progress

This is ongoing work, and the same 22 questions tell us whether each next step helps. On the list now:

  • Room in the prompt: for broad questions the first pass of the search already fills the space, so the product data that pages link to often does not fit yet.
  • Products with variants: a page links the main product, the feed lists only its variants, and the search does not yet connect the two.
  • Suggesting an available alternative every time a product is out of stock.
  • Replying in the visitor's language every time; once it answered a German question in English.

Next: Asking the Shop Live

A product feed is a snapshot: prices and stock are as old as the last read, and a search over text cannot sort or filter. "What is the cheapest product?" and "everything under 10 euros" stay half-answered for that reason. The next step is to let the assistant ask the shop itself, through the shop's own interface: MCP where the shop offers it (Shopware has it in its agentic commerce extension), its regular product API otherwise.

Two rules shape the design. Our code, not the model, decides when to ask the shop: for a product question it checks the few products the search found, and the model still answers in one call; only a sorting or filtering question gets a search tool, once per answer. And in the first version the connection only reads: no cart, no orders, no customer data, and the shop's answers are treated as data, never as instructions. If the shop does not answer, the assistant says its figures come from the feed, and when.

We will measure it with the same 22 questions. The ones that need sorting and counting are exactly the ones it should fix.

We will write again when the next round of measurements is in. If you run an online shop, Neurotko can answer your visitors from your own product feed and pages. Talk to us.