AI-generated WA permit process + pre-populated council letter template. Ready to print.
🏗
Registered Surveyor
Get a CDC quote
A licensed WA building surveyor issues your Certificate of Design Compliance — cutting approval time to 10 days.
⚖️
WA Property Solicitor
Complex situation?
DAP required, boundary issues, retrospective approval, or neighbour disputes — speak with a WA property solicitor.
🏗 Licensed Perth Surveyor
Get a free CDC quote
No obligation
A registered building surveyor issues your Certificate of Design Compliance — reducing council processing from 25 days to 10 business days. Leave your details and a surveyor calls within 1 business day.
📧 Confirmation sent to your email. One registered WA surveyor contact only. No spam.
✅
Request sent
A licensed Perth building surveyor will call you within 1 business day. Reference: —
WA Property Legal Advice
Referral to a licensed WA solicitor · Confidential
⚖️
WA Property Law Panel
Registered solicitors · Western Australian jurisdictions · Building & planning law · Initial consultation available
Common reasons people seek legal advice
🏗Retrospective permit for existing unlawful structure
🏘Neighbour objections or boundary / setback disputes
📋Development Application (DA) refusal or appeal
💰Builder dispute or defective building work
📜Heritage listed property or local heritage area
By submitting you agree to be contacted by a licensed WA solicitor. This is not legal advice — it is a referral request. Your details are shared with one solicitor only.
⚖️
Referral submitted
A licensed WA property solicitor will contact you within 1 business day to arrange an initial consultation.
WA Permit Application Assistant FREE
Powered by Claude AI
🤖
Claude is generating your application guide…
Step-by-step WA permit process + pre-populated council letter
WA Building Act 2011
Cost breakdown
🏗 Licensed Perth Surveyor
Get a free quote from a registered building surveyor
Free & No obligation
Your project requires a building permit. A registered building surveyor can issue your Certificate of Design Compliance (CDC) — cutting council processing time from 25 days to 10 business days.
Leave your details and a local surveyor will call you within 1 business day. No obligation.
Your details are sent securely to one registered WA Building Surveying Contractor only.
Not shared with third parties. No spam — just one call from a surveyor.
✅
Request sent successfully
A licensed Perth building surveyor will call you within 1 business day.
Your Lead ID: —
WA Permit GuideDetailed permit rules for your project
Important: Permit thresholds sourced from City of Bayswater, City of Gosnells, City of Perth, and City of South Perth under the Building Act 2011 (WA). Always verify with your specific local council before commencing work. Cost estimates use Master Builders WA and HIA 2025 benchmarks with Perth's 1.18× multiplier. Planning guidance only — not a formal permit determination or QS quote.
In Perth, an alfresco or patio is exempt from a building permit only if ALL THREE conditions are met simultaneously:
Floor area ≤ 10 m²
Wall / roof height ≤ 2.4 m at any point
Freestanding — not attached to the house
If your alfresco is attached to the house, or exceeds either threshold, a Building Permit is required under Schedule 4 of the Building Regulations 2012 (WA).
How to apply
Use the Certified (BA1) pathway — engage a private building surveyor to issue a Certificate of Design Compliance (CDC), then lodge with your council. Processing: 10 Business Days. Fee: 0.32% of construction cost (min $110).
What you'll need
Site plan showing property boundaries and setbacks
Floor plan and elevations (scale 1:100)
Structural specifications
BA1 form from building.wa.gov.au
`
},
pergola: {
title: 'Pergola — WA Permit Guide',
sub: 'Building Act 2011 (WA) · Class 10a',
body: `
Exemption thresholds
A freestanding pergola is exempt from a Building Permit if area ≤ 20 m² AND it is not attached to the dwelling. An open-structure pergola (no solid roof) is treated differently from a covered patio — confirm with your building surveyor.
Key WA rules
If attached to the house: Building Permit required regardless of size
Setback from boundary: minimum 1.0 m (R-Codes, most Perth councils)
Max height: must comply with R-Codes for your zoning
BAL (Bushfire Attack Level) may restrict materials in fire-prone areas
`
},
deck: {
title: 'Deck — WA Permit Guide',
sub: 'Building Act 2011 (WA) · Class 10b',
body: `
⚠ Important: No size exemption for decks in WA
Unlike other states, Western Australia does not have a size-based exemption for decks. A timber deck is classified as a Class 10b structure under the NCC. A Building Permit is required for any deck regardless of size.
Why?
Decks are structural — they must comply with AS 1684 (timber framing), have engineered footings, and meet fire separation requirements under NCC 2022. The permit ensures structural safety and correct setbacks.
Application
BA1 (certified) pathway recommended — 10 Business Day approval
Engineer's report required for decks over 1.0 m high or spans over 3.6 m
Structural drawings required showing framing, posts, and footing details
A shed is exempt only if ALL THREE conditions are met: area ≤ 10 m², height ≤ 2.4 m, and freestanding. If any condition fails, a Building Permit is required.
Common issues
Most standard kit sheds (Colorbond, Spanbuild) exceed 10 m² — permit required
Adding electricity or plumbing to any shed requires licensed tradies regardless of permit status
Corner block setbacks may restrict shed placement — check R-Codes
Council may require boundary setbacks of 1.0 m minimum
This is one of the most misunderstood rules in WA. Unlike many other states, Western Australia requires a Building Permit for any retaining wall exceeding 500 mm in height. The 1-metre threshold applies in some other states but not in WA.
Engineering requirements
Walls over 500 mm: Building Permit required
Walls over 1.0 m: Structural engineer's design typically required
Walls near boundaries: Check R-Codes and local council requirements
Walls supporting a driveway or structure: Engineer mandatory
`
},
pool: {
title: 'Swimming Pool — WA Permit Guide',
sub: 'Building Act 2011 (WA) · Class 10b',
body: `
Two permits always required
Swimming pools in WA always require both a Development Approval (DA) from your local council and a Building Permit. The DA must be obtained first.
Pool barrier — mandatory
A pool safety barrier is legally required under the Building Regulations 2012 (WA)
Barrier must comply with AS 1926.1 and be certified by a building surveyor before first fill
Pool cannot be filled until an Occupancy Permit or Certificate of Building Compliance is issued
Penalty for non-compliant pool barrier: up to $5,000
Timeframes
DA: 25–60 business days. Building Permit (certified pathway): 10 business days. Allow 3–4 months for the full approval process before construction.
Room extensions always require a Development Approval (DA) from your local council AND a Building Permit. The DA must be obtained before the building permit can be lodged.
Key requirements
Structural engineer's drawings mandatory
Energy efficiency assessment (NatHERS or equivalent) for new habitable space
Home Building Contracts Act 1991 (WA) applies if builder cost exceeds $7,500
Home indemnity insurance required for contracts over $20,000
Owner-builder permit required if you intend to build yourself
Engage a draftsperson
Extensions require detailed architectural drawings. Engage a registered draftsperson or architect before engaging a building surveyor. Allow 8–16 weeks for the full approval process.
A shade sail is exempt from a Building Permit if the sail area is ≤ 20 m². If posts are set in concrete footings (permanent structure), it is treated as a building and a permit may be required — confirm with your council.
Engineering
Large shade sails (over 15 m²) should have an engineer-designed post footing to handle wind loads in Perth (W50N wind region)
Shade sails near pool areas must not compromise the pool safety barrier
Some councils require a structural engineer's certificate even for exempt shade sails
`
},
bathroom: {
title: 'Bathroom Renovation — WA Permit Guide',
sub: 'Building Act 2011 (WA) · No building permit required',
body: `
No building permit required — but licensed trades are mandatory
A bathroom renovation does not require a Building Permit in WA, provided no structural walls are moved and no building envelope changes occur. However, all trade work must be performed by licensed contractors:
Plumbing: Licensed plumber required — all WA plumbing work
Electrical: Licensed electrician required — all WA electrical work
Waterproofing: Licensed waterproofer required — must comply with AS 3740:2021
A Waterproofing Certificate must be issued before tiling. The certificate is required for insurance and future property sale.
`
},
kitchen: {
title: 'Kitchen Renovation — WA Permit Guide',
sub: 'Building Act 2011 (WA) · No building permit required',
body: `
No building permit — but trades must be licensed
A kitchen renovation does not require a Building Permit unless structural walls are removed or the building envelope is altered. All electrical and plumbing work must be performed by licensed contractors with a Compliance Certificate.
Moving gas appliances: Gas plumber required — compliance certificate issued
Moving power points: Licensed electrician required
Splashback tiles over gas cooktop: confirm compliance with AS/NZS 5601
Moving a wall: If load-bearing, a structural engineer and Building Permit are required
`
},
};
function showInlineGuide() {
const pt = state.project;
if (!pt) return;
const guide = PERMIT_GUIDES[pt];
if (!guide) return;
const wrap = document.getElementById('inline-guides-wrap');
const btn = document.getElementById('inline-guide-btn');
const body = document.getElementById('inline-guide-body');
const title = document.getElementById('inline-guide-title');
const sub = document.getElementById('inline-guide-sub');
if (guide) {
title.textContent = guide.title;
sub.textContent = guide.sub;
body.innerHTML = guide.body;
wrap.style.display = '';
}
}
function toggleInlineGuide() {
const body = document.getElementById('inline-guide-body');
const btn = document.getElementById('inline-guide-btn');
const isOpen = body.style.display !== 'none';
body.style.display = isOpen ? 'none' : 'block';
btn.textContent = isOpen ? 'Read the guide ▼' : 'Hide guide ▲';
trackEvent('inline_guide_toggled', { project_type: state.project, open: !isOpen });
}
// ── RESET ──
function resetCalc() {
document.querySelectorAll('.proj-btn').forEach(b => { b.classList.remove('active'); b.setAttribute('aria-pressed','false'); });
state.project = null;
document.getElementById('result-panel').classList.remove('visible');
document.getElementById('live-preview').classList.remove('visible');
document.getElementById('ai-permit-card').classList.remove('visible');
document.getElementById('lead-card').classList.remove('visible');
document.getElementById('results-row').style.display = 'none';
document.getElementById('path-strip').style.display = 'none';
document.getElementById('action-cards').style.display = 'none';
document.getElementById('rules-toggle').style.display = 'none';
document.getElementById('cost-toggle').style.display = 'none';
document.getElementById('rules-body').classList.remove('open');
document.getElementById('cost-body').classList.remove('open');
document.getElementById('rules-toggle').classList.remove('open');
document.getElementById('cost-toggle').classList.remove('open');
document.getElementById('inline-guides-wrap').style.display = 'none';
document.getElementById('inline-guide-body').style.display = 'none';
document.body.classList.remove('has-project','has-result');
setProgress(1);
window.scrollTo({ top: 0, behavior: 'smooth' });
}
// ============================================================
// AI PERMIT APPLICATION ASSISTANT
// ============================================================
// Backend proxy endpoint — API key lives securely on Netlify, never in the browser
const AI_PROXY_URL = '/api/claude';
const AI_PERMIT_TYPES = {
alfresco: { types:['Building Permit'], devApproval:false, nccClass:'Class 10a' },
pergola: { types:['Building Permit'], devApproval:false, nccClass:'Class 10a' },
deck: { types:['Building Permit'], devApproval:false, nccClass:'Class 10b' },
shed: { types:['Building Permit'], devApproval:false, nccClass:'Class 10a' },
bathroom: { types:[], devApproval:false, nccClass:'N/A' },
kitchen: { types:[], devApproval:false, nccClass:'N/A' },
extension: { types:['Development Approval','Building Permit'],devApproval:true, nccClass:'Class 1a' },
retaining: { types:['Building Permit'], devApproval:false, nccClass:'Class 10b' },
pool: { types:['Development Approval','Building Permit'],devApproval:true, nccClass:'Class 10b' },
shadesail: { types:['Building Permit'], devApproval:false, nccClass:'Class 10a' },
};
// Store AI result for copy/download
let aiResult = { guide: '', template: '' };
let currentTab = 'guide';
function showAiCard(verdict) {
const card = document.getElementById('ai-permit-card');
if (!state.project) return;
const ai = AI_PERMIT_TYPES[state.project];
if (!ai || ai.types.length === 0 || verdict === 'no') {
card.classList.remove('visible');
return;
}
// Build permit type tags
const typesEl = document.getElementById('ai-permit-types');
typesEl.innerHTML = ai.types.map(t =>
`${t}`
).join('') + (ai.devApproval ? '⚠ DA required first' : '');
card.classList.add('visible');
}
function buildAiPrompt() {
const p = PROJECTS[state.project];
const ai = AI_PERMIT_TYPES[state.project];
const attachedLabel = state.attached === 'yes' ? 'attached to the house' : 'freestanding';
const devNote = ai.devApproval
? 'IMPORTANT: This project requires BOTH a Development Approval (DA) from the local council AND a separate Building Permit. Address both sequential processes clearly.'
: '';
return `You are a Western Australia building permit expert helping a Perth homeowner navigate the official application process under the Building Act 2011 (WA). Be specific, accurate, and practical. Use Australian English.
PROJECT DETAILS:
- Project type: ${p.name}
- NCC Building Classification: ${ai.nccClass}
- Size: ${state.size} m²
- Height: ${state.height.toFixed(1)} m
- Finish level: ${state.finish}-range
- Configuration: ${attachedLabel}
- Permit types required: ${ai.types.join(' + ')}
${devNote}
Return your response in EXACTLY this two-part format:
## PART 1: STEP-BY-STEP APPLICATION GUIDE
Provide 6–8 numbered steps for the complete WA building permit application process for this specific project type. Be specific to Perth metro councils. For each step include the action, who to contact or which website, approximate cost, and timeframe. Cover:
1. Pre-application preparation (site plan, drawings required)
2. Choosing certified vs uncertified pathway (with specific cost/time difference)
3. Engaging a registered building surveyor or draftsperson if needed
4. ${ai.devApproval ? 'Development Approval application to local council (BEFORE building permit)' : 'Building permit application lodgement process'}
5. Document checklist (site plan to scale, floor plan, elevations, specifications, engineering if required)
6. Fee payment and council processing timeframe
7. Site inspection requirements
8. Permit conditions and start-work rules under Building Act 2011 (WA)
End with 3 common mistakes to avoid for this specific project type.
## PART 2: PRE-POPULATED COUNCIL APPLICATION LETTER
Write a complete, formal letter to "The Building Surveyor" pre-filled with all the project details above. Format as a real letter ready to print. Include:
[OWNER NAME]
[PROPERTY ADDRESS, SUBURB WA POSTCODE]
[PHONE] | [EMAIL]
[DATE]
The Building Surveyor
[COUNCIL NAME] Council
[COUNCIL ADDRESS]
Re: Building Permit Application — ${p.name}, ${state.size}m²
Opening paragraph stating the purpose.
Description of proposed works using correct WA building terminology and NCC classification.
Statement of compliance with Building Act 2011 (WA) and relevant regulations.
Estimated value of works (based on ${state.finish}-range Perth pricing for ${state.size}m²).
List of enclosed documents (4–6 items appropriate for this project type).
Request for permit issuance and offer to provide additional information.
Formal sign-off.
[OWNER SIGNATURE]
[OWNER NAME PRINTED]`;
}
async function openAiAssistant() {
// Open modal
const modal = document.getElementById('ai-modal');
modal.classList.add('open');
document.body.style.overflow = 'hidden';
// Reset UI
document.getElementById('ai-loading').style.display = 'block';
document.getElementById('ai-guide-content').style.display = 'none';
document.getElementById('ai-template-content').style.display = 'none';
document.getElementById('ai-tabs').style.display = 'none';
document.getElementById('ai-footer').style.display = 'none';
document.getElementById('ai-modal-sub').textContent = `${PROJECTS[state.project].name} · ${state.size}m² · Claude AI`;
const btn = document.getElementById('ai-btn');
btn.disabled = true;
btn.innerHTML = ' Generating…';
trackEvent('ai_assistant_opened', { project_type: state.project });
try {
// Call backend proxy — API key is stored securely as a Netlify env variable
const prompt = buildAiPrompt();
const res = await fetch(AI_PROXY_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
max_tokens: 3000,
system: 'You are a WA building permit expert. Return exactly the two-part format requested. Be specific, accurate, practical and WA-specific. Australian English.',
messages: [{ role: 'user', content: prompt }]
})
});
if (!res.ok) {
const e = await res.json();
throw new Error(e.error?.message || `API error ${res.status}`);
}
const data = await res.json();
const text = data.content?.[0]?.text || '';
// Split into parts
const i1 = text.indexOf('## PART 1:');
const i2 = text.indexOf('## PART 2:');
aiResult.guide = i1 >= 0 ? text.slice(i1, i2 >= 0 ? i2 : undefined).trim() : text;
aiResult.template = i2 >= 0 ? text.slice(i2).trim() : '';
// Render guide
renderGuide(aiResult.guide);
// Render template
renderTemplate(aiResult.template);
// Show tabs and content
document.getElementById('ai-loading').style.display = 'none';
document.getElementById('ai-tabs').style.display = 'flex';
document.getElementById('ai-footer').style.display = 'flex';
switchTab('guide');
trackEvent('ai_assistant_completed', { project_type: state.project });
} catch(e) {
document.getElementById('ai-loading').innerHTML = `
⚠️
Could not connect to Claude API
${e.message}
Make sure ANTHROPIC_API_KEY is set in your Netlify environment variables (Site settings → Environment variables).
`;
} finally {
btn.disabled = false;
btn.innerHTML = '🤖 Get application guide + letter template';
}
}
function renderGuide(text) {
const el = document.getElementById('ai-guide-content');
// Parse numbered steps
const lines = text.split('\n');
let html = '';
let inStep = false;
let stepTitle = '', stepDetail = '';
lines.forEach(line => {
const stepMatch = line.match(/^(\d+)\.\s+(.+)/);
if (stepMatch) {
if (inStep) html += renderStep(stepTitle, stepDetail);
inStep = true;
stepTitle = stepMatch[2];
stepDetail = '';
} else if (inStep && line.trim() && !line.startsWith('## ') && !line.startsWith('### ')) {
stepDetail += (stepDetail ? ' ' : '') + line.trim();
} else if (line.startsWith('## ') || line.startsWith('### ')) {
if (inStep) { html += renderStep(stepTitle, stepDetail); inStep = false; stepTitle = ''; stepDetail = ''; }
if (!line.startsWith('## PART')) {
html += `
${line.replace(/^#+ /,'')}
`;
}
} else if (!inStep && line.trim() && !line.startsWith('## ')) {
// Regular text
const bold = line.replace(/\*\*([^*]+)\*\*/g,'$1');
html += `