// Case Study · Designing a service as a product
Digital District Partners
Productized Studio · Fine Jewelry Vertical · Solo
Digital District Partners is a productized web studio for independent jewelers. Fixed build tiers with published prices, a delivery checklist anyone can read before signing, and a monthly care plan. It is a business with its own brand, site, and terms rather than a note about freelance availability, and it is one person. The interesting part is not the storefronts. It is what happens when you try to make a service behave like a product.
// 01 · Boundaries drawn by capability, not hours
Each tier is bounded by something the tier below structurally cannot do. Not by page count and not by hours. Triage is repair only: one critical fix, a plain-English report on what broke, keys and documentation handed back. Foundation is the first tier where a stranger can buy something without phoning the store. Growth Engine exists because a standard checkout physically cannot take a deposit on custom work, so the boundary is deposits and part-payments. Flagship is the tier that includes owned infrastructure.
What is out is stated as loudly as what is in. Every tier carries an explicit excludes list, and the site publishes a standing "what you will not get from us" block: no team, no paid ad management, no brand identity work, no photography or copywriting, no around-the-clock coverage. Scope control moved out of the negotiation and into the price sheet, where it costs nothing to enforce.
The published comparison against hiring an agency includes the two rows where being one person loses. Publishing your own weaknesses next to your price is a product decision, not a modesty one.
// 02 · The pricing reversal
The original policy published only the two cheapest tiers and scoped everything else on a call. It was wrong, and what made it wrong was watching a jeweler compare us against the vertical incumbent, who publishes a $5,000 to $15,000 ladder. Against that, our two visible numbers sat next to a case study describing a multi-million-dollar catalog, and the gap did the talking.
A hidden price cannot be judged. "We will scope it on the call" is the exact experience this buyer has been burned by before. So the whole ladder went public at real figures.
The lesson generalises past pricing: an unquotable number is not a negotiating position. It is missing information, and the buyer fills the gap with the worst assumption available.
A quieter version of the same lesson sits in the media platform. The recurring fee is for operating the platform and is never a markup on hosting, because Cloudflare bills the client directly at cost. A markup on a twelve-dollar bill invites the question "why am I paying you to pass through twelve dollars." A fee to run the thing is defensible on its own terms. That is a pricing model chosen to survive the client’s most obvious question rather than to maximise the line item.
// 03 · One array behind four promises
The delivery checklist is the spine of the whole business. Twelve binary checks live in a typed data file, each tagged with the tiers that deliver it. The marketing claim, the legal guarantee, the delivery QA gate, and the scheduled follow-up emails all resolve to that one array, so they cannot drift apart. The file carries a comment noting the numbering is load-bearing because the emails cite checks by number.
The guarantee is written against it: if the build does not pass every check marked for its tier, on the client’s own phone, at handoff, the client does not pay the final balance. Objective and invokable instead of vague satisfaction language.
It was deliberately narrowed once the checklist went public. The original promised every check, and publishing the grid made that unfulfillable, because one check is product photography that no tier delivers and another is a paid add-on. Scoping a guarantee against your own published exclusions, before a client finds the gap, is the discipline in one artifact.
Scope creep is handled by four mechanisms rather than by argument: the per-tier excludes list, a 100% upgrade credit that turns "can you also do X" into an upsell with no sunk-cost fight, month-to-month terms with full client ownership of accounts and code, and the guarantee itself.
// 04 · Building the exit ramp on purpose
The media platform is sold as a product with its own price: a build fee, a monthly operating fee, and inclusion in the top tier. The engineering behind it is a separate case study. What belongs here is the tenancy decision.
It is deliberately not multi-tenant in the usual sense. Each client gets their own deployment, on their own subdomain, on their own Cloudflare account, with the storage, the domain, and the billing relationship in their name. Cloudflare invoices them directly at cost, typically under twenty dollars a month, and I never touch that invoice.
The competitors this sells against bill by visitor on their own domain. That means a product doing well costs the jeweler more than one nobody sees, and it means their media is hostage. I cannot press that wound while doing the same thing, so the exit ramp is built in. The reasoning I keep coming back to is that the exit ramp being there is the reason clients never take it.
It works economically because of an architecture choice: frames are pre-baked at fixed sizes and served as files, so the CDN hands back an object instead of generating one. No transform is ever billed, and the bill stops scaling with traffic.
// 05 · What is still manual
Naming the seams matters more than implying everything is automated.
Client onboarding, contract issuance, and invoicing are manual. The founding-slot counter on the site is decremented by hand, with a to-do in the file saying so. There is no test suite. Lint is currently broken because ESLint 9 is installed without a flat config.
What is genuinely built and running: an audit generator that turns an inbound storefront URL into a live mobile Lighthouse pass and a plain-text report, cached per URL, behind a human approval gate; a booking engine that computes open slots server-side and degrades to showing all slots when the database is unreachable rather than erroring; and a design system documented with a computed contrast table in both WCAG 2.1 and APCA, written for the actual reader, which is a jeweler in their fifties or sixties on a phone in daylight.
Content is single-sourced by rule and components are forbidden from inlining marketing copy. Every published statistic is a typed record carrying value, label, source, method, and as-of date, and a stat without a source renders "Verification pending" instead of rendering. Testimonials stay null until a real attributed quote exists. Those are guardrails written into the type system so the fastest path is also the honest one.
Built and run solo
This is the portfolio record of a business I run, not a pitch for it. Client-facing detail, pricing, and case studies live on the studio’s own site.
