Docs
Mignuti Chatbot is a Web Component. If your platform lets you paste a <script> tag, you
can embed Mignuti Chatbot. Below: the 60-second quickstart plus eight platform-specific recipes.
Not technical? For WordPress there's a no-code plugin. For every other platform it's one line your team can paste in two minutes.
Quickstart (60 seconds)
- Sign up at /en/signup (free, no credit card).
- Onboarding wizard creates your first project. Choose a vertical template or upload a document (PDF, text, Markdown) or paste a URL.
-
Step 3 generates your embed code — one line of HTML with a
data-projectattribute. - Paste that line into your site. Reload. The chat launcher appears bottom-right.
Embed-tag anatomy
<script
src="https://widget.mignuti.com/v1.js"
data-project="prj_4f9c…" // public widget key
data-secret="sec_9b21…" // bcrypt-bound secret
data-consent="granted" // 'pending' | 'granted' | 'denied'
async></script> - data-project: public key, safe to expose in HTML.
- data-secret: bcrypt-bound, validated server-side. Without it, the widget will not boot.
- data-consent: defaults to
pending— the widget waits for an explicitwindow.MignutiChatbot.setConsent('granted')call before it loads sessions or writes localStorage. Wire that into your cookie banner (see Consent). - async: never blocking. The widget weighs about 37 KB (gzip).
WordPress
Three options, in order of preference:
1. Plugin "Mignuti Chatbot" (recommended)
The dedicated plugin sets itself up in one click — including page targeting, a GDPR consent bridge (Borlabs, Complianz, Cookiebot, Usercentrics, Real Cookie Banner) and a "Test connection" button. On the official directory since 26 September 2026: wordpress.org/plugins/mignuti-chatbot. All the details →
Alternative: download the ZIP (18 KB)- WP-Admin → Plugins → Add New → search for "Mignuti Chatbot" → Install Now → activate. (Or upload the ZIP via Upload Plugin — same version.)
- Settings → Mignuti Chatbot → click "Connect with Mignuti", pick your project — key and domain are set automatically.
Updates arrive automatically through the directory, alongside your other plugin updates. Prefer no
connect flow? Enter data-project + data-secret by hand under "Enter details manually".
2. Header-footer-injection plugin (Insert Headers and Footers, WPCode)
Paste the embed snippet into the "Body" or "Footer" hook. Works on any theme.
3. Theme functions.php
add_action('wp_footer', function () {
echo '<script src="https://widget.mignuti.com/v1.js" data-project="prj_…" data-secret="sec_…" async></script>';
}); JTL-Shop
JTL-Shop 5 has a dedicated plugin — no template editing:
Download the JTL-Shop plugin (ZIP)- Shop admin → Plugins → Plugin manager → Upload → pick the ZIP → install.
- Plugins → Mignuti Chatbot → Settings: enter
data-project(project ID) and secret from the Mignuti admin → Embed, pick the consent mode and an optional accent color. - Important — clear the cache: System → Cache → "Clear entire object cache" AND "Clear entire template cache". Only then does the chat appear in the storefront.
The plugin appends the loader before </body> on every storefront page, with optional
hiding for logged-in customers and during checkout. Remember to add your shop domain under
Embed → Allowed domains in the Mignuti admin.
Shopware 6
Shopware 6 has a dedicated plugin — no theme editing:
Download the Shopware plugin (ZIP)- Admin → Extensions → My extensions → Upload extension → pick the ZIP → install & activate.
- Extensions → Mignuti Chatbot → Config: enter
data-project(project ID) and secret from the Mignuti admin → Embed, pick the consent mode. - Clear the storefront cache — the chat appears on every storefront page.
Optionally hide it in cart/checkout and for logged-in customers. All the details →
Shopify
- Online Store → Themes → Edit code on your live theme.
- Open
layout/theme.liquid. - Paste the embed snippet just before
</body>. - Save. The widget appears on storefront, product, cart and collection pages.
For checkout pages, Shopify only allows scripts via the App SDK (Plus plan). Mignuti Chatbot is intentionally not loaded on checkout — chatbots distract during conversion. If you need it, contact us.
Webflow
- Project Settings → Custom Code → Footer Code.
- Paste the embed snippet.
- Save → Publish.
On staging (webflow.io domains) you must add the staging URL to Allowed Origins in your Mignuti Chatbot Embed settings. The widget refuses to boot on un-allow-listed origins as anti-key-theft.
Plain HTML / static sites (Astro, Hugo, Eleventy, Jekyll)
Paste the snippet into your layout template, just before </body>:
<!-- in your <body> -->
<script src="https://widget.mignuti.com/v1.js"
data-project="prj_…" data-secret="sec_…" async></script>
</body> React / Next.js
The cleanest pattern is a Layout-level effect that injects the script once:
// app/layout.tsx (Next.js 14 App Router)
import Script from 'next/script';
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{children}
<Script
src="https://widget.mignuti.com/v1.js"
strategy="lazyOnload"
data-project="prj_…"
data-secret="sec_…"
/>
</body>
</html>
);
}
Why lazyOnload: the widget is non-critical UI. Loading it after window-load keeps Largest
Contentful Paint clean.
Vue 3 / Nuxt 3
In nuxt.config.ts:
export default defineNuxtConfig({
app: {
head: {
script: [
{
src: 'https://widget.mignuti.com/v1.js',
'data-project': 'prj_…',
'data-secret': 'sec_…',
async: true,
},
],
},
},
}); Consent / cookie banners
With data-consent="pending" (the default), Mignuti Chatbot does not start any session until
you call
window.MignutiChatbot.setConsent('granted'). Hook this into your cookie-banner
accept-button:
// after the visitor accepts marketing/functional cookies:
window.MignutiChatbot?.setConsent('granted');
// after the visitor refuses:
window.MignutiChatbot?.setConsent('denied'); // widget hides itself Mignuti Chatbot is technically a "functional" cookie under most CMP categorisations (it stores a session id in localStorage so the conversation persists between page-loads). DSGVO Art. 6(1)(a) consent is the cleanest legal basis for B2C sites; B2B with legitimate-interest argument also works.
Connect a Dropbox folder
Instead of uploading files you can connect a Dropbox folder: the bot reads new and changed files by itself, deleted ones disappear from the knowledge base again. Available from the Standard plan up.
- In the dashboard go to Knowledge → Add knowledge → Dropbox folder, then Connect Dropbox.
-
Approve access at Dropbox. This creates the folder
Apps/Mignuti Chatbotin your Dropbox — that folder is all we see. - Drop files into it and hit Sync now (or wait for the schedule).
You can optionally name a subfolder when connecting, for example /Manuals. The bot then
reads only that part.
What gets read
- Formats: PDF, TXT, Markdown — up to 25 MB per file. Everything else is left alone.
- Sync: daily, weekly, monthly or on demand only. The fastest cadence depends on your plan, same as with URL crawling.
- Read-only: we never write, move or delete anything in your Dropbox — not even when you delete a document on our side.
- Volume limit: the same document limit as for uploads applies. Once it is reached, the source shows "limit reached" and stops reading further files.
Which way deleting works
- File deleted in Dropbox → the document leaves the knowledge base on the next sync.
- Document deleted on our side → it does not come back, and the file in your Dropbox stays untouched.
- Connection removed → all documents read from it are deleted and the token is revoked at Dropbox.
The folder stays empty / nothing is read
-
Are the files really in
Apps/Mignuti Chatbot? If a second folder with the same name exists underApps, Dropbox simply reports an empty folder to us — no error. - Has the Dropbox client finished uploading (green check)? Half-synced files are not visible to our request yet.
- Is the format supported? Spreadsheets, slides and images are skipped on purpose — the source shows them as "skipped".
Connect Google Drive
On Drive you pick individual files instead of a folder, in the familiar Google dialog. We only ever see what you click there. Available from the Standard plan up.
- Knowledge → Add knowledge → Google Drive, then Connect Google Drive and approve at Google.
- Pick files opens the Google dialog. Multi-select works, and you can extend the list at any time.
- Done — the first sync runs immediately, after that on your chosen schedule.
What gets read
- Formats: PDF, TXT, Markdown and Google Docs — the latter are pulled as plain text, which works better for a chatbot than a PDF. Sheets and slides are left alone.
- Size: up to 25 MB per file.
- Access: only the files you picked, read-only. The rest of your Drive stays invisible to us — not as a promise, but by the shape of the permission you grant.
How to remove files again
- Remove from the selection (the cross next to the file name) → the document leaves the knowledge base, the file in your Drive stays.
- Deleted or trashed in Drive → disappears on the next sync.
- Connection removed → all documents read from it are deleted and the grant is revoked at Google.
The Google dialog does not open
-
Is a browser extension blocking
apis.google.com? The file picker loads from there. - Message "The API developer key is invalid": then the instance's Google configuration is off — hosted with us? Drop us a line and we will check.
Leads to your CRM (Zapier, Make, n8n)
Mignuti Chatbot scores every conversation with a lead score (0–100) and captures the visitor's email when they share it. Push hot leads (score ≥ 70) to your CRM automatically via webhook — no coding. You can also browse them anytime in the admin under Leads (with CSV export).
- In Zapier, Make or n8n create a
Webhook / Catch Hooktrigger and copy the URL. -
In the admin under Integrations → Webhooks create a subscription with that URL and select
the
hot_leadevent. -
In the CRM step map
data.lead_emailto the contact email;lead_scoreandintentsas a note. Ready for HubSpot, Pipedrive, Salesforce, Google Sheets, Slack, Notion …
Example payload (POST, JSON):
{
"id": "hot_lead:8f3c…",
"event": "hot_lead",
"occurred_at": "2026-08-27T10:15:00Z",
"data": {
"conversation_id": "8f3c…",
"project_id": "a91b…",
"lead_score": 82,
"lead_email": "customer@example.com",
"intents": ["buying_intent", "price_question"],
"first_message": "How much is the Enterprise plan?"
}
} Every request is HMAC-SHA256 signed. Verify the header and reject requests older than 5 minutes:
x-mignuti-chatbot-signature: t=<ts>,v1=<sig>
x-mignuti-chatbot-timestamp: <unix-seconds>
x-mignuti-chatbot-event: hot_lead
// sig = HMAC_SHA256(secret, ts + "." + rawBody) // hex
The secret is shown once when you create the subscription. No automation tool? The
CSV export on the Leads page works with any CRM.
Troubleshooting
My site uses a strict Content-Security-Policy (CSP)
The widget needs these CSP allowances — otherwise it loads but sessions/answers fail silently:
script-src ... https://widget.mignuti.com;
connect-src ... https://widget.mignuti.com https://api.chatbot.mignuti.com;
font-src ... https://widget.mignuti.com; script-src: loadsv1.js.-
connect-src: chat session, answer stream and UI translations (both hosts required). font-src: only if you picked a custom font in the bot config.
The launcher does not appear
- Open DevTools → Network — is
v1.jsloaded with status 200? - Console — any "origin_not_allowed" errors? Add the host to Allowed Origins.
- Make sure
data-secretis present and starts withsec_.
The bot answers but says "I don't know" a lot
- Check the Knowledge-base — is your document status "ready" (not "pending"/"failed")?
- Check the similarity threshold in the chatbot config (default 0.35) — lower it slightly for thin content, raise it if answers feel off-topic.
- Add Q&A pairs for the most-asked unanswered questions (see Pending Questions page).
"Bot is at quota" message
You hit the hard cap (3× plan limit). Upgrade your plan in Billing or wait until next month. The hard cap exists so a runaway widget cannot bill you €10 000.
Widget breaks our site CSS
It cannot — the widget runs inside a closed Shadow Root with :host { all: initial }. If you see CSS bleed, open an issue at media@mignuti.com
with your URL — that would be a bug we want to know about.