A file based CRM was the right call for a five person pipeline
JSON, CSV, and a nightly audit script keep the whole pipeline honest. What it looks like and where it breaks.
WinflowAI’s CRM is three files and a handful of Python scripts. One JSON file holds every account and its pipeline stage. A second holds qualified meetings. An append-only CSV is the payment ledger. No login page, no per-seat fee, no vendor. For a pipeline my size it has beaten every SaaS CRM I’ve used, and I want to be specific about why, because the answer has real limits.
The shape of it
accounts.json tracks each lead and client through my pipeline stages, with source, terms, and history on every record. meetings.json logs every qualified meeting, because my pricing bills per booked meeting and each one needs a paper trail. payments.csv only ever gains rows. Nothing edits history, so the ledger can always be trusted over anyone’s memory, including mine.
Import scripts pull from Stripe and Upwork, and they’re idempotent, so re-running one can never duplicate a payment. An aliases file maps the messy names payment processors use to the clean account they belong to.
The audit is the actual product
The piece that turns a pile of files into a CRM is the reconciliation audit. A script cross-references all three files against my standard terms and prints what drifted: a retainer unpaid past its date, a build fee never collected, a meeting delivered but never billed.
Every CRM claims to track this. In practice a SaaS CRM tracks whatever someone remembered to type in, and nobody audits the gap between the CRM and the bank account until tax season. Mine runs on demand, takes seconds, and has caught real money: unbilled meetings that would’ve quietly evaporated in any system that relied on me remembering.
Why files win at this scale
With a handful of active accounts and a few dozen leads, my entire database is smaller than one marketing email. At that size the tradeoffs flip. Version control works, so git diff shows exactly what changed in my pipeline this week. Any script reads the whole dataset in a millisecond. And because it’s plain text, Claude Code operates on it directly: I say “log a $2K payment from Ben and advance him to active,” and the entry gets made, attributed, and audited.
That last part is the quiet superpower. Every SaaS CRM is racing to bolt AI onto their interface. Plain files have been AI-native the whole time.
Where it breaks
I know exactly where the edges are. Two people writing at once will eventually clobber each other, so this design assumes one operator. Somewhere in the hundreds of accounts, grepping stops being fun. And the moment a team needs shared dashboards, permissions, or a mobile app, the vendors earn their fee.
My rule from this build: the CRM should be simpler than the pipeline it tracks. A five person pipeline managed through fourteen HubSpot screens is a full trad rack hauled up a gym boulder. All that gear, and it’s slowing down the exact climbing it was supposed to protect. When my pipeline outgrows my files, migrating will be easy, because everything’s already structured, exportable, and clean. Until then, three files.