Case study · Product

ClickBox CRM: the system a real business runs on

Around the second dozen events, a spreadsheet stopped working and no CRM off the shelf fitted how the business books, contracts and gets paid. So I built one — and then rebuilt its phone client as a native, offline-first Android app.

Role
Founder, Full-Stack Engineer
Company
ClickBox
Period
2024 – present
Stack
Kotlin · Compose · Room · Express · SQLite · Claude · Voyage AI
CRM home: revenue, expenses, what needs you, pipelineCRM deals grouped by stageCRM deal detailCRM inbox with lead and deal tagsCRM VAT, social security and payroll overview

Home · Deals · Deal detail · Inbox · TaxGeneric demo data

Why build it

My third CRM — the first I built

I’d already rolled out HubSpot and extended Zoho for other companies. That’s how I knew when configuring stops paying and building starts.

2024 · DSwissBought: HubSpotLed the first CRM rollout and cleaned corrupted invoice data so the CRM could be trusted.
2025 – 26 · AralabExtended: Zoho →Implemented it, then went past the defaults with Deluge, client scripts and custom widgets.
2024 – now · ClickBoxBuilt: ClickBox CRMRuns a business doing €50K+ a year across 300+ events — booking to invoice.
  1. CaptureLead + dealWebsite forms and n8n create the deal, visible on desktop and phone.
  2. AI front officeDraft, retrieve, approveAn LLM drafts replies from past mail; a human approves in Telegram.
  3. ContractE-sign + invoicePDF, PKCS#7 signature with a trusted timestamp, then the invoice.
  4. MoneyRoute + reconcileDeposit and final payment route to the right provider per account.
AI with a human gate

Teaching a model to sound like the business

Replies are drafted from an embedded corpus of the business’s own past correspondence, so they sound like ClickBox, not a help desk. Nothing sends automatically: every draft goes to Telegram first. When one is rejected, a second, cheaper model classifies why — so rejections improve the next draft instead of disappearing.

CRM inbox and thread in landscape
Depth, not breadth

A tax assistant that checks its own citations

A Telegram bot takes a receipt and has to decide the VAT treatment. It doesn’t answer from a model’s memory of tax law: it retrieves the relevant articles from a locally indexed legal code, reads only those, and cross-checks every citation against what it opened. A citation to an article it never read is stripped and the answer blocked.

Product decision

Why I replaced the WebView with native

CRM deals board in landscape
  • No signal, no appVenues have bad coverage. Room is now the source of truth.
  • Desktop tables on a phoneHorizontal scrolling everywhere; every screen is now drawn for 412 dp.
  • A stack of fragile workaroundsCookie forwarding, a spoofed user agent — replaced by one device-token header.
  • A feature ceilingThe shell reached about 56 of the backend’s 328 endpoints.
294unit tests on the deal stage machine, invoice maths, contracts, payroll and VAT
6Gradle modules — pure domain logic kept apart from UI, network and storage
4refresh triggers: a push, the foreground, a 15-minute job, pull-down on the inbox
1WebView kept on purpose — sandboxed, for untrusted email HTML
Design system

Colour that carries meaning

“Studio” — one light theme, one coral action per screen, and a fixed tint mapping used on every screen, so a colour always means the same thing.

  • Mintmoney in
  • Peachmoney out
  • Skymail & info
  • Lemondates & deadlines
  • Rosedanger