CROWLINE COURIERS

Build guide · Site 275 · Industry Demos XII

How the run planner
became the meter

Crowline Couriers is a fictional same-day courier working the Perth metro out of a Welshpool depot. The page has one job — book a run — and its signature makes the pricing model itself the interactive centrepiece: a procedural SVG metro map where the zones you tap are the meter.

Concept

The audience is anyone with a deadline and freight that can't sit in a depot: law firms with settlement packs due at four, workshops dead without a part, florists, e-commerce sellers promising same-day. Courier pricing is usually a black box; this page's argument is the opposite — five honest zone bands radiating from the CBD, a violet run line traced from pickup star to drop star, and a price card that shows the zone maths in full. The whole aesthetic is the depot wall at 7am: a sun-faded laminated metro map, a dispatcher's violet highlighter, run sheets printed and vans nose-out.

Palette

#F5F3EC · road-map paper
The ground — the laminated metro map on the depot wall, sun-faded.
#2C2E30 · bitumen
Structure and primary ink — the arterials on the map; also the price card's ground.
#5B3FA8 · run violet
Line/mark only — the dispatcher's highlighter: run lines, zone arcs, CTAs. Never body text on paper.
#3E7A33 · scan green
The barcode scanner's happy beep as colour: focus rings, ticks, the POD flash.
#2F5E27 · green-ink
Derived darker green for text links — scan green itself sits at ~4.7:1 on paper, too close to the floor for small text.

Per the collection's ink/line rule, the violet marks and the green links are split from body ink: copy is set in bitumen (#2C2E30, ~12:1 on paper) with a dimmed #565A5E (~6:1) for secondary text. No other site in the collection marks in violet on a light ground — that's Crowline's slot.

Type

The signature — Run Planner

The map is a single procedural SVG (460×500): a clipped coastline polygon, a faint street-grid pattern, arterial hint lines, and five zone bands drawn as annulus paths (plus a southern wedge annulus for Peel, because Peel genuinely only exists to the south). Each band is an SVG tap-target carrying role="button", tabindex="0", an explicit aria-label and an Enter/Space handler — and because SVG elements have no .hidden IDL property and no HTMLElement click(), all state is driven through attributes and dispatched MouseEvents.

The run line is generated, not authored: pickup and drop each map to a representative suburb point in their band, the path routes Manhattan-style with 45° corner cuts via a CBD interchange node (couriers radiate through the inner arterials), and the line dash-draws with a travelling head that runs the route on a loop — faster for express, fastest for a direct drive. When the head reaches the drop star, a scan-green POD tick flashes: the delivery, proven. The line uses butt caps so the zero-length dash state can't render a stray dot, holds a 0.8 opacity once drawn (well above the 0.4 never-invisible floor), and the reduced-motion path renders the run complete with the head parked at 65% of the route. First render earns the slow 900ms trace; every subsequent change redraws at 450ms via a firstDraw flag so the planner feels snappy, not laggy.

A live state probe window.__courier carries pickup, drop, service, vehicle, steps, price, ETA and submission state on every interaction.

The pricing model

One meter, said out loud on the card: the map is the meter. The base rate is set purely by the number of zone bands the run crosses; express and direct are flat adders on top of it — never a second meter — and the vehicle is a flat adder chosen by what the load is.

ZONE-STEP BOARD — STANDARD VAN
Zones crossedExample runPrice
Same zoneWelshpool → Subiaco (both inner)$35
1 stepCBD → Welshpool$49
2 stepsWelshpool → Joondalup$69
3 stepsWelshpool → Mandurah$89
4 stepsCBD → Mandurah (the full board)$109
FLAT ADDERS — NEVER A SECOND METER
AdderAmountOn-card honesty
Express 90-minute+$32"The surcharge buys the queue, not the speed limit."
Direct drive+$85"One driver, your job only, door to door nonstop."
Van+$0Honest no-op, stated on-chip: the van is the base rate.
Ute+$15Long and awkward loads.
One-tonner+$35"A pallet is a one-tonner job whatever the paperwork says."

Measured figures (from the running page, verified against an independently reimplemented oracle in the QA harness): rest state Welshpool (inner) → Joondalup (outer), standard van = $69; the same run express = $101; inner → Peel, direct, one-tonner = $209; same-zone standard van = $35, which equals the services grid's "runs from $35" floor. All four match the spec's worked examples exactly — no corrections were needed; the spec's arithmetic was pure anchor maths and it held.

Derived, and declared as derived: the direct-drive ETA is an estimate of 25 min + 15 min per zone step, printed with a "~" hedge because a nonstop drive time is traffic, not a promise. The "door by" clock reads the visitor's real time and, when the computed door time falls outside depot hours (Mon–Fri 6:30am–6pm, Sat 7am–1pm), honestly switches to "next depot day · first van 6:30am" instead of printing a 2am delivery. Each zone maps to a representative suburb for the run line and the booking pre-fill (pickup reps: Perth CBD, Welshpool, Cannington, Midland, Pinjarra; drop reps: Perth CBD, Subiaco, Fremantle, Joondalup, Mandurah) — the real system would geocode the actual suburbs.

Conversion decisions

Local SEO we'd implement for the real business

The demo page deliberately ships only WebPage schema naming it a demonstration — fictional structured data in a real index would be dishonest markup. For a real courier client, we'd ship LocalBusiness + Review schema like this:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "name": "Crowline Couriers",
  "description": "Same-day courier runs across the Perth metro",
  "telephone": "+61 8 9000 0275",
  "address": {
    "@type": "PostalAddress",
    "addressLocality": "Welshpool",
    "addressRegion": "WA",
    "postalCode": "6106",
    "addressCountry": "AU"
  },
  "areaServed": ["Perth", "Joondalup", "Midland", "Rockingham", "Mandurah"],
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "06:30", "closes": "18:00" },
    { "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday", "opens": "07:00", "closes": "13:00" }
  ],
  "priceRange": "$35–$209",
  "review": {
    "@type": "Review",
    "reviewRating": { "@type": "Rating", "ratingValue": "5" },
    "author": { "@type": "Person", "name": "Verified customer" },
    "reviewBody": "Settlement pack made the 4pm window with eleven minutes showing."
  },
  "aggregateRating": {
    "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "180"
  }
}
</script>

Plus a Google Business Profile wired to the review flow, suburb-level service pages for the high-intent corridors (CBD legal, Welshpool/Kewdale industrial, Joondalup and Mandurah), and FAQ schema on the real questions above.

What would change for the real client

Iteration log

Pass 1 · Craft

Drove the whole page in headless Chrome with a 35-check harness: fresh-load empty submit (3 validation signals raised, no confirmation), filled submit (confirmation in the "thanks / received / we'd call" family), every service/vehicle/zone chip, SVG band taps by dispatched MouseEvent, keyboard Enter on a band, all six FAQs, the armed pickup/drop toggle, and the sticky bar. Verified every displayed price against an independently reimplemented oracle: rest $69, express $101, inner→Peel direct one-tonner $209, same-zone floor $35 — all matched the spec's arithmetic.

Screenshot review caught three real defects the DOM asserts sailed past: the 375px masthead overflowed to scrollWidth 475 (the full phone number in the call pill — compacted to a "Call" pill under 560px, keeping the tel: link and the full number in hero, footer and sticky bar); the run-sheet slip's route line overran its card ("WELSHPOOL → JOONDAL…") — restructured to EX/TO lines; and the ETA label collided with the Mandurah suburb label on Peel drops — replaced the generic offset with per-zone ETA anchor positions.

Pass 2 · Depth

Enriched the signature: crossed-band glow changed from a flat 0.16 wash (which flattened the ring rhythm) to per-ring offsets that preserve the alternating band tones; added the depot pulse ring (CSS-animated scale on a clean element — never a property the element also sets as an SVG attribute); made the travelling head's speed honest to the service level (standard 9, express 6.5, direct 4.5 ms-per-length-unit — a direct drive visibly runs harder); and gave the price total a settle "pop" on change. The POD tick flash at the drop star on each loop completion is the second-read detail: the delivery, proven, in scan green. Screenshot review of the planner and booking sections confirmed card hierarchy and the express note panel.

Pass 3 · Hardening

Masthead first at 375: wordmark right edge 275px vs call-pill left edge 287px — clear, measured from getBoundingClientRect edges, and confirmed by eye on the 375 screenshot. scrollWidth 375, sticky bar 68px with the tel: link, h1 + a 56px call CTA inside the first mobile viewport, and a map band tap verified working at 375. Reduced-motion path renders the run complete and static (dash removed, head parked, depot pulse stilled). Chanel rule: removed the CBD→Fremantle arterial hint line, decluttering the inner-west where three suburb labels sit. Final copy read caught a real honesty bug: the "door by" clock would happily print a 2am delivery when viewed at night — it now falls back to "next depot day · first van 6:30am" outside depot hours. Zero console errors across every run, including the v-flag-checked phone pattern.

Honest numbers: every figure on the page comes from the one zone-step board, and the planner's cheapest output ($35) equals the services grid's floor. The four worked examples in the concept spec were re-measured from the implemented model and matched exactly — no corrections shipped.