Novamart —
AI shopping assistant for a large catalog
A multi-tenant chat assistant that answers product questions, looks up orders and recommends items across a 60k SKU catalog. One platform, multiple storefronts, each with its own catalog, tone and policies.
01The problem
Novamart runs a few sister storefronts on a shared backend — different categories, different brand voices, but the same operations team. Customers were asking the same questions over and over in the live chat widget: does this come in size M?, what's the warranty?, where is my order?, can I exchange this?
Their support agents were buried under repetitive tickets and the catalog was too large for any single rep to know cold. They wanted a chat assistant that could answer these directly from real product data — not a static FAQ bot, and not something that hallucinates spec sheets.
02What I built
A multi-tenant AI assistant that lives in their existing chat widget. Each store plugs into the same backend through a tenant id. The assistant can do three things:
- Answer product questions grounded in the live catalog — specs, materials, sizing, compatibility.
- Look up orders for logged-in customers — status, tracking, delivery window.
- Recommend products by category, price band, or by similarity to something they're already looking at.
Everything outside that scope is politely handed off to a human, so the bot never invents a return policy or commits to a refund it can't honour.
03Multi-tenant by design
From day one the system was built for multiple stores. A single deployment serves all of them — they share the infrastructure but not the data.
tenant_id.04The agent graph
Built with LangGraph. The user message hits a router node that decides whether the request is product Q&A, order lookup, recommendation, or out-of-scope. Each path is its own small graph with its own tools.
- Product Q&A → hybrid retrieval (BM25 + dense) over the catalog, re-rank, then answer with inline citations to product pages.
- Order lookup → calls the store's order API with the customer's session token. Never reads orders for a different tenant.
- Recommendation → vector search over product embeddings, filtered by category, price and stock.
- Fallback → a single, friendly handoff message that opens a ticket.
05Retrieval that doesn't hallucinate specs
Product Q&A is the place where a chatbot most easily lies. The fix was discipline at retrieval time, not bigger prompts.
- Hybrid search — BM25 for exact SKU / model numbers, dense vectors for natural-language questions.
- Structured fields stay structured — price, stock, dimensions and warranty come from SQL columns, not from embeddings.
- Citations — every answer links to the product card it was drawn from. If there is no good source, the assistant refuses.
- Eval set — a small set of real customer questions runs through RAGAS on every deploy. Retrieval precision and answer faithfulness are the gates.
06Stack
07Outcome
Three storefronts are live on the same backend. The assistant resolves a large share of the easy questions on its own — product specs, order status, sizing — and the support team only gets pinged on the cases that actually need a human.
Adding the next storefront is a config change, not a project. New tenant id, point at the product feed, set the system prompt — the rest of the platform is already there.