Skip to content

Now listed Every Web Factory package and fixed-fee engagement, with its price. See the catalog

Blue Horizon Labs

Case study

Service Line·Cross-industry·

The Web Factory Service Line — Publishing the Price Before the First Sale

A service line is not real until someone can order it. We shipped the service line as data — a ladder of fixed-fee packages with published prices, gated by tests instead of by a sales conversation.

Measured

  • Every published package priced and provenance-recorded
  • 1 registry, 0 prices in the services page markup
  • Every published price gated by an invariant test
A price you will not publish is a price you have not decided.

The study

The problem

The lab had a service line and no way to buy it. Prices existed — in a plan, in a catalog row, in the founder's head — and the site said, in effect, ask us. That is a perfectly normal way to sell consulting and a terrible way to sell a two-week engagement to an owner-operated business, because the buyer's first question is the number and the answer took a phone call to produce.

There was a second problem underneath it. Every price the site had ever shown was a literal typed into a page component. Nothing connected the number a visitor read to the number in the catalog, or to the decision that set it. A price could drift, and nothing would notice.

The decision

Publish the number, and make the publishing mechanism the thing that keeps it honest. Concretely: no fixed-fee price may exist in page markup. The packages live in one registry module that carries, next to each figure, a provenance record — who ratified it, on what date, from which artifact. A package without that record cannot be published, because a test rejects it.

That is the same rule the lab already applies to partner claims and to case-study metrics, moved onto pricing. The reasoning transfers exactly: a public claim with no recorded source is indistinguishable from an invented one six months later.

How it is built

The registry is an ordinary TypeScript module — a list of packages, each with an id, an audience, a summary, deliverables, a timeline, a display price, an optional term that changes what the price means, and a machine-readable form of the same figure for structured data. The services page imports the list and renders it. There is no content management system, no build-time API call, and no admin screen. The larger engagement floors sit in the same module and are pinned literally by a test; they predate the provenance rule, and their ratification record lives in the lab's decision log rather than beside the figure.

Four invariants do the work, and each one is a test rather than a convention:

  • A published package is complete. Price, at least two deliverables, a timeline, a call to action, and a provenance record. Missing any of them fails the test suite that gates every deploy.
  • The page holds no figure. A regular expression over the services page source rejects any dollar amount typed back into it.
  • Each published price renders exactly once. The rendered HTML is counted. A copy-pasted figure sitting in a second place — a heading, a meta description, a structured-data node — is caught, because two copies of a number are two things that can disagree.
  • An unratified price renders nowhere. A package the owner has not signed off carries published: false. It is asserted absent from the built page, and the query key that deep-links a package refuses to resolve it.

The structured-data layer follows the same logic. Each published package emits a Service node with an Offer built from the machine-readable figure, never from the display string — so answer engines and readers are quoting one source. The larger engagement fees deliberately emit no offer at all: the page says in plain English that the exact figure is set inside the diagnostic, and publishing a machine-readable price for something that has not been scoped would contradict it.

What we measured

Every ratified package went from "in a plan" to orderable, with the price on the page and a call to action that carries the package identity through to the contact form, so the first message already says which thing the person wants. The credit term on the diagnostic — the fee applied in full against the first invoice of any build scoped from it — is a field on the row rather than a sentence someone remembered to write, which means it is on the page or it is nowhere.

The number that matters most is zero: zero dollar figures left in the services page markup.

What transferred to the lab's method

The pattern is now three-for-three across surfaces that make public claims: partners, packages, and case studies each keep their claims and their sources in one data file with tests standing between the data and the page. It is a cheap habit with an expensive alternative. The alternative is a site whose statements were all true on the day someone typed them.

Begin

The next study could be yours.

Start with a diagnostic conversation — plain language, real numbers.

Schedule a conversation