In late 2024, Codefree — a 12-person software agency doing custom work for clients across four countries — decided we needed better tooling to run our own operation. In early 2025, we started building it. In late 2025, it was doing everything our previous four-tool stack did and more. In early 2026, we opened it to outside customers under the name Klientele. **The gap between "we're using it internally" and "we're selling it externally" was 14 months. Deliberately.** This is why, and what happened during that gap that made the product better than it would have been if we'd shipped in month three.
Why did Codefree skip the MVP for post-sales software?
Direct answer: Codefree skipped the MVP for three reasons: post-sales operations software is unforgiving of missing pieces (a wrong invoice is not a fix-it-next-sprint bug), the honest test loop is monthly not weekly (retainer rollover behaviour only shows up on the 1st), and we were the harshest customer imaginable — every deficiency instantly became a real Codefree operational problem, which is the only environment that produces a product that ships well.
Every startup playbook says: build the minimum thing, ship it to real users, iterate on their feedback. That playbook is correct for most SaaS products. It was wrong for this one, for three specific reasons.
Reason 1 — post-sales operations software is unforgiving of missing pieces. If a task manager is missing a feature, users work around it — put a workflow in Notion, ping each other on Slack, live with a gap. If a billing system is missing a feature, invoices go out wrong and clients get angry. If a retainer reconciler is missing a feature, money leaks. There is no "we'll add it in the next sprint" recovery for an invoice that shipped with the wrong tax field. The floor for this category is much higher than an MVP.
Reason 2 — the honest test loop is monthly, not weekly. Retainer rollover behaves correctly? You find out after the 1st of the next month. Invoice DSO improved? Six weeks after invoices go out. SLA breach alerts fire correctly? Only when a real SLA actually breaches. Fast-iteration MVP loops rely on daily user feedback — this domain's real feedback is a month or a quarter downstream.
Reason 3 — we were the harshest customer imaginable. Codefree already ran a functional 12-person agency. Every deficiency in Klientele instantly became a Codefree operational problem. If our billing system generated a wrong invoice, we lost a real client's trust, not an imaginary early-user's patience. The stakes were real. That's the environment that made the product ship well.
“Ship-fast-and-learn works when the cost of a bug is user frustration. It doesn't work when the cost of a bug is a wrong invoice or a missed compliance deadline. Some categories deserve to ship late.”
In what order did Codefree build Klientele?
Direct answer: Codefree built Klientele in five layers over 12 months, each running production for at least a month before the next started: Layer 1 Intake (Q1 2025 — every client request went into Klientele), Layer 2 Execution (Q2 2025 — sprints, capacity, estimation formula), Layer 3 Delivery (Q3 2025 — time tracking, retainers, invoicing), Layer 4 Visibility (Q3 2025 — executive dashboards), Layer 5 Configuration (Q4 2025 — industry templates and AI generator).
We built Klientele in five layers, one at a time, each one running production for at least a month before the next started:
Layer 1: Intake (Q1 2025)
Every request to Codefree went into Klientele. Client emails were forwarded to a workspace-specific inbound address that turned them into tickets. Widget on our own site captured bug reports from clients. The internal team used the app directly.
Success signal: within four weeks, nobody at Codefree was using the previous ticket tool (Jira) for anything new.
Layer 2: Execution (Q2 2025)
We shipped sprints, weekly capacity plans, and the estimation formula. Every developer's week was planned in Klientele. Every ticket got the multiplier treatment before commitment.
Success signal: variance on committed sprint work dropped from ~40% to under 20% in the first quarter of using the honest capacity model.
Layer 3: Delivery (Q3 2025)
Time tracking, retainer accounting, invoice generation, PDF invoicing, payment tracking. This was the hardest and most consequential layer. It replaced Toggl + QuickBooks + our retainer spreadsheet in one pass.
Success signal: the first end-to-end invoice ran through Klientele in July 2025. It was correct. The client paid it. We celebrated with dinner. It's a low bar until you've had a wrong invoice go out.
Layer 4: Visibility (Q3 2025, overlapping with Delivery)
Dashboards for every seat. CEO view, CFO view, CTO view, developer view, client view. Executive dashboards with health scores, alert streams, top priorities. Real-time WebSocket updates. Push notifications, mentions.
Success signal: the Monday reconciliation meeting was retired in September 2025. It's been dead for over a year. Nobody misses it.
Layer 5: Configuration (Q4 2025)
Industry templates for five verticals beyond agencies. Custom fields per entity. Status overlays. Terminology renaming. And a way to configure any vertical we hadn't hand-built.
Success signal: first successful cross-vertical use of Klientele — a friendly legal firm ran the Legal template internally for six weeks in Q4 2025 as a beta. Their feedback shaped the Legal template's final shipping form.
What almost killed Klientele — the pressure to ship early?
Direct answer: Four temptations almost killed the project: month 3 (a partner suggested a 20-agency private beta, but the billing layer was not built), month 6 (a conference invited us to speak, which would have created external pressure), month 9 (an investor asked when we would raise, we declined until year-one), month 12 (branding was ready and sales was itching, we held for two more months) — each temptation was right in isolation and wrong in aggregate, and the category demanded we ship late.
The hardest part of building a product for 14 months before shipping is resisting the market's constant tug to ship earlier. We got that tug at every stage:
- Month 3 — a partner suggested we open a private beta with 20 friendly agencies. The billing layer wasn't built. We would have shipped a ticket manager pretending to be a post-sales platform.
- Month 6 — a small conference approached us to speak about our internal tooling. We declined. Speaking publicly would have created external pressure to open access.
- Month 9 — an investor asked when we'd take capital to accelerate. We said "not until we've run this internally for a year." They walked. Their firm now leads our seed round, so no hard feelings.
- Month 12 — the branding was done, the marketing site was ready, and the sales-team-of-one was itching. We held for another two months to hit the 14-month internal mark. Zero regret.
Every one of those temptations was structurally right in isolation and wrong in aggregate. The category demanded that we ship late. We did.
What did 14 months of internal use change about Klientele?
Direct answer: Four significant changes came out of internal use: the retainer rollover cron was rewritten with idempotency keys after silently dropping updates on the 1st, the overdue-ticket digest was aggregated to 4-hourly after generating 60 emails during one SLA incident, the estimation buffer bracket became U-shaped after 6 months of Codefree variance data replaced the flat 20% buffer, and the client portal's default hidden fields were added after our own clients asked uncomfortable questions about internal notes.
Fourteen months of running our own operation on Klientele changed the shape of the shipped product in ways an MVP-then-iterate approach would have missed.
The retainer rollover cron. We built it in month 4. In month 6 we discovered it was silently dropping rollover on retainers whose configuration was mid-update on the 1st of the month. Fixed. Rewrote the cron with optimistic status transitions and idempotency keys. Six months later — still no incidents. An external customer would have been billed wrong before we caught it.
The overdue-ticket digest. First version sent one email per overdue ticket per hour. During an incident where fifteen tickets breached SLA simultaneously, our own team received 60 emails in an hour. Rebuilt it into an aggregated digest that fires every 4 hours with a single email per assignee listing all their overdue tickets. Nobody at Codefree has complained about ticket notification volume since. If we'd shipped the first version to customers, we'd have taught them to filter our emails to spam.
The estimation formula's buffer bracket. We shipped with a flat 20% buffer. After 6 months of internal variance tracking, the U-shaped bracket (higher buffer at both size extremes) replaced it. Our sprint predictability improved. That change is only possible because we had 6 months of our own variance data to fit against. An external customer would have burned through a year of missed sprints before generating the same data.
The client portal's default hidden fields. The first version showed client users everything the internal team saw, including internal notes and time estimates. Our own clients started asking uncomfortable questions ("why is this estimated at 3 hours when you billed us for 8?"). We added the portal's hidden-fields system before anyone else saw it. Now the default hides internal notes and time estimates until a workspace explicitly opts in.
“Every one of these fixes cost us zero customer trust because we were our own customer. An external MVP would have taught us the same lessons at 10-100× the trust cost.”
How did Codefree decide Klientele was ready to sell externally?
Direct answer: Codefree required four internal metrics to be true for six consecutive months: utilization variance within ±5% of reported (achieved ±3%), retainer leak under 10% (achieved 6-8%), invoice cycle time under 7 days (achieved 4-5 days), and zero-incident months achieved for 6 consecutive periods (achieved Q3-Q4 2025). All four hit; the last two months of 2025 were documentation and packaging; February 2026 was public launch.
Before opening Klientele to outside customers in Q1 2026, we made ourselves earn it. Three internal metrics had to be true for six consecutive months:
| Metric | Target | Actual over final 6 months |
|---|---|---|
| Codefree utilization variance from reported | ±5% | ±3% |
| Retainer leak (unbilled hours as % of capacity) | Under 10% | 6-8% |
| Invoice cycle time (work-done to paid) | Under 7 days | 4-5 days |
| Zero-incident months | 6 consecutive | Achieved Q3-Q4 2025 |
We hit all four. The last two months of 2025 were spent on documentation, marketing site, packaging, and the six industry templates. February 2026 was the public launch.
What did Codefree learn from 14 months of internal use that we did not expect?
Direct answer: Three unexpected lessons: (1) the industry template layer is more important than the underlying platform — a legal firm's day-one experience is entirely defined by whether the form says "Matter" or "Ticket", (2) client-visible features get used but internal-only features get demanded — the internal team judges the product by their daily life, and (3) nobody wants a workflow builder; everyone wants opinionated defaults that cover 90% with escape hatches for the rest.
The template layer is more important than the underlying platform. We built Klientele expecting the differentiator to be the operational depth — the retainer math, the audit chain, the honest capacity model. Those matter. But the moment we started shipping the industry templates, we realised the templates were the difference between "capable software" and "software that felt built for us." A legal firm's day-one experience is entirely defined by whether the ticket form says "Matter" or "Ticket." Everything else is context.
Client-visible features get used, internal-only features get demanded. Every client-facing feature we shipped (portal, invoice public share links, notification preferences) had lower internal usage than we predicted. But every internal-only feature (activity log, dashboard widgets, capacity planner) had constant demand from our own team. Post-sales operations software is bought for the internal team's daily life, then judged by the client's occasional visits. Getting that priority backwards is the most common category mistake we see.
Nobody wants a workflow builder. Everyone wants opinionated defaults. We shipped a very flexible custom-field system. Almost nobody in our internal team used it — they wanted the templates to be right on day one, then leave the customization for edge cases. This changed our template design philosophy: opinionated defaults that cover 90% of the use case, with escape hatches for the rest. Not a blank canvas.
What changed when Klientele opened to external customers?
Direct answer: The product itself did not change when Klientele opened to external customers in February 2026 — it had been operationally hardened for 14 months. What changed was how we heard feedback: internal feedback is instantaneous and continuous (Slack pings within minutes), external feedback is filtered and often too polite (customers do not complain about notification volume, they just start ignoring the emails), so we built explicit external feedback loops (NPS at 30/60/90 days, one-on-one interviews at 30 active days, public roadmap voting).
The public launch in February 2026 was the first time Klientele had real, non-Codefree revenue at stake. The change wasn't in the product — the product had been operationally hardened for 14 months. The change was in how we heard feedback.
Internal feedback is instantaneous and continuous. Our team pings me on Slack the moment something's confusing. External feedback is filtered, delayed, and often too polite. Customers won't tell you the notification volume is annoying — they'll just start ignoring the emails. Customers won't tell you the terminology feels off — they'll just churn quietly. We built better external-feedback loops in the first quarter of public launch than we had internally: NPS at 30/60/90 days, one-on-one product interviews with every workspace that hits 30 active days, a public roadmap that anyone can vote on.
Codefree bet 14 months of runway on the belief that this category deserved a product built by operators rather than iterated toward operators. We were right. Klientele is now three months into public availability, running production for a growing set of service businesses across legal, healthcare, agencies, consulting, SaaS support, and vet clinics. The version they signed up for was already 18 months old the day they saw it. That's the value proposition. That's the bet. And it's why the retainer math you'll see on day one is the same math we run our own business on Monday morning.
Last updated July 30, 2026