{"id":382444,"date":"2026-10-15T02:41:51","date_gmt":"2026-10-15T02:41:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/nexus-sale\/"},"modified":"2026-10-15T02:41:21","modified_gmt":"2026-10-15T02:41:21","slug":"ninhle-ai-sales-assistant","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/ninhle-ai-sales-assistant\/","author":23581226,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.3.0","stable_tag":"2.3.0","tested":"7.1.3","requires":"6.3","requires_php":"8.1","requires_plugins":null,"header_name":"Ninhle AI Sales Assistant for WooCommerce","header_author":"Ninhle","header_description":"AI sales and customer support for WooCommerce, powered by store data with product guidance, lead capture, and human handoff.","assets_banners_color":"395f92","last_updated":"2026-10-15 02:41:21","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/ninhle.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":80,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.3.0":{"tag":"2.3.0","author":"ninhle","date":"2026-10-15 02:41:21","revision":3747521}},"upgrade_notice":{"2.3.0":"<p>Telegram notifications and other paid features now ship only in the Starter and Pro plans. Adds personal-data export\/erasure and WooCommerce HPOS compatibility.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3747521,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3747521,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3747521,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3747521,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.3.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3747521,"resolution":"1","location":"assets","locale":"","width":1280,"height":860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3747521,"resolution":"2","location":"assets","locale":"","width":1280,"height":860},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3747521,"resolution":"3","location":"assets","locale":"","width":1280,"height":860},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3747521,"resolution":"4","location":"assets","locale":"","width":1280,"height":860},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3747521,"resolution":"5","location":"assets","locale":"","width":1280,"height":860}},"screenshots":{"1":"The chat widget on a WooCommerce shop page, answering from the real product catalog.","2":"Settings: brand name, logo, colours, footer tagline and suggested question chips, with a live preview.","3":"Inbox: every conversation with its status; take over from the bot and reply as a human agent.","4":"Leads captured in chat, with score and status, ready to export as CSV.","5":"Rules Engine: automatic handoffs, messages and tags based on what visitors write."}},"plugin_section":[],"plugin_tags":[5739,2364,2369,139790,286],"plugin_category":[45],"plugin_contributors":[286863],"plugin_business_model":[],"class_list":["post-382444","plugin","type-plugin","status-publish","hentry","plugin_tags-artificial-intelligence","plugin_tags-chatbot","plugin_tags-customer-support","plugin_tags-product-recommendations","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-ninhle","plugin_committers-ninhle"],"banners":{"banner":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/banner-772x250.png?rev=3747521","banner_2x":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/banner-1544x500.png?rev=3747521","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/icon-128x128.png?rev=3747521","icon_2x":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/icon-256x256.png?rev=3747521","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/screenshot-1.png?rev=3747521","caption":"The chat widget on a WooCommerce shop page, answering from the real product catalog."},{"src":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/screenshot-2.png?rev=3747521","caption":"Settings: brand name, logo, colours, footer tagline and suggested question chips, with a live preview."},{"src":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/screenshot-3.png?rev=3747521","caption":"Inbox: every conversation with its status; take over from the bot and reply as a human agent."},{"src":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/screenshot-4.png?rev=3747521","caption":"Leads captured in chat, with score and status, ready to export as CSV."},{"src":"https:\/\/ps.w.org\/ninhle-ai-sales-assistant\/assets\/screenshot-5.png?rev=3747521","caption":"Rules Engine: automatic handoffs, messages and tags based on what visitors write."}],"raw_content":"<!--section=description-->\n<p>Ninhle AI Sales Assistant is an AI sales agent for WordPress and WooCommerce. It answers customer\nquestions using your actual product data \u2014 never invented prices or stock \u2014 qualifies\nbuyers, handles objections, captures leads and hands off to a human when needed.<\/p>\n\n<h4>Free features<\/h4>\n\n<ul>\n<li><strong>Bring your own key<\/strong> \u2014 choose Anthropic Claude, OpenAI or Google Gemini as your AI provider. You control the account and the spend.<\/li>\n<li><strong>Grounded in real data<\/strong> \u2014 product answers come from a synced WooCommerce catalog and live store lookups, not from model memory.<\/li>\n<li><strong>Store tools<\/strong> \u2014 product search and details, order status (only after the customer proves they own the order), digital downloads, store policies and site content.<\/li>\n<li><strong>Sales playbook and rules<\/strong> \u2014 an editable script covering persona, qualifying questions, objection handling and closing, plus keyword rules for instant answers.<\/li>\n<li><strong>Lead capture<\/strong> \u2014 a dedicated contact panel in the chat widget, with leads stored in your own database and exportable to CSV.<\/li>\n<li><strong>Human handoff<\/strong> \u2014 escalates on complaints, explicit requests or low confidence, and can notify a webhook URL you choose.<\/li>\n<li><strong>Conversation inbox<\/strong> \u2014 read every conversation in WP Admin and release it back to the bot after a person has stepped in.<\/li>\n<li><strong>Your brand<\/strong> \u2014 widget name, logo, colour and font.<\/li>\n<li><strong>Local-only mode<\/strong> \u2014 answer product, cart and order questions from store data without calling any AI provider.<\/li>\n<li><strong>Privacy built in<\/strong> \u2014 WordPress personal-data export and erasure, attachment retention, rate limiting.<\/li>\n<li><strong>Translation-ready<\/strong> \u2014 every string can be translated on translate.wordpress.org.<\/li>\n<li><strong>WooCommerce compatible<\/strong> \u2014 declares support for High-Performance Order Storage (HPOS) and the Cart\/Checkout blocks.<\/li>\n<\/ul>\n\n<h4>Premium plans<\/h4>\n\n<p>Ninhle AI Sales Assistant is free to install and use. Optional paid plans add extra code to the\nplugin; nothing in the free version is locked or time-limited.<\/p>\n\n<p><strong>Starter<\/strong> \u2014 product variations with per-variation add-to-cart links, Telegram\nnotifications for new leads and handoffs, a sales dashboard, and cached answers\nfor repeated questions.<\/p>\n\n<p><strong>Pro<\/strong> \u2014 everything in Starter, plus coupon validation, automatic failover to a\nsecond AI provider, daily and monthly AI budget caps, rule-based lead scoring with\nadvanced analytics, price-output verification, and signed HMAC-SHA256 webhooks\nfor n8n, Make, Zapier and CRMs.<\/p>\n\n<p>AI usage is never included: OpenAI, Anthropic and Google bill you directly for\nyour own API key, on every plan including Free.<\/p>\n\n<h3>External services<\/h3>\n\n<p>The plugin connects to the services below. Except for the AI provider you configure,\neach one is used only when you turn the related setting on.<\/p>\n\n<p><strong>AI provider (the one you configure)<\/strong> \u2014 receives the visitor's chat messages, recent\nconversation history, your sales playbook and business information, and product data from\nyour own store, each time a visitor sends a message. Nothing is sent in local-only mode.<\/p>\n\n<ul>\n<li>Anthropic (Claude) \u2014 https:\/\/www.anthropic.com\/legal\/privacy \u2014 https:\/\/www.anthropic.com\/legal\/consumer-terms<\/li>\n<li>OpenAI \u2014 https:\/\/openai.com\/policies\/privacy-policy \u2014 https:\/\/openai.com\/policies\/terms-of-use<\/li>\n<li>Google (Gemini) \u2014 https:\/\/policies.google.com\/privacy \u2014 https:\/\/ai.google.dev\/gemini-api\/terms<\/li>\n<\/ul>\n\n<p><strong>Link reading (optional, off by default)<\/strong> \u2014 when you enable \"Let the bot read links\ncustomers send\", a URL a visitor pastes into the chat is sent to r.jina.ai to fetch its\ntext (https:\/\/jina.ai\/legal\/). YouTube links are read from youtube.com instead, to get the\nvideo title and public transcript (https:\/\/policies.google.com\/privacy,\nhttps:\/\/www.youtube.com\/t\/terms). Leave this off if visitors might paste private links.<\/p>\n\n<p><strong>Google Fonts (optional)<\/strong> \u2014 only if you pick a Google font for the widget in the\nsettings. Visitors' browsers then load that font from fonts.googleapis.com\n(https:\/\/policies.google.com\/privacy). The default font loads nothing from Google.<\/p>\n\n<p><strong>Handoff webhook (optional)<\/strong> \u2014 only if you enter a webhook URL. On a handoff the plugin\nsends the conversation ID, contact ID and handoff level to that URL, which you control.<\/p>\n\n<p><strong>Telegram (paid plans only, optional)<\/strong> \u2014 the free version contains no Telegram code. In\nthe Starter and Pro plans, if you enter a Telegram bot token and chat ID, new leads (name,\nemail, phone) and handoff requests (priority, issue, summary, conversation number) are sent\nto api.telegram.org (https:\/\/telegram.org\/privacy, https:\/\/telegram.org\/tos).<\/p>\n\n<p><strong>Automation webhooks (Pro plan only, optional)<\/strong> \u2014 the free version contains no code for\nthis. In Pro, if you enter a webhook URL, lead and handoff events are posted to that URL,\nwhich you control, signed with your secret.<\/p>\n\n<p><strong>Freemius (licensing)<\/strong> \u2014 the plugin bundles the Freemius SDK for optional upgrades.\nIt sends data to Freemius only if you opt in or start a paid plan or trial\n(https:\/\/freemius.com\/privacy\/, https:\/\/freemius.com\/terms\/).<\/p>\n\n<h3>Security<\/h3>\n\n<p>API keys are stored server-side and never sent to the browser; the settings screen\nshows only a masked value. Every provider call is made from your server through the\nWordPress REST API.<\/p>\n\n<p>Database queries use $wpdb-&gt;prepare(). Every REST route declares a real\npermission_callback, and the endpoints the AI uses as tools are internal-only -\nthey cannot be reached from outside the site. Visitor sessions use hashed tokens\nand chat messages are rate limited per session.<\/p>\n\n<p>Chat messages are rendered as DOM elements rather than injected HTML, and only\nhttp and https links are ever made clickable, so content returned by the AI cannot\ninject markup.<\/p>\n\n<p>Please report security issues privately to the author rather than in a public forum.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>Conversations, contacts and leads are stored in your own WordPress database. The\nplugin registers with Tools &gt; Export Personal Data and Tools &gt; Erase Personal Data,\nso you can answer data-subject requests from WordPress itself. Message attachments\nare purged on a configurable retention schedule. No data is sent anywhere except the\nservices listed under External services.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install from Plugins &gt; Add New, or upload the plugin ZIP, then activate.<\/li>\n<li>Go to Ninhle AI Sales &gt; Settings and enter an API key for your chosen AI provider (or choose local-only mode).<\/li>\n<li>Fill in the Business information and review the Sales playbook.<\/li>\n<li>Click \"Sync products now\" (or run <code>wp ninhle-ai-sales-assistant sync-products<\/code>) so the bot knows your catalog.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20paid%20ai%20subscription%3F\"><h3>Do I need a paid AI subscription?<\/h3><\/dt>\n<dd><p>To use an AI provider, yes: you supply your own API key from Anthropic, OpenAI or Google\nand are billed directly by that provider. Local-only mode needs no key.<\/p><\/dd>\n<dt id=\"does%20it%20work%20without%20woocommerce%3F\"><h3>Does it work without WooCommerce?<\/h3><\/dt>\n<dd><p>The chat and lead capture work on any WordPress site. Product search, catalog grounding and\norder lookup require WooCommerce.<\/p><\/dd>\n<dt id=\"will%20it%20invent%20prices%20or%20stock%3F\"><h3>Will it invent prices or stock?<\/h3><\/dt>\n<dd><p>No. The playbook forbids it and product facts come from lookups against your store. If the\ncatalog has not been synced, the bot is told to say so and offer a handoff instead of guessing.<\/p><\/dd>\n<dt id=\"is%20anything%20in%20the%20free%20version%20locked%3F\"><h3>Is anything in the free version locked?<\/h3><\/dt>\n<dd><p>No. Paid plans add separate code; the free version contains no locked or trial-limited features.<\/p><\/dd>\n<dt id=\"where%20is%20the%20source%20code%20of%20the%20javascript%20files%3F\"><h3>Where is the source code of the JavaScript files?<\/h3><\/dt>\n<dd><p>The files in <code>assets\/dist<\/code> are built with Vite from the human-readable source shipped in the\nplugin under <code>src\/JS<\/code> (admin screens and chat widget). To rebuild them, run <code>npm ci<\/code> and then\n    npm run build in the plugin folder; the build configuration is in <code>vite.config.ts<\/code> and\n    package.json.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>Added: WordPress personal-data export and erasure cover every table the plugin creates.<\/li>\n<li>Added: declared compatibility with WooCommerce HPOS and the Cart\/Checkout blocks.<\/li>\n<li>Changed: the chat widget is one continuous white card (header, messages and composer) and fits narrow phone screens.<\/li>\n<li>Changed: the widget uses the system font by default and loads Google Fonts only if you pick a Google font in the settings.<\/li>\n<li>Changed: a chat session is created only when a visitor opens the chat, not on every page view. Returning visitors are no longer rate-limited, so visitors on shared mobile or office networks keep the chat button.<\/li>\n<li>Fixed: on phones, the chat button could sit off-screen when the theme has content wider than the screen (for example a news ticker).<\/li>\n<li>Fixed: automation rules could not be saved because the rules table was missing two columns; existing sites are repaired automatically.<\/li>\n<li>Fixed: deleting an automation rule reported an error even though the rule was deleted.<\/li>\n<li>Changed: the plugin is now named Ninhle AI Sales Assistant for WooCommerce.<\/li>\n<li>Fixed: inline scripts attached to the admin and widget bundles were dropped when the bundles were loaded as ES modules.<\/li>\n<li>Changed: Telegram notifications, product variations, coupon validation, provider failover, budget caps and the sales dashboard now ship only in the paid plans, as separate code.<\/li>\n<li>Changed: translations come from translate.wordpress.org; the plugin no longer bundles its own translation files.<\/li>\n<li>Fixed: handoff replies are now translatable instead of always Vietnamese.<\/li>\n<li>Fixed: on\/off settings saved as \"on\" were read back as \"off\", so link reading, the prompt creator and the adaptive playbook never ran when enabled.<\/li>\n<li>Fixed: the assistant could stop replying after looking up products or other tools.<\/li>\n<li>Fixed: the assistant now reads PDF files customers attach, and reliably looks at attached images when using OpenAI.<\/li>\n<li>Fixed: when link reading is on, files a customer uploads are no longer sent to the link-reading service.<\/li>\n<li>Fixed: AI cost was recorded as zero when no model was chosen in the settings; the default model is now used for cost estimates.<\/li>\n<li>Fixed: Gemini failed when the model field was left empty.<\/li>\n<li>Fixed: attached files were never removed from conversations that were not closed, and deleting or clearing a conversation left its files on the server. Files sent in the chat are now deleted after the retention period, and immediately when their conversation is deleted or cleared.<\/li>\n<li>Fixed: file uploads no longer require the PHP fileinfo extension.<\/li>\n<li>Security: attachment paths are validated before files are read for the AI provider.<\/li>\n<li>Changed: if processing a message fails unexpectedly, the visitor gets an apology instead of no reply.<\/li>\n<li>Added: customers can paste an image (for example a screenshot) straight into the chat box.<\/li>\n<li>Fixed: suggested follow-up questions sometimes appeared as raw \"[SUGGESTIONS]\" text instead of buttons.<\/li>\n<li>Fixed: the response cache no longer stores answers that contain prices or stock status.<\/li>\n<li>Security: YouTube caption downloads only go to youtube.com over HTTPS.<\/li>\n<li>Changed: the free version no longer shows settings for features that exist only in the paid plans.<\/li>\n<li>Fixed: the leads CSV export downloaded as escaped text instead of a spreadsheet; it now opens correctly in Excel, including accented names.<\/li>\n<li>Changed: licensing and upgrade notices appear only on the plugin's own admin pages.<\/li>\n<li>Fixed: when coupon checking is not available, the assistant no longer tells customers a code is invalid; it asks them to enter it at checkout.<\/li>\n<li>Security: chat responses are never stored by page caches (for example LiteSpeed Cache or a host CDN). A cached response could be served without a valid chat session, and visitors could miss the assistant's reply.<\/li>\n<li>Fixed: with Google Gemini or Anthropic Claude, product and order lookups could fail and the internal lookup command could appear in the chat.<\/li>\n<li>Fixed: the default Gemini and Claude models had been retired by Google and Anthropic. The plugin now defaults to current models and ignores retired model names saved by earlier versions.<\/li>\n<li>Changed: the default chat widget name is \"Shop Assistant\"; set your own name in the settings.<\/li>\n<li>Added: the assistant knows the current date and time in your store's timezone (Settings &gt; General), so it can tell customers the date and take it into account for opening hours, delivery times and promotion end dates.<\/li>\n<\/ul>\n\n<h4>2.2.0<\/h4>\n\n<ul>\n<li>Added: three-tier licensing - Free, Starter and Pro - with Pro inheriting all Starter features.<\/li>\n<li>Added: premium code moved to a separate directory so the Free build genuinely excludes it rather than hiding it.<\/li>\n<li>Added: safe fallbacks so the Free build runs with no paid code present at all.<\/li>\n<li>Changed: minimum WordPress raised to 6.3.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Changed: the admin interface is now English throughout; Vietnamese ships as a translation.<\/li>\n<li>Changed: default widget tagline and policy fallbacks are English and brand-neutral.<\/li>\n<li>Fixed: the Rules screen was calling REST helpers that did not exist, so every action on that tab failed.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added: Freemius SDK for optional paid plans, supporting annual subscriptions and lifetime licenses.<\/li>\n<\/ul>","raw_excerpt":"AI sales and customer support for WooCommerce, with product guidance, lead capture, and human handoff.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/382444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=382444"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ninhle"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=382444"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=382444"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=382444"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=382444"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=382444"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=382444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}