Build in Public
Explain SaaS Technical Debt While Building in Public
Explain SaaS technical debt in public with a maintenance note and fictional example. Separate completed work, released changes, and evidence of a benefit.
By Uriel Bitton · · 9 min read

The short answer
Explain SaaS technical debt publicly by naming the constraint, why it matters now, the chosen scope, current customer impact, checks, and follow-up evidence. Separate engineering work completed, changes released, and benefits measured. Refactoring can preserve visible behavior, so do not present it as a new capability or a proven performance gain.
Explain SaaS technical debt in public by naming the constraint, why you are addressing it now, what the maintenance will change, and what users can expect today. Separate completed engineering work from a released capability and from evidence of a benefit. A refactor can be worth explaining even when the product deliberately behaves the same way.
Building in public does not require a visible feature every week. Internal work can reveal useful product judgment: which constraint you chose to remove, which work you deferred, and what would justify the next step. The public update should let readers inspect that judgment without turning an expected improvement into a result you have not measured.
The maintenance note and CSV-import example below are editorial guidance. The example is fictional; no product refactor, benchmark, customer interview, or business result was conducted for this article.
Describe the constraint before calling it technical debt
Technical debt is a way to discuss internal design problems that make later changes harder. Martin Fowler’s explanation of technical debt uses the extra effort required to modify software as the interest in the metaphor. He also cautions that estimates of the work and its payoff are uncertain. That is a reason to explain your evidence and assumptions rather than announce a precise return on maintenance.
Start with something concrete: the same validation rule must be updated in several places, a routine change requires inspecting unrelated modules, or a supported workflow depends on a workaround. State only the constraint you can actually substantiate. “The codebase is a mess” gives readers little basis for understanding the decision.
Avoid treating every maintenance task as proof that the original team failed. Fowler’s technical-debt quadrant distinguishes deliberate from inadvertent debt and prudent from reckless decisions. Learning can reveal a better design later. Your public explanation can acknowledge that new understanding without inventing a story about carelessness or blaming a former collaborator.
Tell readers what changes for them, including when nothing does
An internal restructuring and a new product capability are different claims. Fowler’s definition of refactoring describes changing internal structure while preserving observable behavior. If your work also changes an import rule, permission, output, or supported format, describe that behavior change separately. Calling the whole release a refactor can hide information users need.
For an internal change, the useful customer statement may be that the existing workflow, supported inputs, and account requirements remain the same. Verify that statement before publishing it. If the change is not deployed yet, make its current state clear and describe unchanged behavior as the intended boundary, not a confirmed rollout result.
Readers following your build may care about why the work matters for future changes. Customers using the product may mainly need to know whether they must do anything. Give each audience its answer. A detailed explanation of module boundaries should not bury an instruction about an affected workflow.
Choose maintenance worth explaining publicly
Share the work when it explains a meaningful product choice, changes a previously stated plan, or provides a useful lesson about a constraint. A private cleanup task does not need an announcement merely to keep the public feed active. You can group routine maintenance or leave it in internal notes.
There is a useful historical example of making engineering work visible: in Buffer’s November 2017 account of its product cycles, Katie Wilde described time between cycles for work including refactoring and audits. That shows a company explaining its engineering process publicly. It is not evidence of Buffer’s current process or proof that a maintenance post increases trust, revenue, or retention.
For your own update, ask what readers will understand about the product decision afterward. If the only message is that you worked hard, a longer technical explanation will not fix the missing purpose.
Use a public maintenance note
Write the full internal decision first, then reduce it to the parts a reader can evaluate safely. The following note is a communication framework, not a technical-debt scoring system or a substitute for engineering review.
Part of the note | What to explain | Boundary to preserve |
|---|---|---|
Constraint | The specific repeated difficulty or design limitation. | Do not imply every old component is defective. |
Why now | The upcoming work, repeated friction, or learning that changed the priority. | Distinguish an observed problem from an estimated future cost. |
Chosen scope | The part you will improve and what you will leave alone. | Avoid turning a bounded refactor into a promise to rebuild everything. |
Current customer impact | What is available now, what may change, and any action needed. | Do not announce planned work as a completed release. |
Checks | What you will compare or inspect before and after the change. | A check covering selected cases does not prove universal correctness. |
Follow-up | What later observation would support the expected benefit or change the plan. | Do not claim faster delivery or better reliability before evidence exists. |
Use the smallest useful amount of detail. A customer-safe diagram or synthetic example can make the constraint understandable. A screenshot of an internal ticket often needs more explanation while exposing information that adds nothing to the lesson.
Keep a link or reference to the supporting internal work in your private note. That helps you check the public wording later. The public post can summarize the relevant evidence without exposing customer records, private messages, credentials, or sensitive system details.
A fictional example: consolidating CSV-import rules
Imagine a fictional reporting SaaS with two existing CSV-import routes. Over time, each route acquired its own copy of the same validation rules. When a rule changes, the founder must inspect and update both copies. She wants to consolidate the shared checks before adding another import route.
The issue is a repeated maintenance burden, not an established customer failure. She has not shown that imports are slow or unreliable. Her decision is to create one shared validation path while preserving the currently supported formats and error messages. Adding the next import route remains separate work.
Before implementation: explain the choice
The following is proposed copy for that invented situation, written at the planning stage:
We’re consolidating the shared CSV-validation rules before adding another import route. Today, a rule change requires checking two copies, which makes keeping them aligned more work.
The intended scope is internal: preserve the supported file formats and current error messages. This work does not add a new format. We’ll compare representative valid and invalid files before deciding whether it is ready to roll out.
We expect one shared path to simplify later changes, but we have not measured that benefit. We’ll return with what the checks covered, what remains uncertain, and whether the rollout changed anything users need to know.
That update makes a choice visible without claiming an improvement has happened. It also gives the next public update a job: report whether the intended boundary held and whether later work supports the expected benefit.
During checks: report the evidence you actually have
For this example, the founder could compare how both versions handle accepted files, missing required fields, empty rows, and previously supported error cases. These are proposed checks, not tests performed for this article. Real checks should come from the product’s actual behavior and risks.
If a previously accepted file becomes rejected, she needs to investigate whether that is a regression or an intentional change. A cleaner internal structure does not settle the answer. If she intentionally changes the accepted input, the public explanation must identify that change instead of claiming behavior stayed identical.
If selected cases match, she can report that bounded observation. She cannot infer that every possible input works, that support volume will fall, or that customers will finish imports faster. Those are different questions requiring their own evidence.
After release: keep the conclusion narrow
If the change is deployed and its status verified, the follow-up can say the shared validation path is in use and describe the compatibility checks completed. If users need no action, say so only after confirming that point. Keep any known exception beside the release statement.
The expected reduction in future maintenance effort remains a hypothesis until relevant later work provides evidence. The founder might return after making a validation-rule change to explain what she had to modify and what still required duplication. That observation can inform the next decision without becoming a claim about every future release.
Match each public claim to its evidence
A completed ticket, a successful deployment, and an improved customer outcome answer different questions. Keep those distinctions in the same update so a reader does not have to search older posts to discover the qualification.
Evidence available | Claim it may support | Claim it does not establish |
|---|---|---|
A reviewed implementation exists | The scoped internal work is implemented. | The change is available to every user. |
A verified rollout and defined checks | The specified version is deployed; the named cases were checked. | All behavior is correct or every edge case is covered. |
Relevant later observation | A specific later change involved the recorded work or friction. | A universal increase in engineering productivity. |
A defined performance or user study | A result within the measured task, conditions, and sample. | That the refactor caused every observed business improvement. |
If you want to publish a speed claim, use a separate measurement method and state its conditions. The guide to sharing SaaS speed tests while building in public explains how to bound that claim. Renaming modules or deleting code does not supply a performance measurement.
Keep the public record aligned when the plan changes
If maintenance takes longer, narrows in scope, or stops, update the decision rather than quietly leaving an earlier promise in place. State what you learned and which part remains unfinished. A newly discovered constraint can justify a revised plan without proving that the original work was pointless.
If the work changes customer behavior, publish the relevant release information where users expect it. The guide to writing a public SaaS changelog for feature adoption covers that customer-facing task. A build-in-public explanation can link to it while keeping the reasoning behind the maintenance decision available.
Buildside’s About page describes public SaaS progress sharing and collaboration. A maintenance decision can be part of that record when it offers concrete context for other founders. Buildside publishes this Journal; this is a suggested communication use case, not a claim that the platform audits code or verifies an author’s engineering results.
For your next maintenance update, write the constraint, the chosen scope, and the current customer impact before describing the implementation. Then add the checks and the evidence still missing. That gives readers something useful to inspect while the less visible work continues.
Questions founders ask next
Should I publish an exact technical-debt percentage?
Use a percentage only when you can explain what it counts, how it was estimated, and its limits. An internal label or tool score does not automatically represent a share of customer risk, future development time, or money owed.
Can I share the decision before the refactor ships?
Yes, if the update clearly describes planned or ongoing work. Explain the intended scope and current user impact, and identify what must be checked before release. Follow up when the status changes.
Do I need to publish source code to explain the work?
No. A customer-safe description, synthetic example, or simplified diagram can explain the constraint and decision. Share only the detail needed for the lesson, with permission for any material that belongs to other people.
Sources
Frequently asked questions
Should I publish an exact technical-debt percentage?
Use a percentage only when you can explain what it counts, how it was estimated, and its limits. An internal label or tool score does not automatically represent a share of customer risk, future development time, or money owed.
Can I share the decision before the refactor ships?
Yes, if the update clearly describes planned or ongoing work. Explain the intended scope and current user impact, and identify what must be checked before release. Follow up when the status changes.
Do I need to publish source code to explain the work?
No. A customer-safe description, synthetic example, or simplified diagram can explain the constraint and decision. Share only the detail needed for the lesson, with permission for any material that belongs to other people.
A note from Uriel Bitton
This article combines primary technical definitions, a dated historical example, and an original communication framework. The reporting-SaaS example and proposed copy are fictional. No refactor, benchmark, customer study, or business result was conducted for this article. Buildside publishes this Journal.
Keep building with us
Get practical founder lessons and product updates in your inbox.
Keep reading
Share SaaS Speed Tests While Building in Public
Publish SaaS speed improvements with a clear timing boundary, comparable conditions, failures, and slow-end results. Show what the test supports and what remains unmeasured.
How to Use a Public SaaS Changelog to Drive Feature Adoption
Turn SaaS releases into useful build-in-public updates. Show the user problem, the shipped change, how to try it, and what customer behavior to check afterward.