The concept
The regulator is the competition.
Ledgerline Licensing prepares and lodges Western Australian liquor licence applications: new licences, transfers timed to settlement, alterations, extended trading permits and one-off event licences. The buyer is four months into a fit-out and has just discovered the licence is the long pole, or is buying a going concern and needs the transfer to land on settlement day. The page has one job — get that operator onto a twenty-minute call before they lodge anything — and it earns that call by answering the question first, for free, and by saying out loud that the regulator takes applications direct and no agent is required.
That last part is not a disclaimer. A Perth search for a liquor licensing consultant returns the regulator and almost nothing else, which means the reader has already been reading government pages for an hour. A page that pretends the regulator is hard to reach loses to the regulator. A page that says here is the answer, here is the form, ring us if the objection window worries you is the only one they will remember.
Palette
An application bundle, not a bar.
Alcohol-brand burgundy and gold-on-black were ruled out by argument: they would make the page look like the venue instead of the file that gets the venue open. The room here is a desk with a bundle of paper on it. Ratios below are measured, not estimated.
#F8F6F1The page ground. Warm enough to read as paper stock rather than screen white.#EDE9E0Cards, the walkthrough, the form. Body ink measures 13.95:1 on it.#1D2129The lodge-it-yourself panel and the footer. Paper on it measures 14.94:1.#1F5F52Every call-to-action, and the chain marks in the seal. Paper on it measures 6.9:1.#1A1D2215.65:1 on paper. Also the only ink allowed on the map, over land or water.#4F555E6.96:1 on paper. Declared for paper and panel only — never on the map.#1B584C7.63:1 on paper. Prices, links, and accented words inside body copy.#7A54106.27:1 on paper. Licence-class chips and the seal legend, and nowhere else.#8A62125.07:1 on paper as a mark. The seal rings, the tick marks, the refusal rules.#EEEAE1Body ink 14.07:1. Every suburb label on the map is body ink for that reason.#D2DBDDBody ink 12:1. The ocean, the Swan and the Canning.#CDC7BA1.56:1 on paper. Lines only — it never carries a word.Brass appears on licence-class chips, the seal and the refusal rules, and nowhere else on the page: the client sells a licence, not a drink. Two tokens are deliberately fenced — muted grey is licensed for paper and panel only, so the service-area map carries body ink over both fills, and the hairline is a lines-only token that never sets type.
Type
Notarial, not a law firm.
Fraunces at 500 and 600, optical-size axis, tightly tracked, does the headings, the prices and the seal. It has the weight of something official without the Trajan-and-columns cliché that every licensing firm reaches for; at display sizes its slightly flared serifs read like a stamp, which is exactly the page’s subject. Inter at 400/500/600 carries everything a person actually has to read: body copy, chips, form labels, the seven FAQ answers.
Tabular figures are scoped, not global. The first draft set font-variant-numeric: tabular-nums on body, which widened the hyphen glyph as well as the digits — so “one-off” and “twenty-four” rendered with a visible gap either side of the hyphen. It was invisible to every assertion and obvious in the first screenshot. Tabular figures now apply to the price column, the masthead number, the seal and the confirmation echo, and nowhere else.
The proof element
The which-licence walkthrough.
Three plain questions — what are you running, will people want a drink without ordering a meal, do you want to sell sealed takeaway — resolve to one of seven named licence classes. The decision table is total over all 24 combinations and every one of the seven classes is reachable; both properties are asserted by an oracle written separately from the page and re-driven in a real browser, cell by cell.
| What you are running | Drink without a meal | Sealed takeaway | Class |
|---|---|---|---|
| A place where people sit and eat | no | no | Restaurant |
| A place where people sit and eat | yes | no | Tavern |
| A place where people sit and eat | no | yes | Tavern |
| A place where people sit and eat | yes | yes | Tavern |
| A small venue for drinks | either | no | Small bar |
| A small venue for drinks | either | yes | Tavern |
| A bottle shop | either | either | Liquor store |
| A brewery, winery or distillery | either | either | Producer |
| A club | either | either | Club |
| A one-off event | either | either | Occasional |
Neutrality is swept, never claimed
For four of the six venue types neither of the two yes/no answers changes the class, and for a small venue only the takeaway question moves it. The page does not assert that from a hand-written list — it flips each control against the same function that produces the answer and reports what it finds, then marks the dead controls N/A on the drawn chain and says so in a sentence. A control that silently does nothing reads as a broken page; a control that says this one does not matter for you reads as a model.
The road you did not take
Under every answer, the page flips one control at a time and names what the class would become, together with whether that class needs a public interest assessment. Choosing sealed takeaway in a small venue turns a small bar into a tavern — and a tavern application needs a public interest assessment and is usually advertised, while a small bar application needs neither. That is a real, costly consequence of a lease decision, and it is worth more to the reader than any fee on the page. It is generated from the same table as the answer, so it can never contradict it.
How the seal is drawn
The signature is a single inline SVG: a plate, a three-node answer chain, and a two-ring seal with eight registration ticks. There is no library, no raster, and no animation loop — the page comes to rest the moment it loads and is pixel-identical at seven seconds and at nine, which is what the 1200×750 thumbnail contract needs. The only motion is a 130 ms press on the seal when an answer changes, skipped outright when prefers-reduced-motion is set.
Two details in there are lessons the collection paid for. The class name inside the ring is measured, not guessed from a character count: the script sets 24px and walks down until getComputedTextLength() fits the 88-unit chord, then re-measures once document.fonts.ready resolves, because Fraunces arrives after first paint. And the N/A strike marks on the dead nodes are toggled with setAttribute("hidden","") rather than el.hidden — hidden is an HTMLElement property and does nothing at all on an SVG element, which is a defect every state assertion in the world will sail straight past.
At 375px the plate crops. The three-node chain sets its labels at about seven pixels once a 520-unit plate is squeezed into a 335-pixel column, so below 640px the chain is hidden and the viewBox re-frames onto the seal alone, which then renders about 200px across. viewBox is an attribute, so a media query cannot do it — a matchMedia listener sets it, and the chips directly beneath already carry the same state the chain was showing.
Conversion decisions
Why things sit where they sit.
- The answer is above the questions. The walkthrough leads with the seal and the named class, then offers “change any answer” below. It reads like a readout, it keeps the answer on screen while the controls are driven, and it puts the page’s single most valuable sentence inside the first 750 pixels of the 1200-wide thumbnail — measured at 454px, not hoped for.
- The proof card sits beside the headline at 1024px and up. On mobile the reading order is the conventional one: masthead, hero, services, proof, how it works, reviews, map, FAQ, form, footer. At desktop the card floats into the hero’s second column, because a hero plus a six-tile grid spends the whole thumbnail frame before the drawing appears.
- Four prices are in the hero at desktop. A licensing prospect’s first question after “which licence” is “what does this cost”, and every competitor on that search result is a government page with no price at all. Four anchors and the sentence that the regulator’s own fee is separate does more work than a paragraph of positioning.
- Five required fields, one optional. Name, phone, venue suburb, venue type and “have you lodged anything yet?” — that last one is the field that makes the call useful, because an application already advertised is a completely different conversation from a lease not yet signed. Everything else waits for the phone.
- The refusal sits next to the answer, not in the FAQ. The lodge-it-yourself panel is the dark block directly under the walkthrough, at body size, on every one of the 24 branches. A refusal in the FAQ is a disclaimer; a refusal beside the number is a demonstration of how the business behaves.
- No fees the business does not set. The regulator’s application fees are set by regulation and move; the page says who sets them, says you pay them direct, and prints none. The one exception is a fee stated plainly at the source — there is no application fee for an extended trading permit lodged with a grant application — and the page turns that into advice: ask for the hours at the same time.
Verification
What was checked at the source, and what was refused.
This page names a real Act, real licence classes, real certificates and real training requirements. Every one of them was read at the regulator’s own site or at wa.gov.au before it was written down.
| Claim on the page | Status |
|---|---|
| The seven class names: Restaurant, Small bar, Tavern, Liquor store, Producer, Club, Occasional | Verified, with the regulator’s own wording |
| Restaurant s50; liquor store s47; producer s55; club s48; occasional s59; tavern under s41 | Verified |
| Small bar: on-premises only, no packaged sales, no more than 150 persons at any one time | Verified |
| Public interest assessment required for hotel, tavern, liquor store and nightclub; not for small bar, restaurant, wholesaler, producer, club | Verified |
| The legislation does not require a public interest submission to be prepared by legal counsel or industry consultants | Verified, quoted |
| Occasional licence: an occasion of no more than three weeks; lodge at least 14 days ahead, 60 days above 500 patrons, 90 days above 5,000 | Verified |
| Section 40 certificate from the planning authority; section 39 certificate from local government, covering the five named Acts | Verified — and the spec had them conflated |
| Approved manager under s100(2), present under s100(2a); RSA for a restricted card, Course in Management of Licensed Premises for an unrestricted one | Verified |
| Packaged liquor over 400 m² within 5 km metro / 12 km regional cannot be considered | Verified |
| No application fee for an extended trading permit lodged with a grant application | Verified |
| Any dollar figure for a regulator application fee | Refused — set by regulation and it moves |
| Any processing time or turnaround for a permanent licence | Refused — could not verify at source |
| The advertising period and the objection window in days | Refused — named as stages, never as a number |
| The department’s current name | Avoided — see below |
Two corrections the page made to its own brief
- Section 40 is the planning certificate, not the local government one. The brief described a “section 40 certificate of local government”. At the source they are two different documents: a section 40 certificate comes from the authority responsible for planning matters in the district (a development approval may be lodged instead), and a section 39 certificate comes from local government and speaks to the Health (Miscellaneous Provisions) Act 1911, the Food Act 2008, sewerage and drainage law, the Local Government Act 1995 and the Building Act 2011. The page ships both, correctly, and the FAQ explains the difference.
- The page does not call the regulator “DLGSC”. The brief did. The liquor regulator’s own pages now carry a notice that the department was renamed, and the wa.gov.au guide to applying for a liquor licence attributes the service to Racing, Gaming and Liquor within the Department of Local Government, Industry Regulation and Safety. Rather than print a department name that may already be stale, the page names the decision-maker — the Director of Liquor Licensing — and refers otherwise to “the regulator”. That is the part that does not change with a machinery-of-government reshuffle, and it is the name the reader will see on their own determination.
Iteration log
Three passes, each one driving the page.
Pass 1 — Craft
Drove all 24 walkthrough combinations against a separately written oracle, submitted the form empty and filled, and then looked at the rendered 1200×750 capture, which is where most of these came from.
- The answer was 861px down a 750px frame. The card ran head → three question rows → note → seal → answer, and the class name landed 111px below the fold at 1200 wide. Restructured to lead with the seal and the answer; measured again at 454px, with the drawn seal at 224–382px.
- The seal’s captions overflowed its own rings. “LICENCE CLASS” measured 93.3 units across a chord of 85.5, and the plate’s footer line ran to x=652 on a 520-unit plate — clipped clean off. Caption dropped to 8px with tighter tracking, footer split into two shorter lines anchored to the plate’s two ends, and the class name switched from a guessed size to a measured fit.
- Tabular figures were widening the hyphen.
font-variant-numericonbodyrendered “one-off” and “twenty-four” with a gap either side of the hyphen. Scoped to the four places that actually hold numbers. - The trust line finished 78px below the mobile fold. At 375×667 the masthead stacked into three rows and the hero’s secondary phone button pushed the trust line under the sticky bar. Masthead now puts the wordmark on its own row with the call chip and the CTA sharing the next; the redundant hero phone button is hidden below 620px (there is a
tel:link in the masthead and another in the sticky bar). Trust line now finishes at 581px against a bar top of 598px. - The sticky bar’s phone label wrapped to two lines at 375. Nowrap plus a size step at 400px.
- “Change any answer” was a
::beforeon the first fieldset, which put it under that fieldset’s legend, because a legend renders at the top of its box no matter what. Made a real heading element.
Pass 2 — Depth
Re-drove every combination, then added the two things a second visit should notice.
- Added “the road you did not take”. Under every answer the page now flips one control at a time and names the class it would become, with the public interest assessment consequence attached. It is generated from the decision function, and the harness asserts the generated list against the oracle on all 24 cells — not just that it exists.
- Added the neutrality sentence and the N/A marks. The dead controls are computed by flipping them, not by a hand-written list of which venues care. For a small venue the page now says that drinking without a meal does not change the class, because a small bar already allows it, and that takeaway is the answer that moves you.
- Added the desktop hero furniture. Four price anchors and a pull-panel naming the four classes that need no public interest assessment. The left column had been empty from 430px down in the thumbnail; it now carries the prices and the page’s most useful free fact.
- Service cards became flex columns so the “plus the regulator’s own fee” line sits on one baseline across a row, instead of floating at three different heights.
Pass 3 — Hardening
375 / 768 / 1440, keyboard, reduced motion, rubbish in the phone field, and a rapid-fire drive with no settle between clicks.
- The map was drawing labels on top of each other. “City of Vincent” and “City of Bayswater” overlapped at 1200, and at 375 the enlarged labels overlapped again after the first fix. Every pin was relaid on a ladder that guarantees vertical separation, Bayswater joined the labels that drop below 640px, and the harness now asserts that no two visible map labels have intersecting boxes at both widths.
- The map was rendering at 23px labels because a 640-unit viewBox was being stretched to 1140px. Capped at 820px wide and the type re-scaled per band; asserted to land between 12 and 26px at desktop and at least 10px at 375.
- Junk in the phone field. The
patternattribute is compiled by Chrome with thevflag, where an unescaped(,)or-inside a character class makes the whole pattern silently vanish and the field accept anything. This page’s pattern carries none of those characters, the checker compiles it withvbefore shipping, and the harness types “ring me maybe” into the field and asserts both that the page rejects it and thatcheckValidity()returns false. - Rapid-fire drive. Seven chip clicks dispatched in a single evaluation with no settle between them; the final state still resolves to the oracle’s answer and the console stays clean.
- Thumbnail at rest. The state probe and the rendered pixels are identical at 7 seconds and at 9. There is no frame accumulator anywhere on the page, because there is no loop at all.
- Removed one ornament. The seal originally carried “LIQUOR CONTROL ACT 1988” as a third line inside its rings. It never fitted, and the Act belongs on the plate, not in the seal.
- Then the checker itself was tested. Sixteen defects were planted into the two files one at a time — a second
h1, a bannedLocalBusinessblock, a curly-quoted attribute, a real street address, three flavours of non-reserved phone number, aconsole.error, a wrong branch in the decision table, the answer pushed below the fold, av-invalidpattern, a map label collision, an overflowing seal caption, the SVGhiddenIDL property, a confirmation panel visible on load, and a missing guide panel — and every one of them fired, with both files restored byte-for-byte afterwards. - That exercise found a dead check. The reserved-phone-number scan matched
\(08\)\s*9\d{3}against source in which the number is written(08) 9000 0342. is not\s, so the check had been matching nothing at all and passing vacuously the whole time. It now normalises the entity first, asserts the index page carries at least one number, and separately checks everytel:href. A green check that cannot fail is worth less than no check.
Local SEO
What we would ship for the real business.
The live page carries only WebPage schema that names itself a demonstration, because marking a fictional agency up as a real one would put false structured data into a real index. For an actual licensing agent, this is the block we would ship — a ProfessionalService with genuine reviews collected through their own request flow, an aggregate rating computed from those reviews rather than typed, and a service catalogue that mirrors the six tiles on the page.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ProfessionalService",
"@id": "https://ledgerlinelicensing.com.au/#business",
"name": "Ledgerline Licensing",
"description": "WA liquor licence applications prepared and lodged: new licences,
transfers, alterations, extended trading permits and occasional licences.",
"url": "https://ledgerlinelicensing.com.au/",
"telephone": "+61 8 XXXX XXXX",
"email": "office@ledgerlinelicensing.com.au",
"priceRange": "$$",
"address": {
"@type": "PostalAddress",
"streetAddress": "Suite N, NN Example Street",
"addressLocality": "West Perth",
"addressRegion": "WA",
"postalCode": "6005",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.94, "longitude": 115.84 },
"areaServed": [
{ "@type": "City", "name": "Perth" },
{ "@type": "AdministrativeArea", "name": "Western Australia" }
],
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:30", "closes": "17:00"
}],
"hasOfferCatalog": {
"@type": "OfferCatalog",
"name": "Liquor licensing services",
"itemListElement": [
{ "@type": "Offer",
"itemOffered": { "@type": "Service", "name": "New liquor licence application" },
"priceSpecification": {
"@type": "PriceSpecification",
"price": "3400", "priceCurrency": "AUD",
"valueAddedTaxIncluded": true,
"description": "From. Excludes the regulator's own application fee."
}
},
{ "@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Licence transfer on settlement" } },
{ "@type": "Offer",
"itemOffered": { "@type": "Service", "name": "Extended trading permit" } }
]
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9", "reviewCount": "38",
"bestRating": "5", "worstRating": "1"
},
"review": [{
"@type": "Review",
"author": { "@type": "Person", "name": "A real, named, consenting client" },
"datePublished": "2026-07-14",
"reviewRating": { "@type": "Rating", "ratingValue": "5", "bestRating": "5" },
"reviewBody": "The transfer landed on settlement day. Fortnightly updates the whole way."
}]
}
</script>
Alongside it: a Google Business Profile in the Licensing service / Consultant category with the West Perth address verified, an FAQPage block built from the seven questions already on the page (they were written from the regulator’s own material, which is exactly what an answer engine wants to cite), and one page per licence class targeting the searches people actually run — small bar licence Perth, liquor licence transfer settlement WA, occasional licence for an event WA — each one linking back to the walkthrough. Reviews would be requested by SMS after a determination lands and marked up only once they exist.
For the real client
What changes on day one.
- The enquiry form raises a matter. On this demo the form confirms locally and sends nothing. For a real agent it posts into a practice or matter management system — Actionstep, Smokeball or Karbon are the usual three at this size — opening a matter with the venue suburb, the class the walkthrough resolved, and the stage the enquirer selected, so the twenty-minute call starts with the file already open.
- The engagement letter and the authority go out through DocuSign straight off the back of that matter, with the fixed fee filled from whichever tile they came in on. Signed authority in, lodgement can start the same day.
- The fee lands in Xero as a draft invoice against the matter, with the regulator’s application fee recorded as a disbursement paid direct by the client rather than passed through the agent’s account — which is the accounting shape the page already promises in words.
- Enquiries and stages live in a CRM. HubSpot or Pipedrive at this size, with a pipeline that mirrors the real one: enquiry, engaged, bundle building, lodged, advertised, objection period, determined. The fortnightly one-line status the page promises is a workflow on that pipeline, not somebody remembering.
- The walkthrough becomes a lead scorer. The class it resolves is worth knowing before the call: a tavern or liquor store enquiry is a public interest assessment and an advertised application, and it is a different quote and a different diary. That value already exists in the page state and would be written onto the CRM record with the enquiry.
- The reviews become real. Three demo quotes come out and a live feed goes in, requested after determination and marked up only once collected.
Why this converts
Your buyer arrives having already read six government pages, so the page answers their question in three clicks before it asks for anything, and the answer — a named licence class on a drawn seal — is on screen inside the first 750 pixels rather than under a menu of service tiles. It then does the thing none of your competitors will: it tells them they can lodge the application themselves, quotes the regulator saying no consultant is required, and on the cheapest job on the page it tells them outright to do it alone. That single paragraph is what makes the four prices in the hero believable, because a business that turns down the $390 job is a business whose $3,400 quote is a real number rather than an opening position. Every consequence the walkthrough names — sealed takeaway turning a small bar into a tavern, a tavern needing a public interest assessment and advertising — is a decision your buyer is about to make on a lease, which is why they ring rather than bookmark. And the five fields ask only what makes the call useful, including the one question that changes everything about it: have you lodged anything yet.