01/06/2026
Project:

Yuki Chatbot

For Yuki, we created a chatbot that answers questions about their sales data in HubSpot CRM in plain language and prepares proposals itself, built on top of the same AI that enriches sales notes and Chamber of Commerce data in the background.

Prototype

AI enrichment for HubSpot

For the minor “Dealing with GenAI”, my group received a real client: Yuki, VISMA’s accounting software with 136,000+ customer companies. Yuki’s sales team works with a CRM (HubSpot) where sales notes are largely free text, company fields often remain empty and inside sales manually looks up missing data. The assignment was an advisory report plus a working prototype that shows how AI can improve that process without relinquishing control. I built the prototype: two Python repos with a FastAPI web app on top of a separate reusable Python package. Every change that the AI ​​proposes first ends up in a review table, and only after explicit approval does anything go to HubSpot. The choice for “supportive AI, not autonomous AI” is directly the advice from the report: phased rollout with a human in the loop.

The three tools

Notes & chatbot

Part A, Processing notes, allows an LLM to propose up to ten fields per sales note (accounting package, employees, Chamber of Commerce number, turnover, address), each with a reliability score and a quote as substantiation.

Part B, Chamber of Commerce enrichment, compares HubSpot companies with the official Trade Register and automatically fills or corrects company data, with the company name as the only exception that is never overwritten.

Part C, the Lead agent, is a chatbot that answers questions about the data in HubSpot in plain language with tables or graphs: it can read freely itself, but every write action shows it as a proposal.

Data security

Human-in-the-loop

The heart of the system is the review table: no changes reach HubSpot without explicit approval. High-confidence proposals can be approved in bulk, low-confidence proposals deliberately cannot, and a conflict resolver and audit log keep everything traceable. Rejected proposals are returned as a negative example in the next run. When applied, only empty fields are filled, and a different existing value is never silently overwritten.

Because Yuki does not (yet) have a processing agreement with Anthropic, a built-in test data guard blocks notes without fixed marking before the API call. The LLM provider can be switched with one variable (Anthropic Claude or Google Gemini), and the entire test suite (490 tests) runs mocked, without external API calls or costs.

Questions? Contact me or return to the overview