It needs no integration with your helpdesk at all — it runs in the browser and attaches to markup — so the question is not which helpdesk you use but whether you can reach the form. Two things have to be true:
  1. You can add a <script> tag to the page the form is on. Zendesk Guide, Freshdesk portals, Salesforce Experience Cloud, Webflow, WordPress, Shopify and anything you host yourself all allow this. Some portals restrict custom JavaScript — Jira Service Management is the usual one — and there the deflector cannot be installed on the portal itself.
  2. The form is not in a cross-origin iframe. No script on your page can read inside one, ours included. A third-party chat widget or an embedded form served from your vendor’s domain is out of reach; install the deflector inside that form’s own template instead, if the vendor allows it.
Everything else — Zendesk, Freshdesk, Front, Intercom’s own contact forms, Salesforce, and hand-built HTML — is the same job: name the form, name the field holding the question.
No, and that is the design constraint the whole implementation is built around. Every failure path — network error, bad selector, an answer nobody wanted, a request still in flight when the reader loses patience — ends with the form submitting exactly as it would have if the script had never loaded.When the reader chooses to submit, the deflector re-fires their own event with requestSubmit(), which runs the page’s validation and every submit listener on it. Using submit() would skip both, which on an AJAX form means the ticket is never created at all.
In order of likelihood:
  1. The question is under 25 characters. By design. Turn on data-debug-mode="true" — the console says so explicitly.
  2. The wrong event. Start with onSubmit; switch to onClick if your form does its work in a click handler and never fires submit.
  3. A selector matched nothing. Debug mode names it.
  4. The form does not exist yet. The deflector waits 10s by default; raise data-wait-for-elements-timeout, or -1 to wait forever.
  5. The form is rebuilt on hydration. Set data-render-timeout="500".
The listener is on the wrong element for the event. A submit listener on a button never fires — submit is dispatched at the form — so the deflector’s interception is skipped while its pass-through still runs.Either set data-submit-element-event-type="onClick" to match a button, or leave the event on onSubmit and let the selector fall back to the form.
No. The two measure different things and neither substitutes for the other: the rate counts tickets avoided, the vote says whether the answer was any good. Only a form submission counts against the rate.You want both. A confidently wrong answer avoids the ticket too.
The modal never opens and the ticket is filed. Nobody is shown a guess.Below the confidence threshold, the answer is withheld. When retrieval concludes the corpus does not cover the question at all, the excerpts and the citations are withheld from the model, so it cannot assemble a plausible answer out of passages it was never given. And an answer whose claims are not supported by its own sources has its confidence dropped to zero.All three appear in Activity as low_confidence or no_answer — which is, in practice, the most useful list of documentation gaps you will get, sorted by what people were about to file tickets about.
Whatever the reader wrote in, subject to your knowledge base’s own answer style settings. The interface strings around the answer are English by default and every one of them is configurable — see Copy.
Yes. The deflector runs in the reader’s browser with your public client key, and never needs to fetch the page itself. Your signed-in support portal is fine.The knowledge base it answers from is a separate question: an internal knowledge base has no public surface at all and cannot be used with a client key, deliberately.
Not usefully. The deflector’s origin allowlist is enforced server-side, so a page on another domain is refused. Its source-group scope is enforced there too, so an embed cannot widen what it reaches.localhost always passes the allowlist, so a local build works before the domain it ships on exists.
Yes. A deflection is an answer produced by the full pipeline, so it counts as one question against your monthly allowance, exactly like a widget question or a bot answer. Interceptions that produced no answer cost nothing.
A browser-scoped anonymous id, shared with the Ask AI widget so one person is one person in both. No IP address. Browser and OS family, never version. An email address only if you point the deflector at your form’s email field, and only on the conversation, purged with it — and never at all for a zero-retention workspace. See User tracking.
One at a time. attach() replaces any deflector already attached, so calling it twice does not leave two sets of listeners on the same button.For two different forms on one page, or a different question field per ticket type, call attach() with the right configuration when the form changes — see Rendering manually.
Timing. The deflector works on the form, before a ticket exists, in the reader’s browser. Helpdesk automation works on tickets that were filed anyway, over a webhook from your helpdesk.Both produce their answer through the same call with the same confidence computation, so a threshold you tune in one behaves the same way in the other.