Commercial Flat Roofing — Free Expert Assessment
This Week Only — Free Expert Roof Assessment · Lynwood, CA & SoCal

Don't Replace Your Commercial Roof
Until You Do This

Morales Roofing has been protecting SoCal properties for 20+ years. Find out if your roof qualifies for restoration — and how much you could save.

Only 3 Free Inspection Slots Remaining This Week

This Week Only — Free

Expert Commercial Roof Assessment

Don't Replace Your Commercial Roof Until You Do This

Answer 7 quick questions and find out if your roof qualifies for restoration — and how much you could save.

8 out of 10

commercial flat roofs can be restored — not replaced

Find out if yours qualifies in under 2 minutes

Free expert assessment — no sales pitch, no obligation
Save $50,000–$150,000 vs. unnecessary full replacement
Results in under 2 minutes
Licensed & Insured
95+ Five-Star Reviews
No Obligation

⚠️ Only 3 free inspection slots remaining this week

⚠️  Only 3 free inspection slots remaining — claim yours now

One Last Step to Claim Your Free Inspection

Enter your details and we'll personally reach out to schedule your no-obligation roof assessment.

Please enter your first name.
Please enter your last name.
Please enter a valid email address.
Please enter a valid 10-digit US phone number.
Please enter a valid street address (must include a number).
Please enter a valid zip code (12345 or 12345-6789).

Your information is 100% secure and will never be shared.

Analyzing Your Roof Profile...

Preparing your booking & sending your details

Free Inspection | No Obligation | Licensed & Insured
Select a Date & Time for Your Free Roof Inspection
12 property managers viewing this page right now
8/10 Flat Roofs Can Be
Restored, Not Replaced
95+ Five-Star Reviews
From Property Owners
$150K Average Savings vs.
Unnecessary Replacement
Owner Personally Leads
Every Inspection

Why SoCal Property Managers Trust Morales Roofing

We Find the Real Problem.
Most Roofers Just Sell You a New Roof.

Most roofing contractors lead with replacement because that's where the money is. We do the opposite — we start with an honest diagnosis and only recommend what your roof actually needs.

We locate the actual source of every leak — not just the symptom
We recommend restoration when possible — because it saves you money
Our owner attends every single inspection — no third-party crews
Detailed written report delivered within 24 hours of every visit
8/10
Roofs Can Be RestoredNot every roof needs to be torn off — we prove it every week.
$150K
Average Client Savingsvs. what another contractor quoted them for full replacement.
95+
Five-Star ReviewsFrom property managers, warehouse owners, and facility directors.

The Truth About Commercial Roofing

Most Roofers vs. Our Approach

✗  Most Roofing Contractors
Can't pinpoint exact leak sources — just estimate
Lead with full replacement because the margin is higher
Send salespeople, not trained inspectors
Lack specialized commercial flat-roof training
Push unnecessary work that adds to their bottom line
✓  Our Approach
Owner personally diagnoses every roof — no shortcuts
Recommends restoration when possible — 8 out of 10 qualify
Honest written scope — no pressure, no upsells
Specialized in commercial flat systems: TPO, EPDM, built-up
Our job is to save you money — not spend it for you

Certified Excellence

Licensed, Certified & Trusted

We hold the certifications that matter most for commercial flat roofing — so you can trust the diagnosis, not just hope for it.

🛡️
Fully Insured
$2M Liability + Workers' Compensation
📋
Licensed
State-Licensed Commercial Roofing Contractor
95+ Reviews
Five-Star Rated by Property Owners
🏗️
Owner-Led
Every Inspection Led by the Owner Personally
★★★★★

Stop Paying for Replacements You Don't Need

Take the 2-minute assessment and find out if your commercial roof can be restored — and how much you could save.

Get My Free Roof Assessment →

⚠️ Only 3 inspection slots remaining this week

Our Work Speaks for Itself

Recent Commercial Roofing Projects

TPO Roofing InstallationMorales Roofing  ·  San Gabriel Valley
TPO Roofing RepairMorales Roofing  ·  LA County
Roofing InstallationMorales Roofing  ·  Orange County
Commercial Flat RoofingMorales Roofing  ·  Lynwood, CA
20+ Years of Quality WorkMorales Roofing  ·  Licensed & Insured

Meet The Morales Team

Morales Roofing

P
Pedro — Owner, Morales Roofing
20+ Years Serving SoCal · Licensed & Insured · Lynwood, CA

"I personally show up to every job. Morales Roofing has been built on honesty and hard work — I've spent 20+ years protecting homes and businesses across the San Gabriel Valley, LA County, and Orange County, and I take every roof seriously, no matter the size."

Pedro is known for being professional, responsive, and offering fair pricing. Whether it's a TPO installation, a repair, or a full replacement — he'll give you a straight answer and get it done right.

Why Pay for a New Roof When Yours Can Be Fixed?

What You Get With Every Free Assessment

🔍

Expert Diagnosis

Our owner personally inspects the roof and identifies every problem area — not just the ones that are easy to see.

💰

Save Thousands

8 out of 10 commercial flat roofs can be restored at a fraction of replacement cost. We'll tell you honestly which category yours falls into.

Problems Found Fast

We use advanced leak-detection methods to locate the exact source — not guess and patch. You get real answers, not band-aids.

📄

Detailed Written Report

Every inspection includes a full written scope of findings delivered within 24 hours — so you have documentation for insurance, management, or your records.

Residential & Commercial Services

Our Services

TPO Roofing Installation

Our TPO roofing installation provides an energy-efficient and durable roofing solution built to last — protecting your property through every season.

TPO Roofing Repair

We specialize in TPO roofing repairs to address damage and restore full functionality — fast, clean, and done right the first time.

Roofing Installation

Whether you're building new or upgrading your existing roof, our installation services deliver quality craftsmanship on every residential and commercial project.

Client Testimonials

What Property Owners Are Saying

★★★★★

Real reviews from property owners across San Gabriel Valley, LA County & Orange County

★★★★★

"Morales Roofing completely replaced the roof of my house and the result was excellent. The team was punctual, worked very cleanly, and left everything perfectly finished. I would definitely recommend them to anyone looking for a reliable roofing service."

LH
Laura Hernandez
Verified Customer · Morales Roofing
★★★★★

"HIGHLY recommend using Morales Roofing. Pedro was easy to work with and gave an incredibly fair price. I couldn't be happier with the results! From the start he was professional, responsive, and offered an excellent price."

KH
Kendee Hamilton
Google Review · 5 Stars
★★★★★

"Pedro is a hardworking, honest and communicative roofer. Highly recommend him! A pleasure to work with."
Services: Roof inspection, Roof repair · Price: Reasonable

CC
Cecilia Chao
Google Review · 5 Stars

Common Questions

Questions Property Managers Ask Us

What does a commercial flat roof inspection actually cover?
Our inspections cover the entire roof membrane, flashing details, drains and scuppers, penetrations, parapet walls, and any visible deck damage. We document everything with photos and deliver a written report within 24 hours.
How do I know if my roof can be restored instead of replaced?
A roof is a good candidate for restoration if the structural deck is sound, moisture intrusion is localized, and the membrane still has some life in it. During the free inspection we assess all three — and give you an honest answer, even if that answer means you need a full replacement.
How much does restoration typically cost versus full replacement?
Restoration typically costs 25–40% of what a full tear-off and replacement would run. On a 30,000 sq ft commercial roof, that can mean saving $80,000–$150,000. We quote both options so you can make an informed decision.
Do you work with insurance claims?
Yes. We provide detailed inspection reports, photographic documentation, and damage assessments that meet insurance carrier requirements. We've helped many commercial clients navigate the claims process successfully.
How soon can you schedule a free inspection?
We typically schedule within 2–5 business days for standard assessments. If you have an active leak or emergency situation, call us directly and we'll prioritize getting someone out within 24 hours.
Is there any cost or obligation for the free assessment?
None whatsoever. The assessment is completely free, and you'll receive our honest findings regardless of whether you choose to work with us. We believe if we give you a fair diagnosis, you'll make the right call.
🛡️

Our Promise to You

Our Honest Assessment Guarantee

We guarantee that every assessment we deliver is 100% honest — even if that means telling you your roof needs a full replacement. We don't upsell, we don't exaggerate damage, and we don't recommend work that isn't necessary. Our reputation depends on your trust, not a single sale.

Get My Honest Assessment →
★★★★★

Ready to Get Honest Answers?

Find Out If Your Roof Can Be Saved — Before You Spend a Dollar

Take the free 2-minute assessment and get a priority recommendation from our commercial roofing specialists. No obligation. No pressure.

Please, Give Me a Free Assessment →

⚠️ Only 3 free inspection slots remaining this week · SoCal & Surrounding Areas

© 2026 Morales Roofing. All rights reserved. Lynwood, CA · Serving Greater SoCal & 60-Mile Radius.
📋
Just Booked
A property manager from Irvine booked a free inspection
2 minutes ago
// ───────────────────────────────────────────────────────────────────────────── // GoHighLevel Intent Quiz — Engine // ───────────────────────────────────────────────────────────────────────────── document.addEventListener('DOMContentLoaded', function () { // ── Question meta ────────────────────────────────────────────────────────── var QUESTIONS = [ { key: 'roof_condition' }, { key: 'urgency' }, { key: 'property_ownership' }, { key: 'other_quotes' }, { key: 'decision_timeline' }, { key: 'work_type' }, { key: 'storm_insurance' }, ]; var TOTAL_QUESTIONS = QUESTIONS.length; // 7 // ── State ────────────────────────────────────────────────────────────────── var answers = new Array(TOTAL_QUESTIONS).fill(null); // { points, label } var currentStep = 0; // ── Branding ─────────────────────────────────────────────────────────────── try { var c = QUIZ_CONFIG; document.documentElement.style.setProperty('--accent', c.primaryColor); document.documentElement.style.setProperty('--accent-dk', darken(c.primaryColor, 15)); if (c.logoUrl) { document.getElementById('logoWrap').innerHTML = '' + c.businessName + ' logo'; } document.getElementById('logoText').textContent = c.businessName; var phoneEl = document.getElementById('nurtureBizPhone'); if (phoneEl) phoneEl.textContent = c.businessPhone; } catch (e) { console.warn('Quiz: config not loaded or incomplete.', e); } // ── Bind option buttons ──────────────────────────────────────────────────── for (var s = 0; s < TOTAL_QUESTIONS; s++) { (function (stepIdx) { var stepEl = document.getElementById('step-' + stepIdx); var nextBtn = document.getElementById('next-' + stepIdx); if (!stepEl) return; // Option selection stepEl.querySelectorAll('.option-btn').forEach(function (btn) { btn.addEventListener('click', function () { stepEl.querySelectorAll('.option-btn').forEach(function (b) { b.classList.remove('selected'); }); btn.classList.add('selected'); answers[stepIdx] = { points: parseInt(btn.getAttribute('data-points'), 10), label: btn.getAttribute('data-label'), }; if (nextBtn) nextBtn.disabled = false; }); }); // Next if (nextBtn) { nextBtn.addEventListener('click', function () { goToStep(stepIdx + 1); }); } // Back var backBtn = stepEl.querySelector('.btn-back'); if (backBtn) { backBtn.addEventListener('click', function () { goToStep(stepIdx - 1); }); } })(s); } // Back button on the form step (step 7) var formStep = document.getElementById('step-7'); var formBackBtn = formStep && formStep.querySelector('.btn-back'); if (formBackBtn) { formBackBtn.addEventListener('click', function () { goToStep(TOTAL_QUESTIONS - 1); }); } // ── Navigation ───────────────────────────────────────────────────────────── function goToStep(idx) { var from = document.getElementById('step-' + currentStep); if (from) from.classList.remove('active'); currentStep = idx; var to = document.getElementById('step-' + currentStep); if (to) to.classList.add('active'); updateProgress(currentStep); window.scrollTo({ top: 0, behavior: 'smooth' }); } function updateProgress(stepIdx) { var pct = Math.min(100, Math.round((stepIdx / (TOTAL_QUESTIONS + 1)) * 100)); var label = stepIdx < TOTAL_QUESTIONS ? 'Question ' + (stepIdx + 1) + ' of ' + TOTAL_QUESTIONS : 'Almost done — enter your details'; var fill = document.getElementById('progressFill'); var lbl = document.getElementById('progressLabel'); if (fill) fill.style.width = pct + '%'; if (lbl) lbl.textContent = label; } // ── Scoring ──────────────────────────────────────────────────────────────── function calcScore() { return answers.reduce(function (sum, a) { return sum + (a ? a.points : 0); }, 0); } function intentLevel(score) { var threshold = (typeof QUIZ_CONFIG !== 'undefined') ? QUIZ_CONFIG.intentThreshold : 55; return score >= threshold ? 'HIGH' : 'LOW'; } // ── Form submit ──────────────────────────────────────────────────────────── var leadForm = document.getElementById('leadForm'); if (leadForm) { leadForm.addEventListener('submit', async function (e) { e.preventDefault(); if (!validateForm()) return; var btn = document.getElementById('submitBtn'); btn.classList.add('loading'); btn.disabled = true; var score = calcScore(); var level = intentLevel(score); var payload = buildPayload(score, level); try { await submitToGHL(payload); } catch (err) { console.warn('GHL webhook failed — showing results anyway.', err); } showResult(score, level); }); } // ── Phone formatter ──────────────────────────────────────────────────────── var phoneInput = document.getElementById('phone'); if (phoneInput) { phoneInput.addEventListener('input', function () { var digits = this.value.replace(/\D/g, '').slice(0, 10); if (digits.length <= 3) this.value = digits; else if (digits.length <= 6) this.value = '(' + digits.slice(0,3) + ') ' + digits.slice(3); else this.value = '(' + digits.slice(0,3) + ') ' + digits.slice(3,6) + '-' + digits.slice(6); }); } // ── Build GHL payload ────────────────────────────────────────────────────── function buildPayload(score, level) { var cfg = (typeof QUIZ_CONFIG !== 'undefined') ? QUIZ_CONFIG : {}; var answerMap = {}; QUESTIONS.forEach(function (q, i) { answerMap[q.key] = answers[i] ? answers[i].label : 'Not answered'; }); return { first_name: val('firstName'), last_name: val('lastName'), email: val('email'), phone: val('phone'), address1: val('address'), customData: Object.assign({ intent_score: score, intent_level: level, ghl_tags: level === 'HIGH' ? (cfg.highIntentTags || []) : (cfg.lowIntentTags || []), pipeline_name: level === 'HIGH' ? (cfg.highIntentPipeline || '') : (cfg.lowIntentPipeline || ''), pipeline_stage: level === 'HIGH' ? (cfg.highIntentStage || '') : (cfg.lowIntentStage || ''), source: 'Roofing Intent Quiz', quiz_submitted_at: new Date().toISOString(), }, answerMap), }; } function val(id) { var el = document.getElementById(id); return el ? el.value.trim() : ''; } async function submitToGHL(payload) { var url = (typeof QUIZ_CONFIG !== 'undefined') ? QUIZ_CONFIG.webhookUrl : ''; if (!url || url.indexOf('YOUR_WEBHOOK') !== -1) { console.warn('GHL webhook URL not configured.'); return; } var res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (!res.ok) throw new Error('GHL responded ' + res.status); } // ── Show result screen ───────────────────────────────────────────────────── function showResult(score, level) { document.querySelectorAll('.step').forEach(function (s) { s.style.display = 'none'; }); document.querySelector('.progress-bar-wrap').style.display = 'none'; document.querySelector('.progress-label').style.display = 'none'; var arcLen = 251.2; var filled = (score / 100) * arcLen; var cfg = (typeof QUIZ_CONFIG !== 'undefined') ? QUIZ_CONFIG : {}; if (level === 'HIGH') { if (cfg.highIntentRedirectUrl) { window.location.href = cfg.highIntentRedirectUrl; return; } document.getElementById('resultHigh').classList.add('active'); document.getElementById('scoreDisplayHigh').textContent = score; animateArc('arcFillHigh', arcLen, filled); renderCalendar(cfg.calendarUrl || ''); } else { if (cfg.lowIntentRedirectUrl) { window.location.href = cfg.lowIntentRedirectUrl; return; } document.getElementById('resultLow').classList.add('active'); document.getElementById('scoreDisplayLow').textContent = score; animateArc('arcFillLow', arcLen, filled); } window.scrollTo({ top: 0, behavior: 'smooth' }); } function animateArc(arcId, total, filled) { var arc = document.getElementById(arcId); if (!arc) return; var current = total; var target = total - filled; var step = (current - target) / 40; var timer = setInterval(function () { current -= step; if (current <= target) { current = target; clearInterval(timer); } arc.setAttribute('stroke-dashoffset', current.toFixed(2)); }, 20); } function renderCalendar(url) { var container = document.getElementById('calendarContainer'); if (!container) return; if (!url || url.indexOf('YOUR_CALENDAR') !== -1) { container.innerHTML = '
' + '

📅 Calendar not configured yet.
' + 'Set calendarUrl in config.js to show your GHL booking widget.

'; return; } container.innerHTML = ''; } // ── Validation ───────────────────────────────────────────────────────────── function validateForm() { var ok = true; function check(id, testFn, errId) { var input = document.getElementById(id); var err = document.getElementById(errId); var pass = input && testFn(input.value.trim()); if (input) input.classList.toggle('error', !pass); if (err) err.classList.toggle('visible', !pass); if (!pass) ok = false; } check('firstName', function (v) { return v.length >= 2; }, 'err-firstName'); check('lastName', function (v) { return v.length >= 2; }, 'err-lastName'); check('email', function (v) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v); }, 'err-email'); check('phone', function (v) { return v.replace(/\D/g,'').length >= 10; }, 'err-phone'); return ok; } // ── Utilities ────────────────────────────────────────────────────────────── function darken(hex, pct) { var n = parseInt(hex.replace('#', ''), 16); var r = Math.max(0, (n >> 16) - pct); var g = Math.max(0, ((n >> 8) & 0xff) - pct); var b = Math.max(0, (n & 0xff) - pct); return '#' + [r, g, b].map(function (v) { return v.toString(16).padStart(2, '0'); }).join(''); } }); // end DOMContentLoaded