Generative Assets · Industry demonstration 422
A fictional Osborne Park building certification practice, built to show a real one what a lead-generation page looks like when it answers the two questions every caller asks — what does it cost, and when do I get it — and then says plainly which charges are not its own.
The concept
Plumbline Certification is three registered building surveyors certifying residential work across the Perth metro. Their buyer is an owner-builder, a small builder or a homeowner with an addition, who has just been told they need a certificate before a building permit can be issued and cannot find out from anybody what that costs or how long it takes.
The page has one job: get drawings sent in. Everything on it is arranged so a frightened owner-builder can read a fee and a turnaround in about eight seconds, then hand over a set of plans without ringing anybody. The proof element answers in two units at once — dollars and working days — because a certifier’s customer is always waiting on both.
The thing that makes it more than a price list is the refusal. Getting a permit costs more than this practice’s fee: there is an application fee charged by the permit authority and there are levies the state adds. Those are set by other people and they move. So the page does not print them, says so where the reader can see it, and shows exactly which of the three stages Plumbline actually owns. Refusing to invent a number is the most persuasive paragraph on the page.
The proof element
Work type, service, turnaround. Sixteen cells in total, and every one of them was re-implemented in a separate oracle script from the concept prose and diffed against the shipped page cell by cell — fees, working days, the result card text, the title block on the drawing and the stage strip, all four surfaces, all sixteen cells.
| Work | Our fee | Inspections add | Standard | Priority |
|---|---|---|---|---|
| New single dwelling | $1,150 | +$620 | 8 working days | 4 working days |
| Addition or alteration | $780 | +$420 | 6 working days | 3 working days |
| Patio, carport or shed | $420 | +$180 | 4 working days | 2 working days |
| Pool and barrier | $340 | +$140 | 3 working days | 2 working days |
Priority multiplies the fee by 1.35 and rounds to the nearest ten dollars, and halves the working days rounded up. The rest state — an addition with inspections on standard turnaround — is $1,200 and six working days, and that is what the thumbnail captures. The cheapest cell on the whole grid is $340, which is exactly the services grid’s lowest “from” price; the dearest is $2,390. Both were found by sweeping the grid, not by reading a cell somebody chose by hand.
A certifier’s customer is never only asking about money. They are standing between a designer who has finished and a permit that has not started, and the question underneath “what does it cost” is almost always “when can my builder pour”. Publishing the fee alone answers half of it and invites a phone call to get the other half. So the card sets them as a pair, on one line: the dollars in Spectral, the days in Public Sans caps beside them, separated by a hairline rather than stacked, so the eye takes both as a single answer.
Two of them, both swept rather than asserted. Adding site inspections never changes the turnaround — the inspections run against the builder’s programme weeks after the document has gone out — proven across all eight work-type and turnaround vectors, and the inspection term in the turnaround function is a real number that happens to be zero, so the sweep tests arithmetic rather than a function against itself. And if the builder has not got a slab date, take standard: priority costs thirty-five per cent more to buy days the customer is not going to use. A page that argues against its own dearer option reads as a model rather than a mood.
It is the only thing on the page priced at zero and it is deliberately given a block of its own in the hero column. The reason is commercial, not generous: the moment a set of drawings arrives, this practice is in the job. The alternative — a form that asks for a phone number and promises a callback — converts worse, because the reader has to decide to buy before they have any evidence the seller is competent. Reading the drawings for nothing puts the evidence first and the invoice second, and the page says exactly that.
The palette
Three colours off the only object this business actually produces. Every hex and every ratio below is quoted from one row of the wave’s measured contrast sweep, never from memory, and no colour was minted during the build.
The type
Spectral 600 sets every heading, the fee figure and the fee in the drawing’s title block. It is a serif drawn for screen reading with the proportions of a printed document, which is exactly what this business sells — a signed piece of paper that unlocks a permit. Public Sans 400/500/600 carries everything else: body copy at 17px on a phone, the labels, the chips and the working-day count.
The one typographic move is the pair in the result card. The fee is set in Spectral at up to 50px; the turnaround sits immediately beside it in Public Sans 600 caps with wide tracking, the number itself one and a half times the label, separated by a hairline rather than a line break. Two faces, two units, one answer — and because they share a baseline, the eye reads them as a single sentence rather than as a price with a footnote.
Everything else is deliberately quiet. Section headings are two or three lines wide at most and sit in the left half of the measure; the eyebrows are 11.5px caps with a short prussian rule in front of them, which is the only ornament repeated across the page.
The technique
The signature is a stylised drawing sheet: a plan of the selected work on the left, a title block that fills with the work type, the scope and the fee, and a rubber stamp carrying the turnaround in working days. It is inline SVG, generated as a string and written in one synchronous pass — assembled in one go rather than staggered into the DOM, because an SVG scene assembled after the animation loop starts can receive no paint invalidation in headless Chrome, which is the renderer that takes the thumbnail.
The important detail is the coordinate system. The viewBox is not fixed: it is recomputed on every draw as 0 0 W H where W is the element’s measured CSS width. That makes one SVG unit exactly one CSS pixel at every viewport, so an 8.5px label on the drawing is 8.5px on a phone and 8.5px on a 1440 monitor. A fixed viewBox would have rendered the title block at about four pixels at 375. When the sheet itself measures under 430px — which is every phone — it turns portrait, the title block moves to the bottom-left and the stamp drops down beside it, so the plan keeps the full width of the sheet.
Motion is one thing only: the stamp’s outer ring is an asymmetric dashed circle that turns about eleven degrees a second. It is driven from performance.now() on every frame — an absolute wall-clock angle, never a per-frame accumulator, because headless Chrome services animation frames only when a frame is requested and a capped delta accumulator would have the stamp barely moved at the seven-second thumbnail instant. The loop stops on document.hidden and restarts on the way back, and under prefers-reduced-motion the ring is written once at zero degrees and no loop starts at all.
The one micro-interaction is the stamp press: changing any control sets a wall-clock timestamp, and for the next 240 milliseconds the loop scales the whole stamp group from 1.055 back to 1 on an ease-out curve. It is applied by writing the transform attribute from inside the loop rather than by a CSS class, because a stylesheet transform rule silently discards an SVG element’s transform attribute — the state would have been right and the pixels wrong.
The three passes
outline:none on focus. The soft box-shadow ring was there, but a keyboard user got no real outline. Added an explicit :focus-visible rule that restores the page’s 3px prussian ring on every input, select and textarea.pattern is compiled with the v flag in the checker, because that is what browsers do and a pattern that is legal in Node can throw at checkValidity and leave the one field that has to be right silently unvalidated. Typing “call me maybe” is rejected by the browser and by our own handler, flags that field and no other, and never reaches the confirmation.document.hidden and restarts on the way back, with no console error either side.Why this converts
What this page refused to publish
This is the highest-risk page in the wave. Building certification sits directly against real regulation, real statutory charges and a real registration scheme, and every one of those is a number a demonstration page could get wrong with somebody’s name on it. The rule we worked to: if we cannot verify it, we do not publish it and we do not soften it either. Each of the following was considered, and declined.
Local SEO
This page emits only WebPage, CreativeWork and a BreadcrumbList, and it names itself a demonstration inside them. Publishing LocalBusiness or Review markup for a business that does not exist would put fictional data into a real index, so we do not. For a real client the schema below is what would go on the page on day one, with their registration, their hours and their genuine reviews behind it.
{
"@context": "https://schema.org",
"@type": "ProfessionalService",
"additionalType": "https://en.wikipedia.org/wiki/Building_inspection",
"name": "<Practice name>",
"description": "Registered building surveyors certifying residential work across the Perth metropolitan area.",
"url": "https://<domain>.com.au/",
"telephone": "+61 8 <real number>",
"email": "office@<domain>.com.au",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "<real street address>",
"addressLocality": "Osborne Park",
"addressRegion": "WA",
"postalCode": "6017",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": "<lat>", "longitude": "<lng>" },
"areaServed": [
{ "@type": "City", "name": "Perth" },
{ "@type": "AdministrativeArea", "name": "Perth metropolitan area" }
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:00", "closes": "16:30"
}],
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Certification services",
"itemListElement": [
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "New single dwelling certification" } },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Addition or alteration certification" } },
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Pool and barrier certification" } }
]
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "<from the live reviews feed>",
"reviewCount": "<from the live reviews feed>"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "<real reviewer>" },
"reviewRating": { "@type": "Rating", "ratingValue": "5" },
"reviewBody": "<their words, pulled from the reviews feed>"
}]
}
Alongside it: an FAQPage block generated from the seven questions already on the page, a Google Business Profile wired to the same NAP strings, and per-suburb landing pages for the eighteen areas in the service list — each one carrying this practice’s own fee table, because the fee is the thing people search for and nobody else publishes it.
For the real client
Their fee table becomes the source of truth. The four base fees, the four inspection adders, the four turnarounds and the priority multiplier live in one object at the top of the script; on a real build they come out of the practice’s own schedule and get edited in one place, not fourteen.
The form becomes a job. Right now the confirmation is local and nothing is sent. For a real practice the enquiry lands in whatever they already run — most Perth certifiers are on a document-management stack of some kind, and the ones that are not are on email and a spreadsheet. The two integrations that pay for themselves fastest are a file-upload step that puts the drawing set straight into their job folder at the moment of enquiry, and a link straight out to the permit authority’s own lodgement portal at the end of the process, so nobody retypes an address.
Their photographs replace nothing. This page has none by design — the collection is procedural throughout — but a certifier is one of the few trades where that is arguably the right answer anyway: their product is a document, and a drawn sheet says more about competence than a stock photo of a hard hat.
The reviews come off a live feed and get marked up properly, which is the point of the schema panel above. The three on the demonstration page are written copy and are labelled as such on the page itself.
The declines stay declined. Even for a real practice, we would keep the permit fee and the levies off the page and keep the at-cost statement. It is the paragraph that makes the fee above it credible, and a real practice has more to lose from a stale number than a fictional one does.