Sales CRM

macOSweb appElectronReactSupabaseClaudeMEDDICmobile

Sales CRM is the app my sales team uses to run new business — selling to education publishers and language schools. It’s the sister app to our Fundraise CRM: the same shared, live-syncing foundation, retargeted from raising money to closing deals, with the MEDDIC qualification framework built into every account.

What it does

  • One shared pipeline. The whole team works the same set of accounts and every edit syncs in real time. Deals move Lead → Discovery → Demo → Evaluation → Proposal → Negotiation → Closed, and the dashboard rolls up what’s won, what’s in negotiation, and what’s still live — the open stages weighted by each deal’s likelihood, so the number is a forecast rather than a wish.
  • MEDDIC on every deal. Each account captures Metrics, Economic Buyer, Decision Criteria, Decision Process, Identify Pain, and Champion, with an at-a-glance score so reps can see which deals are actually qualified and which are wishful thinking.
  • People, not just companies. Every account holds multiple contacts with their own details, and the full communication trail — calls, emails, WhatsApp, LinkedIn, meetings — is logged per person, so it stays readable even with several stakeholders in the same deal.
  • Pricing proposals. Quotes are stored as volume tiers — a license fee per user per month at each band, in the customer’s currency — with status and history, so the latest pricing always lives with the account.
  • Knows where it’s leaking. When a deal is lost, the CRM records the stage it died at, then shows where in the funnel we’re weakest — so we fix the stage that’s actually costing us, not the one we assume. Cards also flag overdue next actions, accounts gone quiet for two weeks, and deals marked at risk.
  • Whose deal is it. Every account has a relationship manager, and the list filters by owner — pulled from the team roster, so unassigned accounts are visible too.
  • A pipeline you can print. A stage-by-segment grid (publishers, language schools, other) gives the whole funnel on one screen, and prints cleanly for a pipeline review.
  • In and out. Import accounts from CSV and export them back; segment values are normalised on the way in.
  • Anywhere, any device. A native macOS app at your desk, or the same CRM in a browser on your phone — same database, always in sync, so you can update a deal walking out of a meeting.
  • Auto-fill from the call log. Click one button and Claude reads everything logged against the account and drafts the empty MEDDIC fields, so the qualification is grounded in what the customer actually said.

How it’s built

  • One codebase, two surfaces — a Vite + React renderer that ships both ways: packaged by Electron into a double-clickable macOS app, and deployed as a web app on Cloudflare Pages that runs in any browser, desktop or mobile.
  • Data & auth — a shared Supabase Postgres database with row-level security and realtime; accounts, contacts, communications, and proposals are separate tables that stay live across every client. Sign-in is invite-only, so removing a teammate revokes access immediately.
  • Extraction — the Claude call runs in the Electron main process using each user’s own Anthropic key, stored encrypted in their Mac’s Keychain and never sent anywhere but Anthropic’s API. You can pick the model in Settings.
  • Security — context isolation, sandboxing, no Node integration in the renderer, and a content-security policy that only allows outbound traffic to Supabase. No secrets in the build.

Why I made it

We already had the Fundraise CRM for raising capital, and the sales team wanted the same thing for selling — but a pipeline is only as good as its qualification. Bolting MEDDIC onto every account, logging conversations per person, and recording where deals die turns the CRM from a list of names into something that tells us, honestly, where the business is strong and where it’s weak.