Subsoil Greywater Co.Build notes Back to the site Index

Industry demonstration · greywater plumbing · Perth

How the Subsoil Greywater Co. page was built

A licensed plumbing business in Kelmscott installing greywater diversion systems across Perth's south-east. The customer is a homeowner watching the garden struggle who has seen a cheap diverter kit online. The page has one job: say which system the house actually needs, what that water may and may not be used for, and what it costs installed — so they book a site look instead of buying the wrong box.

The single design decision

The proof element is a cross-section from the house wall to the garden bed, redrawn as you change the house. It shows where each waste pipe goes — bathroom and laundry to the diverter valve, the kitchen straight to the sewer on every system — and one sub-surface drip line per zone under a bed. The picture carries the rules a buyer does not know to ask about: the water goes under the ground, the kitchen never joins it, and the valve has a sewer setting for a wet winter.

At 1024 px and wider the card sits in the hero's second column, so the answer and the drawing are both inside the 1200×750 thumbnail. On a phone the reading order is unchanged: hero, services, then the card.

Palette

Water that has been used once, and the soil it ends up in. The blue is the pipe; the loam is where the water goes. Every ratio below is measured, not estimated — the first eleven are copied from contrast-w59.log, the last four were minted during the build and measured the same way.

Ground#F1F4F2Rinsed grey-green. Ink on it 14.80:1, muted 6.89:1.
Surface#FFFFFFCards and the proof card. Ink 16.39:1, muted 7.64:1.
Ink#15222014.80:1 on ground, 16.39:1 on surface.
Muted#4A56546.89:1 on ground, 7.64:1 on surface. Also the sewer pipes.
Petrol blue — primary#0B5A6B7.05:1 on ground. CTA fill with white at 7.81:1. Every greywater pipe in the drawing.
Loam — accent#7A4E1F6.46:1 on ground, 7.15:1 on surface. Mulch, the Health WA limit card, focus rings.
Band#173430Footer, confirmation, the house wall. Light ink #EEF3F1 on it at 11.92:1.
Soil (minted)#EADFD2Below ground in the cross-section. Ink 12.47:1, muted 5.81:1, blue drip line 5.94:1, loam mulch 5.44:1.
Leaf (minted, marks only)#2F5E45Plants on the beds, never text. 7.48:1 against the card.
Scarp (minted)#E3E8E5The hills band on the map. Ink 13.22:1, muted label 6.16:1.
Primary hover (minted)#084756Button hover. White on it at 10.26:1.

Declared FORBIDDEN in the log and kept off the page: any body token on the band, muted on primary (1.02:1), primary on accent (1.09:1). The light buttons in the footer and sticky bar put band on #EEF3F1 — the same pair as the declared light-on-band row, reversed, 11.92:1.

Type

Greywater to your garden,

Figtree 400 for body copy at 16px and up, with tabular numerals wherever litres and dollars change under your thumb.

Bricolage Grotesque 600/700 for headings and figures: a grotesque with a slightly hand-cut, workshop edge that reads like a signwritten ute door rather than a corporate brochure. Figtree 400/500 for everything else — round, open and very legible on a phone in the backyard. Cross-section labels are sized in CSS per breakpoint, never as SVG attributes, so they never fall below about 11 px at 375 wide.

The proof element

Three inputs: people in the house (1–6), washes a week (1–14), and a toggle for shower and bath water. The model is ten lines and mirrors figures-w59.mjs exactly: litres a week are washes × 60 L plus, with the toggle on, people × 45 L × 7. The system is a laundry diverter ($590, one zone included) with the toggle off, or a bathroom + laundry system ($1,650, two zones included) with it on. Zones are one per 600 L a week, never fewer than the system includes, and each extra zone is $160. Those three planning figures are the business's own assumptions and the card says so above the drawing.

HouseSystemLitres / weekkL / yearZonesInstalled
2 people, 4 washes, laundry onlyLaundry diverter24012.51$590
4 people, 6 washes, + shower and bathBathroom + laundry1,62084.23$1,810
6 people, 10 washes, + shower and bathBathroom + laundry2,490129.55$2,130
4 people, 6 washes, laundry onlyLaundry diverter36018.71$590 — $1,220 less

The drawing is built with createElementNS: the house wall, three outlets, the valve, and for each zone a bed of mulch, deterministic plants, a riser, a drip line with emitters and a pale wet halo under each one, and a label with the litres that bed takes. Labels are measured with getComputedTextLength and shortened (“Zone 5” to “Z5”, “498 L/wk” to “498 L”) only when they would spill out of their bed. Toggling the bathroom off re-routes the bathroom pipe, dashed, to the sewer. The entrance — pipes flowing in, beds fading up — is CSS keyed to an intro class that is removed at 2.4 s, so no redraw or resize can ever replay it and the page is at rest long before the 7-second thumbnail.

Two branches argue against the sale. The laundry-only diverter for the same house is printed in every state: beside the dearer system it shows the money and the honest limit (“it sends 360 L a week, not 1,620, so it waters one bed instead of three”) with isSubstitute:false; when you are already on it, the card says it is the cheapest box and shows what adding the bathroom would cost. Then the $6,900 treated system, the biggest ticket in the grid, carries Health WA's own sentence that treated greywater which is not disinfected may only go sub-surface — so it waters the same beds. The state probe window.__greywater exposes every input and derived figure, the alternative, the upgrade and isSubstitute.

The three passes

Pass 1 — Craft

  • The desktop headline broke on a one-word line. “Greywater to your garden beds,” left “beds,” alone at 1200 wide. Cut to “Greywater to your garden,”, desktop size reduced to 38–48 px and text-wrap:balance added.
  • Both hero buttons wrapped to two lines at 375. Shorter labels below 420 px (“Free site look”, “☎ (08) 9000 0471”) keep each on one line and the trust line above the sticky bar.
  • The service-area map printed labels at 7.3 px on a phone. A 900×440 map scales to a third of its size at 375. Redrawn at 600×520 with labels at 21 units (about 11 px), and given a side panel at desktop so it does not become a metre tall.
  • Map labels collided with the geography. Gosnells sat on the river line and the scarp ridge marks cut through “DARLING SCARP”; both moved.
  • The alternative card's heading wrapped beside its price and “$1,220 less” broke over two lines at 375. Heading moved above, delta set nowrap.
  • My own harness was wrong before the page was. The in-frame check serialised a DOMRect to {} and failed a drawing that was plainly in the thumbnail; fixed to copy the rectangle's numbers first.

Pass 2 — Depth

  • A 1440 screenshot showed about 850 px of empty hero column beside the long proof card. At ≥1024 px the services grid now takes column 1 under the hero while the card spans both rows; the phone order is untouched and asserted section by section (hero, services, proof, why, reviews, area, FAQ, enquiry).
  • Second read: “in the price”. One person and one wash sends 375 L a week, which needs one zone, but the bathroom system includes two. The spare bed is now labelled over its plants, and the ledger note says the extra bed is already paid for.
  • Micro-interaction: the installed price nudges down into place, briefly in loam, when it changes. Skipped under reduced motion.
  • Drove the whole input grid, not just the examples. All 168 cells (6 × 14 × 2) read back from the running page match the oracle's formula on litres, kL, zones, drawn beds, printed total and alternative price. Ranges read off the page: diverter $590–$750, bathroom system $1,650–$2,130, identical to figures-w59.mjs. Both floors equal the services-grid “from” prices.

Pass 3 — Hardening

  • Label-overlap asserts added at 375 for the map and for the cross-section in three states (laundry only, one zone; one person one wash with the included bed; six people fourteen washes, five zones). The map check caught one pair of colliding labels in the Kelmscott marker group on its first run; the “our base” line and Seville Grove were moved apart and it now reads zero in every state.
  • Form driven three ways. Empty submit: blocked, five fields flagged, focus on the first. Junk “ring me maybe” in the phone box: rejected (the pattern escapes (, ), + and - and compiles under the v flag). Forty people: rejected. Filled: the local confirmation names the caller and suburb and says plainly nothing was sent.
  • Rest and motion. Thumbnail reproduced at 1200×750 after 7 s; the probe read again three seconds later is identical; everything is opaque and the intro class is gone. With prefers-reduced-motion the intro class is never added and the page is complete at 250 ms.
  • Zero console errors at 375, 768, 1200 and 1440; no horizontal overflow at any of them; one <h1> per page; no curly quotes inside attributes on either file.
  • Chanel rule: removed the drop shadow from the proof card. It already had a border and a white ground on grey; the shadow was decoration.

Why this converts

The call button sits in the header and in a bar under the customer's thumb, and the page's main button asks for a free 20-minute site look rather than a sale, because that is the smallest yes a homeowner can give a plumber. The form asks only what a plumber needs to walk the yard — which water, what needs it, which suburb — so it takes under a minute and every answer changes what the callback says. The cross-section answers the question people are too unsure to ask, which box and what it can water, in their own numbers before they ever speak to anyone. It prints the cheaper diverter beside the dearer system in every state and quotes Health WA against the biggest job on the menu, which is exactly why the price that remains reads as honest. The trust line is things a customer can check — licensed, WaterMark-certified only, a free look — rather than adjectives.

Conversion decisions

Sources, and what this page declined to publish

Every sentence about the rules was read on 13 September 2026 from Health WA's Approved greywater systems page (last reviewed 28 July 2026) and from the Code of Practice for the Reuse of Greywater in Western Australia 2010, which that page links. Quoted verbatim: diverted greywater reused in gardens via sub-surface irrigation; diversion devices not fed kitchen greywater; WaterMark certification; treated greywater that is not disinfected used sub-surface only; the garden-or-sewer switch; the definition of greywater; the Code's installation approval from the relevant local government, its sub-surface depth of at least 100 mm below soil or mulch, its winter diversion advice and its sentence on stored greywater and odour.

Declined: any council application fee; any environmental health inspection or “permit to use” step; any water bill or dollar saving a year; any sprinkler roster day or rule; any claim that a particular council has a particular form. The approval step is stated as a mechanism — your local government approves it, and we lodge nothing without you. The market price band the brief anchored the fees against was not re-verified, so it is not printed; every fee on the page is the fictional business's own.

Local SEO we would ship for the real business

The live page carries only a WebPage block naming it a demonstration. For a real licensed plumber we would ship the following, filled with their verified details and real reviews from their Google Business Profile — never with the invented ones on this demo.

{
  "@context": "https://schema.org",
  "@type": "Plumber",
  "name": "[Business name]",
  "telephone": "[verified phone]",
  "url": "https://[their-domain]/greywater",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "[their verified street address]",
    "addressLocality": "Kelmscott",
    "addressRegion": "WA",
    "postalCode": "6111",
    "addressCountry": "AU"
  },
  "areaServed": ["Kelmscott", "Armadale", "Gosnells", "Canning Vale",
                 "Byford", "Thornlie", "Forrestdale", "Harrisdale", "Southern River"],
  "openingHours": ["Mo-Fr 07:00-16:30", "Sa 08:00-12:00"],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Greywater systems",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Laundry greywater diverter, installed" },
        "priceSpecification": { "@type": "PriceSpecification", "minPrice": "[their price]", "priceCurrency": "AUD" } }
    ]
  },
  "review": [
    { "@type": "Review",
      "author": { "@type": "Person", "name": "[real reviewer, with consent]" },
      "reviewRating": { "@type": "Rating", "ratingValue": "[1-5]" },
      "reviewBody": "[verbatim from their review platform]" }
  ]
}

Plus: a Google Business Profile in the Plumber category with greywater as a listed service, suburb pages only where the business genuinely works, and the page title leading with “greywater” and the area rather than the brand.

What would change for a real client

Where this build disagreed with its brief