// internal_tools
Internal Tool & Custom CRM Development
Ops consoles, custom CRMs, and workflow tools for the processes your business actually runs on. Built for the moment the spreadsheet stops scaling and off-the-shelf stops fitting.
// what_we_build
What We Build
A single surface for the operations team: queues, states, actions. Replaces the tab-switching ritual across five tools that never agree.
Pipeline and relationship tracking shaped to your process, not a vendor’s template. Only the fields you use, with validation on all of them.
Requests, reviews, and sign-offs with an explicit state machine underneath. Who approved what, when, and what changed — recorded by default.
Numbers pulled from the systems of record, not pasted into slides. Every figure is traceable to its source query.
Forms with validation at the edge and at the database. Bad data is rejected on entry, because cleaning it downstream costs ten times more.
// how_internal_tools_fail
How Internal Tools Fail
Internal tools get less scrutiny than customer-facing software and hold more privilege. That combination produces a specific set of failures.
ADMIN_ACTION_WITHOUT_AUDIT_LOG
Someone edits a critical record in production. Nobody knows who, when, or what it was before.
Counter: Every privileged mutation writes an audit entry — actor, timestamp, before and after. Built in phase one, not retrofitted.
PERMISSION_LEAK
The intern’s account can see payroll, because internal tools “don’t need” roles. Then a screenshot leaves the building.
Counter: Roles are defined in Discovery and enforced at the data layer. Internal does not mean trusted.
BULK_ACTION_NO_UNDO
An operator selects 400 rows and hits the wrong button. There is no undo, and last month’s export is the only backup.
Counter: Bulk actions run a dry-run preview first, execute in recoverable batches, and are reversible — or explicitly confirmed as not.
SPREADSHEET_STATE_DRIFT
The tool reads from a sheet that three people edit by hand. Reality and the sheet diverged weeks ago.
Counter: The tool becomes the system of record, with validated writes. Migrating off the sheet is part of the build, not an afterthought.
REPORT_ON_STALE_DATA
A dashboard shows last Tuesday’s numbers under today’s date. Decisions get made on them.
Counter: Every figure carries its freshness. A failed sync surfaces as a visible staleness warning, not as silently old numbers.
// faq
Questions
Should we build a custom internal tool or buy off-the-shelf?
When does Retool or Airtable stop scaling?
What does a custom internal tool cost?
Who maintains the tool after handover?
Can it connect to the systems we already use?
If the spreadsheet is now load-bearing, that is the signal. Discovery maps the process before any tool gets built.