<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: storebird</title>
    <description>The latest articles on DEV Community by storebird (@storebird).</description>
    <link>https://dev.to/storebird</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3992555%2Fbdf0fc73-d0fc-4ab4-840d-5e976d3926dc.png</url>
      <title>DEV Community: storebird</title>
      <link>https://dev.to/storebird</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/storebird"/>
    <language>en</language>
    <item>
      <title>How to add an AI sales assistant to a WooCommerce store that actually knows your catalog</title>
      <dc:creator>storebird</dc:creator>
      <pubDate>Fri, 19 Jun 2026 12:25:33 +0000</pubDate>
      <link>https://dev.to/storebird/how-to-add-an-ai-sales-assistant-to-a-woocommerce-store-that-actually-knows-your-catalog-28ef</link>
      <guid>https://dev.to/storebird/how-to-add-an-ai-sales-assistant-to-a-woocommerce-store-that-actually-knows-your-catalog-28ef</guid>
      <description>&lt;p&gt;You drop a chatbot on your WooCommerce store. A customer asks "do you have the blue one in size M, and is it in stock?" The bot replies with a cheerful, confident, completely useless answer. It has no idea what you sell.&lt;/p&gt;

&lt;p&gt;That gap is the whole problem. And it has a clear technical cause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do generic AI chatbots fail on a WooCommerce store?
&lt;/h2&gt;

&lt;p&gt;Because they have &lt;strong&gt;no catalog context&lt;/strong&gt;. A general-purpose LLM (or a no-code bot builder hooked to one) knows how English works. It does not know your 1,400 SKUs, today's stock levels, your shipping rules, or that order #10428 shipped yesterday.&lt;/p&gt;

&lt;p&gt;When the model has no grounding data, it either deflects ("Please check the product page" — friction, lost sale) or hallucinates ("Yes, in stock!" — worse, because now you have an angry customer).&lt;/p&gt;

&lt;p&gt;Neither is what a customer wants. They asked a &lt;em&gt;sales&lt;/em&gt; question. To answer it, the assistant needs live access to two things: &lt;strong&gt;your product catalog&lt;/strong&gt; and &lt;strong&gt;your order data&lt;/strong&gt;. Getting that access right is the entire job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does "knows your catalog" actually require?
&lt;/h2&gt;

&lt;p&gt;Three capabilities, in order of difficulty:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Product Q&amp;amp;A grounded in real data&lt;/strong&gt; — answering "is this waterproof?" from your actual product descriptions and attributes, not from the model's training data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Order lookup&lt;/strong&gt; — answering "where's my order?" by reading the real order, verified so customer A can't read customer B's order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human handoff&lt;/strong&gt; — knowing when to stop and route to a human, with full context, so the customer doesn't repeat themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's take them one at a time, with the concepts a developer needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you ground answers in your product catalog? (RAG)
&lt;/h2&gt;

&lt;p&gt;You can't paste 1,400 products into a prompt — you'd blow the context window and the bill. The standard approach is &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt;: you index your catalog once, then at question time you retrieve only the few products relevant to the question and hand &lt;em&gt;those&lt;/em&gt; to the model.&lt;/p&gt;

&lt;p&gt;The indexing step turns each product into a vector ("embedding") and stores it in a vector database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Index step (runs in a queue when products sync/change).&lt;/span&gt;
&lt;span class="c1"&gt;// Each product becomes a searchable vector — done once, then incrementally.&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$products&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$batch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$texts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$batch&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;implode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"Name: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"Price: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"In stock: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;stock_status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'instock'&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'yes'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'no'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="s2"&gt;"Description: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;short_description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"Attributes: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;attributes_as_text&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// colour, size, material...&lt;/span&gt;
    &lt;span class="p"&gt;]))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// 'document' inputType for content being indexed&lt;/span&gt;
    &lt;span class="nv"&gt;$vectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$embeddingService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;embedBatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$texts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'document'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$vectorDb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$websiteId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$batch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$vectors&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At question time you embed the &lt;em&gt;question&lt;/em&gt; (note &lt;code&gt;'query'&lt;/code&gt;, not &lt;code&gt;'document'&lt;/code&gt; — it matters for retrieval quality), pull the top matches, and only those go into the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$questionVector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$embeddingService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'query'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$relevant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$vectorDb&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$websiteId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$questionVector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$llm&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"You are a sales assistant for this WooCommerce store.
             Only use the products below. If unsure, say so — never invent stock."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$relevant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;// the 5 real products, with live stock&lt;/span&gt;
    &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;$userMessage&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two non-obvious details that separate a demo from production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep stock fresh.&lt;/strong&gt; The embedding can be stale, but stock status must be read live (or re-synced on WooCommerce's &lt;code&gt;woocommerce_product_set_stock&lt;/code&gt; hook). A &lt;code&gt;woocommerce ai chatbot&lt;/code&gt; that confidently sells out-of-stock items destroys trust fast.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constrain the model.&lt;/strong&gt; "Only use the products below; never invent stock" in the system prompt is what stops hallucination. The retrieval gives it truth; the instruction makes it stay there.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How do you answer "where's my order?" safely?
&lt;/h2&gt;

&lt;p&gt;Order status is the single most common support question on a store — a real &lt;code&gt;woocommerce order tracking chatbot&lt;/code&gt; use case. The trap is security: order data is personal, so you cannot let a bot read any order from any visitor.&lt;/p&gt;

&lt;p&gt;The pattern that works: &lt;strong&gt;require an order number plus a second factor&lt;/strong&gt; (the billing email or postcode), and never put your WooCommerce API keys in the chatbot's cloud. Keep the credentials on the WordPress side and expose a single narrow endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In your WP plugin — credentials stay on the store, not in the SaaS.&lt;/span&gt;
&lt;span class="nf"&gt;register_rest_route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'yourbot/v1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/order/lookup'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'methods'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'permission_callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'yourbot_verify_signed_request'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// shared secret&lt;/span&gt;
  &lt;span class="s1"&gt;'callback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;WP_REST_Request&lt;/span&gt; &lt;span class="nv"&gt;$req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$orders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wc_get_orders&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
      &lt;span class="s1"&gt;'limit'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'search'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;sanitize_text_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$req&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'order_number'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$orders&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Second factor: the order number alone is NOT enough.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_billing_email&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$req&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WP_REST_Response&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'error'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'not_found'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s1"&gt;'status'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_status&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;      &lt;span class="c1"&gt;// processing / completed / ...&lt;/span&gt;
      &lt;span class="s1"&gt;'tracking'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get_meta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'_tracking_number'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The assistant collects &lt;code&gt;order_number&lt;/code&gt; + &lt;code&gt;email&lt;/code&gt;, calls this endpoint, and reads back the real status. Because the verification happens on the store with the real billing email, one customer can't fish for another's order. If you'd rather use core WooCommerce, the same idea works against the &lt;code&gt;wc/v3/orders&lt;/code&gt; REST endpoint — just keep the consumer keys server-side, never in the browser or the bot's prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  When should the bot stop and hand off to a human?
&lt;/h2&gt;

&lt;p&gt;Always have an escape hatch. Refunds, complaints, anything emotional or high-value — route to a person. The detail that makes handoff &lt;em&gt;good&lt;/em&gt; rather than annoying: pass the &lt;strong&gt;full conversation transcript and any order context&lt;/strong&gt; to the human, so the customer never re-explains. A handoff that loses context feels worse than no bot at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build it yourself or use a WooCommerce-native tool?
&lt;/h2&gt;

&lt;p&gt;Now the honest part. Everything above is buildable — none of it is exotic. But "buildable in a weekend" and "running reliably for a year" are different sentences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build it yourself if:&lt;/strong&gt; you want full control, you already run a vector DB and queue workers, and ongoing maintenance (re-embedding on every catalog change, prompt tuning, abuse handling, multilingual, the order-security edge cases) is a cost you're happy to own. It's a genuinely good project and the right call for some teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use an off-the-shelf tool if:&lt;/strong&gt; you'd rather ship this week and keep your time on the store. Popular options — Tidio, Gorgias, Intercom — are general e-commerce/support chat tools you bolt onto WooCommerce; the catalog-grounding is something you configure, not something native.&lt;/p&gt;

&lt;p&gt;One option built specifically as an &lt;strong&gt;AI sales employee for WooCommerce&lt;/strong&gt; (not a generic chatbot) is &lt;strong&gt;&lt;a href="https://storebird.ai" rel="noopener noreferrer"&gt;Storebird&lt;/a&gt;&lt;/strong&gt;. It does the pattern above out of the box: embeds your catalog into a vector store for grounded answers, does verified order lookup through the WordPress plugin (so your WooCommerce keys never leave your store), and hands off to a human with full context. There's a free &lt;a href="https://wordpress.org/plugins/storebird-ai-chat-for-woocommerce/" rel="noopener noreferrer"&gt;WordPress.org plugin&lt;/a&gt; if you want to wire it to a real store first — which is the only honest way to evaluate any of these: connect it to &lt;em&gt;your&lt;/em&gt; catalog and ask it your hardest product question. If you've been hunting for a &lt;strong&gt;Tidio alternative for WooCommerce&lt;/strong&gt; that treats the catalog as a first-class input, it's worth a look (&lt;a href="https://www.youtube.com/watch?v=j0OTPbPBAPw" rel="noopener noreferrer"&gt;short demo&lt;/a&gt; if you want to see the order-lookup flow first).&lt;/p&gt;

&lt;p&gt;I'm biased toward the WooCommerce-native route because catalog-grounding is the hard 80% of the value and a generic bot makes you rebuild it. But the architecture is the real lesson — whichever route you take, judge any &lt;strong&gt;ai sales assistant for woocommerce&lt;/strong&gt; on one question: &lt;em&gt;does it actually know your catalog and your orders, or is it guessing?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Generic chatbots fail on WooCommerce because they have &lt;strong&gt;no catalog or order context&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ground product answers with &lt;strong&gt;RAG&lt;/strong&gt;: embed your catalog into a vector DB, retrieve the few relevant products per question, and constrain the model to those (read stock live).&lt;/li&gt;
&lt;li&gt;Answer "where's my order?" with &lt;strong&gt;order number + a second factor&lt;/strong&gt;, and keep WooCommerce credentials on the store, never in the bot.&lt;/li&gt;
&lt;li&gt;Always offer &lt;strong&gt;human handoff with full context&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Build it if you want control and will own the maintenance; otherwise use a &lt;strong&gt;WooCommerce-native&lt;/strong&gt; tool and spend your time on the store.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>woocommerce</category>
      <category>ai</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
