12,847 Perth homeowners have used this tool  ·  Data updated March 2026  ·  WA Building Act 2011
WA Building Act 2011 — Free · Instant · No login

Do you need a permit
for your renovation?
Find out in 60 seconds.

Perth homeowners lose thousands every year starting work without the right permit — or paying for one they didn't need. Check yours now, free.

Permit verdict Exempt or required — with the exact WA rule that applies
Cost estimate Perth-adjusted range with full line-item breakdown
Application guide AI-generated council letter and step-by-step process
Starting without a permit = up to $50,000 fine
Decks in WA have NO size exemption
WA retaining wall limit is 500 mm — not 1 m
✓ WA Building Act 2011 ✓ HIA 2025 benchmarks ✓ Master Builders WA ✓ Perth councils sourced ✓ Free · No login
Choose project
Set details
View results
What are you building?
$0 – $0 Perth mid-range estimate · adjust size below
Size & quality
20 m²
SmallLarge
2.4 m
1.0 m6.0 m
Finish level
Attached to house?
Home built before 1990?
Building permit verdict
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 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:
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.
''; const w = window.open('', '_blank', 'width=900,height=700'); w.document.write(printContent); w.document.close(); w.onload = () => { w.focus(); w.print(); }; trackEvent('print_summary_opened', { project_type: state.project }); } // ════════════════════════════════════════════════════════════════ // INLINE PERMIT GUIDE — replaces broken /blog/ link // ════════════════════════════════════════════════════════════════ const PERMIT_GUIDES = { alfresco: { title: 'Alfresco & Patio — WA Permit Guide', sub: 'Building Act 2011 (WA) · Class 10a', body: `

When is a permit required?

In Perth, an alfresco or patio is exempt from a building permit only if ALL THREE conditions are met simultaneously:

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

` }, 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

` }, 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

` }, shed: { title: 'Shed & Workshop — WA Permit Guide', sub: 'Building Act 2011 (WA) · Class 10a', body: `

Exemption thresholds

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

` }, retaining: { title: 'Retaining Wall — WA Permit Guide', sub: 'Building Act 2011 (WA) · Class 10b', body: `

⚠ WA threshold is 500 mm — not 1 metre

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

` }, 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

Timeframes

DA: 25–60 business days. Building Permit (certified pathway): 10 business days. Allow 3–4 months for the full approval process before construction.

` }, extension: { title: 'Room Extension — WA Permit Guide', sub: 'Building Act 2011 (WA) · Class 1a', body: `

Two approvals required

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

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.

` }, shadesail: { title: 'Shade Sail — WA Permit Guide', sub: 'Building Act 2011 (WA) · Class 10a', body: `

Exemption threshold

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

` }, 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:

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.

` }, }; 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 += `

${bold}

`; } }); if (inStep) html += renderStep(stepTitle, stepDetail); el.innerHTML = html; } function renderStep(title, detail) { const num = title.match(/^(\d+)\.\s+/) ? title.match(/^(\d+)\.\s+/)[1] : ''; const cleanTitle = title.replace(/^\d+\.\s+/,'').replace(/\*\*/g,''); const bold = detail.replace(/\*\*([^*]+)\*\*/g,'$1'); // Extract cost/time hints const costMatch = detail.match(/\$[\d,]+[\w\s–-]*(?:per|each|flat|approx)?/i); const timeMatch = detail.match(/\d+[\s\-–]+\d*\s*(?:business\s*)?(?:days?|weeks?|hours?)/i); const meta = (costMatch ? `~${costMatch[0].replace(/approx\.?\s*/i,'')}` : '') + (timeMatch ? `${timeMatch[0]}` : ''); return `
${num}
${cleanTitle}
${bold}
${meta ? `
${meta}
` : ''}
`; } function renderTemplate(text) { const el = document.getElementById('ai-template-content'); // Highlight placeholders like [OWNER NAME] const highlighted = text .replace(/## PART 2:[^\n]*/,'') .replace(/\[([^\]]+)\]/g,'[$1]'); el.innerHTML = `
Replace all [PLACEHOLDERS] with your details before submitting. This letter is pre-populated with your project specifics and WA building terminology.
${highlighted}
`; } function switchTab(tab) { currentTab = tab; document.getElementById('ai-guide-content').style.display = tab === 'guide' ? 'block' : 'none'; document.getElementById('ai-template-content').style.display = tab === 'template' ? 'block' : 'none'; document.getElementById('tab-guide').className = 'ai-tab' + (tab === 'guide' ? ' active' : ''); document.getElementById('tab-template').className = 'ai-tab' + (tab === 'template' ? ' active' : ''); document.getElementById('tab-guide').setAttribute('aria-selected', tab === 'guide'); document.getElementById('tab-template').setAttribute('aria-selected', tab === 'template'); } function closeAiModal() { document.getElementById('ai-modal').classList.remove('open'); document.body.style.overflow = ''; } // Close on overlay click document.getElementById('ai-modal').addEventListener('click', function(e) { if (e.target === this) closeAiModal(); }); // Close on Escape document.addEventListener('keydown', e => { if (e.key === 'Escape') closeAiModal(); }); function copyGuide() { navigator.clipboard.writeText(aiResult.guide).then(() => alert('Guide copied to clipboard!')); trackEvent('ai_guide_copied', { project_type: state.project }); } function copyTemplate() { navigator.clipboard.writeText(aiResult.template).then(() => alert('Letter template copied to clipboard!')); trackEvent('ai_template_copied', { project_type: state.project }); } function downloadTemplate() { const p = PROJECTS[state.project]; const blob = new Blob([aiResult.template], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `permit-application-letter-${state.project}-${state.size}m2.txt`; a.click(); URL.revokeObjectURL(url); trackEvent('ai_template_downloaded', { project_type: state.project }); }