We used to pay for a CRM. It was competent, expensive, and built for a company that does not look like ours. Every quarter we paid for seats we did not fill and modules we did not open, and every quarter our one trade rep worked around it in a spreadsheet because the software did not understand the job.
Over a weekend, we replaced it. Not a prototype — the actual system the business runs on. It is live, it holds 690 trade members, and the subscription line is gone.
Generic CRM is priced per seat and designed for the average of every business that has ever bought one. That average is not a real company. It is a committee’s idea of one.
What our rep needed was narrow and specific: which trade accounts have gone quiet, who ordered samples and never converted, what is the exact trade price for this material at this tier, which quotes are stalling, and what should I do first this morning. A general-purpose CRM can be configured toward some of that. It will never be built for it.
We stopped asking how to configure the software around the business, and started asking what the software would look like if the business had written it.
| Capability | What it does | Why generic CRM could not |
|---|---|---|
| Start my day | Ranks today’s accounts by why they need contact, not by a static list view | It does not know what a stalled sample means in our business |
| Trade pricing engine | Live tier pricing across every material and roll size, including made-to-order | Pricing lives in Shopify, not in a CRM object model |
| AI drafting | Writes the outreach in our rep’s voice, grounded in the real catalog and real order history | Generic AI writes generic email and invents products |
| Follow-through | A promise made in an email becomes a task automatically | Nothing connects the sentence to the obligation |
| Reorder and sample intelligence | Flags who is due, who sampled and stalled, who is drifting | Requires our data model, not a CRM’s |
The last one is the point. When our rep tells a designer their samples are going out today, the system creates the task to actually send them. The email and the obligation are the same object. No CRM we looked at does that, because no CRM knows what we promise.
Multi-tenant SaaS carries permanent overhead. Every query is scoped, every page is generalised, every screen renders fields ninety-nine percent of customers hide. Ours holds one company’s data on one server and renders the four things a person needs.
Speed is not vanity here. A rep who can work an account in seconds works more accounts. That is the entire return.
This is a build log, not a sales pitch, so here is what it actually cost.
You still own it. When something breaks at eleven at night, there is no support queue — there is you. We have had a genuine bug where lifetime XP on the rep dashboard drifted backwards because a ledger was being recomputed from a pruned source. A vendor would have shipped that fix for us. We shipped it ourselves, which is faster, but only because someone here can.
It also is not free. It is a trade: a recurring bill you cannot control for an ownership cost you can. That trade is obviously correct for a system with one power user and highly specific logic. It is much less obvious for payroll, accounting, or anything with regulatory surface. We did not build those and we are not going to.
We are not special. A weekend build that replaces a real subscription is now available to any operator with a clear head about their own workflow. The constraint stopped being engineering capacity and became knowing precisely what you want.
That is a genuinely new condition, and most software pricing has not absorbed it yet. We wrote more about where that leads in Software in Freefall.
Internal build log, Canvas & Ivy trade program. Figures reflect our own system at time of writing and are specific to our use case.
We talk to founders at every stage — long before they're ready to sell.
Start a Conversation →