91³Ô¹ÏÍø

Watch CBS News

Want to go solar, but worried by NYC's recent landmark lawsuit? Here's what to know.

Last month, New York City announced a landmark lawsuit against a solar installer that CBS News New York's investigative team first looked into back in 2024.

Now, investigative reporter Mahsa Saeidi is building on that reporting with a roadmap on how you can go solar, while protecting your pocketbook.

Cautionary tale

Lorna Wynter thought solar power would free her from skyrocketing electric bills. Instead, she's still paying several hundred dollars a month, and she says she ended up with a loan she never agreed to.

"My best friend has such a program where she didn't pay a cent and she doesn't have a loan for her panels, and her electric bill is about $20," Wynter said.

Wynter and her friend live in the same city and use the same technology, but ended up with completely different outcomes.

The difference is who they hired.

New York City Department of Consumer and Worker Protection (DCWP) Commissioner Samuel Levine said he thinks solar panels can be a great deal, but he advises consumers to slow down.

Advice for going solar

"There are a lot of ways these companies try to trick consumers. Often, for example, they'll quote the monthly cost instead of the full cost," Levine said.

The city's consumer watchdog says know the full price of the system:

  • Be skeptical of free solar claims
  • Understand what tax credits you actually qualify for:  federal, state and city
  • Shop financing on your own
  • Don't assume the company's lender is your cheapest option

"Often, what's involved there is the solar contractors getting kickbacks," Levine said.

If you sign and something feels off, New York law gives you three business days to cancel with no penalty.

"If you feel you might have been scammed or you're just not sure, exercise that right," Levine said.

Send that cancellation notice in writing. Certified mail is the safest option.

A few more tips: make sure your installer is licensed with the DCWP; get at least three written quotes and read every page, and if someone shows up at your door with an iPad and says the offer expires soon, it's not a deadline, it's a warning.

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=50747257b890e014813016b79ece0fb2'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });