Common questions about MxChat. Updated daily based on real customer questions. If you can’t find an answer here, check the documentation or open the chatbot on this page.
Getting started
How is MxChat different from Chatling, Tidio, Chatbase or other hosted chatbot builders?
The difference is where the bot lives and who you pay. Chatling and the other hosted builders run the bot, its knowledge base and its transcripts on the vendor’s servers under a subscription; MxChat is a WordPress plugin that runs on your own site, so your knowledge base and every transcript are rows in your own database (or a Pinecone or OpenAI Vector Store account you own), and the only requests the plugin makes to mxchat.ai are the licence activate, deactivate and domain checks — nothing else leaves your site through us. You bring your own AI API key under MxChat → Settings → API Keys (OpenAI, Anthropic Claude, Google Gemini, xAI Grok, DeepSeek, OpenRouter, or any OpenAI-compatible endpoint) and that provider bills you directly for usage, with no per-message metering or markup from MxChat and no message cap from us (the rate limits under Settings default to Unlimited and exist to cap your own spend). The core plugin on WordPress.org is free and is the whole product, not a trial; a Pro or Agency licence is a one-time payment with lifetime updates and no monthly fee, and it buys the add-ons. For a side-by-side with a specific service, we publish comparison articles for Tidio, Intercom, tawk.to, Drift and LiveChat (not Chatling yet); for anything else, the documentation lists what MxChat does. Available in MxChat core (the free plugin); a Pro licence unlocks the add-ons.
Is there a money-back guarantee or refund window on MxChat Pro?
Yes. The published refund policy for purchases on mxchat.ai is a full refund within 14 days of your initial purchase, no hassle — we only ask that you tell us why, because the reason or feedback is what helps us improve the product. To request one, say Support Ticket in the chat on mxchat.ai and answer Yes to the question about a Pro add-on or a purchase (the No branch is for plugin bugs and sends you to the WordPress.org forum, which cannot see your order), then give your order number (from My Account → Orders or the order-confirmation email) and the reason; the policy text itself is at the bottom of the Privacy Policy page. Pro, Agency and Agency Plus are one-time purchases, so there is no subscription to cancel afterwards. If you are outside the 14 days and stuck rather than unhappy, a Support Ticket is still the right place for a setup problem — most “it won’t do what I need” cases are configuration, and the documentation and this FAQ cover the common ones. This is about buying on mxchat.ai; the MxChat plugin has no part in refunds.
Does MxChat work in Hindi (or Spanish, German, Arabic, Japanese…), and does the free plugin support other languages too?
Yes — in every language your AI model can write, and the free plugin has no language restriction, because there is no chat language setting to pick. MxChat sends the visitor’s message to the chat model you chose and the model replies in the language it was written in, Hindi included, so a visitor who writes in Hindi and one who writes in English get answers in kind from the same bot; the widget’s own labels — welcome message, placeholder, header title — are text fields you fill in whatever language you like (see how to translate the widget text). On the admin side, MxChat → Transcripts has a Translate control that renders any conversation into one of twenty languages — English, Hindi, Spanish, Arabic, Chinese, Japanese and more — through your own model key, so you can read chats in languages you don’t speak. Two things depend on your setup: your knowledge base is matched in the language it was written, so if visitors ask in Hindi about English content the right entry can score too low to be used (see why the bot says it doesn’t know in another language), and right-to-left scripts such as Arabic and Hebrew are laid out automatically. Available in MxChat core (the free plugin).
I bought MxChat Pro for my company — how do I get an invoice with my company name and VAT number? There was no VAT field at checkout.
You can’t add it at checkout: the mxchat.ai order form asks only for your name, address and email — there is no company or VAT-number field — and the PDF invoice is not attached to the order emails or offered under My Account → Orders, so it is issued on request from your order. Say Support Ticket in the chat on mxchat.ai and answer Yes to the question about a Pro add-on or a purchase (the No branch is for plugin bugs and sends you to the WordPress.org forum, which cannot see your order), or email maxwell@mxchat.ai; include your order number (from My Account → Orders or the order-confirmation email), your company name and address, and the VAT number you need on it, and the invoice is generated from your order and emailed to you. If you typed your company name into the name fields because there was nowhere else to put it, mention that too. Until it arrives, the order-confirmation email is your receipt. This is about buying on mxchat.ai; the MxChat plugin has no part in invoicing.
How do I report a security vulnerability in MxChat, and is there a bug bounty program?
Email [email protected] with a description of the issue and the plugin or site area affected (including the plugin version), steps to reproduce or a proof of concept, and your assessment of the impact; reports are acknowledged within 3 business days. The full policy is at mxchat.ai/security-policy: in scope are the mxchat.ai website, the core plugin on WordPress.org and every Pro add-on; out of scope are third-party services MxChat integrates with (OpenAI, Anthropic, Pinecone and similar), denial-of-service testing and social engineering; and researchers acting in good faith — avoiding other users’ data, not degrading the service, and allowing reasonable time to fix before public disclosure — are covered by its safe-harbor terms. The same contact is published in machine-readable form at /.well-known/security.txt (RFC 9116). The policy does not offer a paid bug bounty; reports are handled as responsible disclosure. Covers MxChat core (the free plugin), every Pro add-on and the mxchat.ai website.
Does MxChat have a team inbox where my agents can read and reply to visitor conversations?
Not as a screen inside WordPress. MxChat → Transcripts holds the complete record — a stats dashboard, All Chats with every message and the knowledge-base sources behind each reply, and Leads — but it is read-only: there is no reply box on it, so no one takes a conversation over from that screen. Live replies happen in a tool your team already has open. Slack posts the conversation into a channel, Telegram gives each visitor their own forum topic inside a supergroup, and Webhook POSTs the conversation to a URL you own for out-of-band follow-up. Those are three independent handoffs, each set up under MxChat → Settings → Integrations with its own availability schedule, so you can run more than one and the bot only offers a destination that is inside its hours. Slack is the closest thing to a shared inbox, because the whole channel sees the handoff and any agent in it can answer; see live-agent handoff for how the three compare. No add-on adds a WordPress-side agent console. Available in MxChat core (the free plugin).
Can I import a settings file I exported from another MxChat site?
No — the export is a reference file, not a restore point, and there is no import button anywhere in MxChat. MxChat → Settings → Optimization → Settings Tools → Export Settings downloads a JSON snapshot of your configuration stamped with the plugin, WordPress and PHP versions, and every API key inside it is masked to its last four characters, so the file could not be replayed into another site even if an importer existed. To move a configuration, open the JSON alongside a fresh install and re-enter the values by hand, then paste your API keys in from your provider dashboards. The Migration Tool add-on does not cover this either — it moves knowledge-base entries and action embeddings between vector databases and embedding models, not settings (see where the Migration Tool is). Available in MxChat core (the free plugin).
I bought MxChat Pro — do I have to install all the add-ons, and which one should I start with?
None of them, to start. Core is a complete chatbot on its own, and the six-step setup wizard at MxChat → Onboarding (chat model → behaviour → embedding model → knowledge base → actions → done) never asks for an add-on, so work through that first and you have a working bot. MxChat → Pro & Extensions then lists all fifteen add-ons with a status dot on each — that screen is a catalogue, not an installer, and each card’s button tells you where that add-on stands: Get the ZIP from My Account when your licence is active but the plugin isn’t installed (it opens My Account → Downloads, where the installable ZIPs live, to be uploaded via Plugins → Add New → Upload Plugin; on 3.2.20 and earlier the same button reads Download Add-on and opens the add-on’s page on mxchat.ai instead), Activate Extension once the ZIP is installed, and Configure Extension once it is running. Pick by the job you actually have — Multi-Bot for running more than one bot, WooCommerce for a store, Forms for lead capture and support tickets — and leave the rest uninstalled; every card carries its own description and a Documentation link, and an add-on you skip today can be added later without disturbing the ones already running. Available in MxChat core (the free plugin); each Pro add-on installs as its own plugin.
If I install MxChat on my own site, will the chatbot work the same as the one here on mxchat.ai?
It is the same plugin, so the capability is the same — what differs is configuration, and a fresh install starts with almost none of it. Three things decide how a bot behaves: the AI Instructions under MxChat → Settings → Behavior set its tone and its rules, the content you import under MxChat → Knowledge decides what it actually knows about your business, and the model you choose decides how well it reasons over both. Until those are filled in, a new install answers from the model’s general knowledge rather than from your site, which is why it will not sound like this one on day one. Some of what you see in the chat here is also not core: the forms it drops into the conversation and the product cards it shows come from add-ons, while the scripted offers and quick-reply buttons that trigger them are Actions, which ships with the free plugin. Available in MxChat core (the free plugin); the in-chat forms come from the Forms add-on and the product cards from the WooCommerce add-on.
How much does MxChat cost to run on a WooCommerce store with 1,000+ products?
The licence does not scale with catalogue size — it is a one-time price and every plan already includes the WooCommerce add-on, so 1,000 products cost the same to licence as 10. What scales is your AI provider bill, and the part specific to a big catalogue is indexing: the add-on re-embeds a product every time it is saved while published, with no check for whether anything meaningful changed. A first pass over 1,000 products is 1,000 embedding calls, and any bulk edit that re-saves them — a price sweep, a description tidy-up, a CSV re-import — is another 1,000. On Text-Embedding-3 Small that is cents rather than dollars, but the repeat billing on bulk edits is the part nobody budgets for. Ongoing chat spend is the normal per-message cost; estimate it here and cap it under Rate Limits. Available in MxChat core; the WooCommerce add-on adds the product sync described here.
Where do I see what changed in the latest MxChat update?
In WordPress go to Plugins → Installed Plugins, find MxChat (or any MxChat add-on) and click View details — the Changelog tab lists the release notes for every version. Core’s notes come from its WordPress.org page; each Pro add-on sends its own through the MxChat update service, and those same notes are published in the Changelog section of that add-on’s page under mxchat.ai/add-ons. Note that MxChat → Transcripts is the chat log — a record of visitor conversations — not the update log. Available in MxChat core (the free plugin); each Pro add-on publishes its own changelog to the same screen.
Can I use my ChatGPT Plus subscription with MxChat, or do I need a separate API key?
ChatGPT Plus and the OpenAI API are separate products: a Plus subscription gives you the chat website, not an API key and not API credit, so MxChat cannot run on it. Open a developer account at platform.openai.com, add a payment method, create a key, and paste it under MxChat → Settings → API Keys — OpenAI then bills you per token, separately from the Plus fee. If you’d rather not use OpenAI at all, MxChat also runs on Anthropic, Google Gemini, xAI Grok, DeepSeek, a single OpenRouter key, or any OpenAI-compatible endpoint you host yourself. To keep spend predictable, set a hard usage limit in your provider’s own dashboard and cap conversations under MxChat → Settings → Rate Limits. Available in MxChat core (the free plugin).
Where are MxChat’s settings in the WordPress admin? I can’t find the screen I was told to open.
The MxChat item in the WordPress sidebar has exactly eight screens: Onboarding, Settings, Knowledge, Transcripts, Actions, Content, API Access and Pro & Extensions — anything else you see was added by an add-on. Nearly every option lives inside Settings, which has its own sidebar: Chatbot (AI Models, Behavior, Display, Lead Capture, Quick Questions, Rate Limits), API Keys, Optimization, Testing, then Integrations (Toolbar, Loops, Brave Search, Slack, Telegram) and Tutorials. So Telegram is Settings → Integrations → Telegram, the pre-chat email form is Settings → Chatbot → Lead Capture, and the switch that puts the floating widget on your site is Auto-Display Chatbot under Settings → Chatbot → Display. There is no “General” section and no top-level Telegram, License or Intents page: licence activation is Pro & Extensions, and trigger phrases are Actions → Trigger Phrases. If a guide or a chatbot sends you to a path that isn’t in that list, it is out of date — check this map first. Available in MxChat core (the free plugin).
How much of MxChat can I use for free — is the free version a trial?
It is not a trial and it does not expire. The free plugin on WordPress.org (mxchat-basic) is the whole core product: the chat widget, the knowledge base and its importers, every supported AI provider, Quick Questions, and the Slack and Telegram live-agent handoff — with no licence key, no time limit and no message cap from us (the rate limits under Settings default to Unlimited and exist so you can cap your own API spend). A Pro licence buys the add-ons, each of which installs as its own plugin from My Account → Downloads. You bring your own AI API key either way, and the provider bills you directly for usage. Available in MxChat core (the free plugin); a Pro licence unlocks the add-ons.
I have a licence but My Account → Downloads only lists add-ons — where do I download the main MxChat plugin?
The core MxChat plugin is free, so it is not a paid download and never appears on your Downloads page — that page lists only the Pro add-ons your licence unlocks. Install core from your own site first: Plugins → Add New, search MxChat, then Install and Activate; the direct listing is wordpress.org/plugins/mxchat-basic. Then activate your key under MxChat → Pro & Extensions and upload each add-on ZIP from My Account → Downloads via Plugins → Add New → Upload Plugin. The add-ons do nothing until the core plugin is active, so always install core first. Available in MxChat core (the free plugin); each Pro add-on installs as its own plugin.
What payment methods does mxchat.ai accept — can I pay by credit card, or is it PayPal only?
Card is fine; you do not need a PayPal account. Checkout offers Card and Debit & Credit Cards alongside PayPal itself, plus a set of European bank methods: iDEAL, Bancontact, Blik, EPS, MyBank, Przelewy24, Trustly and Multibanco. Add the plan to your cart, click Proceed to Checkout, and choose there — the exact list can vary a little by country and currency. This is about buying on mxchat.ai; the MxChat plugin itself never processes payments.
How much will the OpenAI (or other AI provider) API cost me, and how do I estimate it before buying?
MxChat is bring-your-own-keys, so apart from the one-time plugin price you pay only your AI provider, billed directly with no MxChat metering or markup. Your usage cost has two parts: a mostly one-time embedding charge to index your content (re-billed only when you re-index or switch embedding models, and usually small on Text-Embedding-3 Small even for a few thousand pages), plus an ongoing per-message chat charge that scales with traffic, since MxChat sets no message cap by default. To ballpark the chat spend, multiply your expected monthly messages by your chat model’s price per token from the provider’s own pricing page — each reply is capped at 1000 output tokens server-side, plus the input and context tokens — and pick a cheaper, smaller model to bring it down. Keep spend predictable by setting the Total chatbot message limit under Rate Limits, shortening replies with an AI Instructions behavior rule, and setting a hard spend cap on the key in your provider’s dashboard; for a fuller walkthrough see our cost guide. Available in MxChat core (the free plugin).
How do I uninstall MxChat from my WordPress site?
Remove it the standard WordPress way: go to Plugins, click Deactivate under MxChat (and under any MxChat add-ons you installed separately), then click Delete. That removes the plugin files. One thing to know: MxChat ships no uninstall routine, so deleting the plugin does not erase your data — your settings and its database tables (chat transcripts, the knowledge-base content, ratings, and a few others, each named with an mxchat_ segment such as wp_mxchat_chat_transcripts) stay in the database. If you want a clean wipe, clear your chat history first (or use the REST API), then — if you’re comfortable in the database — drop the mxchat_ tables and delete the mxchat_ options; if you plan to reinstall later, leaving them preserves your configuration and knowledge base. Available in MxChat core (the free plugin).
I bought MxChat Pro and activated my license, but an add-on (like the Theme Customizer / “Theme Settings”) doesn’t appear — how do I install it?
Buying Pro or Agency and activating your license unlocks the add-ons, but it does not install them for you — each add-on (Theme Customizer, Forms, Multi-Bot, WooCommerce, and so on) is a separate plugin you install yourself. Get it in three steps: (1) sign in at mxchat.ai and open My Account → Downloads — from core 3.2.21 the add-on’s card under MxChat → Pro & Extensions has a Get the ZIP from My Account button that opens the same page — then download the add-on’s ZIP (the theme add-on is listed as MxChat Chatbot Themes); (2) in WordPress go to Plugins → Add New → Upload Plugin, choose the ZIP, install, and Activate; (3) its menu then appears — for the Theme Customizer that is MxChat → Theme Settings, which only shows once the add-on plugin is active and your Pro license is active. If the menu still doesn’t show, confirm your license reads active under MxChat → Pro & Extensions (see activating your license). If your Downloads page is empty or the add-on isn’t listed there at all, that’s an account/entitlement issue rather than a setting — email maxwell@mxchat.ai with your order number. Available in MxChat core (the free plugin); each Pro add-on installs as its own plugin.
Activating my license fails with “Exceeded maximum number of activations” — how do I free a slot?
That error means every activation slot on your license key is already in use. The usual cause is a previous install, site move, migration, or reinstall that still holds an activation — so even the same domain and email are refused until a slot is freed. Free one yourself from the site that still holds it: go to MxChat → Pro & Extensions and click Deactivate License — it calls home to release the slot (you’ll see “Activation slot has been freed up”) — then activate on the site you want, or release slots from the Manage Account link on that same screen. If you’ve lost access to the old install and can’t deactivate it, email maxwell@mxchat.ai with your order number and we’ll reset the activation count. See also moving a license to a new site. Available in MxChat core (the free plugin) — Pro & Extensions is always the bottom item in the MxChat menu, whether or not an add-on is installed.
How do I copy my chatbot’s settings and knowledge base to another WordPress site (e.g. a second Agency site)?
There’s no one-click “clone this bot” button, but each piece moves over cleanly. Settings: MxChat → Settings → Optimization & Diagnostics → Export Settings downloads a JSON of your configuration (API keys are masked for security). There’s no import counterpart, so use that file as a reference and re-enter the settings on the new site. Knowledge base: the simplest reliable path is to re-run your original imports (URL/sitemap, PDFs, Direct Content) on the new site — the KB is just embeddings of that content; alternatively, point both sites at the same Pinecone index so they share one knowledge base, or use the Migration add-on to export and migrate the vectors in bulk. License: on an Agency license you have several activation slots, so just activate the new site with one of your spare keys — you don’t need to contact support (for a single-key move, deactivate on the old site first — see moving a license to a new site). Available in MxChat core; the Migration add-on (Pro) handles bulk knowledge-base export and vector migration.
How do I move my MxChat Pro license to a different site or a new domain?
Deactivate it on the old site, then activate it on the new one. Activation checks only your purchase email and activation key — the domain is simply recorded against the license, and nothing requires it to be publicly reachable — so a local install (localhost, mysite.test, Local/MAMP/XAMPP, or a staging URL) activates like any other site. The only requirement is that the machine can reach mxchat.ai over HTTPS, since activation and add-on updates are remote calls. Each activation occupies a slot, so to move one: on the old site open MxChat → Pro & Extensions and click Deactivate License to free the slot; then on the new site enter the same email and activation key, activate, and use Link Domain to bind the key to the new URL. The same screen has a Manage Account link to your license dashboard if you would rather manage activations there. Available in MxChat core (the free plugin).
Can I use one license key on more than one site, and how many sites does each plan cover?
No — each license key activates a single site. Activation binds the key to one domain (along with the email you bought it with), so the same key can’t be reused on a second site. The plans differ only in how many keys you get: MxChat Pro includes 1 key (1 site), Agency includes 5 keys, and Agency Plus includes 10 keys — every tier unlocks the same Pro features and add-ons. Activate each site separately under MxChat → Pro & Extensions with its own key (your Agency keys may be labelled “MxChatPRO Version 1” — that’s normal). If you bought a multi-site plan but didn’t receive all your keys, retrieve them from the lost-license page or open a Support Ticket. Available in MxChat core (the free plugin) — Pro & Extensions is always the bottom item in the MxChat menu, whether or not an add-on is installed.
What is the MxChat onboarding wizard, and do I have to complete it?
When you first open MxChat in your WordPress admin you land on a six-step setup wizard that walks you through it one step at a time: pick a chat model and paste its API key, set the bot’s behavior, choose an embedding model for the knowledge base, optionally seed your first content, optionally enable Actions, and a final “you’re set up” step to test the bot and turn it on. Only the first step (a chat model + key) is essential — behavior, knowledge base, and Actions are all skippable and can be set later. You can reopen the guide any time from MxChat → Settings → Tutorials. Available in MxChat core (the free plugin).
What privacy disclaimer should I add to my site if I use MxChat?
You mostly do not have to write one any more. MxChat contributes ready-made wording to WordPress’s own Settings → Privacy → Privacy Policy Guide — four paragraphs covering what is stored and where, that conversations are kept for whatever retention period you configured, that clicked links are recorded and later anonymised, and that chat data is included in personal-data export and erasure requests — so open that guide and copy the MxChat section into your policy page. Two things it deliberately leaves to you, because only you know them: which AI provider you configured (OpenAI, Anthropic, Google and the rest each see message text in transit under their own terms), and any provider-specific terms you want to cite. Separately, switch on Privacy Notice under MxChat → Settings → Chatbot → Lead Capture to show a short line in the chat window linking to that policy page. If you would rather write the clause yourself, the facts to disclose are that transcripts live in your own WordPress database (table {prefix}mxchat_transcripts) and not on MxChat servers, that messages are forwarded to your chosen AI provider, and that each chat records the visitor’s IP address and the page it started on. Available in MxChat core (the free plugin).
How do I activate my MxChat Pro license?
Go to MxChat → Pro & Extensions in your WordPress admin (this screen was called “License” in older releases) and enter both your license key and the email address the licence was issued to — that is the billing email on your order, which, if you paid with PayPal, is usually your PayPal account’s address rather than the one you typed at checkout (see every key says Invalid). Activation calls the WooCommerce Software API at mxchat.ai with your domain, your key, and that email; if any of the three don’t match the original order, the response is “Invalid license”. If you mistyped the purchase email at checkout, the only fix is to email maxwell@mxchat.ai with the order number so it can be corrected on the order. Available in MxChat core (the free plugin) — Pro & Extensions is always the bottom item in the MxChat menu, whether or not an add-on is installed.
Can I open the chatbot from a custom link or button instead of the floating bubble?
Yes. The cleanest way is the Trigger add-on, which turns any element on your page into a chat opener via two data attributes: add data-mxchat-open to a button or link to open the widget on click, or add data-mxchat-trigger="Your prefilled message" to open the widget AND auto-send that message — perfect for CTAs like “Ask about pricing” or “Get a quote”. With Multi-Bot active, add data-mxchat-bot-id="support" to target a specific bot. Without the add-on, you can still trigger the widget from JavaScript by simulating a click on the rendered floating button: document.querySelector('.floating-chatbot-button').click() — wire that to any element’s onclick handler. For an anchor element, remember to call event.preventDefault() first so the browser doesn’t follow the # href and scroll the page to the top. Available in MxChat core (the free plugin); the Trigger add-on adds the simple data-attribute API plus built-in button styles, hover animations (shake, pulse, bounce), and Multi-Bot targeting.
How do I add the chatbot to a specific page or post? What shortcode does MxChat use?
MxChat registers one shortcode: [mxchat_chatbot]. Drop it into any page or post from the editor content and the floating chat widget renders on that page. To embed the chatbot inline at that exact spot instead of as a floating bubble, add floating="no" — [mxchat_chatbot floating="no"] renders in place at a fixed 500 px height. If you run the Multi-Bot add-on, add bot_id="your-bot-slug" to choose which bot appears, e.g. [mxchat_chatbot bot_id="support"]. Since core 3.2.20 there are two no-shortcode options as well: an MxChat Chatbot block in the block editor, and an MxChat Chatbot widget in Elementor 3.5 or newer — both offer the same inline-or-floating choice and a bot picker when Multi-Bot is active, and both show a neutral placeholder in the editor rather than a live chat. There is still no WordPress sidebar widget, and in Divi the shortcode in a Code or Text module remains the way in. If you’d rather the chatbot appear on every page automatically, turn on Auto-Display Chatbot under MxChat → Settings → Chatbot instead. Available in MxChat core (the free plugin).
Where are my API keys stored — locally or in the cloud? Does MxChat see them?
Locally, on your own server. Every API key you paste under MxChat → Settings → API Keys (OpenAI, Anthropic Claude, Google Gemini, xAI Grok, DeepSeek, OpenRouter, Voyage, Loops, Brave) is saved as a field inside the mxchat_options row of your WordPress wp_options table — the same database that holds the rest of your site’s settings. The keys never leave your server except when MxChat uses them to call the provider you configured them for (e.g. the OpenAI key is sent to api.openai.com when generating a reply); they are not transmitted to mxchat.ai, not synced to any MxChat-hosted service, and not visible to MxChat staff. If you want extra defense-in-depth, restrict database access at the host level and use the providers’ own usage-limit / IP-allowlist controls — those run on the provider side, not in MxChat. Available in MxChat core (the free plugin).
Do I need my own AI API keys, or are language models included with MxChat?
MxChat is bring-your-own-keys — the plugin doesn’t bundle access to any AI provider. Open accounts at the providers you want to use (OpenAI, Anthropic, Google Gemini, xAI Grok, DeepSeek, or OpenRouter), then paste each key under MxChat → Settings → API Keys; without a key, that provider’s models won’t load and you’ll see a “No API key detected” warning on the model picker. The provider bills you directly for usage — MxChat doesn’t proxy, meter, or mark up the API calls. If you only want to manage one account, OpenRouter gives you a single key that unlocks 100+ models from many providers. Available in MxChat core (the free plugin).
AI models & providers
What’s the difference between the chat model and the embedding model, and which one matters more?
They do two different jobs. The embedding model turns text into vectors — your knowledge base content when you index it, and each visitor message right before a reply — so MxChat can find the stored content that best matches the question. The chat model then reads that retrieved content plus the conversation history and writes the answer the visitor actually sees. Both are chosen under MxChat → Settings → Chatbot → AI Models; the keys live under Settings → API Keys, one per provider, so they can come from different companies (OpenAI embeddings with a Claude or DeepSeek chat model, for example) and are only the same key when both use the same provider. Neither is “more important”: if the bot cannot find the right content, the embedding side is the problem (check that key, or re-index after changing the model), and if it finds the content but explains it badly, change the chat model. Available in MxChat core (the free plugin).
Is the retrieved knowledge-base context passed to every chat model identically, or is there model-specific grounding logic?
It is identical. Retrieval happens before the provider is chosen: MxChat embeds the question, finds the matching chunks and assembles them into one context string, and only then hands that same string to whichever provider the switch dispatches — OpenAI, Claude, Gemini, Grok, DeepSeek, OpenRouter or a custom endpoint. What differs per provider is purely the envelope its API demands (message-array shape, streaming flag); there is no per-model prompt variant, re-ranking or extra grounding step. That is also why your embedding model and chat model are genuinely independent — a Gemini-embedded knowledge base behaves the same whether an OpenRouter, OpenAI or DeepSeek model reads it. So if one model grounds noticeably worse than another on the same knowledge base, that is the model’s instruction-following, not a different retrieval; to confirm it, open MxChat → Transcripts, select the conversation and read the Sources tab in Message Context, which lists the documents and similarity scores actually sent for that specific reply. Available in MxChat core (the free plugin).
Does Enable Streaming work with Google Gemini, or do I have to change my chat model to get word-by-word replies?
No — Gemini is the one built-in provider MxChat has no streaming path for, and it is the only one: OpenAI, Claude, Grok, DeepSeek, OpenRouter and a Custom Provider endpoint all stream, while the Gemini branch calls the ordinary response function only. Nothing warns you about it either — with Enable Streaming on and a Gemini model selected, the request quietly falls back and the answer arrives in one piece, with no error. Enable Streaming and Chat Model sit on the same screen at MxChat → Settings → Chatbot → AI Models; both are single site-wide settings, and streaming ships off on a fresh install. If you want Google’s models and streaming, keep the model and change the route: select OpenRouter as the provider and pick a Google model from its list, which MxChat fetches live from OpenRouter’s API (see OpenRouter models). Slow replies have other causes too — see why the chatbot is slow. Available in MxChat core (the free plugin); the Multi-Bot add-on is what makes the chat model a per-bot choice.
Does MxChat support Brave Search?
Yes — Brave is the search provider built into the free core plugin, as two Actions: Brave Web Search and Brave Image Search, both listed under the “Search Features” group and neither of them Pro-only. Switch them on under MxChat → Actions, and add a Brave Search API key at Settings → API Keys → Brave API Key; enabling either Action without that key raises an admin warning, because the tool is registered but every call will fail. The tuning options — number of images returned, Safe Search, number of news articles, and country — live separately at Settings → Integrations → Brave Search. Brave is a different thing from the Enable Web Search toggle, which grounds OpenAI and Gemini models through their own native search, and from the Perplexity add-on — see the comparison of the three. Available in MxChat core (the free plugin).
Can I use Mistral (or another provider that isn’t in the model dropdown) with MxChat?
Yes, but not as a direct integration — there is no native Mistral provider in MxChat, no Mistral entry in the model picker, and no separate “provider” dropdown to change, because you choose a model and the provider follows. Both working routes reach Mistral through a gateway rather than through Mistral’s own API, and both are supported. The first route is OpenRouter: paste your key under MxChat → Settings → API Keys → OpenRouter API Key, click the button to load the model list, then pick a Mistral model in Settings → Chatbot → AI Models. The second is Custom Provider (OpenAI-compatible), on that same API Keys tab — point Base URL at any endpoint that speaks OpenAI’s /v1/chat/completions, add the key, and type the model identifier the server expects in Model Name (the field’s own examples are llama3.2, mistral, gpt-oss), leave Auth Scheme on Bearer, then select “Custom (OpenAI-compatible)” in the model picker and press Test Connection. That second route is how you run Mistral locally through Ollama, LM Studio or vLLM, and it is the same mechanism behind Azure OpenAI support. Available in MxChat core (the free plugin).
Can I use DeepSeek with MxChat, and can DeepSeek handle embeddings too?
For chat, yes; for embeddings, no. Paste your DeepSeek key under MxChat → Settings → API Keys, then open the Chat Model selector under Settings → Chatbot → AI Models and pick DeepSeek V4 Flash or V4 Pro; streaming works with both. DeepSeek publishes no embedding model, so the Embedding Model field on that same screen has to stay on OpenAI, Voyage AI or Google Gemini — or a custom OpenAI-compatible endpoint. Those two fields are the only model settings MxChat has: Chat Model and Embedding Model. If you had saved the older deepseek-chat or deepseek-reasoner, MxChat moved you to DeepSeek V4 Flash by itself when DeepSeek retired those names on 24 July 2026. Available in MxChat core (the free plugin).
Can I use a local or open-source embedding model — Ollama, LM Studio, vLLM — instead of OpenAI, Voyage or Gemini?
Yes, since MxChat 3.2.8. Point MxChat at your endpoint under MxChat → Settings → API Keys → Custom Provider (Base URL, for example http://localhost:11434/v1 for Ollama), then under Extended routing (opt-in) tick “Use custom provider for embeddings” and enter the embedding model’s name — nomic-embed-text or mxbai-embed-large, not a chat model like llama3.2 — in the Custom Embedding Model field. Two things catch people out. The checkbox is off by default, so a local chat model still sends its embeddings to OpenAI until you tick it; and if you leave Custom Embedding Model blank, MxChat falls back to your chat model name, which most servers reject at /embeddings and which surfaces on import as “Failed to store any chunks”. With the box ticked, indexing and live queries both run through your endpoint, so re-index your whole knowledge base after switching — vectors made by two different models never match. Available in MxChat core (the free plugin).
Do I need the Perplexity add-on for web search with Gemini?
No. MxChat has built-in web search: go to Settings → AI Models and turn on Enable Web Search. With a Google Gemini model selected, the bot then grounds its answers with Google Search using your own Gemini API key — no Perplexity required. The same toggle also grounds OpenAI models (every one except gpt-4.1-nano) through their native web search. The Perplexity add-on is a separate, optional integration that answers via Perplexity’s own web search; you only need it if you specifically want Perplexity as the search provider. Available in MxChat core (the free plugin); the Perplexity add-on adds a separate web-search option.
Which embedding model should I choose, and what does embedding cost?
For most sites, OpenAI Text-Embedding-3 Small (TE3 Small) is the sensible default — it’s the fastest and most cost-effective option, uses 1536-dimension vectors, and is what new installs start on. Step up to Text-Embedding-3 Large (3072 dimensions) only if you need maximum retrieval accuracy and accept a higher per-token cost; Ada 2 is a balanced middle option, and Voyage-3 Large or Gemini Embedding are available if you prefer those providers. Set it under MxChat → Settings → Chatbot → AI Models (Embedding Model). Embedding is billed by your AI provider (not by MxChat) and is a one-time charge per item — content is only re-embedded when you re-index it or switch models, so even a few thousand articles is usually a small one-time cost. The only recurring embedding call is the short one MxChat makes for each visitor message before it searches, which is a few dozen tokens and negligible next to the chat model. One catch: if you use Pinecone, the index must be created with the same dimension count as your chosen model, or storing vectors will fail. Available in MxChat core (the free plugin).
Does MxChat support Azure OpenAI?
Yes — as of MxChat 3.2.8, through the Custom (OpenAI-compatible) provider. In MxChat → Settings, open the Custom Provider (OpenAI-compatible) section and set the Base URL to your Azure resource endpoint (https://<resource>.openai.azure.com/openai/deployments/<deployment>), paste your Azure API Key, switch Auth Scheme to api-key header (Azure OpenAI), and fill API Version (required for Azure, e.g. 2024-08-01-preview). Then pick “Custom (OpenAI-compatible)” in the model picker and use Test Connection to confirm. The same provider also connects Ollama, LM Studio, vLLM, and other OpenAI-compatible endpoints. Available in MxChat core (the free plugin).
Which embedding models can I use, and why isn’t Claude an option for embeddings?
Your chat model and your embedding model are two separate settings, so the embedding step in setup only lists providers that actually offer embeddings: OpenAI (Ada 2, Text-Embedding-3 Small, Text-Embedding-3 Large), Voyage AI (Voyage-3 Large), and Google Gemini. Anthropic (Claude) doesn’t publish an embedding model, which is why it never appears at that step — but you can still use Claude as your chat model. The catch: picking Claude for chat doesn’t cover embeddings. If your knowledge base is set to a Voyage or Gemini embedding model, the bot will fail with an error like “Voyage AI API key is not configured” (or “Google Gemini API key is not configured”) until you add that provider’s key under MxChat → Settings → API Keys — or switch the embedding model (Settings → Chatbot → AI Models) to a provider whose key you already have. When the chat and embedding providers match (for example, both OpenAI), MxChat reuses the same key automatically. Those three are the built-in choices in the dropdown, but they are not the whole list — you can also send embeddings to any OpenAI-compatible /embeddings endpoint (Ollama, LM Studio, vLLM, Azure OpenAI) by enabling the custom embedding provider. Available in MxChat core (the free plugin).
Why isn’t GPT-4.1 in the model dropdown anymore?
OpenAI deprecated the GPT-4.1, GPT-4o, GPT-4-turbo and GPT-3.5-turbo families on 2026-02-17, so MxChat removed them from the model picker. MxChat 3.0.55+ migrates any saved chat-model setting on those families to GPT-5.1 Chat Latest (or GPT-5 Mini for the mini variants) the next time the plugin loads, and shows a one-time admin notice describing the swap. The list you see now (GPT-5, 5 Mini, 5 Nano, 5.1, 5.1 Chat, 5.2, 5.3 Chat, 5.4, 5.4 Mini, 5.4 Nano) is OpenAI’s current GPT-5 lineup; pick any of those under MxChat → Settings → Chat Model. Available in MxChat core (the free plugin).
Which OpenRouter models can I use with MxChat — including the free ones?
The full OpenRouter catalog. Paste your OpenRouter API key under MxChat → Settings → Configuration → API Keys, then go to Configuration → Chatbot, open the Chat Model selector and pick the OpenRouter card — choosing that card is what fetches the catalog, there is no separate “load models” button; MxChat pulls the live list directly from OpenRouter’s /api/v1/models endpoint and shows every model OpenRouter exposes — paid and free — as a selectable card with pricing and context length. Free models (the ones OpenRouter suffixes with :free, e.g. deepseek/deepseek-chat-v3-0324:free) work the same as any paid model; pick one and save. There is no curated allow-list inside MxChat. Available in MxChat core (the free plugin).
What AI models does MxChat support?
The Chat Model selector (MxChat → Settings → Chatbot → AI Models) currently offers GPT-5.6 Sol, Claude Fable 5, Claude Opus 5, Claude Opus 4.8, Claude Opus 4.7, Gemini 3.8 Flash (the recommended Gemini default from core 3.2.22, alongside 3.7, 3.6 and 3.5 Flash, 3.1 Pro and the Flash-Lite models — 3.5 Flash-Lite being the lowest-cost choice), Grok 4, and DeepSeek V4 Flash and V4 Pro — plus two gateways: OpenRouter, which unlocks 100+ models from Meta, Mistral, Qwen and others behind one key, and Custom Provider for any OpenAI-compatible endpoint you host yourself. The list moves with the providers: when a vendor retires a model, MxChat drops it from the picker and switches sites that were using it to the successor automatically, so a saved model that disappears is a retirement, not a bug. Native Qwen support is not built in — reach it through OpenRouter. Embedding models are a separate setting on the same screen and a shorter list (see the embedding-model entry). Available in MxChat core (the free plugin).
Knowledge base & training
Is my website content or my visitors’ chat data used to train the AI model?
Not by MxChat: the plugin has no model of its own and never receives your content or conversations — its only calls to mxchat.ai are the licence activate, deactivate and domain checks, and transcripts live in your own WordPress database. What MxChat calls “training” is retrieval (RAG): your content is turned into embeddings and stored, and the passages that match a question are sent along with it; no model weights change and nothing is fine-tuned on your data. What does leave your site goes to the chat and embedding providers you configured with your own API keys (OpenAI, Anthropic, Google, xAI, DeepSeek, OpenRouter, Azure OpenAI, or any OpenAI-compatible endpoint), and whether they retain or train on API traffic is governed by that provider’s API terms for the account your key belongs to, not by MxChat — the plugin’s readme links each provider’s terms and privacy policy, so check the one that applies to your key. For sensitive sites (health, legal, members-only), the custom provider option can point at a model on your own server so nothing leaves your infrastructure, and this entry lists exactly what is sent, and when. Available in MxChat core (the free plugin).
Can I make the chatbot answer only from my own content, and say it doesn’t know instead of using the AI model’s general knowledge?
Yes, and the plugin ships the exact wording: under MxChat → Settings → Chatbot → Behavior → AI Instructions (Behavior), click View Sample Instructions and copy the Knowledge Base Requirements block — it tells the model to answer only from the content marked ===== OFFICIAL KNOWLEDGE DATABASE CONTENT =====, to reply “I don’t have enough information in my knowledge base to answer that question accurately” when the answer is not there, and never to invent URLs, prices, procedures or contacts. That works because MxChat wraps whatever it retrieved in those delimiters on every request, and sends a NO RELEVANT CONTENT FOUND marker instead when nothing matched, so the model can tell your content from its own knowledge. There is no separate “knowledge base only” switch — the instruction is the control, and what counts as “in the knowledge base” is decided by the Similarity Threshold. It is a system-prompt rule rather than a hard filter, so it only refuses cleanly when the right content was actually retrieved: keep the knowledge base organised and check the Testing tab when an answer surprises you. Available in MxChat core (the free plugin).
Do I have to train MxChat on my content, or does it crawl my website by itself once it is installed?
It does not crawl on its own: a fresh install has an empty knowledge base, and the chatbot knows only what you import. The first import is one bulk step rather than a training project — open MxChat → Knowledge → Import Options and use WordPress Content to select all your published pages, posts and products at once (or Sitemap Import to pull every URL your sitemap lists); PDFs, Word/Markdown/text files, single URLs, pasted text and YouTube videos each have their own importer, and the onboarding checklist’s Step 4 walks you to this screen. “Training” here means retrieval, not model training: each item is embedded and stored, and the matching pieces are handed to the AI model with every question. After the first import, switch on MxChat → Knowledge → Auto-Sync for each content type (it is off by default) and every later publish or edit re-indexes that item automatically; there is no scheduled re-crawl, so content that is not a WordPress post — a URL on another site, a PDF — is refreshed by importing it again. Available in MxChat core (the free plugin).
The chatbot’s answers name the .md (or .docx / PDF) file I uploaded to the knowledge base, and when a visitor asks for the manual’s link it says it has no URL — how do I get a real link instead of a file name?
Because an uploaded document has no web address. Document Upload and PDF Upload extract the text and never keep the file, so the entry is stored under the identity upload://your-file.md, and with Citation Links on that identity is handed to the AI as the reference’s URL exactly like a page address — so the bot cites the file name, and any link it builds from it goes nowhere. The Edit button on a knowledge entry changes its text, not its address, so give the content a real one: delete the upload entry from the Knowledge list, then paste the same text into MxChat → Knowledge → Import Options → Direct Content with the page that displays the manual in the source URL (optional) field — or, if the manual is a PDF at a public address, use PDF Import with that URL. The bot then cites that page like any other source; and because URLs written inside an entry’s own text are allowed as citations too, a short Direct Content entry saying where the manual lives, with the full address in the text, lets it answer “where is the manual?” with a link instead of “I don’t have enough information”. If you would rather keep the upload and only want the file name gone, switch off Citation Links at MxChat → Settings → Chatbot → Behavior (no source is cited then), or add a line to AI Instructions (Behavior) telling it not to name files — a prompt instruction, not an enforced rule. Available in MxChat core (the free plugin).
With Pinecone as the vector store, questions containing a part number or SKU pull the wrong record — does the Hybrid keyword boost work with Pinecone?
From core 3.2.22, yes — on a Pinecone document index, a second, opt-in index type. A classic vector index still runs a single dense-vector query with no keyword leg, which is why a code such as HGH25CA retrieves the neighbouring type: embeddings place similar-looking codes close together and cannot tell them apart. Under MxChat → Knowledge → Pinecone the card now has an Index type choice: Vector index (current), the default every existing setup is on, or Document index with full-text search (new), which keeps a keyword index of the stored text next to the vectors. It is a separate index at Pinecone: click Create index for me (a new index named after your Index Name field, sized for your embedding model, in the cloud, region and language you pick, with the host filled in for you) or enter an existing document index’s host and click Check index; the type only saves once the host has been checked. Migrate then copies your current index into it — text, vectors and metadata, same ids — with no embedding calls, resumable and safe to run twice, and Delete old index appears once the counts match and asks you to type the index name. Your embedding provider and model do not change. With the index type on Document index, turn on the Hybrid keyword boost under Knowledge → Chunking & Retrieval: a question carrying a code-like token gets a second lookup restricted to records that contain it (a full-text search is the fallback), fused with the semantic results, and the Transcripts and Testing panels label each match Vector, Keyword or Both. Two limits: the Multi-Bot add-on does not yet offer a per-bot index type, and on 3.2.21 or earlier, or a classic index, what helps is a higher RAG Sources Limit (Settings → Behavior, 3–10) and a slightly lower Similarity Threshold so the right record is not cut. Available in MxChat core (the free plugin).
Does any of my site content or chat data pass through MxChat’s own servers, and who else receives it?
No content, transcripts or knowledge-base data ever reaches MxChat. The plugin runs entirely on your WordPress install, and the only requests it makes to mxchat.ai are the three licence calls — activate, deactivate and a domain check — which send your licence key, the email you bought with and your site’s domain, nothing more. There is no telemetry and no MxChat-hosted index or cache, so there is nothing on our side to retain or delete. What does leave your site is what you configure it to send. At index time, every chunk of the content you import goes to your embedding provider (OpenAI, Gemini, Voyage, or a custom OpenAI-compatible endpoint you point it at) to be turned into a vector — so content behind a paywall reaches that provider when you index it, not only when a visitor asks. At query time, each visitor message goes to the embedding provider for retrieval, then, with the retrieved chunks and recent history, to your chat provider. With local storage the vectors and chunks are rows in your own database; if you turn on Pinecone you enter your own API key and index host under MxChat → Knowledge → Pinecone, so the data sits in a Pinecone account you own, and an OpenAI Vector Store is likewise under your own OpenAI account. Optional integrations — Slack, Telegram, Brave Search, Loops — receive nothing until you add their keys. For a written data-processing agreement, contact us. Available in MxChat core (the free plugin).
With Pinecone on, the Knowledge page says “Knowledge Entries (50)” even though I imported hundreds — is there a 50-entry limit?
No, and from core 3.2.22 the number is right: the heading shows the vector count Pinecone itself reports for your index (or, with Multi-Bot, the bot’s namespace — a bot with its own empty namespace shows 0), the list pages with Previous and Next and continues where the last page ended, and the figure is chunks rather than documents, since a long post is stored as several vectors. On 3.2.20 and 3.2.21 the “(50)” was an artefact of how the screen listed a large index: at 500 vectors or fewer it pulled up to 500 records and counted distinct entries, which was right; past 500 it switched to page-at-a-time listing through Pinecone’s /vectors/list, fetched twice the 25-per-page display — 50 records — and reported the size of that fetch as the total, so the heading read (50) however much you imported and appeared to drop mid-import. Nothing was capped or missing on those versions either: every vector was in the index and retrieval used all of them, so there is nothing to rebuild or re-import — update the plugin and the heading corrects itself. The WordPress-database count was never affected. Available in MxChat core (the free plugin).
Can I delete a knowledge base entry through the REST API?
Yes, from core 3.2.22. Send DELETE /wp-json/mxchat/v1/knowledge with your bearer token and a source_url — the same value the entry was pushed with — as a single string or an array of up to 50 URLs, plus an optional bot_id on a Multi-Bot install. The response reports deleted true or false per URL, and a URL that is not in the knowledge base counts as nothing removed rather than an error, so a sync job can call it blindly whenever a document disappears from SharePoint, Drive or your CMS. Pushing the same source_url again with POST /knowledge still replaces the existing entry rather than duplicating it, which covers updates; the API Access screen (MxChat → API Access) documents every endpoint with a ready-to-run example for both. On 3.2.21 and earlier /knowledge was registered for POST only, and removing an entry was admin-side only under MxChat → Knowledge → Knowledge Base (see deleting knowledge base entries). Available in MxChat core (the free plugin).
Can I upload Markdown (.md) or plain-text (.txt) files to the knowledge base, and how long does it take?
Yes. MxChat → Knowledge → Import Options → Document Upload accepts .md, .txt and .docx — pick the file and click Import Document. The text is extracted and indexed while the file itself is never stored, and re-uploading a file with the same name replaces its previous content instead of creating a duplicate, which makes it safe to re-export Obsidian or Notion notes on a schedule. How long it takes is a function of length rather than format: the text is chunked and each chunk is embedded through your configured embedding provider, so a short note finishes in seconds and a book-length manual takes a minute or two — the upload itself is the fast part. Document Upload arrived in core 3.2.20, so if the Knowledge screen offers only PDF Upload, update the plugin. From 3.2.22 files in the Media Library can be imported in bulk from WordPress Content → Media and kept in sync automatically via the Media toggle under Auto-Sync Settings — with one catch for Markdown: WordPress does not allow .md uploads to the library by default, so that route needs a MIME-type mapping added (the upload_mimes filter), while Document Upload takes .md as it is. Available in MxChat core (the free plugin).
Can I turn knowledge base retrieval off completely, so no embedding call is made on every message?
No — there is no setting for that, and emptying the knowledge base does not achieve it either. MxChat generates a query embedding for every chat message before the search runs, and that call is load-bearing rather than optional: if it errors or comes back empty, the visitor sees “Unable to process your message. The embedding service is not responding correctly” instead of an answer written without context. Changing the backend does not skip it — Pinecone and OpenAI Vector Store change where the search happens, not whether it happens, and the Vector Store path still pays for a query embedding it never uses, because OpenAI runs the search server-side. If the real problem is latency, the embedding call is rarely the expensive part: start with why replies are slow, and on a WordPress-database knowledge base past a few hundred entries with the similarity scan that runs after it. Available in MxChat core (the free plugin).
How do I delete knowledge base entries or clear the whole knowledge base? I don’t see a delete icon.
The delete controls exist, but not on the screen MxChat → Knowledge opens on — that lands on Import Options, and you have to click Knowledge Base in its left sidebar (the item carrying your entry count) before any of them appear. On that screen, Delete All sits at the top right of the Knowledge Entries card and clears the base after a confirmation prompt; tick one or more row checkboxes and the same button becomes Delete Selected, and every row has its own trash icon in the Actions column that removes that source together with every chunk it was split into. One trap worth knowing before you press it: choosing a type from the All Types filter really does narrow the button — it reads Delete All PDFs, Delete All Pages and so on, and removes only that type — but a term typed into the search box does not, so Delete All still clears everything while search results are on screen. Deletion is permanent and there is no export or backup of knowledge entries, so anything you remove has to be re-imported from its original source. Available in MxChat core (the free plugin).
With OpenAI Vector Store, can the chat model read my data directly instead of a separate retrieval call?
No — it is still two calls, but not the two you would expect. On this path MxChat does not embed the question itself: it POSTs the visitor’s raw text to OpenAI’s Responses API with the file_search tool pointed at your Vector Store IDs, so OpenAI does the embedding and the search server-side, and you never configure an embedding provider for it. MxChat then keeps only the retrieved chunks from that response and sends them as context in the ordinary chat call that actually answers your visitor. Two things follow that catch people out: MxChat never uploads anything to the store — you create and fill it in OpenAI’s own dashboard — and retrieval silently stops working if your chat model is not an OpenAI model, since the tool call requires one. See also how the three retrieval backends rank against each other. Available in MxChat core (the free plugin).
Does MxChat index what a dynamic page-builder widget outputs (like an Elementor Posts widget), and can a URL import re-run on a schedule?
No to both, and the two facts compound. WordPress Content import and Auto-Sync read the stored post_content straight from the database, remove shortcode tags and then strip HTML — they deliberately never run WordPress’s the_content filter, so a widget that queries posts at render time contributes only its builder markup and its actual output is never indexed. Direct URL and Sitemap Import do fetch the live rendered HTML (with dedicated Elementor handling) and so capture that output — but only at the moment you run them, and MxChat registers no periodic re-fetch anywhere: the only scheduled jobs core creates are rate-limit resets, transcript cleanup, session cleanup and model-liveness checks. Two consequences worth planning around: a dynamic listing silently goes stale whenever the posts it queries change, because nothing ever edits the host page; and if Auto-Sync is enabled for that page’s post type, saving the page re-indexes it under the same permalink and replaces the good rendered version with the raw-post_content one. Re-run the sitemap import after the underlying content changes, and consider leaving Auto-Sync off for builder pages you maintain by URL. See also page-builder pages that index incompletely and how Sitemap-imported content refreshes. Available in MxChat core (the free plugin).
Do I need BetterDocs or another documentation plugin for MxChat to read my content?
No. MxChat’s knowledge base is its own store — imported content lives in a dedicated MxChat database table, not as posts or pages, and visitors never browse it directly — so nothing has to be published on your site before the bot can answer from it. MxChat → Knowledge → Import Options offers eight methods: WordPress Content, Sitemap Import, Direct URL, Direct Content for pasted text and manual Q&A, PDF Import from a URL, PDF Upload from your computer, Document Upload for .docx, .txt and .md files, and YouTube, so Markdown notes exported from Obsidian or Notion can go straight in (see what you can upload to train the chatbot). A large document set no longer has to go in one upload at a time: from core 3.2.22 you can drop the files into the WordPress Media Library and import them from WordPress Content with the content type set to Media, which lists the PDF, Word, text and Markdown files it can read, or switch on Media under Auto-Sync so new uploads index themselves. A documentation plugin is worth having if you want human-readable, search-indexable help pages alongside the chat; it just is not a prerequisite for MxChat. Available in MxChat core (the free plugin).
Can I use a self-hosted vector database like Qdrant, Chroma or Weaviate instead of Pinecone?
No — core ships exactly three retrieval backends and no plug-in point for a fourth: your WordPress database (the default, and the self-hosted one — those vectors sit in a table on your own server), Pinecone, and OpenAI Vector Store, the last two under MxChat → Knowledge in the Integrations group. When more than one is switched on, OpenAI Vector Store wins, then Pinecone, then the local table. The OpenAI option carries two conditions worth knowing before you pick it: it works only while your chat model is an OpenAI model, and MxChat only searches it — you upload the documents in OpenAI’s own dashboard, and your local knowledge-base entries stop being searched while it is active. Qdrant, Chroma, Weaviate and pgvector are not supported. If what you wanted was your vectors on your own infrastructure, the WordPress database already is that — see what it costs as it grows. Available in MxChat core (the free plugin).
Does keeping the knowledge base in the WordPress database slow my site down?
Not your pages. The knowledge search runs only when a visitor sends a chat message — ordinary page loads never touch it, and the widget’s own effect on load time is a separate question. The cost lands inside that one chat request: MxChat reads every stored chunk in batches of 250 and computes cosine similarity in PHP for each one, so the work grows in a straight line with the size of your knowledge base — there is no vector index to short-circuit it. That pass reads only the embeddings, and the full text of the winning entries afterwards, which keeps memory flat but does not shorten the scan. MxChat’s own Knowledge screen draws the line at more than 500 entries and recommends Pinecone past that; below it, the local table is the simpler choice. Available in MxChat core (the free plugin).
Does content I added with Sitemap Import update itself when I edit the page, or do I have to re-import it?
Auto-sync keys on the post type, not on the importer that created the entry. With a type switched on under MxChat → Knowledge → Auto-Sync, publishing or updating an item re-indexes it under its permalink and replaces whatever entry already sits at that URL — so a page or product originally pulled in by Sitemap Import does refresh when you edit it, provided the sitemap listed the same address the permalink resolves to (a trailing slash, or http against https, makes it a second entry instead). What never refreshes on its own is a sitemap URL with no WordPress post behind it — a category or other taxonomy archive, or a page on another site — because there is no save for MxChat to hook; re-run the sitemap import to update those. Re-running it is safe either way: MxChat deletes the existing chunks for a URL before writing the new ones, so a second pass replaces rather than duplicates (more on that here). Available in MxChat core (the free plugin).
My knowledge base is one long list — how do I find a single entry, and can I export them all as a backup?
The list under MxChat → Knowledge → Knowledge Base has a search box and an All Types filter above it (every public post type, plus PDFs and URLs), and shows 25 entries per page. Entries are grouped by source URL, so one page counts as a single row however many chunks it was split into — which is why the number on screen is smaller than the number of rows actually stored. Worth knowing before you go looking: the search matches the entry’s text, not its URL, so a slug or an address turns up nothing unless those words appear in the content itself. There is no export or backup of knowledge-base entries — the Export Settings button on the Settings screen covers your options, not your content — so treat a deletion as permanent and re-import from the original source if you lose one. Available in MxChat core (the free plugin).
What does the “Hybrid keyword boost” setting do, and what changes if I turn it off?
It runs a ranked keyword query alongside the normal vector scan and fuses the two result lists by reciprocal rank, so exact tokens — SKUs, part numbers, error codes, proper names — can surface even when their embedding similarity is weak. It is off by default and lives at MxChat → Knowledge → Chunking & Retrieval in the Retrieval card; it used to sit under Settings → Behavior, which now only points at the new location. Switch it off and retrieval goes back to pure cosine similarity — marginally faster, but an exact-token question then ranks only as well as its semantic match. Two caveats before you toggle it: it affects the WordPress-database knowledge base and, from core 3.2.22, a Pinecone document index (the setting is now labelled for both) — a classic Pinecone vector index sees no change from it — and on the WordPress database the keyword leg wants a MySQL FULLTEXT index, which MxChat adds to its content table on first use and quietly falls back to a LIKE query on hosts that refuse the ALTER. Because it changes which sources get retrieved on an existing install, re-run a few real questions after enabling — while it is on, the Transcripts and Testing panels label each match Vector, Keyword or Both. If your knowledge base is on Pinecone and exact codes are being missed, see how to switch to a document index with full-text search. Available in MxChat core (the free plugin).
I imported my pages with “WordPress Content” and then again with Sitemap Import — did that create duplicates?
No. Every importer stores content against its source_url, and MxChat deletes any existing chunks for that URL before writing the new ones, so importing the same address a second time replaces the first copy rather than stacking on it — which is why your knowledge-base count did not move. That also answers whether the second pass was worth running: re-importing the same URLs only refreshes them, so reach for Sitemap Import to cover pages the content picker cannot see, not as a top-up for pages it already imported. Two cases do slip past the match, because it compares the URL exactly: the same page imported once with a trailing slash and once without (or once over http and once over https) lands as two entries, and anything pasted into the manual importer is stored under an internal mxchat://manual-content/ identifier, so importing that same page by URL adds a second copy instead of replacing it. Available in MxChat core (the free plugin).
If I move a post to draft, does it stop being used by the chatbot?
Yes — as long as Auto-Sync is switched on for that post type under MxChat → Knowledge → Auto-Sync. MxChat watches WordPress status changes, and when a published item moves to draft, pending, private or scheduled it deletes that item’s knowledge-base chunks, matching on the permalink the post had while it was published; trashing or permanently deleting a post does the same through a separate handler. If Auto-Sync is off for that post type nothing is removed and the old text keeps answering questions — switch the toggle on, then run wp mxchat prune-unpublished once from WP-CLI to clear entries left behind by anything you unpublished earlier. See also what “Sync Post Types” does for the re-indexing side of the same setting. Available in MxChat core (the free plugin).
What is Contextual Awareness, and do I need to mention it in my AI Instructions?
Contextual Awareness lets the bot read the page the visitor is standing on, which is a different thing from your knowledge base: the knowledge base is indexed content it can search in any conversation, this is the live page in front of the visitor right now. Turn it on under MxChat → Settings → Behavior — it ships off. With it on, the browser collects the page URL, the page title and the main body text (once per page from core 3.2.22, once per message before), and MxChat hands the model a labelled Current Page Context block, so you do not need to reference it in your AI Instructions; adding instructions about it changes nothing. Two limits are worth knowing: the text is trimmed to the first 3,000 characters, and it is taken from the first matching content area on the page (main, article, .entry-content, #content and similar), falling back to the whole body with header, footer, nav, sidebar and widgets stripped out. On a page with an unusual layout, add data-mxchat-context="…" to an element and its value is appended to what the bot sees. On core 3.2.21 and earlier the copy it made of the page could start HTML5 video or audio playing; 3.2.22 reads an inert copy instead — see a video starts playing when a visitor sends a message. Available in MxChat core (the free plugin).
My store’s base currency is INR (or EUR) but the chatbot quotes product prices in USD — why?
Your products were indexed before MxChat core 3.2.19. The importer used to write each price with whatever currency symbol was active at the moment the import ran, and multi-currency plugins change that per request — so if the store happened to be serving USD when you imported, a “$” was frozen into every indexed product and stayed there. From 3.2.19 prices are indexed in the store’s base currency, with the currency code, and the bot no longer mixes two currencies in one reply. Existing entries keep the old text until you re-run the WordPress Content import for your products, so do that after updating. This is also why a product card can disagree with the bot’s typed answer: cards build their price live from WooCommerce, which multi-currency plugins do convert, while the sentence above the card is read from the indexed text. Available in MxChat core; the WooCommerce add-on extends it with product cards that price from WooCommerce live.
How do I import a Word (.docx) document into the knowledge base?
Use MxChat → Knowledge → Import Options → Document Upload, which takes .docx, .txt and .md files directly — choose the file and click Import Document. The text is extracted and indexed; the file itself is not stored, and re-uploading a file with the same name replaces its previous content rather than adding a duplicate. This import method arrived in core 3.2.20, so if the Knowledge screen only offers PDF Upload, update the plugin first — older answers that say PDF is the only uploadable file type are out of date. For several documents at once, from core 3.2.22 upload them to the Media Library and import them from WordPress Content with the content type set to Media, which lists your PDF, Word, text and Markdown files; with Media switched on under Auto-Sync Settings → Advanced Custom Post Sync Settings, a file indexes itself on upload, re-indexes when replaced and is removed when deleted. Don’t confuse it with the Word document upload button in the chat toolbar, which lets a visitor attach their own .docx to their own conversation: that text is held in a one-hour session transient and never enters your knowledge base (see where the Toolbar settings are). Available in MxChat core (the free plugin).
There are two screens where I can enter a Pinecone Host — which one do I use?
Both, and they do different jobs. MxChat → Knowledge → Pinecone is the account-level screen holding API Key, Region, Index Name and Host; it is what the default bot queries, and its API Key is the one every bot uses. The second screen exists only if you run Multi-Bot: in an individual bot’s Knowledge Base Configuration card, Pinecone Host overrides the host for that bot alone — key, region and index name are never per-bot. So fill in the core screen first, then set a per-bot Host only for bots that should query a different index. Since Multi-Bot 1.0.8 the same card also carries a Pinecone Namespace field, so bots can instead share one index with fully separated content — leave it blank (or type __default__) to use the index’s default namespace, and note it needs MxChat core 3.2.20 or newer for namespace-aware retrieval and deletion. One trap worth knowing before you use it: changing a namespace after a bot has indexed content does not move the existing vectors — they stay under the old name and that bot stops retrieving them, so re-import the content after a change. Available in MxChat core; the Multi-Bot add-on adds the per-bot Pinecone Host and Pinecone Namespace fields.
Can each chatbot have its own Pinecone index, and how do I add content to a specific bot’s index?
Yes. With the Multi-Bot add-on active, every bot has its own Pinecone Host field on its edit screen in the Multi-Bot Manager — point each bot at a different index host and their knowledge stays completely separate. The API key is not per-bot: it is read from the single core field under MxChat → Knowledge → Pinecone, so all your indexes must sit in the same Pinecone account, and a bot that has a Host but no API key saved on that core screen quietly falls back to WordPress-database storage instead of erroring. To load content into a particular bot’s index, use the Select Bot Database dropdown at the top of MxChat → Knowledge — every import you run on that screen goes to the bot selected there, so switch the dropdown and import again for the second bot. Per bot you use either Pinecone or an OpenAI Vector Store, not both; if both are filled in, the Vector Store wins. Available in MxChat core; the Multi-Bot add-on extends it with the per-bot Pinecone Host and the bot picker on the Knowledge screen.
How does the chatbot decide whether to answer from my knowledge base or from the AI model’s general knowledge, and which setting controls it?
Every visitor message is turned into an embedding and scored for similarity against your indexed content; anything scoring above the Similarity Threshold is passed to the model as context, and when nothing clears the bar the model answers from its own general knowledge instead. There is no separate on/off “fallback” switch — that threshold is the control. Find it at MxChat → Settings → Chatbot → Behavior → Similarity Threshold: a slider from 20 to 85 that defaults to 35 — lower it so the bot leans on your own content more often, raise it for stricter matching. How much of what matched actually reaches the model is set separately by RAG Sources Limit and RAG Chunks Limit, and if the bot skips content that clearly should match, the cause is usually an embedding-model mismatch rather than the threshold. Available in MxChat core (the free plugin).
The chatbot doesn’t fully read my Divi or Elementor (page builder) pages — some text like pricing is missing. How do I index them?
MxChat’s two import methods read different things, and that’s usually the cause. The WordPress Content import pulls a page’s stored post content and strips shortcode tags — but page builders like Divi, Elementor, and WPBakery keep the visible text inside builder modules and markup, so what the importer extracts can be incomplete or noisy (the bot then “sees” the page but misses details such as a price, and links to the page instead of answering). For builder pages, re-import with Direct URL (one page) or Sitemap Import (many) at MxChat → Knowledge → Import Options — those fetch the live rendered HTML a visitor actually sees and pull the main content area (with dedicated Elementor handling), so the real page text is captured. One caveat: text injected purely by JavaScript after the page loads isn’t in the fetched HTML, so make sure key info like pricing is real on-page text, then re-index. See also Direct URL import and why the bot links to pages instead of answering. Available in MxChat core (the free plugin).
Why does my Knowledge Base show a “Not in use” label on my entries?
The amber “Not in use” badge next to your Knowledge Entries means the OpenAI Vector Store integration is switched on, so the chatbot is retrieving answers from OpenAI’s hosted vector store instead of the entries stored in your WordPress database — those local entries are simply sitting there, not being searched. To make them active again, open MxChat → Settings → OpenAI Vector Store (in the Integrations area) and turn off Enable OpenAI Vector Store; the badge then switches back to “WordPress DB” (or “Pinecone” if you use Pinecone). Note that the Vector Store only works when your chat model is an OpenAI model in the first place. Available in MxChat core (the free plugin).
Why don’t my WPML or Polylang translated pages show up when I import with the “WordPress Content” method?
MxChat’s WordPress Content picker runs a standard post query with no language override, and its multilingual config file only registers the widget’s display strings for translation — it adds no language awareness to content indexing. So with WPML or Polylang active, the list shows only the posts for the language that is currently active in wp-admin, and your other-language pages are filtered out. Two reliable fixes: switch the admin language (the WPML/Polylang selector) to each language and import that language’s pages one language at a time; or skip the picker and use Direct URL or Sitemap Import with the translated page URLs, which indexes each language variant as its own knowledge-base entry — also the better setup, since it lets the bot return the right-language page. Available in MxChat core (the free plugin).
Why does the chatbot keep linking to (or pointing me at) my pages instead of answering directly from the knowledge base?
By default MxChat attaches source links to its answers, so the bot cites the page a knowledge-base match came from instead of only giving the answer — it is reading your knowledge base, it’s just adding “see this page” links. That behavior is the Citation Links toggle at MxChat → Settings → Behavior, which ships turned on. Switch it off to get direct answers with no page links — the bot is then instructed to “provide helpful answers based on the reference information without citing sources.” One caveat, straight from the setting’s own note: if you disable Citation Links, make sure your AI Instructions (Behavior) don’t tell the bot to link or cite, or it may fabricate URLs. If instead the bot ignores your content and answers from general knowledge, that’s a different issue — see why the chatbot ignores my knowledge base. Available in MxChat core (the free plugin).
Pinecone says my model “does not support integrated inference” or to “manage your own embeddings” — can MxChat still index automatically?
Yes — that message is expected, and “manage your own embeddings” is exactly the mode MxChat needs. MxChat generates each embedding itself by calling your chosen provider (OpenAI, Voyage, or Gemini) and then upserts the finished vector into your Pinecone index, so it never uses Pinecone’s built-in “integrated inference” embedding service. Create a plain vector index (not a Pinecone-hosted-embedding one), set its dimensions to match your embedding model (1536 for Ada 2 / TE3 Small / Gemini, 3072 for TE3 Large, 2048 for Voyage-3 Large), make sure that provider’s API key is set, and automatic indexing on publish/update works normally. Available in MxChat core (the free plugin).
What is “Direct URL” import and where do I find it?
Direct URL pulls the content of a single web page into your knowledge base by its address. Find it at MxChat → Knowledge → Import Options → Direct URL — it’s one of the import cards there, alongside Sitemap Import and Direct Content (it is not under a tab called “Knowledge Import,” a common mislabel). Use Direct URL for one page, Sitemap Import to pull many pages at once, and Direct Content to paste text you don’t have a URL for. Available in MxChat core (the free plugin).
Can I index only a small set of content (or a JSON file) instead of my whole site?
Yes — you decide exactly what goes into the knowledge base and are never forced to index every post. Post-type syncing is opt-in per content type, so leave it off and add only what you want through MxChat → Knowledge → Import Options: Direct Content to paste a limited block of text, Direct URL for a single page, or a PDF / sitemap. There’s no JSON-file import type, so to load structured data, paste it as text via Direct Content. See also what you can use to train the chatbot. Available in MxChat core (the free plugin).
Can the chatbot read content inside accordions, tabs, popups, or hidden/toggled sections (e.g. in Elementor)?
For the knowledge base, yes — as long as the text is in the page’s HTML. When you index a page by its URL, MxChat fetches the server-rendered HTML and pulls the body content (it has dedicated handling for Elementor widgets), so text inside accordions, tabs, and toggle sections is captured even though it renders collapsed — it’s still present in the page markup. What it won’t pick up: content injected by JavaScript after load, and Elementor popups (separate templates that aren’t part of the page’s HTML) — index those on their own, for example by pasting the text via Knowledge → Import Options → Direct Content. This is separate from the live page scan (Contextual Awareness), which only reads what is currently visible, so collapsed content can be missed there. Available in MxChat core (the free plugin).
How do I re-index or rebuild my knowledge base embeddings without the Pro Migration tool?
The free version has no one-click rebuild button — bulk re-embedding (for switching embedding models or vector databases) is what the Migration add-on does. To re-index in free, re-import the content: submit the same URL or text again and MxChat replaces that source in place — it deletes the old vectors for that URL and re-embeds with your current embedding model. You can also delete an entry from the Knowledge Database table and add it back, and any post type you’ve enabled under Sync Post Types re-embeds automatically when you edit and update the post. This is the fix after changing your Embedding Model (Settings → Chatbot → AI Models): existing content keeps its old embeddings until you re-import it. If you have Pro and are looking for the Migration add-on itself, it installs as its own plugin and lands at MxChat → Migration Tool — see where to find the Migration Tool. Available in MxChat core; the Migration add-on extends it with one-click bulk re-indexing across models and vector DBs.
Does MxChat index Toolset Types fields (or other non-ACF custom fields) in the knowledge base?
Yes. ACF fields are pulled in automatically, but Toolset Types stores its custom field values as ordinary post meta (keys prefixed wpcf-), which ACF does not manage — so add those keys to the whitelist at MxChat → Knowledge → Custom Meta, in the Meta Key Whitelist box, one meta key per line (for example wpcf-price). Each whitelisted field value is appended to the post text when it is embedded, and only plain string values are included, so re-index the post after adding keys. The same whitelist also covers other non-ACF post meta, such as OptionTree fields or theme meta boxes. Available in MxChat core (the free plugin).
How do I teach the chatbot the correct answer to a question it got wrong?
Add the corrected question and answer to your knowledge base as plain text. Go to MxChat → Knowledge → Import Options, click the Direct Content box (“Submit content to be vectorized”), paste the question and the right answer, then submit — the bot pulls it in the next time someone asks something similar. There is no separate “Add New” or “Add Content” button; Direct Content is the manual-entry method, and it works in the free version (it is not Pro-only). Available in MxChat core (the free plugin).
What do the RAG Sources Limit and RAG Chunks Limit settings do?
They cap how much of your knowledge base is fed to the AI on each reply. RAG Sources Limit (in Chatbot settings; default 3, range 3–10) is the maximum number of distinct source documents the bot draws from for one answer. RAG Chunks Limit (default 15, range 8–20) is the maximum number of individual text passages (chunks) injected into the prompt across those sources. Raise them if answers miss details that exist in your content; lower them to cut token cost and keep replies tighter. Both behave the same whether your vectors live in the WordPress database or Pinecone. Available in MxChat core (the free plugin).
What does “Sync Post Types” mean, and will MxChat re-index a page automatically after I edit it?
In MxChat → Knowledge → Auto-Sync you can switch on automatic syncing per content type — Posts, Pages, and any public custom post type — a CPT (WooCommerce products sync when the WooCommerce integration is enabled). With a type’s toggle on, MxChat re-indexes that content into the knowledge base every time you publish or update an item of that type, so you don’t have to re-import it by hand. Turning a toggle on only affects content you publish or update afterward — it does not back-fill posts that already exist, so the first time you set it up, bulk-import your current published content from MxChat → Knowledge → Import Options (the content selector lets you filter by post type and import all published items at once). One exception for re-syncing: anything you added by pasting a URL into the manual importer is stored under an internal mxchat://manual-content/ identifier rather than the page’s URL, so editing the live page won’t re-sync it — re-import that URL to refresh the entry. Available in MxChat core (the free plugin).
Can MxChat automatically sync course content from LMS plugins like LearnDash, LifterLMS, or Tutor LMS?
Yes. MxChat auto-syncs any public custom post type, which includes courses, lessons, and quizzes from the major LMS plugins as long as they’re registered as public CPTs. Open MxChat → Knowledge, expand Sync Custom Post Types, and toggle on the post types you want indexed (e.g. sfwd-courses for LearnDash, course for LifterLMS, courses for Tutor LMS). Whenever a course is published or updated — including ones added by users on the front end — the content is re-indexed automatically. Available in MxChat core (the free plugin).
How do I set up Pinecone for MxChat?
Create the index in your Pinecone dashboard first at app.pinecone.io, then connect it under MxChat → Knowledge → Pinecone. When you create the index, set its dimensions to match your embedding model — 1536 for Ada 2, Text-Embedding-3 Small, or Gemini; 3072 for Text-Embedding-3 Large; 2048 for Voyage-3 Large — and use the cosine metric; a dimension mismatch makes every upsert fail with “Failed to store any chunks.” You’ll need four values to connect: API Key, Region (e.g. gcp-starter), Index Name, and Host (the hostname from your index URL, without https://). Toggle Enable Pinecone Database on, paste the values, and save — new knowledge entries will then be stored in Pinecone instead of the WordPress database. From core 3.2.22 the card also has an Index type choice: leave it on Vector index (current) for the setup above, or pick Document index with full-text search and click Create index for me, which builds the index for you at the right dimension and fills in the host — the type to choose when visitors search by part numbers or SKUs (see keyword matching on Pinecone). Available in MxChat core (the free plugin).
Is Pinecone required? Where are the chatbot’s embeddings and knowledge chunks stored?
No. By default MxChat stores your knowledge base — the text chunks and their embeddings — in free, unlimited local vector storage inside your WordPress database, which keeps the vectors on your own server. MxChat’s own Knowledge screen draws the line at more than 500 knowledge entries: past that it recommends Pinecone, because the WordPress database isn’t built for vector search at that size. Below 500 entries, local storage is the simpler choice and there is nothing to gain by switching. Turn Pinecone on under MxChat → Knowledge → Pinecone and new entries are stored there instead. A third backend, OpenAI Vector Store, sits in the same Integrations group and takes priority over both when it is on — the three are compared here. The AI Search add-on used to be the one feature that couldn’t follow you across — it read the local table only, so a Pinecone site quietly got no AI overview; AI Search 1.0.3 closes that, so make sure you are on it before switching. Available in MxChat core; the AI Search add-on needs 1.0.3 or newer to read a Pinecone knowledge base.
Can I include ACF fields, custom taxonomy terms, or other custom data in the knowledge base?
Yes. When MxChat indexes a post it always pulls the title, excerpt, and body; ACF field data is included automatically (use ACF Field Settings to choose which fields are exposed), any post meta you add to the Knowledge → Custom Meta whitelist is included, and WooCommerce products also index their price, SKU, and product categories. Custom taxonomy terms aren’t pulled in on their own. To add them, use the mxchat_before_process_post filter: it passes the WP_Post object and the bot ID before indexing, so you append your terms (for example the output of wp_get_post_terms()) to the post content and return the post. The filter runs when you index through Knowledge → Import WordPress Content; see the developer hooks & filters docs for a full code example. Available in MxChat core (the free plugin).
What can I upload to train the chatbot?
The Knowledge screen has eight import methods: WordPress Content (posts, pages, WooCommerce products and any public custom post type), Sitemap Import, Direct URL, Direct Content for pasted text and manual Q&A, PDF Import from a URL, PDF Upload from your computer, Document Upload for .docx, .txt and .md files, and YouTube. The two upload methods take one file per submission and never store the file — the text is extracted and indexed, and re-uploading a file with the same name replaces its previous content instead of creating a duplicate. For a batch, use the Media Library instead: from core 3.2.22, WordPress Content with the content type set to Media lists the PDF, Word, text and Markdown files already in your library (images, audio and video are not shown), so you can select a page of them and import in one go, and switching on Media under Auto-Sync Settings → Advanced Custom Post Sync Settings makes a supported file index itself on upload, update on replace and drop out on delete. Imports are unlimited, and auto-sync can be turned on per content type so later edits propagate without a manual re-import. Document Upload arrived in core 3.2.20; if you only see PDF Upload, update the plugin. Available in MxChat core (the free plugin).
Customization & themes
My custom chat button image has disappeared and I can’t find where to upload it — where is the chatbot icon setting?
The launcher image is not a core setting. The two fields — Custom Chatbot Icon (PNG) for the floating button (48×48 px) and Title Bar Icon (PNG) for the header (24×24 px) — live at MxChat → Theme Settings → Custom Icons, and that screen exists only while the Theme Customizer add-on is active and your Pro licence is activated; upload the PNG to the Media Library and paste its URL into the field. The add-on stores those URLs itself and hands them to the widget each time a page renders, so if the add-on has been deactivated or deleted the setting and the image go together: the button falls back to the default glyph and nothing under MxChat → Settings can restore it — re-activate the add-on and the saved icon comes back. If the add-on is active but the licence is not, the Theme Settings menu is hidden while the icon keeps rendering. Two other things empty the field: Theme Customizer versions before 2.0.7 saved the icon inside the core options array, which core rewrites from a fixed list on every settings save, so an icon set on an older version could vanish the next time any core setting was changed — re-enter the URL once on the current version and it stays put; and because the field holds a URL rather than the file, deleting the image from the Media Library leaves the button pointing at nothing. Requires the Theme Customizer add-on.
Text with underscores like _VALUE_ shows up as italic VALUE in the chat — how do I turn off Markdown formatting?
Fixed in core 3.2.22 — update the plugin. The widget still formats Markdown in every bubble (**bold**, *italic*, ~~strikethrough~~, headings, code blocks and tables, in the visitor’s message as well as the bot’s reply) and there is still no setting to turn that off, but the underscore rule is now word-bounded: my_var_name, MXCHAT_API_KEY and snake_case stay as typed, a token whose content is all capitals and digits — _VALUE_, _ID_ — is shown literally because that is a placeholder convention, not emphasis, and only a standalone _word_ with a space on each side still italicises. Two escapes work as well: a backslash writes an underscore, asterisk, tilde or backtick literally (\_VALUE\_), and anything inside backticks is shown exactly as written, because escapes and code spans are taken out of the text before the styling rules run. Formatting is display-only either way — what is sent to the model and saved in your transcripts keeps the underscores. If the AI itself is adding emphasis, tell it not to in AI Instructions. On 3.2.21 and earlier the rule had no word-boundary check and ran before code spans, so neither backticks nor a backslash protected an underscore; a CSS rule such as .bot-message em, .user-message em { font-style: normal; } removed the slant there, but the underscores were still consumed. Available in MxChat core (the free plugin) — the formatter is part of the widget itself.
Can I show an avatar image next to the chatbot’s replies?
Not with a setting — there is no agent avatar in MxChat. Every reply is rendered as a bare <div class="bot-message"> carrying a background colour and a font colour and nothing else, so there is no element for a portrait to sit in, and the product has exactly two image fields: Custom Chatbot Icon (the floating launcher, 48×48 px) and Title Bar Icon (24×24 px), both under MxChat → Theme Settings → Custom Icons. The title-bar icon is the closest thing to a bot face — it renders next to the bot’s name at the top of the panel, which is where most people put the agent’s picture. If you want an image on every reply, add it yourself under Appearance → Customize → Additional CSS: .bot-message::before { content:""; display:block; width:28px; height:28px; margin-bottom:6px; border-radius:50%; background:url(https://example.com/agent.png) center/contain no-repeat; } — message bubbles are display:inline-block, so the image lands at the top inside the bubble rather than beside it. Available in MxChat core; the Theme Customizer add-on adds the two Custom Icons fields.
How do I change the color of the default chat icon instead of uploading my own?
The launcher is two separately‐colored layers — the round button and the icon glyph sitting inside it — and they have their own settings. With the Theme Customizer add‐on both are color pickers in the Chatbot Colors card at MxChat → Theme Settings → Color Settings: Floating Widget Background for the circle (default #212121) and Chatbot Icon Color for the glyph (default #ffffff). There is a picker for the icon itself, so you do not have to replace the image just to recolor it. Without the add‐on, core writes both colors as inline style attributes, so rules added under Appearance → Customize → Additional CSS need !important to win: .floating-chatbot-button { background-color: #162C6B !important; } for the circle and .floating-chatbot-button svg { fill: #162C6B !important; } for the glyph. One catch worth knowing before you go looking: if you have uploaded a launcher image under Custom Icons, neither the picker nor the fill rule will recolor it — the widget renders your upload as a plain <img>, and nothing can repaint a flat image, so swap in a recolored file instead. Available in MxChat core; the Theme Customizer add‐on extends it with the Floating Widget Background and Chatbot Icon Color pickers.
How long can the chatbot’s welcome message be — is there a character limit?
There is no limit. Introductory Message and Chat Teaser Pop-up (both under MxChat → Settings → Chatbot → Display) are plain textareas with no maximum length, nothing caps them on save, and nothing truncates them when they render — so length is a layout question, not a limit. The welcome message appears as an ordinary bot bubble capped at 85% of the widget width (95% on screens under 550px), so it wraps rather than clipping, but a long one pushes your Quick Questions and the visitor’s first reply below the fold. The teaser pop-up is the tighter of the two: it is fixed at 325px wide beside the launcher and simply grows taller as you add text, so keep that one to a line or two. The welcome message also accepts HTML, so two short lines split with a <br> usually reads better than one long paragraph. Available in MxChat core (the free plugin).
Do I have to keep the “AI Agent” label in the chat header? How do I remove or rename it?
No — and it is a different field from the window title. Clear AI Agent Text under MxChat → Settings → Chatbot → Display (the Text & Labels card) and the badge stops rendering altogether, because the widget only draws it when that field is non-empty; type something else there to rename it instead. The Top Bar Title field directly above controls the header title, which is separate text, so blanking that one leaves the badge exactly where it was. There is no Title Bar section under Theme Settings to look in: the add-on owns the badge’s colours (Color Settings → Mode Indicator Background / Font Color) and a Title Bar Icon (PNG) field under Custom Icons, but the wording itself is core. Available in MxChat core; the Theme Customizer add-on extends it with colour control over the badge and a title-bar icon.
What is the “AI Tools” tab under Actions, and how is it different from Trigger Phrases?
AI Tools is MxChat’s function-calling mode: instead of matching a visitor’s wording against phrases you wrote, the model decides for itself when to run one of the capabilities you have ticked. You will find it at MxChat → Actions → AI Tools, listing core capabilities — web search, image generation, PDF search, live-agent handoff, email capture — plus whatever your active add-ons contribute, grouped by add-on. There is no master on/off switch: ticking a tool is the switch, an empty list means the function-calling loop never runs at all, and the screen autosaves on every change rather than waiting for a Save button. It needs a tool-capable chat model — if yours is not, the page names your current model and warns that tools will not fire until you pick a different one under MxChat → Settings → AI Models. Anything that spends money, changes a cart, exposes customer data, hands the conversation to a human or starts a data-collection flow stays off by default even then, each tool takes an optional “when to use” hint for when the model reaches for it at the wrong moment, and Trigger Phrases keeps working alongside it if you prefer explicit phrase matching for some actions. Available in MxChat core (the free plugin).
Can I build my own AI tool (custom function call) for the chatbot?
Yes, in PHP — there is no admin screen for it, but the hooks add-ons use for exactly this ship in the free core. mxchat_function_calling_extra_tools adds your tool to the list, keyed by the name of the callback you want run, carrying a label, an fc_description telling the model when to use it, an optional fc_parameters JSON-schema array for its arguments, and emits_ui if the callback returns HTML; omit group and it files under “Add-ons”. Then hook a filter named after that callback with six accepted arguments — add_filter('my_tool', 'my_handler', 10, 6) — and your handler receives false, the model’s query, the user ID, the session ID, a synthetic intent object, and the model’s full argument array. Your tool then appears under MxChat → Actions → AI Tools and has to be ticked there before it can fire, exactly like the built-in ones, and any HTML it returns is rendered as a real bot message rather than handed back to the model to paraphrase. The same callback can also back a Trigger Phrases intent through the mxchat_available_callbacks filter if you want phrase matching as well as, or instead of, the model deciding. Available in MxChat core (the free plugin).
What does “Open Links in New Tab” do, and does turning it off affect Chat Persistence?
It does not affect it at all — they are unrelated settings that happen to sit one line apart, both under MxChat → Settings → Chatbot → Display → Visibility, which is where the confusion usually starts. Open Links in New Tab does exactly one thing: it sets the target on links inside the bot’s replies to _blank rather than _self. There is no “open the chat in a new tab” feature in MxChat — the widget is always printed into the page the visitor is already on — so if a guide or the chatbot mentioned one, this setting is what it meant. Chat Persistence is the separate toggle that decides whether a returning visitor’s earlier messages are reloaded into the window; both ship off, and switching either one has no effect on the other (see how long a chat session lasts). Available in MxChat core (the free plugin).
Can I make the chat toolbar icons bigger, or center them instead of left-aligned?
Both, but with CSS — there is no setting for either, and both are a one-rule override. Each button is .mxchat-chatbot .toolbar-btn at a hard 16×16 px, and its SVG is set to width: 100%; height: 100%, so resizing the button resizes the icon with it and you never touch the SVG. The row is .mxchat-chatbot .chat-toolbar — display: flex with gap: 10px and no justify-content at all, which is the only reason the icons sit left. Add both rules in Appearance → Customize → Additional CSS: .mxchat-chatbot .toolbar-btn { width: 22px !important; height: 22px !important; } .mxchat-chatbot .chat-toolbar { justify-content: center !important; }. The toolbar is hidden until you switch it on — see where the Toolbar settings live. Available in MxChat core (the free plugin); the Theme Customizer add-on gives you a built-in editor for the same CSS.
Does the MxChat widget run inside an iframe or a shadow DOM — will my translation plugin, CSS or analytics reach it?
Neither, and that is the answer that decides whether a translation plugin can touch it. MxChat prints the whole widget into your page’s own HTML on wp_footer as ordinary markup in the main document — no iframe wrapper, no shadow root — so anything that works on the rest of the page works on the chat: your theme’s stylesheet or a rule in Appearance → Customize → Additional CSS styles it, and a DOM-level translator such as GTranslate, Weglot or TranslatePress can see and translate the visible text. The interface strings you set under MxChat → Chatbot — top bar title, introductory message, input placeholder, chat teaser — are printed server-side into that HTML rather than assembled later in JavaScript, so they are already in the markup those tools scan; MxChat also ships a wpml-config.xml registering them for WPML and Polylang String Translation. The only iframe MxChat creates on the front end is the YouTube player, and only after a visitor clicks a video card. Available in MxChat core (the free plugin).
Can the chat window open automatically when the page loads, instead of starting as a closed bubble?
No — there is no setting for it. The floating panel is printed hidden on every page load and only opens when the visitor clicks the launcher, so a site-wide “start open” option exists neither in core nor in any add-on. Three things get you close. Embed the chatbot inline with [mxchat_chatbot floating="no"], which renders an always-visible chat box in the content instead of a bubble — the usual answer for a dedicated “Ask us” page. Fill in Chat Teaser Pop-up under MxChat → Settings → Chatbot → Display → Text & Labels to show a small message bubble beside the closed launcher; the visitor can dismiss it and it returns after 24 hours. Or open the widget from your own button using the Trigger add-on’s data-mxchat-open attribute — see opening the chatbot from a custom link and the shortcode options. Available in MxChat core (the free plugin); the Trigger add-on adds the data-attribute openers.
How do I make the chat window truly full-screen (edge to edge) on a phone?
With CSS — there is no setting for it, and the panel is not quite full-screen out of the box. Below 550 px core insets it by 8 px on all four sides: width: calc(100vw - 16px), height: calc(100dvh - 16px), top: auto; bottom: 8px; left: 8px; right: 8px and a 16 px corner radius. The part that traps people is the max-height: calc(100dvh - 16px) on that same rule: set bottom: 0 or a taller height and the panel still stops 16 px short, leaving a strip of page visible under it, because the cap is never lifted. Override all of it together in Appearance → Customize → Additional CSS — @media (max-width: 550px) { .floating-chatbot { inset: 0 !important; width: 100vw !important; height: 100dvh !important; max-height: 100dvh !important; border-radius: 0 !important; } .floating-chatbot .mxchat-chatbot-wrapper, .mxchat-chatbot-wrapper .chatbot-top-bar { border-radius: 0 !important; } } — and note the breakpoint is 550 px, not 500 px, so a rule written at 500 will miss the larger phones. Available in MxChat core (the free plugin).
Can I change the chat widget’s colors without the Theme Customizer add-on?
Only with CSS — MxChat core stores the widget’s colors but ships no color pickers for them, so a free install always renders the defaults (dark #212121 bot bubbles with white text, white user bubbles, dark top bar). The screen that edits them by hand is the add-on’s MxChat → Theme Settings → Color Settings tab. To restyle without it, add rules under Appearance → Customize → Additional CSS targeting .bot-message, .user-message, .chatbot-top-bar and .mxchat-chatbot — and mark them !important, because core writes those colors as inline style attributes (PHP for the widget shell, JavaScript for each new message bubble) and inline styles outrank stylesheet rules. The exception is when a generated AI theme is active or a saved theme is assigned to that bot: MxChat skips the inline colors entirely in that case, and ordinary CSS wins without !important. Available in MxChat core; the Theme Customizer add-on extends it with the Color Settings pickers and the AI Theme Generator.
The chat widget is too big on mobile — how do I make it smaller?
The floating launcher button has its own mobile size: open MxChat → Theme Settings → Sizing and use Launcher Button Size (Mobile), which accepts 40–120 px (default 60) and applies at 500 px wide and below; the icon inside scales with it automatically. The open chat panel is a different story — it is meant to fill the screen on a phone, so the Chat Window Width and Height sliders on that same screen are labelled (Desktop) and only take effect from 501 px up. That is why a phone-sized panel looks unchanged after you move them: nothing is broken and no setting is missing, the mobile layout is deliberately near-full-screen — core insets it by 8 px on every side below 550 px, which is also why it stops short of the screen edges (how to remove that inset). If you genuinely need a smaller panel on phones too, that is a CSS job — add your own @media (max-width: 550px) rule targeting .mxchat-chatbot-wrapper (550 px is the breakpoint core itself uses for the panel; a rule written at 500 misses the larger phones) under Appearance → Customize → Additional CSS. Available in MxChat core; the Theme Customizer add-on extends it with the Sizing screen, including the separate mobile launcher slider.
How do I make the chatbot link to my contact page when it can’t answer a question?
Edit the fallback line in the prompt — it’s a setting, not hardcoded. The default reply “I don’t have enough information in my knowledge base to answer that question accurately” is one line of the stock AI Instructions (Behavior) text at MxChat → Settings → Chatbot tab, so open that field and rewrite that line to point somewhere useful, for example: If the answer is not in the knowledge base, reply only with: I don’t have that one — please [contact us](https://yoursite.com/contact) and we’ll help. Markdown link syntax is what renders as a clickable link (the stock instructions already tell the model to hyperlink URLs), and putting the full literal URL in the instruction matters — if you tell the bot to link but don’t give it the address, it can invent one. To send visitors elsewhere for particular subjects rather than for every unanswered question, see restricting topics and returning a link; if links appear as plain text instead of clickable, see the Citation Links setting. Available in MxChat core (the free plugin).
Is there a developer filter to change the chatbot’s answers or system prompt in code?
For no-code control, use MxChat → Settings → Chatbot tab → AI Instructions (Behavior) to add plain-language rules (see the topic-restriction and response-length entries below). To shape answers programmatically, MxChat core exposes the mxchat_system_instructions filter — it runs on the system prompt before every reply and receives three arguments: the instructions text, the bot ID, and the session ID (applied in class-mxchat-integrator.php). Use it to inject live data at runtime, such as business hours, stock levels, or per-user context. Two conveniences are built in without writing a filter: any registered WordPress shortcode you place in the AI Instructions field is expanded before the prompt is sent (from core 3.2.22 the current date and time are sent with every message automatically, and {current_date} / {current_datetime} are replaced in the field as well — see “My chatbot keeps recommending past, expired events” under Troubleshooting), and the {visitor_name} placeholder is replaced with the name captured in the pre-chat form. Full code examples are in the developer hooks & filters docs. Available in MxChat core (the free plugin).
Where is the CSS editor in the Theme Customizer add-on, and why can’t I see the CSS code viewer?
The Theme Customizer does include a built-in CSS viewer and editor, but it lives inside the AI Theme Generator and only appears after you generate (or load a saved) theme — before a theme exists there’s no CSS to show, which is usually why it looks missing. Open MxChat → Theme Settings → AI Theme Generator, describe the look you want and click Generate; once a theme is generated, View CSS reveals the generated CSS (with a Copy button) and Edit CSS opens an editor where you can hand-tune it and save (Ctrl/Cmd+S). If you’d rather write your own CSS without generating a theme at all, add it to your WordPress theme’s Appearance → Customize → Additional CSS using MxChat’s widget selectors — see resizing or restyling the chat widget. Requires the Theme Customizer add-on.
Can I set a maximum input length or character limit on the chat box?
Yes. Set Max Input Length (characters) under MxChat → Settings → Chatbot → Display — enter any number and the chat box enforces it as a real maxlength on the input, so a visitor cannot type or paste past the cap, and a live character counter appears under the box showing how much room is left. Leave it at 0, the default, for no limit. This is separate from the per-visitor message limit under Rate Limits, which caps how many messages someone can send rather than how long each one is (see how rate limits are counted). Available in MxChat core (the free plugin).
How do I add or apply a theme to my chatbot?
After activating the Theme Customizer add-on (Pro), open MxChat → Theme Settings. The default AI Theme Generator tab lets you describe the look you want in plain language, generate a full color theme, save it, and apply it to your chatbot — and if you run Multi-Bot you can assign different saved themes to individual bots. Prefer to set things by hand? The Color Settings, Position Settings, and Custom Icons tabs on the same screen control roughly 20 individual colors (message bubbles, top bar, input, icons, links), the widget’s on-screen position, and your launcher and title-bar PNG icons. Themes are built and applied inside this screen — there are no theme files to download or upload. Requires the Theme Customizer add-on.
How do I change or translate the chat widget’s interface text (welcome message, placeholder, buttons) into my language, or into several languages on a WPML / Polylang site?
The bot’s replies already match the visitor’s language automatically, but the widget’s fixed text comes from settings you type in — so set each one in your language under MxChat → Chatbot: Top Bar Title, Introductory Message (the “Hello! How can I assist you today?” greeting), Input Placeholder, AI Agent Text, Chat Teaser Pop-up, the Satisfaction Rating Prompt, the email/name gate fields (Email Form Content, Submit Button Text, Name Field Placeholder), and the Rate Limit Message. Each field stores one value, so there are no separate per-language fields — that is why the settings only let you enter a single language. On a multilingual site (WPML, Polylang, TranslatePress) you have two paths: translate the plugin’s built-in strings with a .mo language pack (see translating MxChat), which WordPress loads per active locale as your multilingual plugin switches language; and for any field you have overwritten with your own text, register that value in your multilingual plugin’s string-translation tool — MxChat ships a wpml-config.xml, so WPML and Polylang pick up the widget’s 14 visitor-facing strings automatically and list them under String Translation in the admin_texts_mxchat_options domain (other multilingual plugins still need them registered by hand). The widget is plain markup in your page rather than an iframe or shadow DOM, so DOM-level translators like GTranslate can reach that text as well — see whether the widget runs in an iframe. Available in MxChat core (the free plugin).
Can I customize the chatbot’s satisfaction rating prompt (the 👍/👎 “Was this helpful?” survey)?
Yes. Go to MxChat → Settings → Chatbot → Behavior and switch on Satisfaction Rating Prompt — it shows a 👍/👎 prompt after the conversation has had a couple of bot replies and the visitor has gone idle (it’s off by default, and turning it off hides the prompt site-wide). With it on, the “Customize the prompt (optional)” panel lets you set the Idle Timeout (5–600 seconds of inactivity before it appears, default 60), the Prompt Question (default “Was this helpful?”), the Thank-You Message, the Feedback Placeholder, and the Saved Confirmation text — leave any field blank to keep its default. Ratings and any written feedback are stored per session and rolled up in the Satisfaction card under MxChat → Transcripts. Available in MxChat core (the free plugin).
Does MxChat support Hebrew, Arabic, or other right-to-left (RTL) languages?
Yes. The chatbot automatically replies in whatever language a visitor writes in — the AI model translates on the fly, with nothing to configure. For right-to-left scripts like Hebrew and Arabic, every chat bubble is rendered with automatic text-direction detection (dir="auto"), so the text lays out right-to-left correctly, and the widget ships RTL-aware styling for its header menu. Just write to the bot in Hebrew or Arabic and it answers in the same language, properly aligned — there is no language or direction setting to flip. Available in MxChat core (the free plugin).
Where are the Toolbar settings? I can’t find where to turn on the PDF or Word upload buttons.
Open MxChat → Settings, then in the settings sidebar expand Integrations and click Toolbar — the screen is titled “Toolbar Settings.” The chat toolbar is hidden by default, so enable it there first; that adds a row of buttons below the chat input where you can then toggle the PDF upload and Word document upload buttons on or off. If a guide or the chatbot pointed you to a “Toolbar & Components” tab, that’s just the old name for this same screen (the Live Agent, Brave Search, and Perplexity buttons live here too). Available in MxChat core (the free plugin).
How do I hide (or force-show) the chatbot on one specific page or post?
Edit the page or post and find the MxChat Settings box in the editor sidebar. Under Chatbot Visibility, choose Hide Chatbot on this page to switch it off there, Show Chatbot on this page to force it on even when the site-wide auto-show is off, or leave it on Use Global Setting to follow your default. Save or update the page for the change to take effect — the setting is per-page and doesn’t change the chatbot anywhere else. Available in MxChat core (the free plugin).
How do I stop the chatbot from asking visitors for their name and email before they can chat?
MxChat can gate the conversation behind an email-capture form, but it’s a single toggle you can switch off. Go to MxChat → Settings → Chatbot → Lead Capture and turn off “Require Email to Chat” — visitors can then start chatting immediately without entering a name or email. The same setting controls the prompt wording shown when the gate is left on. Available in MxChat core (the free plugin).
Are there size limits for the custom chatbot icon or title icon?
There’s no hard size cap inside MxChat — the two icon fields under MxChat → Theme Settings → Custom Icons just store an image URL, so any image WordPress’s Media Library accepts (limited by your host’s PHP upload_max_filesize, typically 2–64 MB) will work. The recommended uploads are a 48×48 px PNG for the floating launcher (the custom_icon field) and a 24×24 px PNG for the header badge (the title_icon field). The widget renders both at those exact pixel dimensions with object-fit: contain, so larger images scale down without distortion — and because the launcher’s 48 px is applied as an inline style, a bigger upload cannot make it render bigger; 48-inside-a-60 px-button is the intended ratio (why your icon looks small, and how to change it). Uploading a multi‐MB photo just to display it at 48 px wastes bandwidth on every page load, so use a transparent PNG cropped tight to the recommended size for the sharpest result. Requires the Theme Customizer add-on.
How do I resize or restyle the chat widget? What CSS selectors and default dimensions does it use?
Resizing no longer needs CSS. MxChat → Theme Settings → Sizing gives you four sliders that autosave: Launcher Button Size and Launcher Button Size (Mobile) (both 40–120 px, default 60), Chat Window Width (Desktop) (300–600 px, default 375) and Chat Window Height (Desktop) (400–900 px, default 625) — the two window sliders apply from 501 px up, because the panel is full-width on phones by design. For restyling, or for resizing without the add-on, every visual layer has a stable class hook you can override from Appearance → Customize → Additional CSS: .mxchat-chatbot-wrapper (outer floating shell), .mxchat-chatbot (main container), .chat-container (flex interior), .chat-box (scrollable message area), .bot-message / .user-message / .agent-message (bubbles), .chatbot-top-bar, and .chatbot-footer. Defaults in chat-style.css: the floating widget is 375×625 px (capped to 100vh − 50px on short screens); the embedded shortcode [mxchat_chatbot floating="no"] renders at a fixed 500 px height, and the Height slider is honored there too. Available in MxChat core; the Theme Customizer add-on extends it with the Sizing sliders, so no CSS is needed just to change dimensions.
How do I shorten the bot’s responses or set a lower max-tokens?
There is no max-tokens slider in the admin UI; the chat-reply path hard-caps each response at 1000 output tokens server-side, and the model can return fewer. This 1000-token cap is global and isn’t adjustable per bot, even with the Multi-Bot add-on. The supported way to make answers shorter is to add a behavior rule under MxChat → Settings → AI Instructions (Behavior) — for example, Answer in 1–2 sentences. or Keep responses under 60 words. That works across every provider without code changes. Available in MxChat core (the free plugin).
Does MxChat have a REST API I can use from external tools?
Yes — MxChat exposes a bearer-token-authenticated REST API at /wp-json/mxchat/v1/ with five endpoints: GET /health for a connectivity check, GET /transcripts (and DELETE) for reading or pruning chat history with filters for date range, role, session, and whether the answer used RAG context, POST /knowledge for pushing content into the knowledge base from external tools like n8n, Zapier, Make, custom dashboards, or your own agents — and, from core 3.2.22, DELETE /knowledge to remove entries by source_url (one or up to 50 at a time) and GET /leads to read captured leads with paging, a since filter, search and a status filter, so a CRM or spreadsheet can be kept in sync. The API is disabled by default — generate a token from MxChat → API Access, then send it on each request as Authorization: Bearer <token>. This is separate from the chat widget itself, which still uses WordPress’s admin-ajax.php path internally. Those endpoints are the whole of the core API, and the API Access screen documents each with a ready-to-run example: there is no core endpoint that returns WooCommerce product or order data, and none that reads back indexed knowledge. If that is what you need, the MCP Server add-on covers it — it reuses the same token and adds live product, order and customer lookups plus knowledge listing, exposed as Model Context Protocol tools an AI agent can call directly. Available in MxChat core (the free plugin); the MCP Server add-on extends it with an agent-facing Model Context Protocol endpoint.
Can I stop the chatbot from answering certain topics (legal, medical, etc.) and have it return a link instead?
Yes — but it is a system-prompt instruction rather than an enforced filter, and the difference matters if the topic is high-stakes. Go to MxChat → Settings → Chatbot → Behavior and add a directive to AI Instructions (Behavior) such as Do not provide legal advice. If asked about legal matters, respond only with a link to https://example.com/legal-disclaimer. Whatever you write there is sent as part of the system message on every request, so the model follows it the way it follows any system instruction — dependable in practice, with nothing in the product that enforces it. There is no deterministic alternative: Actions map trigger phrases to a fixed set of built-in callbacks and have no “always reply with this exact text” option, and the Moderation add-on bans individual visitors by email or IP rather than restricting subjects. For safety-critical signposting — medical, crisis or emergency — treat the instruction as one layer and also put the number or link somewhere the model cannot omit it, such as the Quick Questions shown above the chat input (Settings → Chatbot → Quick Questions). Available in MxChat core (the free plugin).
How do I hide or unpublish the chatbot? It went live before I tested it.
Three layers of visibility control, broadest to narrowest. Site-wide: MxChat → Settings → Chatbot tab → toggle off Auto-Display Chatbot; the widget disappears from every page, and you can still embed it manually with the [mxchat_chatbot] shortcode when you’re ready to test. Per post type: under the same Chatbot tab, Post Type Visibility lets you switch to Include or Exclude mode and pick which post types (pages, products, posts, custom) get the widget. Per page: open the post in the editor, find the MxChat Visibility meta box in the sidebar, and choose Hide. Available in MxChat core (the free plugin).
Does MxChat offer a white-label option? Can I remove the MxChat branding from the chatbot?
The chat widget is effectively white-label out of the box — visitors never see the MxChat name. There is no “Powered by MxChat” footer to remove, no MxChat logo embedded in the widget, and no required outbound link. You set the bot’s name and greeting under MxChat → Settings → Chatbot → Display (Top Bar Title, AI Agent Text, Introductory Message, Input Placeholder); the colour pickers are a separate screen, MxChat → Theme Settings → Color Settings, which belongs to the Theme Customizer add-on rather than core — core reads the saved colours but ships no pickers of its own — and the plugin has no Custom CSS field anywhere, so styling goes in Appearance → Customize → Additional CSS. There is also no agent avatar: the product has exactly two image fields, the 48×48 px launcher icon and the 24×24 px title-bar icon (see the avatar entry for the CSS workaround). What MxChat does not offer is reseller white-labelling of the plugin itself — the WordPress admin pages still read “MxChat”, and the Pro / Agency / Agency Plus licences cover running it on sites you control, not rebranding and selling it as your own product; that one is a conversation for support. Available in MxChat core; the Theme Customizer add-on adds the colour pickers and the two icon fields.
Is MxChat translated into other languages? How do I translate it into Polish, Spanish, etc., or make a .mo file from the .pot?
The chatbot itself already replies in the visitor’s language automatically — the underlying AI model translates on the fly with no configuration. The plugin’s admin UI is translation-ready (text domain mxchat, .pot file under /languages/) and registered on translate.wordpress.org, so any locale the community has translated will load automatically once your WordPress site language is set under Settings → General. To contribute a translation (Polish, Spanish, or anything else), sign in at translate.wordpress.org and submit strings; once approved, they ship as a language pack to every MxChat install. For a private translation, compile your own .mo from the bundled mxchat.pot using the free Loco Translate plugin (edit and compile right in the WordPress dashboard) or the free desktop app Poedit, then save it as mxchat-<locale>.mo (for example mxchat-uk.mo or mxchat-pl_PL.mo) in /wp-content/languages/plugins/ — WordPress picks it up automatically for that locale. Available in MxChat core (the free plugin).
What’s the difference between AI Theme Customizer and AI Theme Generator, and do I need the AI part to style the chatbot by hand?
They are the same product, and no — the AI is optional. “AI Theme Customizer” is the marketing name (the page at mxchat.ai/ai-theme-customizer and the plugin slug); the add-on registers one admin screen, Theme Settings, under the MxChat menu, and AI Theme Generator is simply the first section in that screen’s left sidebar — not a menu item of its own and not a separate download. The other sections on the same screen — Color Settings, Position Settings and Custom Icons — are ordinary form fields covering roughly 20 colours, the widget’s on-screen position, and your launcher and title-bar PNGs; none of them calls a model, so you never have to pick an AI model or generate anything to style the bot by hand. One Pro-unlocked plugin, one screen, and the AI is one section of it. Requires the Theme Customizer add-on.
Add-ons & integrations
I use the Multi-Bot add-on — should I build all my bots there and delete the main (Default) bot?
No — keep it, because the Default Bot is not a bot you can delete: it is the core plugin’s own settings, and every bot you create under MxChat → Multi-Bot Manager is built on top of it. When a Multi-Bot bot answers, MxChat loads the core options first and lays the bot’s own saved fields over them, so API keys, the embedding model, and every Behavior, Display and integration setting the bot screen has no field for come from the Default Bot; a bot carries only its own chat model (leave it blank to inherit), AI instructions, welcome message, header title, quick questions, colours, lead-capture form, rate limits, similarity threshold and knowledge-base configuration. Treat the Default Bot as the shared base and add a bot only where the persona or the knowledge has to differ. If you don’t want the Default Bot itself to appear anywhere, turn off Auto-Display Chatbot under MxChat → Settings → Chatbot → Display and place the others with [mxchat_chatbot bot_id="your-bot-slug"], or set a page to Show Chatbot on this page and pick one in the Select Bot for this Page dropdown of the MxChat box in the page editor. One caveat on knowledge: separation between bots comes from Pinecone — a Pinecone Host or Pinecone Namespace in each bot’s Knowledge Base Configuration — while bots left on the WordPress-database store all read the same shared table. Requires the Multi-Bot add-on.
Wizard answers don’t appear in MxChat → Transcripts or in the Telegram live-agent handoff — only [WIZARD_COMPLETE] shows. How do I include them?
Update to Forms 1.2.15 with MxChat core 3.2.22 or newer — from that pair the answers are part of the transcript. Each question and the answer the visitor chose is recorded as the wizard runs, so MxChat → Transcripts, the Telegram and Slack handoff, Download Transcript, the emailed transcript and the transcript a form’s notification email attaches all show the full run, and when the wizard finishes the transcript reads Completed wizard with the wizard’s name and the outcome it matched instead of the bare marker. The Telegram and Slack handoff card also gains a Wizard answers section listing every question and answer, and the recent-conversation tail it carries is extended so the message that started the wizard is not pushed out. On Forms 1.2.14 and earlier (or 1.2.15 on an older core) every step after the first travelled over the add-on’s own endpoint and was written only to the wizard’s session record in the {prefix}mxchat_wizard_sessions table, never to the chat transcript; the transcript kept the first step’s card and, for an AI-response outcome, the literal [WIZARD_COMPLETE] the widget sends to wake the model, and the handoff cards were built from that same transcript. Whatever version you are on, MxChat → Form Collection → Wizards → Sessions lists every run with its answers and has an Export CSV button, and the wizard’s Notification Email sends them the moment the last step is answered — from 1.2.15 labelled by each step’s question, with the chat session id and the triggered form’s fields. For an automated route, see the wizard webhook entry. Requires the Forms add-on; the transcript rows need MxChat core 3.2.22.
Can a Forms wizard send a webhook (Zapier, Make) when it completes, with the visitor’s name and email alongside the wizard answers?
Yes, from Forms 1.2.15. Both wizard editors — Conditional and Branching — have a Webhook URL field next to Notification Email, with the same signing secret and Regenerate control the form editor has. Every completed session is POSTed as JSON with event: wizard_completed, the wizard id and title, the chat session_id, user id, page URL, completion time, the matched outcome and an answers array carrying each step’s question and answer; it is signed with HMAC-SHA256 in the X-MxChat-Signature header and listed in the Webhook Log alongside form deliveries, with a Source column. The part that matters for a Zapier or Make sheet: when the outcome is Trigger a Form, delivery waits until that form is submitted and then sends one request carrying the wizard answers and the form’s submitted fields together, flagged form_submitted: true, so one step writes one row per visitor with no join; the form’s own webhook carries the wizard answers as well. If the visitor never submits the form, the daily cleanup sends the wizard-only payload marked form_submitted: false. For PHP integrations a mxchat_forms_wizard_completed action fires with the same payload, the twin of mxchat_forms_submitted. The wizard’s Notification Email still goes out at completion, now labelled by question with the session id and the triggered form’s fields. On Forms 1.2.14 and earlier no wizard webhook or hook existed; the only join was reading answers from the {prefix}mxchat_wizard_sessions table by session_id in an mxchat_forms_submitted listener, or the CSV under Form Collection → Wizards → Sessions. Requires the Forms add-on.
Does the embedding model change my WooCommerce product search or price-filter results?
Not the price comparison. Price filtering is a plain numeric check against each product’s price after the WooCommerce query has run — no vectors are involved, and no prices are stored in any index — so switching models cannot change which products fall inside a price range. It does change two other things. Your question is embedded and compared against the feature’s trigger phrases, and Filtered Product Search only fires above a 70% match, so a different model can change which questions the feature catches at all. And if Enable Semantic Re-rank is on, the model decides which matches survive into the six that get shown. One trap when you switch: the trigger-phrase embeddings are cached for 24 hours under a key that does not include the model, so the old model’s vectors stay in place — re-save the Filtered Product Search settings to clear the cache immediately. Requires the WooCommerce add-on.
Can the AI product search match two brands (or two sizes) in one question?
No. Attributes are extracted as one value per attribute name — a single brand, a single size, a single colour — so a question like “bats from SS and SG” collapses to one of the two brands rather than searching for both, and when several different attributes are present they are combined with AND, never OR. Price ranges are the exception: those genuinely take a minimum and a maximum. Ask for one brand per message, or drop the brand entirely and let the price range and category do the filtering. Requires the WooCommerce add-on.
AI Filtered Product Search only returns a handful of products — and the same ones every time. Why?
On WooCommerce add-on 1.7.9 and earlier the result set was cut to six for display with no setting anywhere, the number the bot announced was counted after that cut — so it said “I found 6 products” when twenty matched — and the order was newest-published first, which is why an identical query returned the same items every time. Add-on 1.7.10 changes all three: a Products to Show setting on the Filtered Product Search tab of the WooCommerce add-on settings takes 1 to 20 (existing stores stay at six until they change it); the reply now states both numbers — how many matched and how many it is showing — so shoppers know there is more; and when the request contains search words, results are ordered by how well they match them (product names first) rather than by publish date, while a request that only gives a price range or category still lists newest first. Enable Semantic Re-rank on the same tab reorders the candidates by how well each product fits the whole question, at the cost of one embedding call per candidate on every search, which is why it stays opt-in. To surface a different set beyond that, tighten the query — a narrower price band, a category, or one attribute. Requires the WooCommerce add-on.
Where is the Migration Tool? I can’t find it in WordPress or in the add-ons list
It is a separate plugin rather than a screen inside core, so nothing appears anywhere until you install it — it is not a tab under Knowledge or Settings, and MxChat → Pro & Extensions only shows its catalogue card. Install the ZIP your Pro licence unlocks the same way as any other add-on, via Plugins → Add New → Upload Plugin (see where add-on ZIPs live); if the Migration Tool is not listed on your Downloads page, email maxwell@mxchat.ai with your order number rather than hunting for it in the add-ons grid. Once it is active it registers its own submenu at MxChat → Migration Tool, headed Database Migration, and that is the only place it lives. From there you can move the knowledge base between the WordPress database and Pinecone in either direction, re-embed your Actions for a new embedding model (action similarity thresholds are adjusted for you), and export the knowledge base as Text or JSON — a JSON backup being the one format you can import again. Its own pages on this site are the Migration Tool page and the Migration Tool docs. Requires the Migration Tool add-on.
Can the chatbot open a support ticket by email from inside the chat?
Yes — that is what a Forms add-on form does, and it is how the widget on this page works. Build a form under MxChat → Form Collection, fill in its Notification Email and optional Email Subject Line, and give it a trigger phrase such as “support ticket” so the bot offers it mid-conversation instead of sending people to a contact page. On submit, MxChat emails that address every field under its own label, sets Reply-To to the email address the visitor typed, and attaches the whole conversation as a .txt transcript — so you can answer straight from your inbox with the context already in front of you; leave the field blank and it falls back to your WordPress admin email. Each submission is also stored under Form Collection → Submissions with CSV export, and a multi-step Wizard can email a completion summary the same way. If you want tickets landing in a real helpdesk rather than an inbox, point the form’s Webhook URL at Zapier, Make or n8n instead. Requires the Forms add-on.
Can I add an AI-powered search bar to my site instead of the chat widget?
Yes. The AI Search add-on ships an embeddable search box you place wherever you want it — the [mxchat_ai_search] shortcode, or the MxChat AI Search block in the editor. A visitor types a question and the answer plus its sources render in place directly below the box; nothing navigates to a ?s= results page and no chat widget is involved. It is a separate surface from the AI Overview that sits above your theme’s own search results, so it keeps working with the AI Search Overview toggle switched off — that toggle controls only the search-page takeover, which is what you want if you need the embedded box and untouched theme search. Both the shortcode and the block take the same options (placeholder, results="overview|full", sources, align, button_text, accent_color) and answer from your MxChat knowledge base through the same endpoint, cache and rate limit as the overview. Requires the AI Search add-on.
Where does the Form Collection CSV export go — can it save to Google Drive?
It goes to your browser, and no. Export CSV on MxChat → Form Collection → Submissions streams the file straight down as a download, so it lands wherever your browser puts downloads; nothing is written to disk on your server, no copy is kept, and there is no Google Drive, Dropbox or other cloud-storage integration to point it at. If what you want is submissions arriving somewhere automatically rather than exported by hand, use the per-form Webhook URL instead and let Zapier, Make or n8n write each one into Drive, Google Sheets or your CRM as it comes in. Requires the Forms add-on.
Can I make visitors tick a privacy-consent checkbox before they can chat?
Yes, with the core pre-chat form since core 3.2.20. Under MxChat → Settings → Chatbot → Lead Capture, turn on Require Email to Chat and then Consent Checkbox; Consent Label is the text beside the box (anchor tags are allowed, so you can link your Privacy Policy), and Require Consent to Submit blocks the form until it is ticked — enforced on the server, not only in the browser — while off makes it a soft opt-in. Each capture records whether the box was ticked, when, and the exact label shown, visible in the Leads tab, the CSV export and WordPress’s privacy exports. From 3.2.22 two more toggles on the same screen make this a pure consent gate if you want one: Require Email Address off makes the email field optional, so the form can collect a name and consent alone, and Also Show for Logged-In Users shows it to signed-in visitors too, pre-filled from their profile (by default they skip it). It is a gate in front of the first message, not in front of the widget itself — the chat window still opens, and the privacy notice text above the form stays display-only. For a consent question mid-conversation rather than at the start, the Forms add-on can trigger a form with a checkbox field on the first message with Block chat until submitted. Available in MxChat core (the free plugin); the Forms add-on adds mid-chat consent forms.
When a chat is handed to Slack, does the agent see the conversation so far?
Yes — the New Live Agent Request that lands in Slack carries the last five messages of the conversation as a quoted Recent Conversation block, followed by the visitor’s current message, so your agent picks the thread up mid-flow instead of asking them to start again. Above that it shows the session ID, the WordPress user ID, and the visitor’s name and email if either was captured. It is the last five turns and not the whole transcript, so for the full conversation open MxChat → Transcripts and search for the session ID printed in the Slack message. Replies typed in the Slack channel, or in the thread when you use a shared handoff channel, go straight back to the visitor. Available in MxChat core (the free plugin).
The chatbot recommends products that aren’t in my store, or links that 404 — can I force it to use only real WooCommerce products?
The product cards already are forced, and they are the part you can trust: candidates come straight out of wc_get_products() filtered to published, purchasable, in-stock items, and every card is re-resolved through wc_get_product() before it renders and dropped if it doesn’t resolve — an unpublished or non-existent product cannot get a card. What has no validation step is prose. The sentence introducing the cards is its own model call, given product names only and told not to list products or write links, so an invented name or a 404 URL is almost always coming from an ordinary chat answer rather than from the product tools — the model filling a gap when nothing cleared the Similarity Threshold, which is the setting to lower first. One behaviour worth knowing before you call it a hallucination: when the search finds fewer than four matches, MxChat pads the set with featured then best-selling products, so an off-topic card is padding, and those products are real. Requires the WooCommerce add-on; the Similarity Threshold that governs the written answer is in MxChat core.
Can MxChat hand off to a live agent automatically when it can’t answer, instead of waiting for a trigger phrase?
Yes, but it’s the AI Tools path rather than Trigger Phrases. Under MxChat → Actions → AI Tools, switch on Hand Off to Live Agent (Slack) or Hand Off to Live Agent (Telegram) — both ship off, because every AI Tool stays off until you enable it. Once one is on the model decides for itself when to call it; there is no confidence score or “no knowledge-base match” rule anywhere in the plugin, so what actually decides is the description the model reads. From MxChat core 3.2.19 both handoff tools arrive with that note prefilled — use this when the visitor has asked something you cannot answer from the knowledge base, or has asked twice about the same unresolved problem — so switching the tool on is now enough on its own. Reword or clear it in the tool’s “When should the assistant use this?” box, which MxChat appends to the model-facing description as “When to use: …”. Available in MxChat core (the free plugin).
How does the Featured Products Showcase decide which products are “featured”, popular or recommended?
It doesn’t decide anything — you choose the products by hand. In the WooCommerce add-on’s Featured Products settings there is a search box: type a product name, click it to add it to the list, and use the up/down arrows to set the order shoppers see. The action ignores WooCommerce’s own “Featured” checkbox, sales counts, ratings and every other popularity signal; the only thing the AI contributes is the sentence written around the list, guided by the prompt box above the selector (for example “these are our best-sellers this month, mention any offers”). Products that are unpublished or deleted are skipped, and if the list is empty the bot answers “I don’t have any featured products to show right now.” For results that are chosen by relevance to the question, use Product Card or AI Filtered Product Search instead. Requires the WooCommerce add-on.
Can I remove or restyle the size/colour dropdowns that appear on WooCommerce product cards in chat?
Both, from WooCommerce add-on 1.7.8 onward. To remove them, turn off Show Variation Dropdowns under Product Display in the add-on’s settings; because adding to cart requires choosing options, a variable product with its dropdowns hidden shows a View options button through to the product page instead of an Add to Cart button that couldn’t work. Simple products are unaffected. Don’t reach for display:none instead — the selections are read when resolving which variation to add, so the button stays visible and the add silently fails. For styling, the markup is stable: .mxchat-product-card wraps .mxchat-product-image, .mxchat-product-name, .mxchat-product-price and .mxchat-variation-selectors (one .mxchat-variation-select per attribute); for anything beyond CSS, the mxchat_woo_product_card_html filter hands your theme or plugin the finished card markup and the product before the card reaches the chat window. Requires the WooCommerce add-on (1.7.8 or newer for the toggle and the filter).
Can the chatbot tell a customer whether we ship to their country?
Yes, from WooCommerce add-on 1.7.8 onward — switch on Shipping Destination Check under MxChat → Actions → AI Tools and the bot answers from your real WooCommerce shipping zones instead of guessing. It says whether you deliver to that destination and which shipping options exist, but never quotes a price, because postage depends on the cart and is worked out at checkout. Zones that only offer local pickup are described as pickup rather than delivery; if you restrict a country by postcode and the shopper hasn’t given theirs, it asks for it instead of guessing either way; and if you haven’t set up shipping zones at all it says so rather than telling shoppers you don’t ship to them. Before 1.7.8 nothing read your zones, so the bot would often reassure a shopper that postage could be checked at checkout for a country you don’t serve — if you still see that, update the add-on and enable the tool. Requires the WooCommerce add-on (1.7.8 or newer).
What does the AI Search overview answer from — will it show my WooCommerce products?
The AI Overview above your search results is generated from your MxChat knowledge base, never from live WooCommerce data: it does not read prices, stock or inventory at search time. Products appear in it only if you have indexed them — Knowledge → WordPress Content, selecting your Products post type — and then only as the text that was indexed, so the overview is as current as your last import unless auto-sync is on. From AI Search 1.0.3 it reads whichever knowledge base your site actually uses, Pinecone included; on 1.0.2 and earlier it read only the WordPress-database copy, so a Pinecone site showed no overview at all and warned you nowhere. The same release adds an Include external source links toggle, for listing only sources from your own site, and an optional footer note under the overview. Your theme’s own product results still render underneath either way. Requires the AI Search add-on (1.0.3 or newer if your knowledge base lives in Pinecone).
Can Claude or ChatGPT connect to my site and read my MxChat and WooCommerce data?
Yes — the MCP Server add-on exposes your WordPress install as a Model Context Protocol endpoint at /wp-json/mxchat-mcp/v1/mcp, so Claude, Claude Code, ChatGPT, or any MCP-aware agent can call twelve tools against the live site. Seven are chatbot operations (bot_info, list_transcripts, search_transcripts, get_session, list_knowledge, add_knowledge, delete_session) and five are WooCommerce (woo.list_products, woo.get_product, woo.list_orders, woo.get_order, woo.search_customers) — get_product returns price, sale price, stock status and quantity, SKU, attributes, gallery image URLs and variation IDs, read live from WooCommerce rather than from a synced copy. It reuses the bearer token you generated under MxChat → API Access instead of a second secret, and the access role defaults to read-only, so write tools such as add_knowledge and delete_session stay blocked until you switch the role to Admin on the MxChat → MCP Server screen. Three limits to design around: the WooCommerce tools need WooCommerce itself active on the site; custom post meta and ACF fields are not part of the product payload, so use WooCommerce’s own /wp-json/wc/v3/products when you need those; and it is pull-only — an agent fetches on demand, and nothing pushes a notification when a product changes. Requires the MCP Server add-on.
A customer types a product’s SKU in chat and the bot can’t find the product — why?
The Show Product Card and Add to Cart actions identify a product by handing the AI a catalog snippet built from your 100 most recently published products. Each line carries that product’s ID, name, price, categories and its SKU — but only when the product actually has a SKU set, and if the one you are searching for belongs to an older product it is never put in front of the model at all. When the model can’t name an ID, the lookup falls back to a WordPress search on its own suggested terms, and that search reads product titles, excerpts and descriptions — not the _sku field, then scores each candidate against the title alone, so a bare number has almost nothing to match on. In practice: have customers type the SKU alongside a word or two of the product name, and put the SKU into the product title or short description if SKU-only lookups matter to your store. Also check the action is switched on under MxChat → Actions — it is listed there as Show Product Card, not “Product Search”. Requires the WooCommerce add-on.
AI Filtered Product Search isn’t filtering by category — how do I make it match the right one?
Two things gate it. First, saving the Filtered Product Search settings is not enough: you also have to switch the Filtered Product Search action on under MxChat → Actions, which is where the feature is actually turned on. Second, the extractor is handed your store’s real categories — slug, name, and parent for child terms — and told to use only those, matching on meaning even when the shopper writes in another language. That list is skipped in three cases, and then category filtering falls back to guesswork: the store has no categories, every category is empty (categories with no products are never offered), or there are more than 60 category terms, where a truncated list would do more harm than none. There is no term-to-category mapping table to fill in — the category names themselves are the lever, and the list is cached for a day but clears itself the moment you add, rename or delete a category. For a descriptor that cuts across categories, such as “vegan” or “on sale”, use a product tag instead; the same extractor reads tags as a separate filter, and from add-on 1.7.10 it is handed your real tag list (up to 120 tags with products) the same way. Requires the WooCommerce add-on.
Can a real person handle chats during business hours and let the AI take over after hours?
Yes — each handoff channel has its own Availability Schedule, set under MxChat → Settings → Integrations → Slack and, separately, → Telegram, so a day team and an evening team can keep different hours. Switch the schedule on and set a start and end time per weekday; windows that cross midnight are supported, and the times are read in your WordPress site’s timezone, not the visitor’s. Inside the window the bot can hand off; outside it, the handover is withheld from the model entirely — so the bot never offers a human nobody can reach — and anyone who asks for one anyway gets your Away Message and keeps talking to the AI. The schedule is off by default, in which case availability depends only on the Live Agent Status toggle on the same screen. Either way the visitor never leaves your website’s chat widget: the header switches to “Live Agent” when a person replies, and it’s your team that answers from Slack or Telegram (see live-agent handoff for the setup). Available in MxChat core (the free plugin).
When the WooCommerce chatbot recommends a product, does it show the full product gallery or just one image?
The product card shows a single image — the product’s featured image — alongside its name, price, and an Add to Cart button. It does not display the WooCommerce product gallery, and it cannot show multiple images for one product; every card renders exactly one photo taken from the product’s featured image (a placeholder is used when none is set). If a shopper asks to “see photos” of an item, the bot replies with that one card image plus a link to the product page, where the full gallery lives. For richer in-chat imagery you can separately switch on the Image Search or Generate Image AI Tools (see showing images in chat), but those are not tied to your product gallery. Requires the WooCommerce add-on.
Can the chatbot show images or play videos in the chat window?
Images yes; video, partly. The chat renders images three ways: the Image Search AI Tool returns a gallery of thumbnails (powered by Brave Search, so it needs a Brave Search API key), the Generate Image AI Tool creates one from a description using OpenAI or Google Imagen, and with the WooCommerce add-on the bot’s product cards carry the product photo, price, and an Add to Cart button — both AI Tools stay off until you switch them on under MxChat → Actions → AI Tools, and visitors can upload an image for the bot to read if you run the Image Analysis add-on. For video, MxChat does embed YouTube: when the knowledge-base entry behind an answer came in through the YouTube importer, the reply carries a click-to-load video card with a thumbnail and a “Watch on YouTube” link, and no Google iframe loads until the visitor taps play. That card is automatic with no on/off setting, so a YouTube-sourced entry that wins retrieval will attach its video even when the question was about something else. Video from any other source isn’t embedded, and generating video is a different product entirely — it happens in wp-admin, not in the chat window. Available in MxChat core; the WooCommerce add-on adds product cards with images, and the Veo Video add-on generates videos from a prompt in wp-admin.
Will the chatbot still work if I deactivate the WooCommerce add-on, and what is the mxchat_woo_get_cart_count request in admin-ajax.php?
Yes, the chatbot keeps working. The widget, the knowledge base, and the answers all live in the free MxChat core plugin, which does not depend on the WooCommerce add-on — deactivating that add-on only removes the store features: product cards, add-to-cart, and order-history lookup. The mxchat_woo_get_cart_count request is the add-on’s cart script asking WooCommerce for the current cart count to fill the cart badge in the chat toolbar; it runs on pages where the chat widget loads, and it stops once the add-on is deactivated. WordPress plugins are site-wide, so there is no per-page switch for the add-on itself — but you can control which pages show the widget at all (see hiding the chatbot on specific pages) and when its script loads (see page-speed options). Available in MxChat core; the WooCommerce add-on extends it with product cards, cart, and order lookup.
Can MxChat call my own REST API during a chat and use the response in its answer?
There’s no no-code field to point the bot at an arbitrary URL, but MxChat’s chatbot supports native function calling — AI Tools — so it can decide on its own to call a tool mid-conversation and use whatever the tool returns. To reach your own endpoint, a developer registers a custom tool on the mxchat_available_callbacks filter whose callback fetches your REST API (for example with wp_remote_get()) and returns the JSON; the function-calling loop then hands that result back to the model to answer with. Enable it under MxChat → Actions → AI Tools (it needs a tool-capable model such as OpenAI, Claude, or Gemini), then turn on your custom tool and describe in plain language when it should fire — built-in tools already cover web search, image generation, uploaded-PDF answers, and WooCommerce/Perplexity actions. This outbound direction is distinct from MxChat’s own inbound REST API, which instead lets external tools read transcripts or push content in. Available in MxChat core (the free plugin).
Can I connect MxChat to Brevo, Mailchimp, or another email-marketing tool?
There’s no native Brevo, Mailchimp, or Sendinblue connector in MxChat, but you can still get chat leads into one. The cleanest path is the Forms add-on: build a form that collects the visitor’s email, set its Webhook URL, and route the submission through Zapier, Make, or n8n into your Brevo or Mailchimp list — each submission is POSTed as JSON, so any automation tool can pick it up. You can also pull captured emails and full conversations programmatically with the REST API’s GET /wp-json/mxchat/v1/transcripts endpoint and push them wherever you like. If all you need is simple list-building and you’re open to using Loops instead, core ships a native Loops email-capture Action (see sending leads to a CRM); for webhook setup see the Forms webhook. The REST API and Loops capture are in MxChat core; routing leads to Brevo or Mailchimp uses the Forms add-on’s webhook.
How does a live agent end the chat, and can the visitor go back to the AI bot afterward without losing the conversation?
On Telegram, the agent ends the handoff by typing #close, #end, #disconnect, or #done inside the visitor’s topic — those four commands are listed at the bottom of every handoff notification MxChat posts to the topic. Any of them flips the session back to the AI: the visitor sees “Live agent session ended. You’re now chatting with the AI assistant,” the Telegram topic is closed, and the visitor keeps their existing conversation and can carry on with the bot right away. To reach a human again they just request a live agent, which opens a fresh topic. A visitor can also switch back on their own during a handoff by sending your “switch to AI” trigger phrase — that switch-to-chatbot intent is the one action still evaluated while a chat is in agent mode. Two caveats: the # commands are the agent’s to type in Telegram (a visitor typing them in the web widget does nothing), and Slack handoffs have no #close command — a Slack agent simply stops replying and the visitor returns with the switch-to-AI phrase. Turn on Enable Chat Persistence (MxChat → Chatbot) so the visitor’s conversation survives a page reload or a later return within ~24h. See live-agent handoff for how the handoff is set up. Available in MxChat core (the free plugin).
Is there a WordPress filter to turn the Slack/Telegram live-agent status on or off with code?
Before reaching for code: if what you want is set hours, MxChat now ships that built in — each channel has an Availability Schedule under MxChat → Settings → Integrations → Slack (and → Telegram), which closes the desk outside your window without a line of PHP (see business-hours handoff). For anything the schedule can’t express, there is no dedicated MxChat filter, and mxchat_get_bot_options is not the one to use — that hook belongs to the Multi-Bot add-on and only returns a per-bot options array (it fires when Multi-Bot is active and the request is for a non-default bot), so it reads a bot's config rather than setting the live-agent state. The status itself lives in the main mxchat_options array as live_agent_status ('on' / 'off'), saved on that same Integrations screen and read at handover time via get_option('mxchat_options'). Because it is a standard WordPress option, control it with the normal option APIs: persist a flip with update_option('mxchat_options', $opts), or override the value at read time by hooking WordPress’s core option_mxchat_options filter and setting $value['live_agent_status']. See live-agent handoff for how the handoff itself works. Available in MxChat core (the free plugin).
Can I show the visitor’s name and email in the Slack live-agent channel?
Yes — in MxChat core 3.2.11 and newer, when a chat is handed to Slack the channel shows the visitor’s identity at the top of the New Live Agent Request message, formatted as Name <email>, so your agent sees who they’re talking to instead of just a session ID and a guest user ID of 0. It uses whatever was captured at the start of the chat — the pre-chat name/email gate, a logged-in user, or the saved transcript; if only the name was captured you’ll see just the name, and the email is added once it’s collected. If you currently see the name but not the email, update MxChat core to 3.2.11 or newer and confirm your pre-chat capture is collecting the email. Available in MxChat core (the free plugin).
How do I create a form in MxChat?
Install the Forms add-on, then go to MxChat → Form Collection and click Create New Form. Give the form a title, click Add Field for each piece of information you want to collect (text, email, dropdown, radio, checkbox, and more), and add at least one Trigger Phrase — a trigger is required, because a form only appears when a visitor’s message matches one (you can also use Trigger After X Messages instead). Save, and the form fires in-chat on a matching message; if a form never shows up, a missing or too-strict trigger is almost always why (see why a form never appears in chat). Requires the Forms add-on.
Can a guest customer check their order status in chat without logging in?
Yes, for a specific order. The WooCommerce add-on’s order tracking verifies a guest by order number + the billing email on that order, then shows the status, items, and any tracking info right in the chat — no account login required. Browsing the full order-history list (every order a customer has placed) still requires them to be logged in, or in their active WooCommerce session. So a guest can look up “where is order #1234?” by confirming the email on that order, but can’t pull a list of all their past orders without signing in. Requires the WooCommerce add-on.
Can I build a multi-step wizard form that asks questions one at a time in chat (for example, an end-of-chat survey)?
Yes. The Forms add-on includes a Wizard builder (MxChat → Form Collection → Wizards) that walks a visitor through questions one step at a time inside the chat, instead of showing a single form — handy for surveys, intake/qualification flows, or an end-of-conversation evaluation. You define the steps and their answer options (Conditional or Branching), and each completed run is saved under Form Collection → Wizards → Sessions with its answers — separately from form submissions, with an Export CSV button; the answers are not written into the chat transcript (see this entry). Like a regular form, a wizard launches from a trigger phrase (its intent) that you configure. Requires the Forms add-on.
How do I add more than one Slack agent to live chat, and where do I find a Slack member ID?
In MxChat → Settings → Integrations → Slack, the Slack Agent User IDs field takes one Slack member ID per line — every ID you list is automatically invited to the Slack channel when a chat is handed off, so more than one teammate can cover live chats (it is not limited to a single person). To find a member ID, in Slack click the person’s name or avatar, choose View full profile, then More → Copy member ID; it looks like U0123ABCD. Paste one ID per line, and set your Slack Bot OAuth Token in the field just below. Available in MxChat core (the free plugin).
How does MxChat create Slack channels for live chats? Can I use one shared channel, make them private, or rename them?
By default each handoff creates a brand-new Slack channel for that visitor (named chat-… from their name, email, or session ID, trimmed to Slack’s 21-character channel-name limit) and reuses it for the rest of their conversation. One shared channel is now supported: set Shared Handoff Channel under Settings → Integrations → Slack to a channel ID (starts with C) or a #channel-name, invite your bot to it first with /invite @YourBot, and every handoff becomes its own thread in that one channel instead of a new channel — agents reply inside the thread, and !endchat in a thread ends just that chat. Leave it blank to keep the per-conversation channels. Two things are still fixed and have no setting: those per-conversation channels are created public (anyone in the workspace can join) and the chat- name prefix can’t be changed, so private channels or a custom prefix would still need a code customization. Available in MxChat core (the free plugin).
What field types can I use in a MxChat form — checkbox, radio, or dropdown?
The Forms add-on’s builder (MxChat → Form Collection) offers eight field types, set per field under Field Type: Static Text, Single Line Input, Message (multi-line), Email, Phone, Dropdown (single choice), Radio buttons (single choice), and Checkboxes (multiple choice). For the three choice types you supply a list of options and the visitor picks from them right in the chat instead of typing; checkboxes allow more than one selection, and every choice is validated against your option list before it’s saved. Choice values flow through to the submission email, the submissions table, and CSV export like any other field. Any field can be marked required and can reuse its label as the placeholder. Requires the Forms add-on.
Can I connect MxChat to my Facebook Page so people can ask questions through Messenger?
No — MxChat has no Facebook Page or Messenger channel. It runs as a chat widget on your own site: natively on WordPress, or on any other site (static HTML, Shopify, React, and the like) through the Anywhere add-on. There’s no way to receive or answer Facebook Messenger conversations inside MxChat; the only handoff channels are Slack and Telegram, and those route a human agent, not Facebook. To reach people coming from Facebook, embed the widget on a page you link to from your Page, or relay messages with a third-party automation. Available in MxChat core; the Anywhere add-on extends it to non-WordPress sites.
Is there a WordPress action hook fired when a visitor submits their email in the pre-chat form?
Not from the core pre-chat email gate — when a visitor submits the name/email form, MxChat stores the value in a mxchat_email_<session_id> option and writes it to the transcript row’s user_email column, then returns success without firing a do_action. To run your own code on capture from the core gate you currently have to read that option (or the transcript row), or poll the REST endpoint GET /wp-json/mxchat/v1/transcripts. If you need a real hook, collect the email through the Forms add-on instead — it fires do_action('mxchat_forms_submitted', $submission, $form) after every successful submission, passing the labeled fields plus session metadata. The pre-chat email gate is in MxChat core (it fires no hook); the Forms add-on adds the mxchat_forms_submitted action.
How do I collect a visitor’s name and email during the conversation instead of with a pre-chat form?
Use the Forms add-on. Create a form under MxChat → Form Collection with name and email fields, then give it Trigger Phrases (e.g. “contact support,” “more info”) or set Trigger After X Messages so it appears mid-chat when the visitor shows intent — not before the chat starts. To explain the form before the inputs show, add a Static Text field as the first field. Submissions are saved under Form Collection → Submissions (with CSV export) and can email an address you choose, so the data is captured without the pre-chat gate. This is different from core’s Require Email to Chat (Settings → Chatbot → Lead Capture), which forces name and email before the chat begins. Requires the Forms add-on; the pre-chat email gate is in MxChat core.
Does MxChat integrate with HubSpot or another CRM? How do I send captured leads to my CRM?
There’s no built-in HubSpot (or other CRM) connector, but three supported paths get your lead and chat data out. (1) Use the Forms add-on with a webhook or Zapier/Make on submission to post each captured lead straight into HubSpot or any CRM. (2) Pull the data programmatically with the REST API: from core 3.2.22, GET /leads returns each captured lead’s name, email, consent, originating page, first and last seen and conversation count, paged, with a since filter so a scheduled job fetches only new ones; GET /transcripts returns the conversations. (3) For plain email-list capture, the core Loops email-capture Action adds a visitor’s email to your Loops list. The REST API and Loops capture are in MxChat core; routing form submissions to a CRM requires the Forms add-on.
Can MxChat tell which orders or sales came from the chatbot?
No — MxChat does not attribute orders or revenue to the chat. With the WooCommerce add-on the bot can look up order status, order details, and a signed-in customer’s order history, but it does not tag which orders began from a chat or from a product the bot recommended. To measure chat-driven sales today, use a general analytics approach such as UTM-tagged links or your store’s analytics. Requires the WooCommerce add-on (for the order lookups the bot performs).
Can MxChat generate descriptions for custom meta boxes or inside the Classic editor?
Yes, as of Advanced Content v1.6.2. The SEO meta generator (page title, meta description, focus keyword, excerpt) still runs from the MxChat → Content screen, but the add-on now also adds an in-editor ✦ Generate with AI control: open any post or product in the Classic or block editor and you’ll get a generate button on the excerpt, on a WooCommerce product’s short and long description, and on any custom meta fields you allowlist. It drafts text into the field for you to review and edit — nothing is saved until you save the post. Turn it on and add fields under MxChat → Content → the In-Editor AI Generation card (enabled by default; list custom fields one per line as meta_key or meta_key|Label). Requires the Advanced Content add-on (Pro).
Can I use MxChat on a non-WordPress site (Shopify, React, plain HTML)?
Yes — the MxChat Anywhere add-on embeds your bot on any site via a single <script> tag, no WordPress required on the host page. Configure the bot inside WordPress as usual, then open MxChat → Embed Widget, enable the embed, whitelist the domains you’ll embed on, and copy the snippet — it looks like <script src="https://yoursite.com/wp-json/mxchat-embed/v1/loader.js?key=YOUR_SITE_KEY" async></script>. Drop it into any HTML page (Shopify themes, Next.js / React / Vue apps, a static site, plain vanilla HTML) and the widget renders inside a Shadow DOM, so the host page’s CSS can’t cascade in and the widget’s styles can’t leak out. Chat requests proxy back through your WordPress REST API, so API keys and system prompts never leave your server; only the public site key plus your domain whitelist are visible client-side. One current limitation: Anywhere supports the floating widget only — the inline shortcode/embedded mode isn’t available off WordPress. Requires the Anywhere add-on.
Does MxChat work with WhatsApp Business? Can the bot reply via WhatsApp?
Not as a live-agent channel. MxChat’s built-in human-handoff channels are Telegram and Slack (configured under MxChat → Settings → Integrations) — there is no native WhatsApp Business handoff or webhook integration. What MxChat does handle on the WhatsApp side is smart contact detection: if a visitor types a WhatsApp-formatted phone number into the chat, MxChat recognizes it and (with “Only send if visitor provided contact info” enabled on the Auto-Email Transcript setting) will trigger the transcript email so your team can follow up on WhatsApp manually. If you need visitors to reach you on WhatsApp from your site, a click-to-chat link or button plugin sits alongside MxChat without conflict. Available in MxChat core (the free plugin).
Can MxChat book appointments or schedule meetings inside the chat?
No — MxChat doesn’t have native appointment booking or calendar integration as of v3.2.6. The Forms add-on can capture name, email, phone, and preferred-time text fields and email the submission to you, but it doesn’t talk to Google Calendar, Calendly, Acuity, or any scheduling API. For a real booking flow, embed a Calendly/Acuity widget on your contact page and have the bot deep-link to that page when a visitor asks to book — you can do this with a custom AI Instruction (“If the user asks to book an appointment, send them to /contact/”). Forms capture available with the Forms add-on; native calendar/scheduling is not in MxChat today.
Does MxChat Forms support webhooks, Zapier, or a WordPress action hook on submission?
Yes, as of the Forms add-on v1.2.8. Each form has an optional Webhook URL field — set it and every submission is POSTed as JSON to that URL, ready for Zapier, Make, n8n, Slack, or a custom endpoint. Requests are signed with HMAC-SHA256 in an X-MxChat-Signature: sha256=… header (using a per-form signing secret you can regenerate), and a Webhook Log under Form Collection shows the last 100 delivery attempts per form. For PHP integrations, the add-on also fires a WordPress action hook — do_action('mxchat_forms_submitted', $submission, $form) — after every successful submission, passing the labeled fields plus session metadata. Full details in the Forms documentation. Requires the Forms add-on.
Can the chatbot add products to the cart or place orders directly through the chat?
It can add to cart; it doesn’t place the order. With the WooCommerce add-on, the bot detects “add to cart” intent in any language, resolves which product the user means from the conversation context, and calls WC()->cart->add_to_cart() in-place — the cart icon in the chatbot toolbar updates, and the visitor can keep browsing. The visitor still completes payment through WooCommerce’s standard checkout on your site; MxChat doesn’t take credit cards, process payments, or finalize the order itself. Enable the cart icon under MxChat → Toolbar & Components after activating the add-on. Requires the WooCommerce add-on.
Does the WooCommerce integration include custom product fields and attributes in the AI’s knowledge?
Yes — three layers. WooCommerce native attributes (both taxonomy-based ones like pa_color and the custom product-level attributes you add on a product’s Attributes tab) are pulled into product context automatically when the WooCommerce add-on is active. ACF fields on products are indexed when products are synced to the knowledge base; control which fields are exposed under MxChat → Knowledge → ACF Field Settings. For arbitrary post meta that isn’t ACF, opt individual meta keys into the index using the custom-meta whitelist on the same screen. Available in MxChat core; the WooCommerce add-on extends it with attribute extraction and cart/order/customer-aware responses.
Can MxChat write blog posts or landing pages with AI?
Yes. Open MxChat → Content → Generate, choose Blog Post or Landing Page in the Type dropdown, set Status (Draft, Scheduled, or Publish), pick a layout, and run the generator. Output includes AI-generated images and SEO metadata, with inline editing before saving. Available in MxChat core; the Advanced Content add-on extends it with smart internal linking, an image manager, and a content calendar for scheduling batches.
What is the Multi-Bot add-on and when do I need it?
Multi-Bot is a Pro add-on that lets you run multiple specialized chatbots on the same site, each with its own knowledge base, system prompt, welcome message, quick questions, and per-bot action controls. Deploy a specific bot with the shortcode’s bot_id attribute ([mxchat_chatbot bot_id="your-bot-slug"]) or pick a bot per page in the post editor. Use it when one bot’s persona or content scope shouldn’t bleed into another — e.g. a sales bot on product pages and a technical-support bot in the docs section. Requires the Multi-Bot add-on.
Can MxChat hand off to a live agent?
Yes — there are three built-in handoff destinations, all configured under MxChat → Settings → Integrations and each with its own availability schedule. Slack posts the conversation into a Slack channel. Telegram sends each visitor’s session into its own forum topic inside a Telegram supergroup (which must have Topics enabled), so your team can reply from their phone; it needs a bot token from @BotFather and the webhook URL MxChat shows on that screen registered with Telegram. Webhook, added in core 3.2.20, is outbound-only: MxChat POSTs a signed JSON payload to a URL you own — a helpdesk, CRM, or an n8n/Zapier/Make flow — and the visitor deliberately stays with the AI, because there is no inbound reply path and nobody should be left waiting on messages that cannot arrive. Your team follows up out-of-band. Direct integrations with Tawk.To, Intercom, Crisp or LiveAgent are not built in; Webhook is the supported way to reach one. Available in MxChat core (the free plugin).
Troubleshooting
Opening MxChat → WooCommerce gives a fatal error — “Allowed memory size exhausted” in class-wpdb.php — on a store with thousands of orders. Why?
A known bug in WooCommerce add-on 1.7.10 and earlier on stores that keep orders in the WordPress posts table (WooCommerce → Settings → Advanced → Features → Order data storage set to WordPress posts); stores on High-Performance Order Storage are not affected. The Sales Attribution cards on that page ask WooCommerce for the orders tagged as chat-attributed using a meta_query, with no limit and as full order objects — and WooCommerce’s legacy order store silently ignores meta_query in wc_get_orders(), so the call loads every processing, completed and on-hold order in the store, twice (a 30-day and an all-time card), on every visit to the page, whether or not attribution is switched on. With twenty thousand orders that is well past a 256 MB limit, which is why the error names class-wpdb.php and why it happens even when no order carries the MxChat marker. Nothing is wrong with your data, and the chatbot, product cards and cart keep working — only the add-on’s settings page dies (and, more quietly, the attributed-orders CSV export on such a store lists every order). Until the fix ships, add this snippet in a small plugin or a code-snippets tool; it re-applies the filter WooCommerce dropped, for any caller that passes one, which is WooCommerce’s own documented route for meta queries on the legacy store: add_filter('woocommerce_order_data_store_cpt_get_orders_query', function ($query, $vars) { if (!empty($vars['meta_query'])) { $query['meta_query'] = array_merge(isset($query['meta_query']) ? (array) $query['meta_query'] : array(), (array) $vars['meta_query']); } return $query; }, 10, 2); — the page then loads and the cards count only attributed orders. Moving the store to High-Performance Order Storage also resolves it, but that is a real migration on a large store, so do the snippet first; raising memory_limit is not a fix at this order count. A corrected add-on is filed as a critical fix. Requires the WooCommerce add-on.
My chatbot keeps recommending past, expired events — does MxChat tell the AI today’s date, and is there a setting for it?
From core 3.2.22, yes, automatically. Every request carries a line of the form Current date and time: Monday, September 21, 2026, 9:15 AM (Europe/Amsterdam). Anything dated before today is in the past., built from the timezone under Settings → General, so the model can tell a past meeting from an upcoming one without a rule from you. There is no setting because there is nothing to switch: the line rides with the per-message context rather than inside your AI Instructions, so it never changes the cached part of the prompt on providers that cache it. If you want the date at a particular spot in your own rules, {current_date} and {current_datetime} are replaced in MxChat → Settings → Chatbot → Behavior → AI Instructions — with the cost the hint under that field spells out: a placeholder changes the instructions once a day or once a minute and reduces how much of the prompt your provider can cache, so most sites do not need one. Developers can reword or drop the automatic line with the mxchat_current_datetime_line filter (return an empty string to suppress it). On 3.2.21 and earlier nothing told the model the date; the workaround was a shortcode in the instructions — add_shortcode('mxchat_today', function () { return 'Today is ' . wp_date('l, F j, Y') . '.'; }); and [mxchat_today] at the top of the field — and it still works, but is redundant once you update. Two things the date alone cannot fix: each event entry has to carry its own date in its text for the comparison to be possible, and for one-off events that have passed, trash or unpublish the post — with Auto-Sync on for that post type, MxChat removes its knowledge-base entry at the same time. Available in MxChat core (the free plugin).
The bot says “Embedding API error – check embedding API key.: Requests from referer are blocked” with my Gemini key — I added my domain in Google AI Studio and it still fails. Why?
The key is fine; it is restricted. Everything after the colon is Google’s own reply, and it means the Gemini API key carries an Application restriction of type Websites (HTTP referrers) while the request arrived with no referrer at all — which is why the sentence has a blank where a referrer should be. MxChat never calls Gemini from the visitor’s browser: every embedding, and every Gemini chat reply, is sent by your web server through PHP’s wp_remote_post(), and a server-to-server request carries no Referer header, so adding yourdomain.com/* to the allowed list changes nothing because no web page is making the call. Fix it where the key lives: open the key in Google Cloud Console under APIs & Services → Credentials (Google AI Studio’s API keys page links to the same project), set Application restrictions to None — or to IP addresses with your server’s outbound IP if your host gives you a fixed one — save, and allow a few minutes for the change to take effect; if you want a limit, use API restrictions to confine the key to the Generative Language API instead. Nothing needs changing in MxChat → Settings → API Keys unless you rotate the key, and because the same key serves a Gemini chat model, one change clears both errors. Available in MxChat core (the free plugin).
A video on my page starts playing by itself — sometimes with sound — every time a visitor sends a chat message. Why?
That is Contextual Awareness (MxChat → Settings → Chatbot → Behavior) on core 3.2.21 or earlier — update to 3.2.22, where it is fixed. Those versions read the page on every message by making a full live copy of the main content area and extracting its text; the copy stripped scripts, styles, navigation and the chat itself but not <video> or <audio>, so a copied player carrying a src and an autoplay attribute started loading and playing invisibly the moment it was created — with sound if the visible player’s muted attribute had been removed, which a custom unmute button usually does — and each message added another one that nothing on the page could stop, re-downloading the media file every time. From 3.2.22 the page text is read from an inert copy, a document that cannot fetch or play anything, and it is gathered once per page rather than once per message, so nothing plays and nothing is downloaded again; no setting changes and the bot sees the same page context as before. If you cannot update yet, either turn Contextual Awareness off on pages with media, or keep muted as an attribute on the element and start playback from video.play() rather than an autoplay attribute, since attributes are what the copy inherits. Available in MxChat core (the free plugin).
Every license key I received says “Invalid License Key” when I activate — I paid with PayPal. What’s wrong?
Almost always the email, not the key. Activation sends your key, your domain and the email you type to mxchat.ai, and the licence server looks the key up together with the email the licence was issued to — a real key registered to a different address comes back as “Invalid License Key”. The licence is issued to the billing email on your order, and when you pay with PayPal that is usually the email on your PayPal account, which can differ from the address you typed at checkout or use to sign in to mxchat.ai; on an Agency plan every key from the order is tied to that same address, so all of them fail together. Find it under My Account → Orders → View (it is shown with the billing address, and the “order complete” email carrying your keys went there too), then activate with that email. If you would rather the licence use your account email instead, email maxwell@mxchat.ai with the order number and the address you want. Available in MxChat core (the free plugin) — activation is on the Pro & Extensions screen, the bottom item in the MxChat menu.
My chatbot never shows the bouncing “typing” dots while it thinks — is that an add-on?
No add-on adds them. The three bouncing dots are part of the free core, appear on every message the bot handles, and have no setting to turn on or off. Three things can hide them. In Live Agent mode they are suppressed deliberately, because the message is being forwarded to a person rather than generated. With streaming switched on, the first token of the reply replaces the dots, so on a fast model they can flash past almost invisibly. And unless you have a saved theme from the Theme Customizer, each dot is painted in your Bot Message Font Color on the bot bubble’s own background — set those two to the same colour and the dots are rendering exactly as intended and cannot be seen. Available in MxChat core (the free plugin).
My visitors ask in Hebrew (or Spanish, Polish, Arabic…) and the bot says it doesn’t know — but the answer is in my knowledge base. Why?
Because retrieval happens before any translation. Every visitor message is embedded and scored against the vectors of your indexed content, and a question written in one language scores much lower against content written in another — often low enough that the right entry never clears your Similarity Threshold and never reaches the model at all. The reply still arrives in the visitor’s own language, because the chat model translates at the very end, and that is what makes this so easy to miss: the bot sounds fluent while answering from general knowledge. Check it in one place — MxChat → Settings → Testing → Last Query Analysis shows the last visitor query, the threshold in force, and every Document Match with its score, so you can see whether your entry scored low or was never returned. The durable fix is to index the answer in the language your visitors actually write in, so question and content are compared like with like; failing that, try a different embedding model at MxChat → Settings → Chatbot → AI Models (TE3 Small, Ada 2, TE3 Large, Voyage-3 Large or Gemini Embedding) and re-index the whole knowledge base afterwards, since stored vectors and live queries must come from the same model. Lowering the Similarity Threshold at MxChat → Settings → Chatbot → Behavior is a last resort and a small adjustment at most — a weak cross-language match that scrapes past a low bar is handed to the model as if it were the answer, which is worse than a clean “I don’t know”. If the bot ignores your knowledge base for every question regardless of language, you are looking at an embedding-model mismatch instead. Available in MxChat core (the free plugin).
I opened my Telegram webhook URL in a browser and got rest_no_route 404 — is my webhook broken?
No — that is the correct response. /wp-json/mxchat/v1/telegram-webhook is registered for POST only (includes/class-mxchat-integrator.php:673-677), so a browser visit, which is a GET, returns {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}} on a completely healthy install; a real POST to the same URL answers rest_forbidden 401 instead, because the route is guarded by your webhook secret. You are most likely copying the wrong box on MxChat → Settings → Integrations → Telegram → Webhook Setup: the first one is Your Webhook URL, which only Telegram ever calls, while the one meant for your browser is Register Webhook URL underneath it (api.telegram.org/bot…/setWebhook?url=…), which replies {"ok":true,"result":true,"description":"Webhook was set"}. To actually inspect the webhook, open https://api.telegram.org/bot<your bot token>/getWebhookInfo and read url, pending_update_count and last_error_message. If agent replies still are not arriving, work through the Telegram reply checklist. Available in MxChat core (the free plugin).
My Telegram agent topic doesn’t show the earlier AI conversation — is Telegram a separate add-on?
There is no Telegram add-on — the whole integration ships in MxChat core, under MxChat → Settings → Integrations → Telegram, and nothing extra needs installing. The handoff does send history: when a visitor asks for an agent, MxChat opens a forum topic in your supergroup and posts the session ID, the visitor’s name and email, a Recent Conversation block and the message that triggered the handoff. From core 3.2.21 that block carries the last ten messages — its heading says so (Recent Conversation (last 10 messages)) and a long history is split across several Telegram messages rather than dropped; on 3.2.20 and earlier it was the last five, and a history over Telegram’s 4,096-character limit could silently lose the whole handoff card, so update if your agents sometimes see no context at all. Either way it is a tail, not the transcript: the complete thread is always in MxChat → Transcripts under the session ID shown at the top of the topic (developers can change the count with the mxchat_handoff_history_count filter). Reply inside the topic to talk to the visitor, and type #close, #end, #disconnect or #done to end the session — from 3.2.21 closing the topic in Telegram itself does the same. Available in MxChat core (the free plugin).
On a phone the keyboard pops open by itself after every bot reply and covers the answer — can I stop that?
In MxChat core 3.2.19 and earlier there is no way to stop it, and no CSS or filter fixes it: every path that finishes a reply calls enableChatInput(), which re-enables the message box by calling focus() on it unconditionally (js/chat-script.js) — and on a touch device focusing a text input is what summons the on-screen keyboard, so the answer and any product cards are half-covered the moment they render. Marking the input readonly or changing inputmode suppresses the keyboard but also breaks typing, so neither is a real workaround. Core 3.2.20 (28 August 2026) made that focus conditional, so update if you are still on 3.2.19: the default setting auto focuses only on fine-pointer (mouse) devices, so phones and tablets keep the keyboard closed while desktop behaviour is unchanged, and a developer can override it site-wide with the mxchat_autofocus_after_reply filter returning 'on' or 'off'. Opening the widget still focuses the input either way — that focus is deliberate and is what makes the chat keyboard-accessible. Available in MxChat core (the free plugin).
AI Search Overview never appears above my WooCommerce product search results — what is stopping it?
The placement anchors, almost certainly — not a hook, not a setting, and not your theme’s templates. AI Search never uses woocommerce_before_shop_loop, woocommerce_before_main_content or the_content, so there is no server-side injection point to lose: its only gate is is_search() plus a non-empty term, which ?s=cricket+bat&post_type=product satisfies, and the card is then positioned by JavaScript after the DOM is built (deliberately — block themes render their templates during head processing, so a server echo lands in <head>). That JavaScript looks for a content scope of main, [role="main"], .site-main, #main, .content-area, then for .wp-block-query or the first article, .hentry, .post, .search-result inside it — none of which a WooCommerce ul.products grid emits, and the add-on contains no WooCommerce-specific code at all as of 1.0.3; with no anchor found the card is skipped silently. Confirm it in a minute from the browser console on that search page: if MxChatSearch is defined the add-on ran and it is purely a placement miss, and running document.querySelector('main, [role="main"], .site-main, #main, .content-area') then .querySelector('.wp-block-query, article, .hentry, .post, .search-result') on the result will return null at the step that is failing. Until product grids are a supported anchor, place the overview yourself with the MxChat AI Search block or the [mxchat_ai_search] shortcode on your shop or results template — that surface is independent of the overview toggle and works even with it off. Requires the AI Search add-on.
I turned on Auto-Email Full Transcript and configured it correctly, but no transcript emails ever arrive. Why?
Four things stop that email, and only the last one is a mail problem. First and most common: the transcript is sent by a scheduled WordPress event, so if WP-Cron is not running on the site — DISABLE_WP_CRON is set with no system cron replacing it, or a full-page cache serves visitors without ever hitting PHP — the send is queued and never fires. Check the queue with WP Crontrol or wp cron event list and look for mxchat_send_delayed_transcript sitting in the past. Second, the delay is measured from the visitor’s last message, not the first: every new message reschedules it, so a long conversation keeps pushing the 15/30/60-minute timer back. Third, if Only send if user provided contact info is on, any session with no email address or phone number in it is skipped silently — that alone explains most “some chats arrive, some don’t.” Fourth, the transcript goes out as a .txt attachment, so an SMTP plugin or relay that strips attachments can swallow it; confirm the addresses in Notification Email and check your mail log. All of these live under MxChat → Transcripts → Notifications — see also emailing transcripts to an admin and sending to several addresses. Available in MxChat core (the free plugin).
How long does a chat session last, and what actually ends it?
With Enable Chat Persistence on (MxChat → Settings → Chatbot → Display → Visibility) the session ID is stored in the visitor’s browser twice: a mxchat_session_id_<bot> cookie with a 24-hour lifetime, plus a localStorage copy with no expiry that the cookie is rewritten from whenever it lapses. So the practical answer is that the conversation follows that browser until its site data is cleared — the 24 hours is the cookie, not the ceiling. A visitor can end it deliberately with Start new chat where you have enabled that menu item, which issues a fresh ID on the spot. Turning persistence off does not change the ID; it stops history being loaded and limits what the model is shown to messages from the current page load, so every page load reads as a fresh conversation. Server-side, per-session state untouched for 30 days is swept automatically (filterable with mxchat_session_retention_days), while saved transcripts follow their own separate schedule — see transcript retention and starting a new chat. Available in MxChat core (the free plugin).
A visitor asked me to export or delete their personal data — are their chats included?
Yes, automatically. MxChat registers itself with WordPress’s built-in privacy tools, so running Tools → Export Personal Data or Tools → Erase Personal Data covers chat conversations, captured names and email addresses, and the temporary files left behind by documents uploaded into the chat — there is no separate MxChat step, and shortcut buttons sit on the Privacy & Data Requests card at the bottom of MxChat → Transcripts. A request only supplies an email address, so MxChat matches it three ways — the stored email, plus, when that address belongs to a registered account, the account’s user ID and username — which is what stops a logged-in visitor’s conversations from being missed. Link-click records have no email column of their own and are matched through the visitor’s sessions; independently of any request, their IP and browser details are anonymised after 30 days and the rows deleted after a year. Available in MxChat core (the free plugin).
How long does MxChat keep chat transcripts, and can I auto-delete them after just one day?
Yes — one day is a setting now, not a code snippet. Open MxChat → Transcripts → Notification Settings: the Auto-Delete Old Transcripts dropdown offers Never (Keep All), After 1 Week, After 2 Weeks and After 1 Month, and beneath it a Custom Retention (Days) number field takes any value from 1 to 3650 and overrides the dropdown when it is greater than 0 (leave it at 0 to use the dropdown). A daily WP-Cron job removes anything older, cascading to the translation and link-click rows so nothing is orphaned, and the line under the dropdown shows when the next cleanup is due — the quickest way to confirm it is armed. One catch worth knowing: the daily job is only scheduled while retention is switched on, so leave the dropdown on any value other than Never. Developers can still override the final day count in code with add_filter( 'mxchat_transcript_retention_days', function () { return 1; } );. Available in MxChat core (the free plugin).
Can I send chat notifications and transcripts to more than one email address?
Yes, from MxChat core 3.2.19 onward — Notification Email under MxChat → Transcripts → Notification Settings takes up to five addresses separated by commas (semicolons also work), and a repeated address is only mailed once. Validation is all-or-nothing on purpose: if any address in the list is invalid nothing is saved and the error names the one that failed, so you can’t end up believing a list is live when part of it isn’t. An empty field still falls back to your WordPress admin email. On 3.2.18 and earlier the field held one address and failed silently if you entered two: support@acme.com, sales@acme.com was stored as support@acme.comsalesacme.com, which passed WordPress’s own validity check, so alerts and transcripts went to a domain that doesn’t exist with no error anywhere — if you are on an older version, update or put a mail alias in the field. Available in MxChat core (the free plugin).
Transcripts → Message Context says “No action analysis available for this message” even though I’ve set up Actions — why?
That panel reports one thing: how your Trigger Phrases scored against the message. It stays empty unless at least one trigger-phrase action is enabled and enabled for the bot that answered. The usual cause is that you configured AI Tools instead — the native function-calling side of MxChat → Actions — which has no similarity scoring to report. From MxChat core 3.2.19 the transcript records AI Tools separately, so a firing tool is no longer invisible: each message lists which tools ran, how long each took, and the error text if one failed. Tools that handle money, customer records or a live-agent handoff log only the fact that they ran, never their arguments. Either way the record is written as the answer is generated and never backfilled, so it won’t appear on conversations from before you added the action. Available in MxChat core (the free plugin).
Why don’t my Display settings show up in the chatbot inside the admin Testing tab — is it front-end only?
Most of them do show up there. MxChat → Settings → Testing renders the real chat widget through the ordinary shortcode in inline mode (the equivalent of [mxchat_chatbot floating="no"]), so Top Bar Title, Introductory Message, Input Placeholder, AI Agent Text, Show Download Transcript Button and Show Start-New-Chat Button all take effect in the Testing panel exactly as they will on your site. What cannot appear is anything that belongs to the floating bubble, because the Testing tab has no bubble to attach it to: the Chat Teaser Pop-up is only rendered in floating mode, and Auto-Display Chatbot merely decides whether the bubble is added to your pages at all. To check those, open the chatbot on the front end of your site instead. Remember also that settings save on blur, so click out of a field and wait for the green tick before reloading the Testing tab — see the no-Save-button entry. Available in MxChat core (the free plugin).
My chatbot keeps asking visitors to join our mailing list — how do I turn that off?
That prompt comes from core’s Loops email-capture action, which can be wired in two independent places, both under MxChat → Actions. Open AI Tools and disable the tool named “Collect Email”, then open Trigger Phrases and remove or disable any action whose callback is “Loops Email Capture” — trigger phrases are matched first, so a leftover phrase keeps firing even after the AI tool is switched off. Both routes run the same code and produce the same “Would you like to join our mailing list?” message, so the chat itself won’t tell you which one fired — check both places. Adding a “never ask for emails” rule to your AI Instructions will not reliably stop either one, because actions are dispatched outside the model’s reply text. This is separate from Require Email to Chat (the pre-chat gate) and from the Forms add-on’s mid-chat forms. Available in MxChat core (the free plugin).
Will a logged-in visitor see their own chat history again if they come back on another device, or after clearing cookies?
No — the visitor-facing chat window remembers a conversation per browser, not per WordPress account. MxChat stores a random session ID in a mxchat_session_id_<botId> cookie (mirrored in localStorage) that expires after 24 hours, and it is never derived from the user ID, so the same logged-in person on a laptop and a phone has two separate conversations, and clearing cookies starts a fresh one. Reloading the previous conversation into the widget at all requires Chat Persistence, which is off by default — turn it on under MxChat → Settings → Display Settings. Note this is only about what the visitor sees: on the admin side every message is already saved against the WordPress account, which is a separate thing — see are conversations stored per logged-in user. Available in MxChat core (the free plugin).
Are chat conversations stored per logged-in WordPress user, or only per session?
Both — MxChat records the WordPress account on every message it saves, and there is no setting to switch on. For a logged-in visitor each stored message carries their WordPress user ID, their username as the user identifier, and their account email; a logged-out visitor is stored against their IP address instead and shows as Guest. Open MxChat → Transcripts to see it — every conversation is labelled with the name you captured, the first part of their account email, or their username, and the Leads view collects visitors who left contact details (see seeing what visitors are asking). Available in MxChat core (the free plugin).
My chatbot replies “Sorry, I’m having trouble responding right now. Please try again in a moment.” — what’s wrong?
That is the generic message MxChat shows a visitor whenever the AI chat provider (OpenAI, Claude, Gemini, Grok, DeepSeek, or OpenRouter) rejects the request, on both streaming and non-streaming replies — the raw provider error is deliberately hidden from visitors. The two usual causes are (1) the selected chat model isn’t available on your API key (a retired or renamed model, or a key without access to it), or (2) an invalid API key, no remaining credit, or a rate limit. To see the real reason, open the chat while logged into WordPress as an administrator and resend the message — admins get the specific error instead of the generic text (for example, “The selected AI model isn’t available on your API key. Choose another model in MxChat → Settings.”), then fix the model or key under MxChat → Settings. If the message instead reads “Embedding API error — check embedding API key,” that is a different failure — see the embedding-key fix. Available in MxChat core (the free plugin).
My live-agent handoff (Slack or Telegram) shows the visitor as “Anonymous” with no name or email — how do I capture their details?
The handoff notification fills its User and Email lines from whatever identity has been captured for that session, so it reads “Anonymous” / “Not provided” when nothing was collected. Three things populate it: a logged-in WordPress user, pre-chat capture — enable Require Email to Chat and the name field under MxChat → Settings → Chatbot → Lead Capture — and, from Forms add-on 1.2.12 onward, any form the visitor fills in during the chat. The Forms path needs no setup: it takes the email from the form’s first email field and the name from the first text field whose label mentions a name, and a later non-empty answer replaces an earlier one while an empty one never blanks what you already had. On Forms 1.2.11 and older a mid-chat submission was stored on its own and did not replace the “Anonymous” label — update the add-on, or wire the mxchat_forms_submitted hook yourself. Available in MxChat core; the Forms add-on (1.2.12 or newer) also feeds mid-chat name and email into the handoff automatically.
How do I see which page a visitor was on when they asked the chatbot a question?
Every conversation records the page the visitor was viewing. Open MxChat → Transcripts and select a chat under All Chats — the conversation’s detail panel shows a clickable Page link to the exact URL the visitor was on when they started chatting. The Leads tab goes further: each captured lead has a Page column, there is a Top Pages breakdown, and you can filter leads by page URL. (The originating page is also returned with every message by the Transcripts REST API if you pull data programmatically.) This is separate from seeing what questions visitors ask — that shows the messages, this shows where they came from. Available in MxChat core (the free plugin).
Why is my chatbot slow to respond, and how do I speed it up?
Most of the wait comes from the AI model and provider you chose, not MxChat itself. Enable Streaming (MxChat → Settings → Chatbot → AI Models) makes replies appear word-by-word as they are generated, which feels far faster — it ships off on a fresh install, so turn it on first. MxChat streams OpenAI, Claude, Grok, DeepSeek, OpenRouter and Custom Provider endpoints; Google Gemini is the one built-in provider with no streaming path, so a Gemini model makes the visitor wait for the whole answer however the toggle is set (see Gemini and streaming). Large or free models are also simply slower to compute, so if replies still drag, switch to a lighter model on a streaming-capable provider; shortening replies helps as well (see limiting response length). This is about reply speed — the widget’s effect on your page-load time is covered separately under page speed. Available in MxChat core (the free plugin).
How do I see what questions visitors are actually asking my chatbot?
Open MxChat → Transcripts in WP admin — that is the record of every conversation the bot has had, and it is part of the free core, so you do not need Pro for it. The Transcripts Dashboard opens on engagement stats (Total Chats, Total Messages, Unique Users, Avg Messages/Chat and recent activity); All Chats lists each conversation in full — the visitor’s messages, the bot’s replies, the knowledge-base sources it used and timestamps — and Leads collects visitors who left a name or email. Use Export All Chats to pull everything out for offline analysis (see exporting transcripts), or have conversations delivered to you automatically under Notification Settings (see emailing transcripts to the admin). Reading the questions your bot answered badly is also the quickest way to find gaps worth adding to your knowledge base. Available in MxChat core (the free plugin).
How do I stop bots or bad actors from spamming my chatbot and running up my API costs?
MxChat has no built-in reCAPTCHA or CAPTCHA; the built-in lever is Rate Limits, under MxChat → Settings → Chatbot → Rate Limits. Set a cap and timeframe on the Logged Out Users role — that is where anonymous and scripted traffic lands, and it defaults to 10 messages per day, counted per visitor IP rather than as one shared pool. Then set the Total chatbot message limit at the top of the same screen for a single ceiling across the whole site per timeframe; it defaults to Unlimited, and it is the one setting that caps your worst-case spend no matter how many visitors turn up. Beyond MxChat, ban repeat abusers with the Moderation add-on and set a spend limit on the API key in your provider’s own dashboard, since they bill you directly. See also how rate limits are counted and prompt-injection hardening. Rate Limits are in MxChat core (the free plugin); banning abusive visitors requires the Moderation add-on.
Does MxChat use XML-RPC, and is it safe to disable XML-RPC?
No — MxChat does not use WordPress’s XML-RPC interface (xmlrpc.php) at all. It talks to your site through the WordPress REST API (its endpoints live under /wp-json/mxchat/v1/) and through admin-ajax.php for the in-page chat requests. So disabling or blocking XML-RPC as a security-hardening step won’t affect the chatbot in any way. Available in MxChat core (the free plugin).
Slack live agent: the channel is created with the conversation, but the agent’s replies never reach the website chat widget — how do I fix it?
Start with the Event Subscription URL, which is the usual cause. Agent replies come back through Slack’s Events API, and the endpoint MxChat exposes is /wp-json/mxchat/v1/slack-messages — not /slack-interaction (that route only handles interactive button payloads and does not answer Slack’s URL‐verification challenge, which is why verification fails or 404s). Set the Request URL to https://YOURSITE/wp-json/mxchat/v1/slack-messages, wait for the green Verified, add message.channels under Subscribe to bot events, and reinstall the app so the scope takes effect. Confirm the Slack Webhook URL, Slack Secret Key and Slack Bot OAuth Token are all set under MxChat → Settings → Integrations → Slack, that the bot is a member of the channel, and that permalinks are not set to “Plain” (Settings → Permalinks) or REST routes 404.
If you have verified all of that and replies still vanish, the handler is receiving your message and dropping it on purpose. Three causes, all silent:
1. Replying in a thread when you should reply in the channel, or the reverse. This is the most common one. In the default mode MxChat opens a fresh channel per conversation; on 3.2.20 and earlier it only read messages posted in the channel, so a threaded reply under the handoff message was discarded — from 3.2.21 a thread reply inside a per-conversation channel reaches the visitor too. If instead you have set a shared channel in the Slack settings, the rule is strict: every conversation lives in a thread rooted at its handoff message, and you must reply inside that thread for MxChat to know which visitor you are talking to. Replying at channel level there reaches nobody. 2. Anything Slack tags with a message subtype is ignored — that includes replies you edit after sending, and replies sent as a file, snippet or image upload rather than typed text. Type the reply as a plain message; from 3.2.21 the agent sees a short note in the channel when one of these is dropped, and Debug Mode logs it. 3. A private shared channel. Posting into one works, so the handoff still appears in Slack and everything looks healthy — but inbound events for a private channel arrive as message.groups, which is not the scope the setup asks you to subscribe to, so nothing comes back. Use a public channel, or add the groups:history scope, subscribe to message.groups alongside message.channels and reinstall the app — from 3.2.21 the Slack settings screen warns you when the shared channel is private. See the Telegram equivalent and live-agent handoff. Available in MxChat core (the free plugin).
Why do I get a 403 (Forbidden) error when adding a PDF to the knowledge base?
A 403 on PDF import almost always comes from your host’s security layer, not from MxChat itself. When you upload a PDF file under MxChat → Knowledge Base, WordPress POSTs it to the admin handler, and hosts with an aggressive firewall/WAF (SiteGround, Cloudflare “Under Attack” mode, Wordfence) often block a binary PDF upload with a 403 before the request even reaches PHP — turning off page caching does not affect the firewall, so ask your host to whitelist the upload (the admin-post / admin-ajax request). When you import a PDF by its URL, MxChat fetches that URL server-side; if the PDF is on the same server, the box’s own hotlink or loopback rule can return a 403 to that self-request — upload the file directly, or paste the text via Direct Content, instead. If you instead see “Access denied” on the first chat message, that is the separate stale-nonce issue: confirm you are on 3.2.7+ and exclude the chat page from caching. Available in MxChat core (the free plugin).
My chatbot suddenly stopped answering anything and shows an “Embedding API error – check embedding API key” message — how do I fix it?
Before the bot replies to anything, it turns each visitor message into an embedding (a vector) so it can search your knowledge base — so if your embedding provider rejects the API key, every message fails and the bot goes silent for everyone, not just during imports. Fix it by re-checking the API key for your selected embedding model in MxChat → Settings: make sure it is valid, not expired, has billing/credit, and belongs to that embedding model’s provider. Your embedding key can be different from your chat-model key — for example, a Google “API key not valid. Please pass a valid API key.” message means the Gemini/Google embedding key is the one that’s bad. Once a working key is saved, replies resume immediately. If the text after the colon reads “Requests from referer are blocked”, the key is valid but restricted to websites — see this entry. Available in MxChat core (the free plugin).
I built a MxChat Forms form but it never appears in the chat — why?
A form only shows up when something triggers it, so a form with no trigger stays hidden. Open MxChat → Form Collection, edit the form, and make sure it has at least one trigger: trigger phrases (the form appears when a visitor’s message semantically matches them — matching is governed by the Similarity Threshold, default 0.85, which is fairly strict, so lower it or add closer phrasing if the form never fires), an after-a-set-number-of-messages count, or expose the form as an AI tool. Also confirm the form is enabled and isn’t restricted to a logged-in role the visitor doesn’t have, and that the chatbot itself is displaying on the page. Note that MxChat Forms appears inside the chat widget — it is not a standalone WordPress contact-form shortcode you place on a page. Requires the Forms add-on.
Is MxChat protected against prompt injection, and how does it handle malicious input?
MxChat applies standard WordPress hardening to every chat request: the message endpoint is nonce-verified and the incoming text is run through wp_kses so only basic code/formatting tags survive (scripts and arbitrary HTML are stripped), and replies are escaped on output. There is no dedicated prompt-injection filter that detects instruction-override attempts such as “ignore your previous instructions” — as with any LLM chatbot, resistance to that ultimately depends on the AI model you choose. You can harden behavior by adding rules under MxChat → Settings → AI Instructions (for example, telling the bot to refuse out-of-scope or override requests), filter incoming messages yourself with the mxchat_filter_message hook, and use the Moderation add-on to ban abusive visitors. The request hardening and AI Instructions are in MxChat core (the free plugin); visitor banning requires the Moderation add-on.
Why do I suddenly see “Connection error when generating embeddings: The ‘openai’ AI connector has not been approved for use by mxchat-basic”?
MxChat does not produce this error and has no “AI Services” screen of its own. It sends embedding and chat requests straight to your AI provider over HTTPS using the API key you set under MxChat → Settings. The wording “the ‘openai’ AI connector has not been approved for use by ‘mxchat-basic/mxchat-basic.php’” is added by a separate layer on your site that intercepts outbound AI calls and requires each plugin to be approved first — usually the WordPress AI Services framework/plugin or a managed-host AI gateway; MxChat only relays that message. Because it worked before and broke suddenly, a recently installed or updated plugin is now brokering the request: open that tool’s settings and approve mxchat-basic for the OpenAI connector, or turn off the interception so MxChat can reach OpenAI directly with its own key (and confirm that key is still set and funded). Available in MxChat core (the free plugin).
Why does importing content fail with “Failed to store any chunks — every chunk failed to embed”, “Failed to generate embedding for content”, or “Failed to store content in database”?
All of these come from the indexing step, not from the chat: MxChat turns each piece of content into a vector embedding and then stores it. On MxChat core 3.2.16 and later the error tells you which half failed, and why. “Failed to store any chunks” now continues with either “— every chunk failed to embed”, followed by the embedding provider’s own reason (fix the API key for the provider that matches your selected embedding model under MxChat → Settings → API Keys; a key showing as “detected” only means it is present, not that it is funded), or “— embeddings generated but storage failed”, which points at your Pinecone index or database instead; a partly-failed import reports both counts. “Failed to store content in database:” is only the wrapper an Import from URL puts around the real message, so read the part after the colon. On earlier versions that one sentence covered both causes — which is why so many imports sent people off to rebuild a Pinecone index when the real fault was the key. There, use “Failed to generate embedding for content” as your diagnostic: it is always the embedding provider, and it appears only on content shorter than your Chunk Size (chunking is on by default at 4,000 characters), so an import reporting both messages on different items is one problem and not two. Fix the key, re-import, and only then suspect storage. On Pinecone, an index whose dimensions don’t match your embedding model (3072 for Text-Embedding-3 Large, 1536 for TE3 Small, Ada 2 or Gemini, 2048 for Voyage-3 Large) makes every upsert fail. Available in MxChat core (the free plugin).
Does the chat widget slow down my site, and can I defer or delay when it loads?
MxChat’s front-end footprint is light — one stylesheet and one JavaScript file, loaded in the page footer — and you can control exactly when the script loads to protect your page-speed scores. Go to MxChat → Settings → Optimization & Diagnostics → Script Loading and pick a Script Loading Strategy: Default (loads immediately), Deferred (after the HTML finishes parsing), Delay 1/3/5 seconds, or On User Interaction (loads on the first scroll, mouse-move, or touch). On User Interaction is best for Core Web Vitals and LCP because the chat script stays out of the initial page load, at the cost of the widget appearing a moment later. MxChat doesn’t publish fixed file sizes — measure your own pages with a tool like PageSpeed Insights after picking a strategy. Available in MxChat core (the free plugin).
How can a visitor reset the chat and start a brand-new conversation?
Yes — MxChat core now has a built-in Start new chat option. Turn it on under MxChat → Settings → Display → Show Start-New-Chat Button (off by default), and a “Start new chat” item appears in the chat window’s menu; tapping it asks for a quick confirmation, then clears the current conversation and begins a fresh session. You can rename the menu item with the adjacent label field. Separately, whether a conversation carries over on its own is still governed by Enable Chat Persistence (Settings → Chatbot → Display Settings): with it off, every fresh page load already starts a new session; with it on, the chat is kept for about 24 hours in the visitor’s browser (a mxchat_session_id_<bot> localStorage key plus a cookie). A change of IP mid-conversation does not reset it — holding the session ID is what proves ownership, so MxChat simply re-records the new owner and the history continues. For what does end a session, see how long a chat session lasts. Available in MxChat core (the free plugin).
The pre-chat form shows “Failed to save email” when a visitor enters their email — how do I fix it?
The usual cause is a stale security nonce served from a full-page cache. The email/name gate submits the nonce baked into the page HTML, and — unlike the chat-send path, which fetches a fresh token per message since 3.2.7 — the gate doesn’t refresh it, so a caching plugin (WP Rocket, LiteSpeed, W3 Total Cache) or Cloudflare full-page caching can hand a visitor an expired nonce and the save is rejected. Exclude the page that hosts the chatbot from full-page caching (or flush your caches) and hard-refresh once. Note the address is stored server-side — in a WordPress option plus the chat transcript row — not in the visitor’s browser, so private/incognito mode isn’t the cause. One more thing to check: if you also enabled Require Name, the visitor must fill both fields — submitting with the name left blank is rejected. Available in MxChat core (the free plugin).
The Order History action returns “API key is not set” — how do I fix it?
First, there is no separate WooCommerce API key to set — order data is read through native WooCommerce, and the action’s reply is written by your selected chat model, so it uses that model’s key (set under MxChat → Settings → API Keys). If you run a non-OpenAI model (Claude, Gemini, Grok, or DeepSeek), this error was a bug: older WooCommerce add-on versions looked specifically for an OpenAI key in the order-checking path, so the action failed even when your model’s key was set. Update the WooCommerce add-on to 1.7.4 or newer and it uses whichever provider key your chat model runs on. If you’re on OpenAI and still see it, your chat model’s key is genuinely empty — add it and save. Also confirm the WooCommerce add-on and your Pro license are active and that the Order History action is enabled under MxChat → Actions. Requires the WooCommerce add-on; the chat-model API key lives in MxChat core.
How do I get chat transcripts (or new-chat alerts) emailed to the admin automatically?
Go to MxChat → Transcripts → Notification Settings (the settings icon on the Transcripts screen). Two separate options live there: Enable Chat Notifications emails your Notification Email whenever a new chat session starts, and Auto-Email Full Transcript sends the entire conversation to that address after the chat ends — you pick a 15-, 30-, or 60-minute delay and can choose to send only when the visitor left contact info. Both run automatically, so you don’t need the manual “Export All Chats” button for routine delivery. Available in MxChat core (the free plugin).
Why does the chatbot ignore my knowledge base and answer from general knowledge instead?
The usual cause is an embedding-model mismatch. Your knowledge base is searched by comparing each visitor question against the vectors created when you indexed your content, and both sides must come from the same embedding model. If you change the embedding model (MxChat → Settings → Chatbot → AI Models → Embedding Model) after indexing — or index with one model and query with another — similarity scores collapse and nothing matches, so the bot falls back to its own general knowledge. Fix it by choosing one supported model (OpenAI TE3 Small/Large or Ada 2, Voyage, or Gemini) and re-indexing your entire knowledge base with it from MxChat → Knowledge. Turning “Use custom provider for embeddings” on or off is itself a model change: since 3.2.8 that toggle routes indexing and live queries through your custom endpoint, so flipping it after you have already indexed leaves your stored vectors on the old model. Re-index rather than switching back — see using a local embedding model. (On 3.2.7 and earlier the toggle affected live queries only, which did leave a permanent mismatch.) If matches are still sparse, lower the Similarity Threshold (try 20–40). Available in MxChat core (the free plugin).
The chat widget isn’t showing up on my site — what should I check?
The most common cause is that auto-display is off: the floating widget only appears when MxChat → Chatbot → Auto-Display Chatbot is turned on, and it’s off by default — a fresh install shows nothing until you enable it (or finish the onboarding wizard’s Appearance step). If auto-display is on but the widget is still missing, check three things: (1) the page’s MxChat Settings box isn’t set to Hide, (2) your cache — after changing settings, purge your full-page cache (W3 Total Cache, WP Rocket, LiteSpeed, or your host/Cloudflare), not just the MxChat toggle, and (3) a theme or other plugin isn’t suppressing the wp_footer hook MxChat uses to inject the widget. A useful tell: MxChat renders the widget server-side on wp_footer, so if you View Source on the live page and the stylesheet loads but there’s no widget container in the raw HTML, the cause is server-side — a stale full-page cache serving HTML from before you enabled the widget, a theme that never calls wp_footer(), or a page/post-type visibility rule — not the browser or JavaScript. This is also why “it works in the dashboard Testing tab but not on the live site” happens: the Testing tab renders inside wp-admin and bypasses both your cache and those front-end display gates. As an alternative to auto-display, you can drop the bot onto a specific page with the [mxchat_chatbot] shortcode. Available in MxChat core (the free plugin).
How can I see how many messages have been used, and does the rate limit reset?
The per-visitor message limit resets automatically on the timeframe you set for each role — hourly, daily, weekly, or monthly — under MxChat → Settings → Chatbot → Rate Limits; the counters roll over as each window elapses, so a “monthly” limit gives every visitor a fresh allowance each month. That is how it works from core 3.2.22; on 3.2.21 and earlier every counter was cleared hourly whatever timeframe you chose, so a daily, weekly or monthly cap effectively reset each hour, and logged-out visitors were counted by a client-supplied address header — 3.2.22 counts against the address the request really came from (Cloudflare is recognised automatically; other proxies can use the mxchat_client_ip filter). If your limits never seemed to bite, update. Per-role counts are tracked per individual visitor rather than as one running total; if you do want a single site-wide total, set the separate Total chatbot message limit on the same screen (see setting a combined limit). For overall volume, MxChat → Transcripts shows total messages and chats for Today / Last 7 Days / Last 30 Days, and the REST API’s /transcripts endpoint accepts since and until for a custom date range. There is no in-chat counter telling a visitor how many messages they have left. Available in MxChat core (the free plugin).
Can I set a message limit above 100, share one combined limit across all visitors, or show visitors how many messages they have left?
Yes, yes, and no. Under MxChat → Settings → Chatbot → Rate Limits the Limit dropdown offers presets (1, 3, 5, 10, 15, 20, 50, 100, unlimited) plus a Custom… option that reveals a number field, so you can set any limit above 100 — on the site-wide cap and on each per-role limit. For one combined limit, use the Total chatbot message limit at the top of that screen: the plugin describes it as “a single ceiling across all users and all roles, per timeframe,” independent of the per-role limits, and when both are configured whichever is hit first stops the conversation. It defaults to Unlimited, so existing sites are unchanged until you set it. There is still no in-chat counter showing how many messages a visitor has left — your custom limit message only appears once the cap is hit, and running totals live under MxChat → Transcripts. Available in MxChat core (the free plugin).
Is the chatbot rate limit per user, or shared across everyone in a role?
The per-role limit is per individual person, not a shared pool. Under MxChat → Settings → Chatbot → Rate Limits you set a message limit and timeframe for each WordPress role, but the role only decides which limit applies — each logged-in user is counted by their own user ID and each logged-out visitor by their own IP address. So a “50 messages per day” cap on the Subscriber role means every subscriber gets 50 each, not 50 split between them all. Counters reset automatically once the chosen timeframe (hourly, daily, weekly, or monthly) elapses. If you want one ceiling shared across everybody instead, that is the separate Total chatbot message limit at the top of the same screen (see setting a combined limit). Available in MxChat core (the free plugin).
I see an “Access denied” error on the first chat message — how do I fix it?
The usual cause is a stale security nonce served by a full-page cache — a caching plugin (WP Rocket, LiteSpeed Cache, FlyingPress, W3 Total Cache) or Cloudflare APO/full-page caching hands a brand-new visitor cached HTML carrying an expired nonce, the first chat-send POST fails with 403, and the widget surfaces “Access denied: Your session may have expired.” MxChat 3.2.7 fixes this for good: the widget now fetches a fresh security token per message from /wp-json/mxchat/v1/nonce instead of trusting the value baked into cached page HTML, so it works behind full-page caches with no manual exclusion. Confirm under MxChat → About that you are on 3.2.7 or later and hard-refresh the page once. If you are on an older build and cannot update yet, exclude the page hosting the chatbot from your caching plugin’s (or Cloudflare’s) page-cache rules as a stop-gap. A second, distinct cause is the Moderation add-on — if the message reads “Access denied. Your IP address has been banned” or “Your email address has been banned,” remove the matching entry under MxChat → Moderation → Bans. Available in MxChat core; the Moderation add-on extends it with IP/email ban enforcement.
Can visitors talk to the chatbot instead of typing? Is there voice input?
Not currently. MxChat’s chat widget is text-only — the input field accepts typing, paste, and the existing emoji and file-upload buttons (when the Image Analysis add-on is active), but there is no built-in microphone button or speech-to-text capture. The absence is total rather than partial: no plugin in the range references SpeechRecognition, getUserMedia or any audio API, so there is nothing half-built to enable. What you can do today is drive the widget from the browser’s own speech API with a short child-theme snippet — the how-to is here, with the selectors and the browser caveats. A native voice button is not currently scheduled; if you want one, say so — asks like this are what move it up. Available in MxChat core (the free plugin).
How do I get MxChat to retry automatically when the AI provider rate-limits or errors out?
MxChat does not auto-retry failed provider calls — a Gemini “model overloaded,” OpenAI 429, or Claude overload error is surfaced to the user verbatim and the chat continues with the next message. The practical workaround is to switch to a less rate-limited provider or model under MxChat → Settings → Chat Model, or paste an OpenRouter key under MxChat → Settings → API Keys so you can move between 100+ backends behind one credential when one provider is busy. Available in MxChat core (the free plugin).
Is MxChat WCAG / ADA accessible? Is the chatbot screen-reader friendly?
The chatbot ships with real accessibility primitives — but no formal audit and no claimed WCAG conformance level. What’s in the box: every interactive control in the chat header (open, close, send, copy, 3-dot menu) has an aria-label, the pre-chat form fields use sr-only labels for screen readers, all buttons are keyboard-focusable, and the 3-dot overflow menu exposes proper role="menu" / role="menuitem" semantics with Escape and arrow-key support. What’s NOT shipped: a third-party WCAG audit, an accessibility statement, or a claimed conformance level (A, AA, or AAA). Color contrast depends on the bot bubble and text colors you choose in MxChat → Chatbot — if your brand palette is low-contrast, the widget will inherit that. If you need formal WCAG-AA or ADA compliance for your site, plan to audit the chatbot in context of your theme and colors before signing off. Available in MxChat core (the free plugin).
Telegram live agent: I get customer messages in the supergroup but my replies don’t reach the customer — why?
Your replies travel back through a webhook: Telegram POSTs your message to /wp-json/mxchat/v1/telegram-webhook on your site, and that handler routes it into the visitor’s chat session. Four things to check, roughly in the order they break. (1) The Webhook Secret — since 3.2.14, a webhook with an empty secret is only accepted when the request arrives from Telegram’s own published IP ranges (includes/class-mxchat-integrator.php:833-849), and behind Cloudflare or any reverse proxy your site sees the proxy’s address instead, so every agent reply is silently rejected; set a secret under MxChat → Settings → Integrations → Telegram, save, then re-open the Register Webhook URL link on that screen, which now carries &secret_token=. From 3.2.21 these rejections are no longer silent: the Telegram settings screen and a dashboard notice count them and say why — an address outside Telegram’s ranges, a webhook registered without the secret, or a secret that doesn’t match — with the fix for each. (2) Topics — your supergroup needs Topics enabled (Group → Manage → Topics), and you must reply inside the per-visitor topic, because messages posted in General are ignored on purpose. (3) Permalinks — WordPress permalinks must be set to anything other than “Plain” (Settings → Permalinks), or REST routes return 404. (4) A topic an agent ended with #close — fixed in 3.2.21, where ending a conversation from MxChat or from Telegram itself retires the topic and the visitor’s next request opens a fresh one. On 3.2.20 and earlier the next handoff reused the closed topic, which Telegram gives no compose box, so you could read their messages and not answer — update, or until you do, have the visitor start a fresh chat in a new browser session. The reverse direction — a handoff or visitor message that never appears in Telegram — is recorded from 3.2.21 on the Telegram settings screen with Telegram’s own reason. Note that opening the webhook URL itself in a browser returns rest_no_route 404 on a perfectly healthy install — that is expected, not a diagnosis. Available in MxChat core (the free plugin).
Where does my chat data go — does the AI provider see my visitors’ messages?
Conversation history is stored locally in your own WordPress database; nothing is sent to MxChat’s servers, and we never see your messages or your API keys. Each visitor message is forwarded to whichever AI provider you configured — OpenAI, Anthropic, Google, xAI, DeepSeek, OpenRouter, Azure OpenAI, or any OpenAI-compatible endpoint you point MxChat at — and that provider sees the message in transit under its own privacy policy. Because the custom-provider option accepts any OpenAI-compatible URL, pointing it at a model running on your own server (Ollama, LM Studio, vLLM) keeps conversations inside your infrastructure end to end. You stay in control of what is kept: set a retention period, export transcripts, or delete individual conversations from MxChat → Transcripts. Available in MxChat core (the free plugin).
Can I export chat transcripts?
Yes. Open MxChat → Transcripts in WP admin to view every conversation with full context — visitor messages, AI replies, the knowledge-base sources used for each answer, and timestamps. The Export All Chats button on that screen downloads the lot, and individual conversations or captured leads can be deleted from the same place. That screen is also where you review what visitors have been asking. Available in MxChat core (the free plugin).