USD list prices on monthly billing, checked September 25, 2026. Features differ; AI usage, add-ons and taxes excluded.
Visual feedback that turns into reviewed fixes, with the customer answered.
Reports arrive with replay and logs, Kai Support answers the customer and investigates, and Kai Code opens the pull request your engineers review. Gleap adds the support conversation and AI investigation to visual feedback.
★ 4.6/5 on G2 Trusted by 4,500+ teams worldwide
7 days free. Cancel anytime. Card required. First charge on day 8 unless you cancel.
Florian Berger3m
Mia Kellerman 4m
Jonas Weber 12m
Sofia Lindqvist 1h
Tom Alvarez Tomorrow 3h
Ade Okafor 6m
Priya Raman 2d
Kai Support transferred ticket to Human.
Gleap USD list prices on monthly billing, checked September 25, 2026. Features differ; AI usage, add-ons and taxes excluded.
Answer customers. Investigate issues. Build what comes next. Kai Support and Kai Copilot work on every plan; investigations and Kai Code come with Team. AI usage is billed separately on every plan.
Answers customers
Answers from your knowledge base and connected sources. From Team, it investigates hard tickets with logs, the click trail and your code.
Works with your team
Press ⌘J on any page. It answers customers when you say yes, drafts articles, explains your numbers and, from Team, drafts the changelog when a fix ships. Your team sends what it drafts.
Builds the fix
Plans the change, writes and tests code, and opens a pull request. Your engineers review and merge.
@@ -42,7 +42,15 @@ NotificationsDrawer const { items } = useNotifications();− useEffect(() => { if (open) refetch(); });+ const socket = useNotificationSocket();+ useEffect(() => {+ if (!open) return;+ return socket.on('notification:new',+ (n) => setItems((p) => [n, ...p]));+ }, [open, socket]); return <Drawer open={open}>
@@ -8,6 +8,18 @@ useNotificationSocket const socket = useSocket();+ const on = useCallback((evt, fn) => {+ socket.on(evt, fn);+ return () => socket.off(evt, fn);+ }, [socket]);− return socket;+ return { on };
@@ -0,0 +1,4 @@+ it('appends a pushed notification',+ async () => {+ render(<NotificationsDrawer open />);+ socket.emit('notification:new', n);+ expect(await findByText(n.title))+ .toBeVisible();