Getting started

AI shopping assistant

A chat widget for your storefront that finds products and answers questions from your indexes.

What it does

The AI shopping assistant is a chat widget you embed on your storefront. Shoppers ask for products in their own words, and it searches the indexes you choose and answers from what it finds.

Set it up under AI assistant in your project.

Create an assistant

A project can have several assistants, for example one per storefront or language. Open AI assistant in the cabinet and create one; each has its own sources, instructions, look and widget key. The number of assistants per project is limited by the platform.

  1. Add the sources: each one is an index and one of its search profiles. Write a short description for every source, for example "Boots catalog with prices" or "Store policies, returns and shipping". The assistant reads these descriptions to decide where to look, so a product index and an FAQ index each need one.
  2. For each source, map the fields: which one is the title, image, price and link. Then choose what the assistant can read.
  3. Optionally add additional instructions, free text of up to 4 000 characters: store facts, tone and what to recommend or avoid, such as "Free returns within 30 days." They are added to the platform's prompt and can't replace its rules; any part that conflicts is ignored.
  4. Try it in the test panel next to the form. It runs your unsaved draft, so you can check answers before saving. Test turns count toward the monthly token limit.
  5. Switch the assistant Live when it is ready. An assistant that is not live does not answer on your site.

The assistant only searches the sources you list, and only what the profile allows.

What the assistant can read

Each source sorts fields into three lists. Type an exact field name or a pattern with one *, such as attributes.*, internal_*, *_cost or * for everything. Naming an object covers everything under it.

ListWhat happens
In every search resultSent with each search hit, cut to 500 characters (1000 for a field whose name contains "desc"). Use it for short facts such as colour or brand.
On requestRead when a shopper asks about one specific product and the search results do not answer it. The assistant can read up to 12 000 characters at a time. Use it for long text.
NeverNever reaches the model, and wins over the other two. The assistant also cannot filter or sort on it, and its facet values are not sent. A title, image, price or link field cannot be in this list, because product cards show it.

Only mapped fields are ever read. These lists decide alone: a pattern also selects fields hidden from public search, so * or attributes.* can show the assistant a field marked not returnable. Put anything it must not see in Never. Never always applies, including to text a language group borrows from another index. The Preview under the lists shows what each mapped field gets.

These lists choose what the assistant reads, whatever fields the search profile returns. The profile still decides which products a search can find, and the query can still match text in a field listed under Never, so keep fields you never want matched out of the profile's search fields.

New sources in the cabinet start with * under On request. Sources created through the API or MCP, and existing ones, start with all lists empty.

Product cards and badges

The reply is a short verdict: the product the assistant would pick for each thing asked for, and the fact that decides it. It answers more fully when the shopper asks for an explanation or a comparison.

The reasons go on the cards. When the assistant recommends products, it picks the cards to show, best first, and writes a one-sentence note on each saying why it suits the request. When the shopper asked for several different things, the cards are grouped under short headings such as Boxes and Tape. It can also add short badges such as In stock or Width: 200 mm for facts the title does not state. The cards appear under its reply, once the reply is written. If it picks none, the widget shows the best hits of each search instead, so each thing asked for is represented.

A note never contains a link and is cut at 140 characters.

A badge's value is always read from the product, and only from a field under In every search result or On request, or the title, price or link field. A field under Never cannot become a badge. The assistant chooses only the label and the unit. A true value shows the label alone, a false or empty value shows no badge, and a list shows its first three values. A number of 1 000 000 or more with no unit shows no badge, as such a raw value says nothing to a shopper.

Open Chat widgets in the assistant's settings to turn the curated list, its badges or their colours off. Notes and headings stay when badges are off. With the list off, the assistant keeps showing the cards its searches find.

A yes/no field shows your own wording, so the assistant can't describe it wrongly. Without wording, a yes shows the field's name (in_stock becomes In stock) and a no shows nothing. Set a label for both answers to show Out of stock too, or to translate them.

Colours mean something rather than decorate: green for a clear match, amber for a limitation and blue for a highlighted fact. The assistant adds one only when it helps the shopper. Override them with .zp-badge.positive, .zp-badge.warning and .zp-badge.info.

To style the cards with custom CSS, use .zp-info, .zp-title, .zp-note, .zp-foot, .zp-price, .zp-badges and .zp-badge, and .zp-group for a heading. Every card has the same layout, with the price under the title.

Appearance

The assistant page also has the look and feel with a live preview: mode, colours, corner radius, position, name, greeting, input placeholder, up to four starter questions, the text shown when the assistant is unavailable, and an optional custom CSS block.

Add it to your pages

Each assistant has its own widget key (zs_ak_...), shown on its page. List your shop's domains under Allowed origins there; the widget refuses to talk from any other site. If a key leaks, regenerate it: the old one stops working at once and you paste the new one into your pages.

The two script tags can go anywhere on the page. The end of <body> is recommended, so the widget never delays your content; from <head> it waits until the page has loaded before it appears.

<script src="https://search.zaproo.cloud/widget/assistant.js"></script>
<script>
  window.zaproo.assistant({
    key: 'zs_ak_...',
    apiUrl: 'https://api.search.zaproo.cloud',
  });
</script>
key
string required
The assistant's widget key (zs_ak_...).
apiUrl
string required
The API address, https://api.search.zaproo.cloud.
mode
'bubble' | 'drawer' | 'inline'
Overrides the mode chosen for the assistant in the cabinet. bubble is a launcher with a floating panel, drawer slides in from the side, inline fills an element on the page.
mount
string | HTMLElement
A CSS selector or element to render into. Use it with inline.
<div id="help"></div>
<script>
  window.zaproo.assistant({ key: 'zs_ak_...', apiUrl: 'https://api.search.zaproo.cloud', mode: 'inline', mount: '#help' });
</script>

Token limits

Every answer uses model tokens, and your plan includes a monthly amount. The free plan has none, so the assistant is unavailable there. When the limit is reached the widget shows your unavailable text until the next month. Staff can set a different monthly limit for a single organization.

Conversations and retention

Conversations in the cabinet lists what shoppers asked, what the assistant answered, which products it showed and the tokens used. You can delete a single conversation.

Conversations are deleted automatically after the retention period. The default is 90 days and you can set anything from 7 to 365 days.

Each page load starts a new chat in the widget, and New chat in its header starts one at any time. Shoppers find their earlier chats under Chats, in the same browser, and can pick one up where they left it. Those chats are deleted after the assistant's retention period like any other conversation.

Privacy

Shoppers' messages and the assistant's answers are stored, and they are visible to your team and to Zaproo platform staff. Tell your shoppers, and add it to your privacy policy. The widget sends a random visitor id kept in the shopper's browser, not a name or an email. Shoppers should not be asked to type personal data into the chat.

How the AI assistant handles data with model providers

The assistant does not run its own language model. Each answer is written by a model at an outside provider that Zaproo staff configure for the platform. You do not pick the provider, and the same assistant can be served by more than one: if the first provider in the chain fails, the turn goes to the next one. A separate scope check, which decides whether a message is about your shop, can use a different provider from the one that writes the answer. Treat every provider configured on the platform as a sub-processor. The list is on the sub-processors page.

What is sent to the provider

Every turn sends:

  • The system prompt: the assistant's name, your instructions, the descriptions of your sources, and the platform's own rules.
  • The recent conversation: up to the last 20 messages, meaning the shopper's messages, the assistant's earlier answers and its earlier searches.
  • Search results: for the first hits of each search, the title, price and link, the fields under In every search result, the hit count and the top facet values. Images are not sent unless you list the image field.
  • Product details: when the assistant reads a product on request, the fields under In every search result and On request for that product.

The scope check sends the shopper's latest message, up to four messages before it (each cut to 500 characters), the assistant's name and your source descriptions.

The provider does not get the visitor id, the shopper's IP address or the page address. It gets whatever the shopper typed, so personal data written into the chat reaches the provider. Do not map fields that hold personal data, and keep personal data out of your instructions.

Test turns from the test panel go to the provider in the same way.

What Zaproo stores

  • Conversations: each message's text, the searches made and products shown, the tokens used, the model and provider that answered, the response time, and the scope check's verdict. They are stored with the random visitor id and the site the chat ran on. They are deleted after the assistant's retention period (90 days by default, 7 to 365 days), or sooner when you delete one.
  • Test chats: turns from the test panel are stored as test conversations. Zaproo staff can see them; your Conversations list does not show them. The same retention period applies.
  • Token counts: daily and monthly totals per organization and assistant, with no message text. They are kept for billing after the conversations are gone.
  • Backups: database backups are kept for 30 days, so deleted conversations can remain in a backup for up to 30 days.

What providers keep

Each provider has its own default retention, set by its API terms and by the account behind the API key Zaproo configures. The summary below reflects the providers' published API data policies as we understand them. It is not a contractual statement, so check the provider's current terms.

ProviderTraining on API dataDefault retentionZero data retention
AnthropicNot used by default under the commercial termsKept for a limited period, longer if flagged by trust and safety; confirm the current period with AnthropicAn account-level agreement with Anthropic
OpenAINot used unless the account opts inUp to 30 days for abuse monitoring, longer when the law requires itAn account-level arrangement OpenAI approves for eligible accounts and endpoints
OpenAI-compatible (Ollama Cloud, a gateway, a self-hosted server)Depends on who runs the endpointDepends on who runs the endpoint; confirm with that vendorDepends on the vendor. A model on your own servers involves no third party.

Zero data retention is not on by default. It is an agreement between the account holder and each provider, not a switch in a request. The platform sends no retention header, so the provider's default retention applies to every request until such an agreement covers the API key in use. Requests to OpenAI ask it not to store completions (store: false), which keeps them out of OpenAI's stored completions but does not shorten its abuse-monitoring retention. Ask us which providers serve the platform and whether zero data retention is in place for them.

For the platform operator

  1. Use only providers whose API terms exclude training on your data, and record each one on the sub-processor list with its region.
  2. Ask Anthropic and OpenAI for zero data retention on the organizations whose keys are configured, and keep the written confirmation.
  3. For an OpenAI-compatible endpoint, get the vendor's retention, logging and hosting region in writing. A gateway may forward to further providers.
  4. Configure the guard and fallback chains only with providers that meet the same bar, since each of them receives shopper messages.
  5. Update this page and the sub-processor list when a provider or its terms change.