All posts
3 min readShane Richardson

Why we built Harmonia

We kept reaching for GoHighLevel, then we kept regretting it. So we built the CRM we actually wanted to run.

For the last three years, every time a client asked us to "put a CRM behind this thing we're building," we eventually arrived at the same answer: GoHighLevel.

Not because we loved it. Because it was the only platform in the $50–$300/seat band that could plausibly hold a multi-channel revenue operation — pipelines, inbox, calendar, comms, automations — without us re-implementing those four primitives ourselves.

So we kept reaching for GHL. And we kept regretting it.

What kept breaking

The complaints, in roughly the order we hit them:

  1. Per-contact pricing. GHL counts every contact toward your bill, which means as your client succeeds at the work the CRM was supposed to help with, they get punished for it. A 30,000-contact list isn't a luxury feature — it's table stakes for any agency doing more than six months of cold outreach.
  2. The API is a feature gate. Public API access is locked behind the highest tier. Rate limits are aggressive. There's no real webhook framework that lets you build outside the platform — just inside.
  3. The platform is bloated by acquisition. GHL is, at this point, not one product. It's a stitched-together stack — phone, funnels, AI, sites, payments — each clearly built or bought at different times, with different design conventions, that you have to navigate between like rooms in a strange hotel.
  4. The UX is built for affiliates, not operators. Sales-driven product design is real and you can feel it. Half the dashboard is trying to upsell you. Reps in the platform aren't trying to close deals — they're trying to navigate.
  5. Data is locked. Export is technically possible. It's also slow, partial, undocumented, and gated behind support tickets. If you want to leave, the platform makes leaving expensive.

For 18 months we shrugged. The alternative was Salesforce — also expensive, also bloated, but in a different way — and the gap between "GHL good enough" and "Salesforce too much" was where almost all our clients lived.

Then November happened

A client came to us with what should have been an ordinary ask. They're a 60-person brokerage running on aging Salesforce. The license fees were eating their margin. The UX was killing rep productivity. The Salesforce admins they'd brought in to fix it had stopped fixing it.

They asked us a question we hadn't been asked before: could you replace this CRM with something built around how we actually work?

We thought about it for two hours. We said yes.

The first version of Harmonia shipped 13 days later. Multi-tenant from day one, because we knew we wanted to run more than one team on it. Built on Supabase because auth, realtime, storage, and pgvector should be solved problems, not project line items. Designed in dark mode first because most CRM operators stare at the thing 8 hours a day and the glare matters.

The client went live, moved their whole team across, and never asked to go back to Salesforce.

What we want Harmonia to be

This is the part that's a little tedious in founder essays, so I'll keep it short.

We want Harmonia to be the CRM that:

  • Doesn't tax growth. Flat tiers. No per-contact pricing. Your list can 10x and your bill doesn't.
  • Lets you leave. CSV export from the UI. SQL export from the API. Your data is yours.
  • Is open at the seams. Public REST API, webhooks, MCP server. If you want to build something Harmonia doesn't do — go build it.
  • Feels like one product. Not a stitched stack. Not a sidebar bot. One thing, designed.
  • Has a point of view. Some products try to be everything to everyone. We're not doing that. Harmonia is opinionated. If those opinions match yours, you'll like it. If they don't, there are 30 other CRMs.

Where to next

Harmonia is in production with paying customers today. The next six months: more verticals, more integrations, more polish on the surfaces we already ship.

If you're somewhere on the spectrum from "considering" to "let's go" — start a trial, or drop us a line.

— Shane