A professional-services firm's most valuable asset is who knows whom — and it lives in partners' inboxes. The CRM, if there is one, is a list of companies nobody updates.

AtlasCRM starts from a different place. It builds the relationship graph from the work that already happens — emails and meetings synced from Microsoft 365, the matters the firm runs, and the calls and notes people log — and turns it into three answers: how strong every relationship is, the warm path from the firm to any person or company, and a stream of signals for the opportunities and risks the graph reveals.

The problem we started from

Three questions come up every week and nobody can answer them from the CRM: Who at the firm has the warmest way into that prospect? Which key clients have gone quiet? Which client only ever talks to one of us? The data to answer them exists. It is just spread across twelve mailboxes and a matter list.

Nobody updates a CRM. Everybody sends email. Build the graph from the email.

The graph

Nodes are the people at the firm, the contacts outside it, and the companies. Edges are typed and weighted: works at, knows (derived from touchpoints), counsel to (from matters), and the things a mailbox cannot see — former colleague, alumni, board member, referred by, counterparty — entered by people who know. Every company and contact page shows its two-hop neighbourhood as a radial graph: hover an edge for the relationship and its strength, click a node to jump.

01

Derived where possible

User ↔ contact strength is computed from touchpoints in the last year plus recency. It updates the moment a touchpoint lands.

02

Entered where necessary

A board seat or a shared past is one form: from, kind, to, strength, note.

03

Kept through change

When a contact moves company the graph keeps their history — and now knows a way into the new account.

Strength, not opinion

The strength of a user–contact edge is a small formula everyone can read: a base, plus a little for each touchpoint in the last year (capped), plus a recency bonus if the last one was in the past 30 or 90 days, plus any manual boost, capped at one. It is deliberately simple. The value of the number is that it is the same for everyone and moves for a reason — a meeting yesterday counts, a coffee three years ago does not.

Warm paths

Ask for a way into a prospect and AtlasCRM runs a shortest-path search over the graph — maximising the product of strengths, at most four hops — from every person at the firm, and ranks the results. "Maya knows Lotte, who just joined Nimbus as General Counsel" beats "Chloé knows someone who knows someone on the board". Each company page shows the best introducer and the alternatives, with the route drawn out.

01 / EDGESLoad the graph

Every edge above zero strength, undirected.

02 / SEARCHBest route per person

Dijkstra on −ln(strength), four hops max; only the origin may be someone at the firm.

03 / RANKBest introducer

Highest product of strengths wins; ties go to fewer hops.

04 / ALTERNATIVESSecond and third

Ban the first edge and search again.

Signals

The graph is only useful if it tells you something before you ask. Six rules run continuously:

  • Dormant client — a client with no touchpoint in 90 days, scored by lifetime fees.
  • Contact moved — someone changed company in the last 180 days; a warm path into a new account.
  • Warm prospect — a prospect nobody has touched in 60 days, with a strong path in from someone at the firm.
  • Cross-sell — a client with several matters, all in one practice area.
  • Stalling pipeline — an opportunity with no touchpoint in 30 days.
  • Single-threaded — a client known by exactly one person at the firm.

Each signal becomes a task with an owner and a date in one click, or is dismissed. The dashboard leads with them.

Matters and touchpoints

Matters run through a pipeline — lead, proposal, negotiation — and become engagements when won (the prospect becomes a client on the spot) or are marked lost. Winning and closing keep the counsel to edges in step, so the firm's own history with an account is part of the graph. Touchpoints come from the Microsoft 365 sync — simulated in the demo behind the same interface — or are logged by hand for the calls and meetings that never hit a calendar.

How it is built

House stack: a Go backend (standard-library routing, SQLite, no CGO) with the path search implemented directly over the edge table, a deterministic seed of twelve people, thirty companies, eighty contacts, forty-two matters and a year of touchpoints whose strengths are computed on start, and tests for warm paths, strength updates, the pipeline, signals, sync and job changes; and a Next.js 16 / React 19 frontend on shadcn/ui and Tailwind v4 with an inline-SVG graph, a pipeline board, and the usual dashboard, directory and audit trail. It signs in through the System32 control plane.

Try it

AtlasCRM is available now in the System32 catalog. Connect a mailbox and watch the graph appear.

Previous build logIntroducing AssetLedger