Wszystko o flowhelp — co to jest, co potrafi, ile kosztuje
Wersja 1.2 · 2026-09-22 · Strona publiczna, bez logowania. Każda liczba na tej stronie ma źródło w naszym własnym kodzie i datę stanu, na który została odczytana — przy każdej sekcji stoi wiersz „Źródło". Tam, gdzie zamiast faktu z kodu składamy Ci obietnicę, jest to napisane wprost. Instrukcja techniczna osadzenia jest osobno: instrukcja widgetu.
flowhelp to asystent AI dla Twojej strony. Czyta to, co już masz w internecie — stronę, cennik, regulamin, FAQ — i odpowiada z tego Twoim klientom, przez całą dobę, w oknie czatu wklejonym u Ciebie jedną linijką. Pod każdą odpowiedzią stoi odnośnik do podstrony, z której odpowiedź pochodzi. Kiedy odpowiedzi nie ma w materiałach, asystent mówi to wprost, zamiast zgadywać.
Ta strona opisuje stan na 2026-09-22 — nie plany. Sekcja „Czego flowhelp dziś nie robi" jest pełnoprawną częścią dokumentu, a nie przypisem.
1. Dla kogo to jest
- mały sklep internetowy — pytania o dostawę, zwroty, dostępność, warunki promocji; te odpowiedzi stoją już na Twoich podstronach, tylko nikt ich nie czyta przed napisaniem wiadomości,
- mały SaaS (oprogramowanie w abonamencie) — pytania o cennik, limity, integracje i dokumentację,
- każda firma, która ma stronę i odpowiada w kółko na te same pytania — także poza godzinami pracy.
Czego flowhelp nie zastępuje: konsultanta przy sprawach nietypowych. Dlatego w oknie czatu mieszkają dwie akcje — formularz kontaktowy i przekazanie rozmowy człowiekowi mailem (sekcja 7).
Źródło: docs/SPEC.md § 1 (profil klienta), docs/LANDING.md § 1 (dwa segmenty ICP: sklepy internetowe i oprogramowanie).
2. Jak to działa
2.1 Skąd asystent bierze wiedzę
Trzy rodzaje źródeł, wszystkie dodawane w panelu:
| Źródło | Co robimy |
|---|---|
| Strona | Podajesz jeden adres. Szukamy mapy witryny, wchodzimy na podstrony w obrębie tej domeny (respektując robots.txt), wycinamy nawigację, stopki i banery cookies — zostaje sama treść. |
| Tekst | Własna notatka w markdownie (np. „Regulamin zwrotów"). Nagłówki ## stają się kontekstem fragmentów. |
| Q&A | Jedna para pytanie–odpowiedź. Najkrótsza droga, żeby domknąć lukę, której nie ma na stronie. |
Treść jest dzielona na fragmenty i zamieniana na wektory (model BGE-M3, 1024 wymiary). Pytanie odwiedzającego przechodzi tę samą drogę, więc asystent szuka po znaczeniu, nie po słowie kluczowym.
Źródło: apps/web/app/(panel)/(app)/(workspace)/knowledge/strings.ts (rodzaje źródeł w oknie „Dodaj źródło"), apps/web/app/(panel)/(app)/onboarding/strings.ts (opis czytania strony), docs/DECYZJE.md ADR-003 i ADR-004 (model embeddingów i wymiar).
2.2 Odpowiedź z cytatem albo „nie wiem"
- Asystent odpowiada wyłącznie z Twoich materiałów. Domyślny tryb to
strict— „odpowiadaj tylko z mojej wiedzy". - Gdy w bazie wiedzy nie ma odpowiedzi, wraca zdanie, które sam ustawiasz. Domyślnie: „Nie mam tej informacji w swojej bazie wiedzy." Model nie dostaje wtedy szansy na zmyślenie — pusty kontekst jest wykrywany maszynowo, a pytanie ląduje w panelu w sekcji Wnioski jako luka do uzupełnienia.
- Pod odpowiedzią stoi rząd odnośników poprzedzony słowem „Źródła": jedna podstrona = jeden odnośnik (nawet gdy odpowiedź oparła się na kilku jej fragmentach) i najwyżej trzy odnośniki pod jedną odpowiedzią. Numerków
[1][2]w treści odpowiedzi nie ma — zaśmiecały zdania. - Kontekst z Twojej strony jest podawany modelowi jako dane, nigdy jako polecenia. Zdanie „zignoruj poprzednie instrukcje" wklejone na cudzej podstronie nie jest dla asystenta rozkazem.
- Tekst odpowiedzi nigdy nie staje się HTML-em — markdown jest zamieniany na drzewo elementów, więc w oknie czatu nie da się wykonać skryptu z treści modelu.
Źródło: packages/db/src/agent-config.ts (refusalMode: 'strict', fallbackAnswer), packages/config/src/constants.ts (INSUFFICIENT_CONTEXT_SENTINEL), docs/DECYZJE.md ADR-031 i ADR-032 (odnośniki do źródeł), ADR-027 (markdown bez HTML-a), CLAUDE.md („kontekst RAG oznaczony jako niezaufane dane").
2.3 Języki
Interfejs okna czatu jest po polsku i angielsku. Język bierze się z konfiguracji asystenta (domyślnie auto, czyli z przeglądarki odwiedzającego) albo z atrybutu data-locale w snippecie. Kierunek tekstu każdej wiadomości ustala się z jej treści, więc odpowiedź po arabsku na polskiej stronie wyświetla się poprawnie.
Panel jest dziś tylko po polsku (angielski to osobny etap). Strona flowhelp.ai ma wersję polską i angielską.
Źródło: packages/widget-core/src/i18n.ts, packages/db/src/agent-config.ts (widget.locale: 'auto'), docs/WIDGET.md § 1 i § 9, docs/PANEL.md § 0 pkt 7.
3. Instalacja — jedna linijka
<script async src="https://cdn.flowhelp.ai/loader.js" data-key="pk_live_…"></script>Tag idzie przed </body>. Klucz publiczny bierzesz z panelu; z założenia jest widoczny w kodzie strony i nie chroni go tajność, tylko allowlista domen, limity tempa i dobowy sufit kosztu (sekcja 8).
Jeśli Twoja strona ma Content-Security-Policy, potrzebne są dokładnie dwa źródła: https://cdn.flowhelp.ai w script-src i https://app.flowhelp.ai w connect-src. Style widgetu żyją w Shadow DOM, więc style-src zostaje bez zmian, a style Twojej strony nie wchodzą do okna czatu i odwrotnie.
Sprawdzone 14.09.2026 na trzech środowiskach: WordPress z Elementorem, Bootstrap 5, Tailwind. Mechanizm jest ten sam wszędzie, gdzie da się wkleić jeden tag <script>.
Pełna instrukcja dla dewelopera — allowlista domen, publiczne API okna (open/close/sendMessage), rozpoznawanie zalogowanych użytkowników podpisem HMAC, tabela błędów: app.flowhelp.ai/docs/widget.
Źródło: docs/WIDGET.md § 1–3 i § 10, docs/LANDING.md § 5 (lista sprawdzonych środowisk z datą).
4. Plany, limity i kredyty
Jedna odpowiedź asystenta to jedna wiadomość na najszybszym paśmie modeli. Liczymy wyłącznie odpowiedzi asystenta — samo pytanie odwiedzającego, także kliknięte z gotowej podpowiedzi, nie jest liczone osobno (ale odpowiedź na nie już tak).
| Plan | Cena | Wiadomości w miesiącu | Pasma modeli |
|---|---|---|---|
| Trial | 0 $, 14 dni, bez karty | 100 | szybkie |
| Starter | 19 $/mc albo 190 $/rok | 2 000 | szybkie |
| Growth | 49 $/mc albo 490 $/rok | 6 000 | szybkie, zrównoważone, inteligentne |
| Scale | 149 $/mc albo 1 490 $/rok | 20 000 | wszystkie cztery |
| Enterprise | cena nie jest publikowana | 100 000 | wszystkie cztery |
| Plan | Asystenci | Strony na asystenta | Miejsca w zespole | Akcje | Odświeżanie treści |
|---|---|---|---|---|---|
| Trial | 1 | 25 | 1 | 2 | ręcznie |
| Starter | 1 | 200 | 1 | 2 | co tydzień |
| Growth | 3 | 2 000 | 3 | 6 | codziennie |
| Scale | 10 | 10 000 | 10 | bez limitu | co godzinę |
| Enterprise | bez limitu | bez limitu | bez limitu | bez limitu | co godzinę |
Rok kosztuje tyle co dziesięć miesięcy — dwa miesiące gratis.
Cięższy model liczy się jako kilka wiadomości. Pasmo szybkie to mnożnik 1×, zrównoważone 5×, inteligentne 20×, najmocniejsze 50×. W Starterze jest jedno pasmo i jedna stawka, więc 2 000 wiadomości znaczy 2 000 odpowiedzi.
Doładowanie: 9 $ za 1 000 wiadomości — kupowane wtedy, kiedy chcesz, ale dziś jeszcze niedostępne, bo płatności uruchamiamy w kolejnym etapie produktu. Do tego czasu każdy plan zaczyna się od 14-dniowego okresu próbnego bez karty, a doładowania i wybór planu nie są dostępne do kupienia.
Źródło: packages/config/src/plans.ts (limity wszystkich planów, TRIAL_DAYS = 14), apps/web/lib/pricing-plans.ts (kwoty i TOPUP_PRICE), packages/config/src/model-bands.ts (mnożniki kredytów), apps/web/messages/pl.json sekcja marketing.pricing (nazwy planów i zdanie o braku płatności) — stan repozytorium 2026-09-22.
5. Co się dzieje, gdy limit się skończy
Nic się nie psuje i asystent nie milknie. Progi są trzy:
| Sytuacja | Zachowanie |
|---|---|
| zużyte 100 % pakietu | asystent schodzi na tańsze pasmo ustawione w konfiguracji asystenta (nigdy droższe niż pasmo żądane) i odpowiada dalej; w planach z jednym pasmem — Trial i Starter — nie ma na co schodzić, więc jakość odpowiedzi się nie zmienia |
| zużyte 200 % pakietu | czat odmawia z kodem 429 i nagłówkiem Retry-After — dwukrotność pakietu to już rachunek, którego nikt nie zamówił |
| koniec 14 dni okresu próbnego | okno czatu na Twojej stronie przestaje odpowiadać, ale w panelu dalej testujesz asystenta |
| 1 000 kredytów na asystenta w ciągu doby (czas UTC) | 429 do północy UTC — sufit pieniędzy, który działa niezależnie od liczby odwiedzających |
Dobowy sufit kredytów jest jedynym bezpiecznikiem, którego nie da się obejść zmianą adresu IP ani czyszczeniem przeglądarki: sumuje cały ruch jednego asystenta.
Źródło: apps/web/lib/chat/quota.ts (progi 100 % / 200 % / koniec okresu próbnego), packages/config/src/constants.ts (WIDGET_DAILY_CREDIT_CAP = 1000), packages/config/src/chat-stream.ts (QUOTA_EXCEEDED → HTTP 429).
6. Panel
6.1 Onboarding — cztery ekrany
- Adres strony — podajesz adres, my szukamy podstron.
- Czytanie — zwykle 2–4 minuty; można iść dalej, trening kończy się w tle.
- Wygląd — imię asystenta, kolor (podpowiadamy go z Twojej strony), powitanie, podpowiadane pytania.
- Instalacja — gotowy snippet do skopiowania albo wysłania deweloperowi.
Zmierzony przebieg skryptem Playwright 22.09.2026: 42,6 s od rejestracji do snippetu (17.09.2026 było 48,7 s). To pomiar automatu, czyli dolna granica, a nie średni czas człowieka.
6.2 Sekcje panelu
| Sekcja | Co w niej jest |
|---|---|
| Start | Co się dzieje z asystentem i co zrobić dalej; ostatnie rozmowy. |
| Wiedza | Lista źródeł (strona / tekst / Q&A), stan każdego z nich, liczba stron pobranych i zaindeksowanych, „Odśwież" na pojedynczym źródle i „Przetrenuj" na całym asystencie. |
| Wygląd | Imię, avatar, kolor główny, motyw jasny/ciemny/auto, róg ekranu, powitanie, podpowiadane pytania, zdanie ujawniające AI. Podgląd na żywo obok. |
| Rozmowy | Pełne transkrypty, oceny kciukiem od odwiedzających, znacznik rozmowy eskalowanej, zebrane leady. |
| Wnioski | Pytania, na które asystent nie znalazł odpowiedzi — każde zamykasz jedną parą Q&A, prosto z listy. Plus wskaźnik deflekcji i najczęstsze pytania z ostatnich dni. |
| Ustawienia | Akcje (sekcja 7), Zespół, Dane, Instalacja, Profil. |
Imię i avatar asystenta ustawiasz w Wyglądzie — widać je w nagłówku okna czatu przez całą rozmowę, razem z nieusuwalną plakietką „AI" obok (sekcja 8.1). Bez avatara pokazujemy inicjały imienia. Avatar ma być ilustracją, nie zdjęciem prawdziwej osoby.
6.3 Zespół, retencja, eksport
- Role: właściciel, administrator (wszystko poza usunięciem workspace'u i zmianą roli właściciela), edytor (wiedza, wygląd i wnioski; ustawienia i zespół widzi tylko do odczytu), podgląd (tylko odczyt). Liczba miejsc wynika z planu.
- Przechowywanie rozmów: 30, 90, 365 dni albo na zawsze. Domyślnie 90 dni. Starsze rozmowy kasuje raz na dobę zadanie w tle; zebrane leady zostają — nie znikają razem z rozmową.
- Eksport rozmów: pełny CSV albo JSON, dla właściciela i administratora.
- Usunięcie workspace'u: asystenci przestają odpowiadać natychmiast, dane przechodzą w stan usunięty. Z panelu tego nie cofniesz.
Źródło: apps/web/app/(panel)/(app)/onboarding/strings.ts (cztery kroki), docs/qa/etap4-2026-09-22/results.md (pomiar 42,6 s i jego zastrzeżenie; poprzedni przebieg 48,7 s — docs/qa/etap4-2026-09-17/results.md), apps/web/app/(panel)/(app)/(workspace)/*/strings.ts (sekcje panelu), apps/web/app/(panel)/(app)/(workspace)/settings/strings.ts (role, retencja, eksport), packages/widget-core/src/ui/App.tsx (imię, avatar i plakietka „AI" w nagłówku okna, inicjały zamiast avatara), packages/db/src/schema/tenancy.ts (retention_days domyślnie 90), docs/PANEL.md § 5 (kontrakt sekcji).
7. Akcje: kontakt i przekazanie człowiekowi
Dwie akcje, obie włączane w panelu. W snippecie nic się nie zmienia i nie ma tu żadnego API do wołania ze strony.
Formularz kontaktowy (lead). Do ośmiu pól, które sam definiujesz (etykieta, typ, czy wymagane). Pokazuje się według wyzwalacza: po N odpowiedziach asystenta, zaraz po odpowiedzi „nie mam tej informacji", albo wyłącznie z przycisku. Otwiera się jako karta nad rozmową, zamykana krzyżykiem lub klawiszem Esc; zamknięcie wyłącza wyzwalacz automatyczny do końca tej rozmowy.
Przekazanie człowiekowi (eskalacja). Ten sam formularz z dodatkowym polem „Wiadomość" i własnym przyciskiem, którego napis ustawiasz. Rozmowa dostaje znacznik „eskalowana", który zasila wskaźnik deflekcji we Wnioskach.
Gdzie trafia zgłoszenie. Do panelu i na e-mail: adres z ustawień akcji, a gdy go nie ma — adres powiadomień workspace'u, a gdy i tego nie ma — adres właściciela. Wiadomość zawiera pola formularza i ostatnie 10 wiadomości rozmowy, żeby dało się odpowiedzieć bez wchodzenia do panelu. Pocztę wysyłamy przez Resend.
Limity nadużyć (bez nich formularz na cudzej stronie jest otwartym kanałem spamu):
| Licznik | Wartość |
|---|---|
| jeden odwiedzający u jednego asystenta | 5 zgłoszeń na dobę (UTC) |
| jedna sieć (adres IP) | 20 zgłoszeń na godzinę |
| jeden asystent łącznie | 200 zgłoszeń na dobę (UTC) |
Źródło: apps/web/lib/widget/lead.ts (WIDGET_LEAD_DAILY_LIMIT = 5), apps/web/lib/widget/limits.ts (WIDGET_LEAD_IP_HOURLY_LIMIT = 20, WIDGET_LEAD_AGENT_DAILY_LIMIT = 200), packages/config/src/widget-embed.ts (WIDGET_LEAD_MAX_FIELDS = 8, wyzwalacze), docs/WIDGET.md § 12, docs/DECYZJE.md ADR-029 i ADR-032.
8. Bezpieczeństwo i prywatność
8.1 Odwiedzający Twojej strony
- Zero cookies od nas. Odwiedzający dostaje identyfikator UUID w
localStorageprzeglądarki — to wszystko, czego potrzeba, żeby powiązać ze sobą wiadomości jednej rozmowy. - Tryby zgody:
open(czat działa od razu),deferred(domyślny — przycisk widoczny, pierwsza wiadomość czeka na zgodę),blocked(nic się nie renderuje, dopóki Twoja strona nie wywołagrantConsent()). Zgoda nie jest dziś utrwalana między wizytami. - Ujawnienie AI jest nieusuwalne. W nagłówku okna stoi plakietka „AI", a pierwsza wiadomość zawiera zdanie ujawniające (edytowalne co do treści, nie do istnienia). Wymaga tego art. 50 EU AI Act i nie zależy to od żadnego ustawienia — asystent nigdy nie ma udawać człowieka. Z tego samego powodu avatar ma być ilustracją, nie zdjęciem prawdziwej osoby.
- Logi bez treści. Identyfikatory tak, treść wiadomości i adresy e-mail odwiedzających — nie. Adresy IP w licznikach limitów są hashowane z sekretem, więc zrzut pamięci podręcznej nie jest listą adresów Twoich gości.
8.2 Twoje dane
- Izolacja tenantów opiera się na bazie danych, nie na warunkach w kodzie. Każdy wiersz należy do workspace'u, a Postgres wymusza to politykami wierszowymi (RLS). Zapytanie bez ustawionego workspace'u nie zwraca nic — nawet gdyby kod o tym zapomniał. Test, który celowo próbuje odczytać dane cudzego workspace'u i musi dostać zero wierszy, jest obowiązkowym warunkiem każdego wdrożenia.
- Klucz publiczny widgetu zakładamy, że wycieknie. Obroną jest allowlista domen (
Origin), limity tempa i dobowy sufit kosztu — nie tajność klucza. Strona spoza allowlisty dostaje 403 bez nagłówków CORS i nic nas nie kosztuje. - Zalogowani użytkownicy Twojego serwisu mogą być rozpoznawani podpisem HMAC liczonym po Twojej stronie. Widget nie zna sekretu i nie liczy podpisu; niezgodny podpis to 403, zanim cokolwiek zostanie policzone.
- Limity tempa czatu: domyślnie 20 wiadomości na 5 minut od jednego odwiedzającego (konfigurowalne od 1 do 200 wiadomości w oknie 30–3 600 s) oraz 200 wiadomości na 5 minut z jednego adresu IP.
- Twoje treści nie służą do trenowania niczyjego modelu. To zobowiązanie, które składamy Ci na stronie, a nie przełącznik w naszym kodzie: modele wołamy u dostawców zewnętrznych (sekcja 8.3).
8.3 Gdzie stoją dane i kto je przetwarza
Aplikacja, baza danych i kolejka stoją na jednej maszynie — VPS w OVH, wystawionej do świata wyłącznie przez nasz serwer WWW. Poza nią w łańcuchu są trzej dostawcy: OpenRouter (model językowy generujący odpowiedź), deAPI (wyliczanie wektorów) i Resend (poczta powiadomień).
Dokładnej lokalizacji centrum danych ta strona nie podaje, bo nie jest udokumentowana w naszym repozytorium, a liczba bez źródła tutaj nie wchodzi.
Umowę powierzenia (DPA) i pełną listę podprocesorów przygotowujemy na życzenie — poproś przez formularz w oknie czatu na flowhelp.ai. Komplet dokumentów prawnych trafia na stronę razem ze startem sprzedaży (sekcja 9), więc dziś nie ma tu pliku do pobrania.
Źródło faktów: docs/DECYZJE.md ADR-006 (RLS jako granica bezpieczeństwa), ADR-026 (klucz publiczny, allowlista, limity), ADR-028 (HMAC identify), ADR-033 (plakietka „AI", avatar jako ilustracja), packages/db/src/agent-config.ts (domyślne consentMode: 'deferred', rateLimitMessages: 20, rateLimitWindowSeconds: 300, aiDisclaimer), apps/web/lib/widget/limits.ts (WIDGET_IP_RATE_LIMIT = 200 / 300 s), CLAUDE.md (zasada RLS), docs/PANEL.md § 0 pkt 6 i docs/DECYZJE.md ADR-024 inwariant 9 (logi bez PII, egzekwowane w apps/web/lib/widget/lead.ts i apps/web/lib/widget/feedback.ts), docs/INFRASTRUKTURA.md § 10.2 (maszyna w OVH).
Źródło obietnic (dwie, oznaczone wyżej — nie wynikają z kodu, tylko z tego, co obiecujemy klientowi): apps/web/messages/pl.json sekcja marketing.faq (odpowiedź o RODO na flowhelp.ai), docs/LANDING.md § „FAQ o RODO nie obiecuje dokumentu opublikowanego" (decyzja: DPA i lista podprocesorów na życzenie, dokumenty na stronie razem z otwarciem sprzedaży).
9. Czego flowhelp dziś nie robi
To nie jest lista wad ani obietnic — to stan na 2026-09-22.
- Nie przyjmuje plików. Wgrywanie PDF-ów i DOCX-ów czeka na magazyn plików; w panelu jest zakładka „Pliki (wkrótce)". Dziś wiedza wchodzi jako strona, tekst albo Q&A.
- Akcje nie odpytują Twoich systemów. Są dokładnie dwie: formularz kontaktowy i przekazanie rozmowy mailem. Asystent nie sprawdzi statusu zamówienia ani stanu magazynu, bo takiego połączenia jeszcze nie ma — i nie zmyśli odpowiedzi w zamian.
- Nie ma głosu. Wyłącznie czat tekstowy.
- Panel jest tylko po polsku. Okno czatu ma polski i angielski; inne języki interfejsu to przyszłość.
- Nie da się jeszcze zapłacić. Rozliczenia to kolejny etap; dziś wszystko zaczyna się od 14-dniowego okresu próbnego.
- Rejestracja jest na zaproszenie. Konto zakłada się kodem zaproszenia — otwarta rejestracja to decyzja właściciela produktu, nie brak funkcji.
- Nie ma jeszcze dokumentów prawnych na stronie. Regulamin, polityka prywatności, umowa powierzenia i lista podprocesorów wchodzą razem ze startem sprzedaży; do tego czasu DPA przygotowujemy na życzenie (sekcja 8.3).
- Zgoda na czat nie jest pamiętana między wizytami.
Źródło: apps/web/app/(panel)/(app)/(workspace)/knowledge/strings.ts (zakładka „Pliki (wkrótce)", ADR-023), apps/web/lib/panel/actions-config.ts (dwa typy akcji: lead_capture, email_escalation), docs/PANEL.md § 0 pkt 7 (panel po polsku), docs/ETAPY.md (billing jako kolejny etap; „Prawne: ToS, Privacy Policy, DPA, lista subprocesorów" jako etap przyszły), CLAUDE.md (SIGNUP_MODE), docs/WIDGET.md § 6 (zgoda nieutrwalana).
10. Kontakt i wsparcie
Najszybsza droga: napisz do asystenta w oknie czatu na flowhelp.ai. Gdy odpowiedzi nie ma w jego bazie wiedzy, pokaże formularz kontaktowy — zgłoszenie trafia prosto do nas razem z całą rozmową, więc nie trzeba niczego powtarzać.
Nie podajemy tu adresu e-mail celowo: domena flowhelp.ai nie odbiera dziś poczty, więc adres na stronie byłby adresem donikąd. Wsparcie w każdym planie, także w Starterze, działa przez okno czatu na flowhelp.ai i jego formularz kontaktowy — wiadomość trafia do nas e-mailem razem z zapisem rozmowy. Regulamin i polityka prywatności wchodzą razem ze startem sprzedaży.
Źródło: docs/LANDING.md § 5 (brak adresów e-mail w treści — MX domeny nie odbiera poczty; regulamin i prywatność „wchodzą z launchem").
11. English summary
flowhelp is an AI assistant for your website. It reads what you already publish — your pages, pricing, terms, FAQ — and answers your customers from that material, around the clock, in a chat window you embed with one line of code. This summary states the facts as of 2026-09-22; the Polish sections above carry the full detail and name the source file behind every number.
How it works. You add knowledge as a website (we follow the sitemap, respect robots.txt and strip navigation, footers and cookie banners), as plain text, or as Q&A pairs. Everything is embedded with BGE-M3 (1024 dimensions), so the assistant searches by meaning. It answers only from your material; when the answer is not there it says so and the question lands in your panel as a gap to close. Under each answer there is a "Sources" row: one link per page, at most three. Retrieved page content is passed to the model as untrusted data, never as instructions, and the model's markdown never becomes HTML.
Install. One tag before </body>: <script async src="https://cdn.flowhelp.ai/loader.js" data-key="pk_live_…"></script>. With a CSP you need exactly two origins: https://cdn.flowhelp.ai in script-src and https://app.flowhelp.ai in connect-src. Full developer instructions: app.flowhelp.ai/docs/widget.
Plans (one answer on the fast band = one message). We count assistant answers only — a visitor's question, including one clicked from a suggested prompt, is not counted separately (the answer to it is).
| Plan | Price | Messages per month |
|---|---|---|
| Trial | $0, 14 days, no card | 100 |
| Starter | $19/mo or $190/yr | 2,000 |
| Growth | $49/mo or $490/yr | 6,000 |
| Scale | $149/mo or $1,490/yr | 20,000 |
| Enterprise | price not published | 100,000 |
| Plan | Assistants | Pages per assistant | Seats | Actions | Refresh |
|---|---|---|---|---|---|
| Trial | 1 | 25 | 1 | 2 | manual |
| Starter | 1 | 200 | 1 | 2 | weekly |
| Growth | 3 | 2,000 | 3 | 6 | daily |
| Scale | 10 | 10,000 | 10 | unlimited | hourly |
| Enterprise | unlimited | unlimited | unlimited | unlimited | hourly |
Heavier model bands cost more per answer: 1x fast, 5x balanced, 20x smart, 50x max. Top-up is $9 per 1,000 messages. Billing is not live yet — every plan currently starts as a 14-day trial.
When the allowance runs out. At 100 % the assistant drops to the fallback band configured for that assistant — never a more expensive one than requested — and keeps answering; at 200 % the chat returns HTTP 429 with Retry-After; a per-assistant cap of 1,000 credits per UTC day protects the wallet regardless of how many visitors call it.
Panel. Four onboarding screens (site → reading → appearance → install; a Playwright run on 2026-09-22 took 42.6 s from sign-up to snippet, down from 48.7 s on 2026-09-17 — a scripted lower bound, not an average human). Sections: Start, Knowledge, Appearance, Conversations, Insights, Settings (actions, team, data, install, profile). Roles: owner, admin, editor, viewer. Conversation retention 30 / 90 / 365 days or forever, default 90; full CSV and JSON export for owner and admin.
Actions. A contact form (up to 8 fields, triggered after N answers, on a fallback answer, or from a button) and an email escalation to a human. Submissions go to the panel and by e-mail (via Resend) with the last 10 messages attached. Abuse limits: 5 per visitor per UTC day, 20 per IP per hour, 200 per assistant per UTC day.
Security and privacy. Tenant isolation is enforced by Postgres row-level security, not by WHERE clauses. The public widget key is assumed to leak — the defence is the domain allowlist, rate limits and the daily credit cap. Logged-in visitors can be verified with an HMAC signature computed on your server. No cookies from us: the visitor id is a UUID in localStorage. Consent modes: open, deferred (default), blocked. The "AI" badge in the header cannot be turned off — EU AI Act Article 50 — and the avatar must be an illustration, never a photo of a real person. Chat rate limits default to 20 messages per 5 minutes per visitor and 200 per 5 minutes per IP. Your content is never used to train anyone's model — a commitment we make to you, not a switch in our code. The stack runs on a single OVH VPS; the other processors are OpenRouter (language model), deAPI (embeddings) and Resend (e-mail). We do not state the data-centre region here because it is not documented in our repository; the DPA and the full subprocessor list are prepared on request through the chat form — the legal documents go on the site when sales open.
Not available today: file uploads (PDF/DOCX), actions that call your own systems (order status, stock), voice, a panel UI in any language other than Polish, payments, published legal documents (terms, privacy policy, DPA — they arrive with sales), and open sign-up (an invite code is required). Consent is not remembered between visits.
Contact: ask the assistant in the chat window on flowhelp.ai — when it does not know, it offers a contact form that reaches us with the whole conversation. We publish no e-mail address because the domain does not receive mail today.