91³Ô¹ÏÍø

Watch CBS News

Napa Valley seeing terrific grape harvests, but demand for wine may be plateauing

The Napa Valley wine industry produced nearly $1 billion worth of wine grapes in 2023, but the industry is changing and demand may be plateauing — possibly even dropping.

"You know, if you had the patience, you could almost watch these tendrils grow," laughed Tom Davies, President of V. Sattui Winery. "On a sunny day like today, this might grow over an inch or more."

Davies is keeping an eye on the V. Sattui 2024 vintage, in its earliest formation, and if it's anything like '23, there will be a lot of it.

"We had we had a phenomenal vintage in 2023," he said.

But what's happening in the wine industry is a story several years in the making, and that includes some years that were not so productive.

"You know, we had the fires in '17, fires in '20," Davies recounts. " So, we were short those years. Plus the drought years. We made much less than we normally would."

And when the rain finally returned while demand for grapes was still on the rise, the times in wine country were as good as ever.

"We went from 2020, which was really one of the toughest years for us, to two years later to the best year we've ever had," Davies said. "So we had a real build-up, so everyone was clamoring for grapes."

But not everyone in the industry is faring as well.

"It's tough," Lodi Winemaker Garret Schaefer said earlier this year. "It's a really, really, really, really tough decision to pull out grape vines."

Winemakers in Lodi, pulling vines from the ground, reflect an industry that has hit a pocket of uncertainty. After decades of steady growth, wine consumption has plateaued, or even started to decline by some measures. 

So, supply is up while demand is heading the other direction. And while industry giants in Napa may be slightly insulated from this, Davies said, yes, the industry is changing.

"We were blessed with people my age, drinking wine," Davies said of the possible generational divide.v"They were really loyal. The Boomers discovered wine."

He said younger drinkers may not be shifting towards wine like their parents. Something he thinks can and will happen.

"I think that it is incumbent upon our industry, to learn how we talk to this new generation," Davis said. "We have gone through so many cycles. When the 60 Minutes story broke, when was that, 30 years ago … Red wine sales soared 30, 40% overnight. Sideways came out, and Pinot Noir took off, and Merlot went down. So everyone pulled Merlot out, and everyone planted Pinot Noir. Now we have too much Pinot Noir."

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(); } }); }); }); });