Case StudyRegulatory Compliance PlatformWorkflow Automation & Document ProcessingFull-Stack Application

Adjudication Registry Platform for NSW Building & Construction

Designed and built a web-based adjudication registry system aligned with the NSW Building and Construction Industry Security of Payment Act (SOPA). The platform replaced a largely manual, paper-driven claims process with structured digital workflows for claimants, respondents, and Authorised Nominating Authorities (ANAs).

Government / Construction·7 months·
Next.jsNode.jsPostgreSQLAWSS3DockerRedisTypeScript
Problem Defined
Architecture
Implementation
Shipped
System Overview
Next.js
Node.js
PostgreSQL
AWS
S3
Docker

Primary stack components — see Architecture Decisions section for detail

Problem

The existing adjudication process under the NSW SOPA framework was administered through a combination of PDF forms, email chains, and manual tracking spreadsheets. ANAs had limited visibility into claim status. Claimants frequently submitted incomplete applications, causing delays and re-work. There was no centralised record of adjudication outcomes, making regulatory reporting difficult. Average claim processing time from submission to adjudicator appointment was roughly 18 business days, with significant variance depending on the ANA's internal capacity.

Context

The NSW SOPA framework governs progress payment disputes in the construction industry. When a payment claim is disputed, the claimant can apply for adjudication through an ANA. The ANA reviews the application for completeness, appoints an adjudicator, and manages the response timeline. The process involves strict statutory deadlines — a response must be lodged within a defined window, and the adjudicator must issue a determination within a fixed period. The system needed to support multiple ANAs, each with their own panel of adjudicators and internal processes.

Constraints

All statutory deadlines defined in the SOPA legislation had to be enforced programmatically.

All statutory deadlines defined in the SOPA legislation had to be enforced programmatically — the system could not allow extensions beyond what the Act permits. Document uploads needed to handle large construction files (drawings, contracts, progress reports) up to 200MB per file. The system had to support concurrent access by claimants, respondents, ANA staff, and adjudicators — each with different permission levels and views. Data sovereignty was non-negotiable: all data had to remain within Australian AWS regions.

Approach

We modelled the adjudication lifecycle as a state machine with clearly defined transitions: Draft → Submitted → Under Review → Accepted → Adjudicator Appointed → Response Period → Determination → Closed. Each state transition triggers validation checks (e.g., mandatory fields, deadline compliance) and notifications. Document management uses S3 with presigned URLs for secure, direct uploads from the browser. Role-based access control ensures each party only sees what they are entitled to at each stage.

Architecture Decisions

Chose PostgreSQL over a document database because the adjudication process has well-defined relational structures — claims, responses, determinations, and appointments map cleanly to normalised tables. Used a state machine library rather than ad-hoc status flags to enforce valid transitions and prevent illegal state changes (e.g., a claim cannot move to 'Adjudicator Appointed' without passing completeness review). File uploads go directly to S3 from the client using presigned URLs, bypassing the application server to avoid memory pressure from large files. Redis handles session management and caches frequently-accessed reference data (adjudicator panels, fee schedules).

Tradeoffs

We implemented statutory deadline calculations in application code rather than relying on database triggers. This adds a testing burden — every deadline rule needs unit tests against edge cases like public holidays and weekends — but gives us better visibility and easier debugging when deadline disputes arise. We also chose server-side rendering for the claim submission forms rather than a single-page approach, because the multi-step form needed to persist partial progress reliably even if the user closes the browser mid-submission.

Implementation Notes

Result

Average processing time from submission to adjudicator appointment dropped from 18 business days to 6 business days. Incomplete application submissions fell from roughly 40% to under 8%, largely due to front-end validation and the guided submission workflow. ANA staff reported spending approximately 60% less time on administrative follow-ups. The system currently handles claims across multiple ANAs operating under the NSW SOPA framework.

Lessons Learned

The statutory deadline logic was the most complex part of the build — not because the rules are individually complicated, but because they interact in non-obvious ways (e.g., if a deadline falls on a public holiday, it rolls to the next business day, but the counting method differs depending on the section of the Act).

We ended up building a dedicated deadline calculation module with its own test suite of over 120 cases, many derived from real disputed scenarios provided by the client. The other significant learning was around document handling: early in the project, we routed uploads through the API server, which caused timeouts and memory issues with large construction files. Moving to presigned S3 uploads resolved this cleanly.

Have a similar challenge?

Let's talk about your project.

Start a conversation