Zoho CRM

zoho.com

ALMOST

A weekend of work, and real gaps remain.

A full sales CRM at a low price, and the entry point to a very large suite — accounting, help desk, email, projects — all sharing one account and one customer record.

Promptfree, for everyone, and the only version there is
Build the CRM I actually need instead of Zoho — and start by noticing what the verdict means.

This is one of the cheapest full suites available, and the price is genuinely hard to beat on features per euro. What it costs instead is fit: a general CRM is somebody else's guess at your sales process, and configuring one into your shape is its own project. Build when your process is specific and small.

STACK
- Node 20+ with Fastify, server-rendered HTML with a little vanilla JS
- SQLite through better-sqlite3, WAL mode, with FTS5
- Caddy in front

THE DATA MODEL
- organisations: id, name, domain, address, owner_id, custom_json
- people: id, organisation_id, name, emails_json, phones_json, title, owner_id
- pipelines and stages: id, name, position, rotting_days
- deals: id, pipeline_id, stage_id, organisation_id, person_id, title, value_cents, currency, expected_close_on, owner_id, status, won_at, lost_at, lost_reason_id, source
- stage_history: id, deal_id, from_stage_id, to_stage_id, at, actor_id — append-only, and where every honest number comes from. It cannot be reconstructed later
- activities: id, kind, subject, note, due_at, done_at, deal_id, person_id, owner_id, source
- emails: id, message_id, thread_id, direction, from_address, subject, snippet, occurred_at, deal_id, person_id
- lost_reasons: id, label — required on a lost deal, because that is the only way anybody learns from losing

THE TWO THINGS THAT DECIDE WHETHER IT IS USED
- **Email filed automatically.** Read-only mailbox sync, matched to a person by address and to a deal by thread, storing the address, direction, subject, timestamp and a short snippet — never the body. Store the thread id on the deal the first time and everything in that thread follows. When two open deals share a contact, file against the person and ask rather than guess
- **A next activity on every deal.** A deal with nothing scheduled is shown as such, prominently. Add a rotting period per stage and that pair does more for a pipeline than any forecast

REPORTING THAT IS HONEST
- Conversion between stages and time in each stage, computed from stage_history
- Deals not moved in longer than the median stage duration, ranked
- Weighted pipeline shown beside the unweighted total, with the weights stated — better, conversion rates from your own closed deals applied to what is open
- Everything computed at query time. No stored totals

THE REST
- Views as saved filters, a board per pipeline with drag to move a stage
- Deduplication by email and domain, reviewed by hand, merges reversible. Never automatic
- FTS5 across people, organisations, notes and activity subjects
- Export everything as CSV and JSON in one command, including stage history

OPERATIONS
- .env: DATABASE_PATH, BASE_URL, SESSION_SECRET, ENCRYPTION_KEY, provider credentials
- Migrations on boot, each once; credentials encrypted at rest
- Nightly backup off the machine, restore script
- Health endpoint reporting mail sync age

WHAT MATTERS MOST
Email filing and stage history. The first is why the CRM stays current; the second is the only thing that will ever tell you something you did not already know.

What you lose

  • A suite where the CRM, the help desk and the books share one customer, for less than a single seat costs elsewhere
  • Telephony, email sync and enrichment already wired into the record
  • Automation, approvals and territory rules an administrator configures without a developer
  • Mobile applications and a very long feature list you would otherwise reproduce

If you would rather not build

  • A spreadsheet, honestly, until the pipeline outgrows it

The escape hatch

open source · no votes, no paid placement

Twenty

$0

A modern open-source CRM with a customisable data model.

twentyhq/twentyfree · open source

EspoCRM

$0

A mature self-hosted CRM with sales, support and marketing modules.

espocrm/espocrmfree · open source

Why this verdict

our own opinion · changed only by a person

48/100

Verdict kinda at 48: the CRM itself is a fortnight, but the price is low enough that the money argument is weak, and the suite around it is what people actually buy. Build for fit rather than for savings.

History

tracked since 14 Aug 2026 · nothing is ever overwritten

Interest · last 30 dayspeak 2/day
views01217 Jul22 Jul27 Jul1 Aug6 Aug11 Aug15 Aug
views prompt copies none yet votes none yet

Questions about Zoho CRM

answered from the record above

Is Zoho CRM free?

No — the plan we track is $14 a month. Standard at $14 per user per month billed annually, around $20 monthly; higher tiers add automation and analytics.

Can you replace Zoho CRM by building your own?

ALMOST. A weekend of work, and real gaps remain. Replacement score 48 out of 100, build time a weekend. Read what you lose before you decide.

How much does Zoho CRM cost?

$14 a month on Standard — $168 a year. Recorded 14 Aug 2026.

What do you lose by replacing Zoho CRM?

A suite where the CRM, the help desk and the books share one customer, for less than a single seat costs elsewhere; Telephony, email sync and enrichment already wired into the record; Automation, approvals and territory rules an administrator configures without a developer; Mobile applications and a very long feature list you would otherwise reproduce. If any of those carry weight for you, keep paying.

Is there an open-source alternative to Zoho CRM?

Yes: Twenty, EspoCRM. The prompt on this page is for when you want it your way instead.

Related entries

same category first, most replaced first

All 17 in CRM & sales

Not sending yet

Every week, something stops being worth paying for.

New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.

free forever · no tracking pixel · stored here, never passed to anyone

Esc