Skip to content
ChatfuelSDK
Modules

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 idknowledge-base
Flag--modules knowledge-base
SelectionDefault — --yes installs it
Requires
Recommendsautomations, bookings
Skillchatfuel-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 labelWhat it holdsSpends the budget
(none)OverviewWhat your AI knows, what it costs, and what is missing.no
profileBusiness profileWho you are: name, contacts, address, opening hours, how to pay.yes
instructionsAbout the businessAnything else the assistant should know — how you work, and what you do not do.yes
faqFAQQuestion and answer pairs, phrased the way customers ask them.yes
productsProductsWhat you sell: title, description, price, photos, availability.yes
servicesServicesBookable services the assistant can offer and schedule.yes
teamTeamThe specialists a customer can be booked with.yes
gapsGapsQuestions 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:

ParameterValue
itemThe row to open on arrival — a catalog item id or an FAQ key.
qThe source's search box.
importfaq or products — opens the import wizard for that target.
draftA 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:

PieceWhere it lives
Business profile, opening hours, how to pay, free-text notesbot.fuelyConfig.knowledgeBase
FAQsbot.fuelyConfig.knowledgeBase.faqs — one array, replaced whole
Products and servicesbot.goodsCatalog
Bookable staffbot.specialists
What all of it costsbot.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

VariableNotes
CHATFUEL_TOKENSecret. Server-side only.
VITE_CHATFUEL_WORKSPACE_IDThe wizard's workspace step writes it.
CHATFUEL_API_BASEDefaults 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

ObjectActionRequired for
AiEditEditing the business profile, the business notes, FAQs and the catalog
InboxViewThe 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 warns600 characters
Business notes before the lint warns4,000 characters
FAQ entries below which the lint calls it thin5
Product title / description120 / 1,000 characters
Photos on a catalog item10
Import file2 MB
Gaps sweep: chats scanned200, in pages of 20
Gaps sweep: conversations opened50, newest first
Gaps sweep: messages read per conversation12
Business-notes versions kept8, in memory, this session only
Undo window60 seconds

On this page