Knowledge Base
Everything the AI knows about a business, as one structured record — the eight sources, the character budget, and why there is nothing to upload.
There is nothing to upload. The Chatfuel knowledge base is a structured record — no file store, no crawler, no chunker, no index, no embeddings, no retrieval endpoint and no similarity score anywhere in the API — so this module is an editor over that record, and anything in it that looks like retrieval quality is local, lexical and says so.
Eight sources in a rail beside the selected source's page: what the business is, what it answers, and what it could not answer yet.
Installed as
| Wizard id | knowledge-base |
| Flag | --modules knowledge-base |
| Selection | Default — --yes installs it |
| Requires | — |
| Recommends | automations, bookings |
| Skill | chatfuel-knowledge-base |
Routes and views
This module has one route and no view segment. /knowledge-base is the whole surface, and
?source= picks which of the eight the rail has open — the default, overview, is omitted
from the URL.
?source= | Rail label | What it holds | Spends the budget |
|---|---|---|---|
| (none) | Overview | What your AI knows, what it costs, and what is missing. | no |
profile | Business profile | Who you are: name, contacts, address, opening hours, how to pay. | yes |
instructions | About the business | Anything else the assistant should know — how you work, and what you do not do. | yes |
faq | FAQ | Question and answer pairs, phrased the way customers ask them. | yes |
products | Products | What you sell: title, description, price, photos, availability. | yes |
services | Services | Bookable services the assistant can offer and schedule. | yes |
team | Team | The specialists a customer can be booked with. | yes |
gaps | Gaps | Questions the assistant handed to a human — the list of what to write next. | no |
Services and Team are one entity seen from two modules. When bookings is installed it owns
editing them, so they render read-only here with a link to /bookings/services and
/bookings/staff; a scaffold that took this module without bookings gets a working editor
instead of a link to nowhere.
The rest of the parameters:
| Parameter | Value |
|---|---|
item | The row to open on arrival — a catalog item id or an FAQ key. |
q | The source's search box. |
import | faq or products — opens the import wizard for that target. |
draft | A question to seed a new FAQ with. This is how "Create FAQ" travels from Gaps to the FAQ source. |
A ?tab=business|faqs|catalog from the three-tab page this replaced is still read, mapped onto
source, and dropped on the next write. An unrecognised value anywhere renders the default
rather than throwing.
The model
One record, read as eight sources:
| Piece | Where it lives |
|---|---|
| Business profile, opening hours, how to pay, free-text notes | bot.fuelyConfig.knowledgeBase |
| FAQs | bot.fuelyConfig.knowledgeBase.faqs — one array, replaced whole |
| Products and services | bot.goodsCatalog |
| Bookable staff | bot.specialists |
| What all of it costs | bot.fuelyConfig.usage { total, catalog } |
Everything in that record is fed to the assistant as text on every conversation, so the
character budget is the constraint everything else competes for. The server reports two
numbers — usage.total and usage.catalog — and no ceiling. There is no limit field in the
schema, which is why nothing in this module draws a gauge: the meter shows composition, which
source is spending what, and "full" arrives as FuelyKnowledgeBaseLimitReached on a failed
write rather than as a threshold anyone guessed.
Writes are granular in one place and wholesale in two others. The business profile has one mutation per field and no bulk update. Opening hours are a full replace — all seven days go every time. And the FAQ list is replaced whole:
FAQ entries have no ids. Identity on the wire is position, and fuelyConfigSetFAQs replaces
the entire array — so a save built on a list that moved silently deletes whatever a
colleague added in the meantime, with no error and nothing on screen to notice. The module
re-queries the live list immediately before writing, compares it against the baseline the
draft was built from, and refuses the save if it moved. Keep that check if you write your
own save path.
One field is misnamed on the server and it matters: additionalInstructions is not
deprecated and is not a prompt. The behaviour prompt moved to the per-scope automation
settings; what is left under that name is the free-text half of the business, which is why
this module calls the source "About the business" rather than "AI instructions".
Configuration
| Variable | Notes |
|---|---|
CHATFUEL_TOKEN | Secret. Server-side only. |
VITE_CHATFUEL_WORKSPACE_ID | The wizard's workspace step writes it. |
CHATFUEL_API_BASE | Defaults to https://panel.chatfuel.com. |
Nothing here is specific to this module. Environment variables has what each one is and which side reads it.
Permissions
| Object | Action | Required for |
|---|---|---|
| Ai | Edit | Editing the business profile, the business notes, FAQs and the catalog |
| Inbox | View | The Gaps source, which reads conversations to find questions the assistant handed to a human |
A role lookup that fails is treated as permitted rather than denied: the API refuses the write anyway, and locking someone out of a page they are allowed to use is the worse failure.
Limits
There is no ingestion API. An import is a local parse — a CSV, TSV, TXT or Markdown file read in the browser, or pasted text — that produces rows a person reviews before they are written through the ordinary mutations. Export is the mirror: CSV for a spreadsheet, JSON for everything else, and a read, so someone who cannot edit can still take their data.
Reading a page from the customer's website is deliberately not offered. A browser cannot read a cross-origin page, so the only way to offer it is a server endpoint that fetches an address a person typed from inside the deployment's network — which is the shape of an SSRF bug. What a URL buys over pasting is one copy and paste. Weigh that against the surface before adding it back.
One budget, no ceiling. Every source that spends characters competes with every other, and
the only way to learn you are full is a failed write. Plan the UI around composition, not
around a percentage. The catalog has a second, separate ceiling with an error of its own:
GoodsItemsTooMuchForBot is too many items, FuelyKnowledgeBaseLimitReached is too many
characters, and any goods mutation can answer with either.
Nothing on this page is live. The schema has exactly one Fuely subscription and it belongs to the automations domain, so freshness here is: merge each setter's own response, refetch on reconnect, and a Refresh control.
The persona fields are deprecated and always come back empty. agentName,
chatLanguage, greeting, messageLength, emojiPolicy and the rest are still in the
schema, so a client can select them — and then renders blank inputs on every real bot, which
reads as a bug in your code. They moved to the per-scope automation settings, along with the
rest of how the AI behaves.
Gaps has two signals and no more. unhandledSwitchToHuman on a contact, and an assignee
that is a person rather than the AI. There is no resolution flag, no CSAT, no "the AI said it
did not know" marker and no server-side grouping — so the clustering is a word overlap, is
described to the reader as a word overlap, and prints counts of real conversations rather than
a confidence score. It also cannot see a hand-off somebody already handled
(unhandledSwitchToHuman flips false the moment an operator opens the chat), a customer who
gave up and left without a hand-off, or whether an answer the assistant did give was any
good.
The module's own ceilings:
| FAQ answer before the lint warns | 600 characters |
| Business notes before the lint warns | 4,000 characters |
| FAQ entries below which the lint calls it thin | 5 |
| Product title / description | 120 / 1,000 characters |
| Photos on a catalog item | 10 |
| Import file | 2 MB |
| Gaps sweep: chats scanned | 200, in pages of 20 |
| Gaps sweep: conversations opened | 50, newest first |
| Gaps sweep: messages read per conversation | 12 |
| Business-notes versions kept | 8, in memory, this session only |
| Undo window | 60 seconds |
Knowledge base, as a product
The eight sources, the budget breakdown, the lint and the gaps loop.
Bookings
Recommended alongside this one — it owns the services and the specialists this module mirrors.
AI Agent
Where the behaviour lives: which channels the agent answers on, when it hands over, and the booking rules.
Your agent's notes
The wizard installs .claude/skills/chatfuel-knowledge-base/ (Codex: .agents/skills/chatfuel-knowledge-base/) — the record, the budget, the replace-all FAQ list and the catalog's traps.