FAQ
Do users need to install anything?
No. Users just paste one script tag into their HTML — no npm packages, no build steps, no dependencies. Extra features load automatically from the same origin.
Will it conflict with my CSS?
No. The widget renders inside a Shadow DOM, completely isolating its styles from your page.
Does it support single-page apps (React, Vue, Next.js)?
Yes. The script loads once and persists across route changes. For React/Next.js, place the script in your root layout.
// app/layout.tsx (App Router)
import Script from 'next/script';
import { ReactNode } from 'react';
export default function RootLayout({ children }: { children: ReactNode }) {
return (
<html lang="en">
<body>
{children}
<Script id="respondo-init" strategy="afterInteractive">
{`
window.Respondo = window.Respondo || {};
Respondo.init = Respondo.init || function(c) { window.RespondoAIConfig = c; };
Respondo.q = Respondo.q || [];
Respondo.identify = Respondo.identify || function(d) { Respondo.q.push(['identify', d]); };
Respondo.init({
agentId: 'YOUR_AGENT_ID',
channelId: 'YOUR_CHANNEL_ID'
});
`}
</Script>
<Script src="https://api.respondo.ai/widget/widget.js" strategy="afterInteractive" />
</body>
</html>
);
}What happens when a conversation is resolved?
A new message after resolution automatically opens a follow-up conversation linked to the previous one (shown as "Continued from #N" in your inbox). Context like language and the prior transcript carries over, and the visitor sees one continuous chat. If a teammate was handling the resolved conversation, the follow-up is routed back to your team instead of the AI; otherwise the AI picks it up.
How is the widget loaded?
The widget is loaded asynchronously (async), so it never blocks page rendering. The core bundle is ~180KB (~50KB gzipped); optional features (campaigns, product tours) load as separate lazy chunks after the widget mounts, so initial page render is never blocked.
How does escalation work?
Users can click the "Talk to human" button, type a phrase requesting a human, or the AI hands over on its own when it cannot answer from your knowledge base. Once escalated, the AI stops responding and all follow-up messages are forwarded to your support team. See the Escalation & Handover section for details.
Can users continue chatting with AI after escalation?
Yes. The widget shows a "Continue with AI" button that lets the user dismiss the escalation and resume the AI conversation.
Knowledge base & website crawl#
Why is my website crawl blocked?
"Blocked" means the site — or its protection layer (Cloudflare, a WAF, an anti-bot plugin) — refused our crawler: the start page or robots.txt answered with an access error or a "checking your browser" challenge on every attempt, or robots.txt explicitly disallows our crawler. Pages you imported earlier stay intact, and a re-sync will fail the same way until the site lets us in. Ask the site owner to allow the User-Agent RespondoAI-Crawler (full string: Mozilla/5.0 (compatible; RespondoAI-Crawler/1.0; +https://respondo.ai/bot)) in their protection settings — on Cloudflare that is Security → WAF → Custom rules — and, if robots.txt is the cause, add an allow rule for User-agent: RespondoAI-Crawler. Respondo does not publish a fixed crawler IP address — allow-list by User-Agent; if the error shown on the source names an IP, allow that one too. If the site can't be changed, add the same content as files or pasted text instead.
The crawl finished but found only a few pages
We discover pages from the site's sitemap (the Sitemap: line in robots.txt or common locations such as /sitemap.xml) and by following links from the start URL — up to 10 link-hops deep and up to 5,000 pages per source. Only pages on the same site and under the start URL's path are imported: a crawl started at https://example.com/help skips /blog, so start from the root or add include paths. Pages that no link or sitemap points to, pages that robots.txt disallows, and pages behind a login are not found. Near-duplicate pages (print versions, tracking-parameter variants) are merged into one. Pages whose content is drawn entirely by JavaScript are detected and rendered with a browser-based fallback, so a low page count usually means a scope or sitemap issue rather than rendering.
How do I limit the crawl to one section of the site?
Open Advanced in the Add website dialog and fill in Only crawl paths starting with and/or Skip paths starting with — one path per line, up to 50 each. Matching is by whole path segments: /docs matches /docs and /docs/getting-started but not /docs-archive; a trailing slash is ignored, and you can paste a full URL — only its path is used. Skip rules win over include rules. The same rules apply to the sitemap and to every later re-sync of that source.
How often does Respondo re-crawl my website?
Each website source has an Auto-refresh schedule in its pages panel: Off, Daily (every 24 hours) or Weekly (every 7 days). A scheduled crawl is incremental: pages whose sitemap lastmod is older than the previous crawl are skipped, unchanged pages are not re-indexed, changed pages are re-indexed and pages that disappeared are removed. To refresh right away, use Re-sync in the source menu or Re-sync all on the Knowledge page.
"We couldn't read the site this time" — what happened?
This is the generic failure: the site didn't respond in time, the domain didn't resolve, the server returned an error, the start page had no readable text, or the address was not found. The detail is shown on the source. Check that the URL opens in a private browser window, that there is no typo in the domain and that the start page is a real content page rather than a login screen. Social networks and messaging platforms (Facebook, Instagram, LinkedIn, X, YouTube and similar) cannot be imported at all — they are rejected before a crawl starts. Your existing pages are kept; a scheduled source retries on its next run, otherwise re-sync once the site is reachable again.
What do "our search index is full" and "we couldn't index this source" mean?
Both appear after the content was read successfully. Index is full means the search index this source is copied into has no room on Respondo's side — a Respondo limit, not a problem with your content. The pages are stored, everything already indexed keeps answering, our team is notified automatically and the source is indexed once there is room; re-syncing sooner fails the same way. Couldn't index this source means building the search index failed this time — a temporary error on our side; existing data is intact and the job is retried automatically. If either message persists, use Ask Copilot on the error.
Are long pages answered only from their beginning?
No. Every crawled page is split into overlapping chunks of roughly 1,600 characters, each indexed separately with the page title attached, so an answer can come from any part of a long article. Citations still show one link per page. Pages imported before this change are re-split on their following re-syncs.
How do I get help with a crawl error?
Every crawl or indexing error on the Knowledge page comes with an Ask Copilot button. It opens Copilot with the error attached, and Copilot answers from Respondo's own help documentation with concrete steps for your case. This help is free — it does not count against your AI requests. If the steps don't solve it, say so — "that didn't help" is enough. Copilot then offers a card that hands the problem to the Respondo team; the card lists exactly what gets sent, nothing leaves until you confirm it, and their reply arrives in the same Copilot thread. If handing it over isn't available, Copilot says so instead of staying quiet.
Messages that don't reach the customer#
A reply says "Not delivered" — what does that mean, and what do I do first?
Every outgoing message in the inbox carries a delivery indicator: Queued (replies written close together are combined and leave as one email within a minute), Sending…, Sent, Delivered, or a red failure. Failures come in three shapes: Not delivered — the channel refused the message; Bounced with the bounce sub-type next to it — the recipient's mail server rejected the email; and Marked as spam — the recipient reported it. Hover or click the label: the tooltip carries the provider's own words, including the raw SMTP diagnostic for a bounce. Beside it sit up to two actions — Retry / Send again, which really re-sends, and Ask Copilot, which opens Copilot with the error attached. If there is no retry button at all, the address is blocked and sending again would fail the same way. A Sent or Delivered that carries N files not delivered beside it means the text arrived but an attachment did not — that channel could not carry the file.
Why didn't my email reach the customer?
Four different things, and the label tells them apart. A permanent bounce means the address does not exist or refuses mail — there is no retry button, and the address goes onto the suppression list. A temporary bounce is a full mailbox or a passing problem on the receiving server; Send again is offered and usually works later. A bounce whose diagnostic mentions SPF, DKIM, DMARC or 5.7.515 is different: the recipient's mail system rejected the message because your sending domain failed its authentication check. A new reply will bounce exactly the same way until the domain is fixed, so answer in another channel meanwhile and repair the DNS records on the email channel in Settings → Channels. Finally, Marked as spam means the recipient pressed "report spam": the address is suppressed and we stop sending to it. A campaign report can additionally show The email provider rejected this message — a permanent refusal before the email ever left, usually an unverified sending domain or a malformed address — and The email provider rejected our credentials, which is a workspace setup problem rather than anything about that one contact.
What is the suppression list, and how does an address get off it?
It is a list, private to your workspace, of email addresses Respondo refuses to send to. An address lands on it when a message hard-bounces (a permanent rejection), when someone reports one of your emails as spam, or when it is blocked manually. Soft bounces never suppress an address. While the block is active, campaign deliveries to it are skipped with This address is blocked after an earlier bounce or complaint, and a reply in the inbox is refused before it goes out. Only the real recipient of the message is ever suppressed — a bounce notification cannot block an arbitrary address. There is no screen for the list in the dashboard: an owner or admin can read it with GET https://api.respondo.ai/api/v1/integrations/email/suppressions and lift one entry with DELETE https://api.respondo.ai/api/v1/integrations/email/suppressions/<email>, or ask Respondo support to do it. Release a hard bounce only when you know the mailbox really was fixed — sending to a dead address again damages your domain's reputation.
WhatsApp won't accept my reply — the 24-hour window
WhatsApp lets a business send free-form messages only within 24 hours of the customer's last message; Meta refuses anything later with error 131047. Respondo tracks that window per person, and when it knows the window has expired it stops the reply before it is sent. When Respondo has no record of a window at all — an imported contact, or a number that has never written to you — it does not block: the message goes to Meta and Meta decides. There are exactly two ways forward. Wait for the customer to write again — their message reopens the window for another 24 hours and your reply then goes through — or send a Meta-approved template. Templates cannot be sent from the conversation composer. Manage them in Outbound → WhatsApp templates: Sync pulls what is already registered on your number, New template submits one to Meta, whose review takes a day or more. Then send an approved template through an outbound campaign aimed at that contact. A template reaches people inside and outside the window alike, but only while its status is approved.
"That channel is disconnected" / "That channel is not connected"
Disconnected means the integration exists but is no longer active — its access token was revoked or expired, or someone disconnected it. Not connected means the contact's endpoint has no integration behind it at all. Both are fixed in Settings → Channels, where disconnected channels are grouped under their own heading with a Reconnect button on each card; reconnect, then retry the message. Two neighbouring cases look similar but are not the same: an email channel whose sending domain is not verified cannot be switched Live and sends nothing until DKIM and SPF are confirmed, and a receive-only channel refuses outgoing messages by design, so Retry there will never succeed.
"No channel to reach this person on" / "No email address on this contact"
Both appear on a campaign's delivery report rather than in the inbox. The first means none of the contact's endpoints matched the channels the campaign sends on; if their only endpoint sits on a receive-only channel, that is reported separately as a deliberate skip. The second means the campaign sends email and the contact has no address on file. Telegram has its own variant: if the person has never written to your bot there is no chat to write to, because the Bot API forbids a bot messaging first — they have to send the first message. Fix these by adding the missing address to the contact, by widening the channels the campaign targets, or by letting it fall back to email.
The contact unsubscribed — what can I send?
They had already unsubscribed means the contact carries a global opt-out — set through the unsubscribe link in one of your emails, brought in with an import, or toggled by a teammate. Campaigns and series skip such contacts on every channel, not only email, and the delivery is recorded as a skip rather than a failure. A one-to-one reply from a teammate inside a conversation is deliberately not blocked by it: an opt-out is about broadcasts, and answering a person who wrote to you is a human decision. The state is shown on the contact as Outbound: Subscribed / Unsubscribed, the contacts list can be filtered by it, and the Re-subscribe button on the contact reverses it — use that only when the person asked you to.
How many times do you retry, and is pressing Retry safe?
A reply from the inbox is handed to a queue that makes up to five attempts, waiting roughly 3, 10, 30 and 30 minutes between them. Only transient failures are retried — timeouts, refused connections, rate limits, the provider's own server errors. A permanent refusal (unknown address, unverified sending domain, rejected credentials) is marked failed immediately, because a repeat would return the same answer. Campaign deliveries run on their own queue with up to six attempts and shorter waits — 5 seconds, 30 seconds, 2 minutes, 10 minutes; when those run out the delivery is closed with Delivery kept failing and was stopped after several attempts instead of sitting in "queued" forever. Pressing Retry by hand is safe. It acts only on a message that is genuinely in the failed state, and for email it first asks the provider what became of the original: if that email did go out, the row flips to delivered instead of sending a second copy, and a real resend leaves under a fresh idempotency key. Where a second copy would be wrong — a hard bounce, a spam complaint, a send still in flight — the button is absent or the retry is refused with the reason.
The cause still isn't clear — how do I get help?
Every failed message carries an Ask Copilot button beside it. It opens Copilot with the error, the channel and the conversation attached, and Copilot answers from Respondo's own help documentation with steps for that exact failure. This help is free — it does not count against your AI requests. If the steps don't solve it, say so — "that didn't help" is enough. Copilot then offers a card that hands the problem to the Respondo team; the card lists exactly what gets sent, nothing leaves until you confirm it, and their reply arrives in the same Copilot thread. If handing it over isn't available, Copilot says so instead of staying quiet.