subCancel
The worked example used across the 27 framework ideas. Assumptions, intentional gaps, open questions and deferred decisions for subCancel, a subscription tracker for solo operators and small studios.
This page is the working notes behind subCancel, the worked example used across the 27 framework ideas. Anywhere a Shape, Build or Launch post says "for subCancel...", the decision they reference comes from here.
What subCancel is
subCancel is a subscription tracker for solo operators and small studios. The operator manually adds each subscription service as they sign up, with a short note on what it does and how long they expect to keep using it. The free tier tracks up to seven subscriptions and sends a quarterly reminder email. The paid tier ($2/month) unlocks unlimited records and a more frequent reminder cadence: monthly by default, with quarterly available as a softer option. Each reminder asks, for every tracked subscription, "still using this? still worth the cost?" so the operator can update notes or mark services for cancelling.
knowledge-base files
Each framework idea drops one file into knowledge-base/. These are the real files for subCancel, building up across the framework. Each links back to the idea that produces it.
user.md
A product someone else buys to solve a recurring pain. The user is not the operator; they have their own job and the product helps with it on a regular cadence. Use this shape if you are building a SaaS or tool for someone other than yourself.
problem.md
A pain that builds quietly through inattention, costing money in small increments. The user does not actively make the bad decision; the system around them does. Use this shape if the pain you are naming is about omission or compounding cost rather than a single bad event.
promise.md
A promise framed around a passive user: the product does the work between actions. Boundaries protect against feature creep into things the user did not ask for. Use this shape if your user expects you to remove cognitive load.
positioning.md
Positioning aimed at the buyer's pain (subscriptions cost too much; this trims them). The useful result is a delivered service. Use this shape if your product solves a recurring tax-like pain.
success.md
Success measured in user behaviour: did the paid action actually happen. Use this shape if the value of version one depends on the user doing something with the product, not just being able to.
risks.md
A risk about user inattention: the value depends on engagement and engagement is fragile. Use this shape if your product depends on the user paying attention to whatever signal you send them.
goal.md
A goal about behaviour change (passive to active). Use this shape if your product's value is about shifting how the user relates to a recurring problem.
scope.md
Cuts that protect against scope expansion into adjacent product categories (auto-detection, multi-user). Use this shape if your scope is at risk of drifting from your category into bigger ones.
path.md
A path that crosses time (first action, then months of no action, then check-in, then action). Use this shape if the value lands across multiple sessions spread over weeks or months.
build/prototype-path.md
A prototype path that tests user behaviour around an attention surface (will they act on the email). Use this shape if your build needs to prove a behavioural assumption about user attention.
build/value-moment.md
A value moment in seeing reality compress into a number (the total). Use this shape if your product's wedge is making something invisible visible.
build/learning-goal.md
A hypothesis about user behaviour driven by a small UX choice. Use this shape if the build's central bet is a tweak to user-side mechanics.
build/routine-checklist.md
Routine work that is the wedge feature itself; if it fails the product loses its reason to exist. Use this shape if your routine work IS the value proposition.
build/buy-vs-build.md
A buy decision that protects build time for the wedge. Use this shape if you have one clear value-creating feature that needs every available hour.
build/system-shape.md
A shape with two clear runtime owners (web + job) sharing one data store. Use this shape if your system has long-running interactive and short-running scheduled halves.
build/differentiation.md
Differentiation in user-side context that only the user can supply at the right moment. Use this shape if your edge is data the user creates that competitors cannot capture later.
build/not-in-v1.md
A cut that protects against decoration features that feel useful but do not move the wedge metric. Use this shape if your v1 risk is browsing-without-deciding features.
build/proof-metric.md
A metric on the user doing the thing the product exists to enable. Use this shape if your value depends on a specific user action you can measure directly.
launch/sharing-plan.md
An audience that already shares the pain: peers in the same role facing the same recurring tax. Use this shape if your product is a tool for a defined occupational pain.
launch/decision-signal.md
A signal read from in-product behaviour (acted on the email). Use this shape if your signal is a discrete user action your system can record.
launch/decision-threshold.md
A threshold for the user-action wedge. Use this shape if your launch hinges on a single user behaviour being common enough to monetise.
launch/learning-signal.md
A diagnostic question that separates two failure modes by splitting on observable metrics. Use this shape if you have one outcome failure and need to know which of two upstream causes is responsible.
launch/review-context.md
A trade-off between simplicity (one batched send) and per-line precision. Use this shape if your reviewable decision is whether to batch or split a delivery mechanism.
launch/iteration-value-test.md
An iteration that adds context to a delivery surface to make the call easier. Use this shape if your iteration is enriching what the user already sees.
launch/readiness-rule.md
Readiness measured by a real user completing the wedge action without breakage. Use this shape if your launch readiness is about one user action working reliably.
launch/launch-risks.md
A launch risk about a silent failure surface (deliverability). Use this shape if your launch's biggest risk is a system layer that fails quietly while the surface stays up.
launch/ownership-check.md
An imperfection that comes from deliberately not collecting data. Use this shape if your launch ships a less-precise version because the more-precise version would compromise the user's trust or privacy.
Why this page exists
The shape+build+launch framework forces decisions. Nine ideas in the Shape phase, three lines each: who the user is, what pain you are solving, what you promise, how you describe it, what success looks like, what could go wrong, the one outcome that justifies it, what stays in and out, the one main path.
What the framework deliberately leaves out is everything else: the assumptions under those decisions, the actors deliberately left out, the questions parked for later. Those things still matter for subCancel just like they would for any real product. This page is where they live.
A specification that captures every assumption, every edge case and every alternative is a specification nobody reads. The Shape files stay lean because that is how decisions actually get made and how the build actually gets done. Lean shapes are easier to share, easier to defend, easier to update. Leanness only works if the things you cut have a place to live. That is what this page is for.
Lean is the work
The framework files are short on purpose. Three lines per idea. Nine ideas in Shape. Eighteen more across Build and Launch. By the end the entire knowledge-base/ folder reads in about ten minutes.
The temptation, every time, is to add another paragraph for completeness. Resist it. The version that ships is the version that is short enough to read in five minutes and clear enough that two people would make the same decision from it.
If a Shape file grows past a screen, ask whether you are adding a decision or hiding indecision. Most of the time you are hiding indecision. The fix is to make a clearer call, not a longer file.
Iteration is the work
The Shape files are not signed contracts. They are the current best version of decisions you have made, written down so the team and the AI tools you work with read from one source.
Every file in knowledge-base/ has the same shape: easy to write, easy to update, easy to throw away. When a decision changes, you change the file and commit it. The git history is the decision log.
If a Shape file has not been touched in three months, that is a signal too. Either the decision still holds (good) or the team has stopped looking at it (less good). The Build and Launch phases catch this by referencing back: a feature that contradicts user.md should fail review, not get merged with a TODO.
Named assumptions
The Shape decisions for subCancel rest on six load-bearing assumptions. Each one is named so it can be challenged, tested or referenced in a later post. If any of them turn out to be wrong, the file or files in knowledge-base/ listed alongside the assumption are where the decision would need to be revisited.
Action over awareness. Operators want to act on subscriptions, not just see them. If tracking is enough and acting on the list is not where the value is, the whole product collapses into a spreadsheet. Load-bearing for goal.md and success.md.
Email is open. Email is a reliable channel for this audience. If inbox fatigue means the monthly reminder gets archived without opening, the paid wedge stops working. Load-bearing for promise.md and path.md.
Impulse price. Two dollars a month is a price point operators will commit to without thinking. Higher and we lose impulse adoption; lower and we look like we do not believe in the product. Load-bearing for promise.md.
Curation over capture. Operators want a deliberate list they curated, not a noisy list scraped from a card statement. If they would rather have everything captured automatically and pruned later, the manual-entry constraint is wrong. Load-bearing for scope.md and positioning.md.
Reminder gradient. Quarterly on the free tier and monthly on paid is the natural value gradient. If quarterly is too slow to be useful, the free tier becomes a static spreadsheet; if monthly is too noisy, paid users churn. Load-bearing for promise.md and success.md.
Single-operator studios. A small studio has one operator who owns these decisions. If two people share the responsibility, the product needs team features and the version-one cuts no longer hold. Load-bearing for user.md and scope.md.
Why these decisions, not the obvious ones
It is worth naming the alternatives that were considered and dropped, so the next person who hits the framework does not redo the work.
Manual entry, not auto-detection from card data. Auto-detection is the obvious feature for a "subscription manager". It was rejected because the wedge is the operator's own deliberate discipline; outsourcing the curation step makes us a connector business competing against banks.
Email, not an in-app dashboard. The operator's attention is already in their inbox; pulling them into a new tab is a tax. A dashboard might come later; the email is the wedge.
Two dollars a month, not nine ninety-five. A low price point makes the upgrade decision a non-event. Pricing can move up later; it is much harder to move it down.
Quarterly reminders on the free tier, not zero reminders. If the free tier is a static list, it is a spreadsheet with extra steps. The reminder cadence is the loop, even at a lower frequency.
One operator per studio, not a team of editors. Team features are the path to a much bigger product, but they are also the path to a much longer build. Version one stays single-actor.
Intentional gap: secondary actors
The Shape files model one user: the studio operator. They do not model the studio's finance lead, the support staff at subCancel, the integrator who might want to automate the workflow or the colleague the operator delegates to next year.
This is deliberate. Version one of any product has to serve one user well before it can serve many. The cuts that make subCancel good for the operator (manual entry, no team features, no API) only hold if there is no secondary user pulling them the other way.
Multisided systems can be built using the same framework. Each actor gets their own pass through the nine Shape ideas: their user.md, their problem.md, their promise.md and so on. The discipline that protects the version-one cuts is the same discipline that lets you safely add a second actor later: you treat the new actor as a fresh build, not as a retrofit.
For now, the second actor is out. When subCancel needs one, the page that gets added first is actors.md listing who else might show up and what changes once they are in scope.
Strategy for open questions
Some decisions need evidence before they can be made. Capturing them as questions, with a trigger for when to revisit, keeps them from being lost or pre-emptively answered.
The shape of an open question is three lines: the question itself, the signal that would tell you it is time to decide and the file that would change once the decision is made.
For subCancel, the open questions today are:
- Custom cadence on paid. Should the paid tier offer a custom cadence (weekly, fortnightly)? Revisit if 25% of paid accounts ask for it. Would change
scope.md. - Right price point. Is two dollars the right price? Revisit after 25 paid accounts if the conversion rate from free is under 5%. Would change
promise.mdandsuccess.md. - Bank integration. Should bank integration be on the roadmap at all? Revisit if more than three operators ask for it directly. Would change
scope.md. - Web dashboard. Does subCancel need a web dashboard or is the email enough? Revisit if operators ask for it more than three times. Would change
path.md.
Each question is parked, not ignored. The condition for unparking is in the question itself.
Strategy for deferred decisions
Some decisions are made but the implementation is paused. They are decided in principle but not implemented in version one because the build has not earned them yet.
For subCancel, the deferred decisions are:
- Year-end summary. Decided to ship eventually for paid users, deferred until 50 paid accounts make it interesting to assemble.
- Spreadsheet migration. Decided to support an import path from spreadsheet, deferred until someone actually asks.
- Anniversary reminders. Decided not in version one, revisit after the cadence proves useful.
Deferred is different from open. Deferred decisions have answers; the question is timing, not content.
How this page fits the framework
The framework asks you to ship the lean version and learn. This page is what makes that honest.
- Shape forces the irreducible decisions. Nine files, three lines each, no room for hedging.
- Build adds the technical decisions on top of Shape. Each Build idea drops another file into
knowledge-base/. - Launch adds the operational decisions on top of Build. The folder keeps growing.
At every phase, this page is the parallel track. It captures what was assumed, what was deferred, who was deliberately left out. When the build hits an unexpected reality, this is the first page that gets updated, because the reality usually contradicts an assumption before it contradicts a decision.
Key takeaway
The Shape files are the decisions. This page is the context that lets them stand alone: the assumptions they rest on, the actors deliberately left out, the questions parked for later. Both kinds of writing matter, but only one of them gets read every day. Keep the framework lean. Let this one breathe.