Co-founded product · in production
SOLAR.IA: the whole team selling on the same WhatsApp
A support and sales system for companies where several people share the same number. From product to infrastructure, through screens, back end and AI. Here's how it works under the hood and what I learned along the way.
The problem
Every company that sells on WhatsApp hits the same wall: one number, several people and no control.
- Conversations get lost across phones and nobody knows who was supposed to reply.
- The sale happens in the chat and never reaches the CRM.
- The owner can't see the funnel or who has been stuck for days.
- Careless bulk messaging gets the number banned by WhatsApp.
What it does
Team inbox
Every conversation in one place, with automatic assignment, transfers, labels and a button to take over or hand back to the AI.
CRM and funnel
Contacts, a Kanban funnel and a portfolio per agent. The Radar shows stalled conversations before they become lost customers.
AI that answers and suggests
An agent replies at any hour using the company's knowledge base and suggests answers to whoever is on duty. Voice notes become text.
No-code chatbots
Flows built in an n8n-style visual editor, simple for people who have never coded.
Campaigns with brakes
Broadcasts, sequences and scheduled messages with send protection: allowed hours, a daily cap and warm-up for new numbers.
Resold under the partner's brand
Agencies resell it with their own brand, domain and plans. Their clients never see the platform behind it.
Under the hood
The part the client never sees, but that holds everything together.
Chatwoot as an invisible engine
Conversations run on Chatwoot, but nobody sees its screens: each company gets its own account, created automatically. Community edition only, MIT licensed.
A Go BFF in the middle
The Next.js front end talks to a Go BFF that holds the rules, permissions and integrations. SQL is handwritten and sqlc generates the typed code.
AI with the client's own key
Each company uses its own AI key, stored encrypted and never sent back to the browser. Audio transcription runs on the server itself.
Three-level white label
Platform, partner and client, each with its own brand, domains and plans.
One company can't see another
Isolation has its own integration test: two workspaces in the same database trying to reach 11 kinds of each other's resources.
Security and privacy built in
Sessions that detect a stolen cookie, mandatory 2FA for admins, SSRF protection, rate limiting and export or deletion of a contact's data.
Backups that get checked
A daily database dump, ready to be copied off the server. If a backup fails, older ones are never deleted and the service reports itself as unhealthy.
Stack
- Next.js
- Go
- Chatwoot
- Evolution API
- OpenAI
- Whisper
- PostgreSQL
- Redis
- WebSocket
- MCP
What went wrong and how I fixed it
Not everything worked the first time. These were the stumbles that taught the most.
- Problem
Local AI, with a small model running on the CPU, was slow and got things wrong. A GPU machine would cost far too much.
FixBring-your-own-key stayed: each company uses its own AI account, and the server stays light.
- Problem
A failed backup was counted as good, and rotation deleted the good ones.
FixEvery dump is verified before it enters rotation, and a failure never deletes anything.
- Problem
A campaign to all contacts built 20 thousand recipients inside the request itself.
FixSending moved to a background worker, and the screen responds right away.
- Problem
A single large call to the MCP server took the BFF down by running out of memory.
FixLimits on the MCP: up to 20 items per batch and 1 MB per call.
- Problem
The assistant streamed its answer, but the Next proxy held it until the end.
FixA no-transform header let the stream through to the browser.
- Problem
Ad source data was lost on the way from the Evolution API to Chatwoot.
FixThe BFF now receives Evolution's raw webhook and stores the source before passing it on.
By the numbers
- ~170 → ~3 mson repeated conversation listings, with caching
- 250 a daysend cap per QR-code-connected number
- 11 resourcescovered by the cross-company isolation test
- 78database migrations
- ~70code review findings, all fixed
Want something like this for your business?
It doesn't have to be SOLAR.IA-sized. Tell me the problem and I'll tell you what makes sense.
Message me on WhatsApp