A CRM the finance team
can close against
This write-up describes the operations desk we ship for sales and finance teams that have outgrown a spreadsheet and a vendor default. The live interface below is a deterministic simulator — not a named client account. Every number you see is a simulation parameter.
What this case actually covers
Named client write-ups wait for approval. This page is the reference implementation: the same six sections, written against a desk you can click through.
Context and constraints
An eight-seat sales team running pipeline in a spreadsheet, invoices in a separate ledger, and no shared account identifier. The constraint is not “more fields” — it is one model that sales and finance can both close against, with RBAC so a shared login is not the access model.
What was actually built
An operations desk with four working surfaces: overview KPIs and activity, a five-stage pipeline board, a deal register, and invoice aging. Opening a deal shows owner, source, probability and the next agreed action. Won deals stay on the same account as their invoices.
Architecture decisions
One account entity for company, deal and invoice — not a CRM sync job into an ERP. Stage changes are events, not overwritten columns, so the audit trail is the product. The public demo is a deterministic simulator so the page can be crawled and clicked without a backend.
Technology stack
React 19, TypeScript and the same design-system primitives as the rest of the site: Card, Table, Tabs, Dialog, Badge, Progress. Production builds add a Node.js integration layer, PostgreSQL and an event log. The demo does not call those services.
Verified outcome
There is no named-client outcome on this page. What you can verify is the interface: pipeline value, win rate, stale follow-ups and receivables move on a 20-minute tick. If a later client write-up reuses this desk, it will say so and only publish numbers they confirm.
What we would change
The demo still hides field-level RBAC and email/telephony adapters behind copy. In a delivery we would surface those as first-class screens — permission matrix and a replayable integration log — instead of leaving them in the architecture section.
The desk, running
Simulator parameters: 8 seats, 18 open-deal slots, €420k quarterly target, 20-minute ticks. No client data, no live ledger, no outbound mail.
Synthetic weekly bookings used to exercise the chart density, not a live ledger.
Calls, mail, meetings and stage changes generated by the simulator.
- −1hSent a follow-up emailHelios Grid
- −1hBooked a working sessionNordic Charge
- −2hLogged a callVistula Media
- −3hBooked a working sessionRhine Storage
- −4hSent a follow-up emailBaltic Ports
- −5hBooked a working sessionAtlas Fleet
- −6hSent a follow-up emailLumen Labs
- −7hBooked a working sessionSilesia Steel
Reading this case
Outgrown the spreadsheet stage?
Describe the pipeline, the ledger it does not talk to, and where hand-offs break. We map that to a concrete account model within 24 hours.