Progress Line The site Index

Build notes · site 457

How Progress Line Payment Claims was built

Progress Line is a fictional Malaga business that prepares Security of Payment claims and adjudication applications with subcontractors and suppliers across Perth and regional WA. Its customer is a tiler, sparky, formworker or supplier sixty days out on an invoice who has heard “put in a claim under the Act”. The page has one job: show the two dates that matter, show what a valid claim must say, and make the $390 claim check the easy yes — or show them how to write it free.

Palette

The colour of a cleared payment and the red of an OVERDUE stamp, on a neutral that reads like a statute page. Red marks deadlines only: the day-15 cell, the rules above both dates, the late warning. Ratios are from contrast-w60.log; the tints added during the build were measured with the same formula and are listed with their pairs.

Paid green#0F5132Primary and CTA fill. White on it 9.36:1; on the ground 8.55:1. Served-day cell, prices, the Malaga marker.
Stamp red#A4262CDeadlines only. 6.64:1 on the ground, 7.26:1 on white; white on it 7.26:1 for the DAY 15 cell.
Ink#161A1716.07:1 on the ground. Dates, headings, form text.
Muted#4B524D7.34:1 on the ground, 8.04:1 on white. Descriptions, captions, weekend dates.
Ground#F4F5F2A cool paper grey, deliberately not cream.
Band#13261DThe Sapience band. #EEF3EF on it 14.14:1.
Counted-day tint#E6F0E9Added in the build. Ink on it 15.08:1, paid green 8.03:1, muted 6.89:1.
Weekend grey#ECEEEAAdded in the build. Muted dates on it 6.88:1.
Warning tint#FBEDECAdded in the build. Stamp red on it 6.37:1, ink 15.43:1. Late warning and invalid fields.

Two non-text additions: field borders #7A817C at 3.99:1 on white (above the 3:1 floor for control boundaries), and map water #DDE6DF, which never carries a word — every map label sits on land.

Type

Tue 24 Nov 2026

Spectral 600 — headings and both answer dates. A book face with the weight of a printed Act, which is exactly what the customer is being asked to invoke. Tabular lining numerals on every date and fee.

Book the $390 claim check

Hanken Grotesk 400/500/700 — body, labels, buttons. Wide apertures stay legible at 16px on a phone in a ute, and the 700 carries the CTAs without shouting.

The drawn claim page uses Spectral italic for the statutory sentence so it reads as quoted law inside a document, and the calendar counts use Spectral numerals so “15” looks like a count, not a date.

Techniques and the claim clock

No libraries. Inline SVG for the calendar, the claim page, both maps and every icon; CSS grid for the layout; one wall-clock animation. The page is about 70 KB.

How the claim clock is built

All date arithmetic runs on UTC millisecond timestamps, parsed straight from the date inputs’ YYYY-MM-DD value with Date.UTC, so a Perth visitor at 11pm never slides a day. addWeekdays steps one day at a time and counts only Monday to Friday, fifteen times, from the day of service. addMonths adds six calendar months and clamps to the last day of the target month, so 31 August lands on 28 February (29 in a leap year) rather than rolling into March. The calendar is always 28 cells starting on the Monday of the service week; a sweep over 800 consecutive service dates proves it always holds the served day and all 15 counted days. On load the counted cells fill in one by one on a performance.now() clock, 85 ms apart, and settle within two seconds; reduced motion, a hidden tab or a matchMedia reduce preference skips straight to the finished frame. The late stamp and the adjudication slip on the drawn page toggle the SVG hidden attribute, not the property, because the property does nothing on an SVG element.

The logic lives in a marked block in the page, and pc-check.mjs lifts that exact block out of the HTML and asserts it in Node. It isn’t a copy, so the check and the page can’t drift. The state probe window.__paymentclaims exposes the inputs, both dates, the fees, the late flag and days late, the Christmas flag, the 15 business days, the $0 alternative with isSubstitute:true, the adjudication alternative with isSubstitute:false and its quoted reason, and a top-level isSubstitute that goes false when an adjudication application is added.

InputPage printsfigures-w60.mjs
Served Tue 3 Nov 2026Tue 24 Nov 2026Tue 24 Nov 2026
Served Fri 18 Dec 2026Fri 8 Jan 2027 + Christmas noteFri 8 Jan 2027
Completed Fri 14 Aug 2026Sun 14 Feb 2027Sun 14 Feb 2027
$18,400 claim$390 / with adjudication $2,240$390 / $2,240
$86,000 claim$690 / with adjudication $3,640$690 / $3,640
Served Mon 15 Feb 2027Late warning, 1 day— (page rule: served after serve-by)

Conversion decisions

Why this converts

  1. Every button asks for a fixed $390 check rather than “a quote”, so a tiler owed $18,400 is saying yes to something small and known, and that button is never more than a thumb away.
  2. The claim clock answers the two questions they arrived with — when must I serve, when must the builder reply — beside the headline, before they scroll.
  3. The form asks only for what the business needs to ring back and quote, and it fills the amount and date in from the clock so the visitor never retypes a number.
  4. The full-size “Write it yourself — $0” card, with the exact sentence to copy, is what makes paying $390 feel like a choice instead of a toll.
  5. Every legal-sounding line is the SBDC’s or Building and Energy’s own sentence, linked, and the business says once and plainly that it is not a law firm, so the trust comes from the regulator rather than from badges.

What the page quotes, and what it declined to publish

Quoted verbatim, re-read at source on 14 September 2026: the SBDC’s The Act applies to contracts entered on or after 1 August 2022., the four elements of a claim, the six-month sentence, the 15-business-day sentence, the adjudication fee sentence and the exact claim sentence; and Building and Energy’s To apply for adjudication in these circumstances, you must act quickly. Different timeframes and requirements apply depending on the circumstances., placed after the three circumstances that page lists.

Not published because they weren’t verified for this build: adjudicator fee caps, nominating-authority fees, the retention trust threshold, response or determination timeframes, pay-when-paid rules, suspension rights, how the Act defines a business day, and any success rate. The page never implies a guaranteed payment, and the reviews name a trade and an invoice, never an outcome.

Local SEO we’d implement for the real business

The demonstration ships only WebPage JSON-LD naming itself a demonstration, because structured data for a fictional business would be dishonest markup. For a real Progress Line, this is what we would put in the head — with their real details, and reviews pulled from a verified source, never typed in:

{
  "@context": "https://schema.org",
  "@type": "ProfessionalService",
  "name": "[Business name]",
  "description": "Security of Payment claims and adjudication applications prepared with subcontractors and suppliers.",
  "telephone": "+61 8 0000 0000",
  "url": "https://[domain]",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "[Unit N, NN Example Street]",
    "addressLocality": "[Suburb]",
    "addressRegion": "WA",
    "postalCode": "[0000]",
    "addressCountry": "AU"
  },
  "areaServed": ["Perth", "Western Australia"],
  "openingHours": "Mo-Fr 07:00-17:00",
  "makesOffer": {
    "@type": "Offer",
    "name": "Payment claim prepared and checked",
    "price": "390",
    "priceCurrency": "AUD"
  },
  "review": [{
    "@type": "Review",
    "author": { "@type": "Person", "name": "[Verified customer]" },
    "reviewBody": "[Imported from the business's review platform]"
  }]
}

What would change for the real client

Iteration log

Pass 1 — Craft

Pass 2 — Depth

Pass 3 — Hardening

This is a demonstration build by Sapience Analytics. Want one pointed at your customers?

sapienceanalytics.com.audanny@sapienceanalytics.com.au