What this page declined to publish
This comes first because on this trade it is the most important part of the build. Everything below was considered, researched, and left off the page on purpose.
The rule we worked to
No NDIA figure, fee, price limit, funding rule, establishment fee or registration requirement goes on the page unless it was verified at ndis.gov.au during this build. Anything unverified is declined outright — not softened, not hedged, not rounded. A wrong number about a real scheme, on a page a tired parent is reading at ten at night, is worse than a missing one.
The result: there is not one dollar sign anywhere on either page. The services grid’s price column reads Included against all eight lines, and the sentence under it explains why. That is asserted in the build harness, not hoped for.
Declined — could not be verified at the source during this build
- The plan-management price limit. The NDIS pricing arrangements page links only to a downloadable pricing schedule (PDF and DOCX, effective 1 July 2026). The PDF’s text could not be extracted during this build, so no figure was verified and none is published.
- Any establishment fee. Same reason. Never mentioned on the page.
- What NDIS provider registration requires. The source describes plan management as done by a registered plan manager, but says nothing we could verify about what registration involves — so the page makes no claim about it, and the fictional business claims no registration status. The footer carries a visibly patterned placeholder (0-000-0000) instead.
- Any regional loading or remote-area pricing rule. Declined; the page says only that it works remotely across WA.
- Support-category and line-item codes. Never published. The page says “the right support budget” and stops there.
- Eligibility advice of any kind. Not the business’s job and not this page’s.
- What happens to a budget at the end of a plan. Declined on the page, out loud: the FAQ answers the part we can answer and then says the rest is a question for a planner or the NDIA, and that we are not going to guess at it on a web page.
Verified at ndis.gov.au on 8 September 2026, and stated once
Source: ndis.gov.au → Participants → Using your plan → “Guide to your management options”, read during this build.
- Funding for a plan manager can be included in a participant’s plan when they ask for it at their plan meeting; that funding is separate to their other NDIS supports and can only be used to pay a plan manager. This is stated once, plainly, in the note under the services grid.
- There are three management options: self-management (you or your nominee pay your providers and manage the financial records yourself), plan management (a registered plan manager pays your providers and manages the financial records for you), and NDIA-management (the NDIA does it, sometimes called Agency-managed). This is the numbered 01 / 02 / 03 row.
Because the price limit itself is declined, the page prints the pinned sentence beside it instead: “Plan management is funded through your plan, not out of your pocket — ask for it at your planning meeting and we will confirm the current price limit with you before we start.”
Where the refusal sits, and why that matters
W53’s rule is that a refusal in the FAQ is a disclaimer, and a refusal beside the number is a demonstration of how the business quotes. The empty price column is in the services grid, and its explanation is the panel immediately underneath it — not a footnote, not an FAQ answer. The strongest sentence on this page is “there is not one dollar figure in that column, and that is on purpose”, and it earns its place by being the first thing you read after the grid.
Local SEO we’d implement for the real business
The live page emits only WebPage, CreativeWork, WebSite and BreadcrumbList, because putting a fictional business into a real search index with fictional reviews attached would be dishonest markup. For a real Wattlebird, this is what ships on day one — printed here as a code sample instead.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "FinancialService",
"@id": "https://wattlebirdplan.com.au/#org",
"name": "Wattlebird Plan Management",
"description": "NDIS plan management for participants in Joondalup, Perth's
northern corridor and remotely across Western Australia.",
"url": "https://wattlebirdplan.com.au/",
"telephone": "+61 8 9000 0433",
"email": "hello@wattlebirdplan.com.au",
"priceRange": "Funded through the participant's plan",
"address": {
"@type": "PostalAddress",
"streetAddress": "<the client's real suite>",
"addressLocality": "Joondalup",
"addressRegion": "WA",
"postalCode": "6027",
"addressCountry": "AU"
},
"geo": { "@type": "GeoCoordinates", "latitude": -31.744, "longitude": 115.766 },
"openingHoursSpecification": [{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"opens": "08:30", "closes": "16:30"
}],
"areaServed": [
{ "@type": "City", "name": "Joondalup" },
{ "@type": "City", "name": "Wanneroo" },
{ "@type": "City", "name": "Clarkson" },
{ "@type": "State", "name": "Western Australia" }
],
"sameAs": [
"https://www.google.com/maps/place/?q=place_id:<GBP place id>",
"https://www.facebook.com/<page>",
"https://www.linkedin.com/company/<page>"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9", "reviewCount": "68"
}
},
{
"@type": "Service",
"name": "NDIS plan management",
"provider": { "@id": "https://wattlebirdplan.com.au/#org" },
"serviceType": "NDIS plan management",
"areaServed": { "@type": "State", "name": "Western Australia" }
},
{
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "Can I move to you in the middle of a plan?",
"acceptedAnswer": {
"@type": "Answer",
"text": "People move to us mid-plan most weeks. You tell us, we do our part
of the paperwork, and from then on your providers send their
invoices to us instead."
}
}]
}
]
}
</script>
And the rest of it, which is not markup
- Google Business Profile as the primary asset for this trade: category Disability services / Financial consultant, the Joondalup service area listed suburb by suburb, and the review flow wired to a card the office hands over after the first statement.
- A real review feed replacing the demonstration copy on this page, pulled from the profile so the markup above is honest rather than typed.
- One page per intent, not one page per suburb: “switching plan managers mid-plan”, “plan managed vs self managed”, “how a plan manager pays a provider”. Doorway suburb pages get a plan manager penalised and do not convert anyway.
- The areaServed list and the on-page suburb list kept identical, because the two disagreeing is the most common local-SEO defect we find on trade sites.
- A statement-day content beat: one short post on the first business day of each month. It matches what the business already does, so it never becomes a chore nobody does.
Why this converts
Five sentences for the person deciding whether to hire us, not for a designer.
- The headline answers the only question this audience actually has — when does my provider get paid — in nine words, and the phone number sits next to it as a button rather than as small print in a corner.
- The proof element asks for two things a tired parent already knows off the top of their head, invoices a month and providers on the plan, and answers in their currency — minutes and hours — because a page about NDIS money that refuses to print NDIS money still has to prove something.
- The empty price column is the highest-converting element on the page: every competitor either publishes a fee the NDIA actually sets or hides behind “contact us”, and saying plainly we do not set this and we do not add to it, so we have nothing to quote you buys more trust in one sentence than a discount would.
- At one or two invoices a month the card turns the work away on screen — twelve minutes, keep self-managing, ring us when you add a second provider — and the button underneath ticks a box on the form instead of losing the lead, which is the difference between an honest page and a page that just looks honest.
- Every conversion mechanic a real enquiry needs is present and driven in the browser before it ships: click-to-call in the masthead and in a sticky bar, a six-field form that validates and confirms locally with nothing faked, reviews written the way a parent and a support coordinator actually speak, a service-area map with named suburbs, and a page that holds together at 375 pixels wide with the headline, the call button and the trust line all above the fold.
The proof element
One slider, one stepper, one drawing, one refusal.
What it computes
There is exactly one number in the model and it belongs to the business, not to the scheme: twelve minutes an invoice — check it against the plan, claim it, file it. The card says on its face that the twelve minutes is our estimate and invites the reader to correct it. Minutes are held as integers and divided once at display (the W47 rule), so a month reads 216 minutes and prints 3.6 hours rather than 3.5999999999999996.
| Invoices a month | Minutes | Hours a month | Hours a year | Licensed by check-w55.mjs |
|---|---|---|---|---|
| 1 | 12 | — | — | yes — and the refusal |
| 2 | 24 | — | — | refusal band only |
| 3 | 36 | 0.6 | 7.2 | hours yes, year no |
| 6 | 72 | 1.2 | 14.4 | both |
| 12 | 144 | 2.4 | 28.8 | hours yes, year no |
| 18 (rest state) | 216 | 3.6 | 43.2 | both |
| 24 | 288 | 4.8 | 57.6 | hours yes, year no |
| 30 | 360 | 6 | 72 | both |
Below three invoices the card prints minutes rather than hours, because that is the reading the oracle licenses at one invoice and because “0.4 hours” is a silly way to tell somebody their month is fine.
The drawing
Thirty invoice slots are drawn once, synchronously, as dashed ghosts; your invoices are a second set of filled slips laid over them, so the ceiling of the scale is visible without being explained. Underneath, a fixed nought-to-six-hour axis — six hours is exactly what thirty invoices costs, so the axis is the reachable maximum rather than an arbitrary frame, and the bar can never run off its own scale. The whole strip is laid out in real CSS pixels: the SVG’s viewBox width tracks its rendered width, so one user unit is one device-independent pixel and the axis type is ten pixels at 375 as well as at 1440. Below 430 pixels the grid re-flows from ten slips a row to six.
Slip visibility is toggled with the hidden attribute via setAttribute / removeAttribute, never the IDL property — hidden is an HTMLElement property and does nothing at all on an SVGElement, which cost a sibling site a whole feature last wave with every state assert green. The [hidden]{display:none!important} guard ships on both pages so the attribute path actually hides.
The three-step payment strip
Provider sends the invoice → we check it against the plan budget → paid within three business days. That promise is ours to make, so it is sayable, and it is the single thing this audience wants to know. It is built in HTML rather than SVG (see Pass 1) with a dot travelling the connector on the wall clock — a six-second cycle that holds for half a second on step two, because the check is the part being sold. It never drops below full opacity, so the seven-second thumbnail catches it alive at any instant, and reduced motion parks it on step two as a settled frame rather than removing it.
The refusal
At one or two invoices a month the card turns apricot and says “12 minutes a month is not worth changing how your plan is managed. Keep self-managing. Ring us when you add a second provider.” The figure in that sentence is computed, so at two invoices it correctly reads 24. A button in the panel ticks the form’s “not yet — ring me when my plan grows” checkbox and moves the reader to the form, and the confirmation changes wording to match. A marker under the slider states the same floor before the reader drags down to find it.
There is a second give-away at the other end: from twenty invoices a month the card suggests asking whether a couple of those providers will bill monthly instead of per visit, because fewer invoices is a better fix than a faster plan manager — advice that costs us the exact thing we are selling.
Where we disagree with the spec, reported rather than resolved quietly
- The oracle licenses 7 of the slider’s 30 positions. check-w55.mjs names invoices 1, 3, 6, 12, 18, 24 and 30, three annual figures (6, 18, 30) and the refusal band. The slider is specified as 1–30 in steps of one, so 23 monthly and 27 annual figures on the page are derived from the one anchor the oracle does name — twelve minutes an invoice — as n × 12. We shipped it as specified, wrote an independent oracle over all thirty cells, and it reproduces every licensed cell exactly. Flagging it rather than assuming that reimplementing the same function from the same anchor counts as a licence.
- Two trust-line figures are brand facts, not oracle cells. “Ten years plan managing” and “340 participants” are the fictional business’s own history, in the same class as its hours and its postcode. Nothing on the page computes with them and check-w55.mjs does not name them.
- The proof element sits beside the headline at desktop, not after the services grid. The concept’s layout order puts it after the grid; the accumulated rule from Wave 51 is that the lead-gen order describes the mobile stack and that at desktop the proof element belongs in the hero’s second column, because a hero plus an eight-line grid spends the whole 1200×750 thumbnail before the drawing appears. On this page the proof element follows the hero at every width.
- Three palette ratios in the concept prose disagree with the sweep. The concept quotes ink at 14.9:1, muted at 7.13:1 and burnt at 7.38:1 on paper; contrast-w55.log measures 16.28:1, 7.12:1 and 7.32:1 for the same hexes. No decision changed — all three pass comfortably either way — but the figures in this guide are quoted from the log, which is the binding half.
Palette
Every disability and aged-care site in Perth is mid-blue and mint-teal on white. This one is warm paper and ink-indigo with an apricot chip: administrative calm rather than clinical brightness, and deliberately unlike the homecare, ndis and supportcoordination pages already in the collection. Ratios below are quoted from contrast-w55.log, hex and figure from the same row of the same run.
| Token | Hex | On | Measured | Why |
|---|---|---|---|---|
| ink | #1B1830 | paper / panel | 16.28:1 / 14.3:1 | An indigo-black, not a neutral black — it keeps the warm ground from reading beige. |
| muted | #565073 | paper / panel | 7.12:1 / 6.25:1 | Second voice. Declared on paper and panel only; never on the map grounds. |
| paper | #FCF8F3 | ground | — | Warm office paper. The page a plan arrives on. |
| panel | #F1E9DE | card ground | — | One step warmer, so cards read as inserts rather than boxes. |
| band | #2A2352 | ground | — | Deep indigo. Carries paperOnDark at 13.6:1 and the hover cut at 15.99:1. |
| apricot | #F2B07A | ground, takes ink | 9.24:1 | The one warm note. Takes ink only — paperOnDark on apricot measures 1.76:1, so it is never reversed out. |
| burnt | #8A3B12 | paper / panel / mapLand | 7.32 / 6.43 / 6.59:1 | The accent line, the eyebrows and the office marker on the map. |
| markIndigo | #2A2352 | panel / mapLand / mapWater / apricot | 11.95 / 12.25 / 10 / 7.71:1 | Every drawn mark: the slips, the bar, the suburb dots, the travelling payment dot. |
| mapLabel | #1B1830 | mapLand / mapWater | 14.67:1 / 11.98:1 | A service-area map always ends up wanting a word on it; this is the text-grade token for it. |
| rule | #D2C5B1 | paper / panel | 1.61:1 / 1.41:1 | Hairlines only, at hairline grade. |
| ruleOnDark | #453D70 | band | 1.47:1 | The same job on the indigo band. |
| apricotOnDark | #F2B07A | band / bandHover | 7.71:1 / 9.07:1 | Minted this build. The apricot was declared only as a ground; the dark band needed it as an eyebrow, a numeral and a focus ring. Added to contrast-w55.mjs and re-swept. |
| paleOnDark | #D5D0E8 | band / bandHover | 9.6:1 / 11.29:1 | Minted this build. Running copy under a heading on the band: rule is a hairline token and paperOnDark is too loud for a paragraph. Added and re-swept. |
With both minted tokens in it the sweep declares 26 pairs for this site and fails none, and the wave-wide run is 0 failures. Two forbidden rows changed decisions on this page rather than merely being recorded: paperOnDark on apricot at 1.76:1 is why the chip and the sticky call button always take ink, and burnt on band at 1.86:1 is why the focus ring changes token on every dark surface (Pass 3).
Type
Bricolage Grotesque at 600 for headings: it has warmth without being soft, which is the register this audience needs from a business that handles their money. Public Sans for body, set at 17px on mobile rather than the usual 16, because this reader actually reads the page rather than scanning it. One typographic move only — the three management choices set as a numbered 01 / 02 / 03 row in display weight with the numerals in apricot, so the page’s single moment of scale is spent on the fact that the choice is the reader’s and plan management is only one of three.
The three passes
Each one rendered the page in headless Chrome and drove the controls — the slider across all thirty positions, the providers stepper to both clamps, the form empty, with junk in the phone field and filled, the refusal button, and the sticky bar. The harness finished at 135 of 135 checks across both pages.
Craft
- Two drawings were rendering type at about six pixels at 375. Both the invoice strip’s axis caption and tick labels and every label in the three-step payment strip were SVG text in a fixed viewBox, which scales down with the container. Fixed properly rather than by bumping font sizes: the invoice strip is now laid out in real CSS pixels (viewBox width tracks rendered width, ten slips a row above 430px and six below), and the payment strip was rebuilt in HTML with the travelling dot positioned from the measured disc geometry instead of hard-coded coordinates.
- The service-area map was a 720px drawing floating in a 1100px column. Rebuilt as a two-column block — map beside the legend and the suburb list — at 980px and up. The ocean band was widened from 7.5% to 10% of the width, and each suburb now takes a small deterministic nudge off its column line so the corridor reads as geography rather than as three lists.
- The two hero CTAs were different widths stacked at 375, which made the phone number read as an afterthought. Both are full-width and equal below 560px; so is the form’s submit button.
- The honesty panel under the services grid ran ragged across a 1100px panel — capped at 80 characters. The trust line’s third clause wrapped with an orphaned bullet leading the second line — split onto its own line.
- Three harness bugs, no site defects (the standing rule that a failing check is a suspect before the page is): a rect helper returning l/r while the assertions read left/right, which made every masthead measurement read NaN and fail at all three widths; an equality assert used where a boolean assert was meant; and a 12-suburb expectation written against an 11-suburb mobile layout.
Depth
- The payment promise was below the fold in the 1200×750 thumbnail. The strip has been moved directly under the answer, ahead of the note and the estimate footnote, and about fifty pixels were taken out of the card (tighter lede, shorter slip height, less padding, a shorter hero pad). The whole proof element now sits in the thumbnail: the strip, the six-hour axis, “3.6 hours a month and 43.2 hours a year”, the refusal marker, and all three payment steps ending in “Paid within three business days”.
- That also fixed the passive liveness probe, which had been reading the page as static because the only moving thing on it was below the captured viewport — a real diagnosis, not a validator excuse: the dot was measured advancing 83 pixels in 1.4 seconds while the pixel diff saw nothing.
- Second read added: a marker under the slider that states the floor — “under three a month we tell you to keep self-managing” — before the reader has to drag down there to discover it. A business publishing the point at which it stops wanting your work is the most persuasive thing on a page like this, so it should not be hidden behind an interaction.
- Second give-away added at twenty invoices and up: ask a couple of providers to bill monthly instead of per visit. Fewer invoices beats a faster plan manager, and it costs us the thing we are selling.
- One micro-interaction: a slip that has just landed settles in over 190ms from 78% scale, so the drawing behaves like paper arriving rather than like a bar chart redrawing. Suppressed entirely under reduced motion and during the entrance.
Hardening
- The focus ring was nearly invisible exactly where it mattered. burnt measures 1.86:1 on the indigo band, so the ring on the Sapience band buttons, the footer links and the sticky bar was effectively unreadable. Re-tokened: dark surfaces take apricotOnDark (7.71:1) and the apricot call button takes the band (7.71:1 the other way). Asserted against the authored rule, since :focus-visible cannot be forced from script.
- Chanel rule — one ornament removed: the dashed service-area outline on the map. It drew a hard boundary we cannot honestly draw, and it crowded the labels. The named suburb list underneath is the truthful answer and now the only one.
- Every number in body copy re-derived from the shipped model. One failed: the service-area block claimed “half the plans we manage” belong to people we have never met — a statistic nothing computes, in a build whose whole argument is that unverifiable figures do not go on the page. Replaced with “plenty of”.
- Added to the harness and passing: the slider driven by keyboard; every interactive target at least 40px tall; a resize that re-lays both drawings and re-measures the payment dot without replaying the entrance; a DPR-2 render with no overflow and no console errors; and a rapid-fire drive of nine control changes in one evaluate with no settle between them.
- Re-verified: one h1 per page, zero console errors at every width, no horizontal overflow at 375 / 768 / 1440 with the wordmark and the phone measured inside the viewport box, the headline and the call button and the trust line all finishing above the sticky bar at 375×667, the reserved (08) 9000 0xxx exchange everywhere, no curly-quoted attributes on either page, the phone pattern compiled under the v flag and driven with junk, and a street-noun scan over both pages whose only hits are “ways”, “plane” and “driven”.
What would change for a real client
The page is the easy half. For a working plan manager the integrations are the job.
- Xero — the bureau’s own ledger and the payment run. Invoices arrive, get coded to the right participant and support budget, and go out as a batch; the monthly statement is generated from the same data rather than typed twice.
- Careview — where a lot of WA providers raise their invoices and manage rosters. Taking the invoice feed directly is what makes a three-business-day promise safe to publish rather than aspirational.
- Brevity — the same story for providers running rostering and claims through it; the value is that nobody re-keys a line item.
- Lumary — the Salesforce-based end for larger providers, where an integration is worth building because one connection covers a lot of monthly volume.
- The bank — an ABA batch file rather than a person typing BSBs, because the whole promise on this page is a clock.
- The form — wired to whatever the office already opens in the morning. On a page like this the enquiry is a phone call waiting to happen; it should land as a task with a name and a number, not as an email nobody owns.
Everything visual on both pages is procedural — SVG, CSS and a little canvas-free JavaScript. There is not a single raster image, no library, no build step and no framework: two self-contained files under 120 KB between them.