91³Ô¹ÏÍø

Watch CBS News

Planning to return that holiday gift? You might be charged a fee.

Shopping for the holidays could turn into a pricey proposition if you plan to return some of those presents as more major retailers are charging fees to ship them back.

By the time 2024 wraps up, U.S. consumers will have returned nearly $900 billion in goods,  by the National Retail Federation and Happy Returns, a return management company.

The explosion of online shopping during and after the pandemic has led to increased returns, according to David Morin, vice president of customer strategy with the logistics company .

"There are higher return rates on e-commerce purchases because of the lack of ability for someone to try something on before they get it, to feel it, to touch it," Morin told CBS News Philadelphia.

Tips for returning unwanted holiday gifts, avoiding fees 01:52

As returns rise, retailers face increasing costs to process them. Narvar estimates a $100 item costs a retailer roughly $32 to get back and re-sell. Transportation is one of the biggest expenses.

Now more retailers are charging fees to customers who opt to ship their returns.

"We are seeing about 20 to 25% more retailers charge for returns this year than last year," Morin said. "It is a way for retailers to recoup some of the cost of doing returns."

A whopping 81% of retailers rolled out stricter return policies in 2023, , including shipping fees, restocking fees and shorter return windows.

Abercrombie, J. Crew and Saks are some of the big names that have added fees specifically for shipping back returns. 

Queen Stewart, a South Jersey mother of two, said she does most of her shopping online these days. She said she understands why retailers are tightening up their policies.

"I get where they're coming from, there's a cost for the product, to ship the product, to restock the product," Stewart said. "If this is happening over and over and over again, it's cutting into the bottom line."

But there is one simple way to mostly avoid these new fees: return the item to a physical store location. In the case of Amazon, the online giant accepts returns for free if you drop them off at Whole Foods or Kohl's. In some cases, the retailer also accepts returns at UPS locations.

Another tip: Ask for a receipt or gift receipt. Without that, some retailers will only offer a store credit, said Stephanie Carls, a retail insights expert at RetailMeNot. Carls also recommends keeping a product's original packaging to make returns easier and ensure you get a full refund.

Finally, check the store's return policy. Some retailers like Apple only accept returns until Jan. 8.

On the flip side, some retailers are trying to get a handle on ballooning return costs by simply allowing customers to keep the unwanted item while still issuing a full refund.

Amazon, Walmart and Target have quietly and sporadically employed a return-less refund policy on some low-priced items deemed not worth the cost or hassle of getting back, like a $20 T-shirt that could cost $30 in shipping and handling to recover, the Associated Press reports.

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