{"id":39455,"date":"2025-01-16T09:00:00","date_gmt":"2025-01-16T08:00:00","guid":{"rendered":"https:\/\/www.everyday-guide.com\/site\/the-real-deal-on-toms-worth-the-price-or-just-good-marketing\/"},"modified":"2025-01-16T09:00:00","modified_gmt":"2025-01-16T08:00:00","slug":"the-real-deal-on-toms-worth-the-price-or-just-good-marketing","status":"publish","type":"post","link":"https:\/\/www.everyday-guide.com\/site\/the-real-deal-on-toms-worth-the-price-or-just-good-marketing\/","title":{"rendered":"The Real Deal on TOMS: Worth the Price or Just Good Marketing?"},"content":{"rendered":"\n<ul class=\"wp-block-list\">\n<li><strong>TOMS built its brand on social impact, but the shoes themselves are a mixed bag.<\/strong> The Alpargatas are iconic but wear out fast. Newer styles are better made but cost more.<\/li>\n<li><strong>Pricing sits in the $55-$100 range for most styles.<\/strong> That's not cheap for canvas slip-ons, and you're partly paying for the brand story.<\/li>\n<li><strong>The giving model changed in 2019.<\/strong> TOMS no longer does One-for-One. They now donate a third of profits to grassroots organizations. It's more sustainable, but less catchy.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"801\" src=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img2.jpg\" alt=\"Pink sneakers with orange laces on feet.\" class=\"wp-image-39451\" srcset=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img2.jpg 1200w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img2-300x200.jpg 300w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img2-1024x684.jpg 1024w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img2-768x513.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n\n<h2 class=\"wp-block-heading\">Who Is TOMS, Really?<\/h2>\n\n\n\n<p>TOMS started in 2006 with a simple pitch: buy a pair of shoes, and they'll give a pair to a kid in need. It was one of the first &#8220;buy one, give one&#8221; companies, and it took off. Celebrities wore them. College students loved them. The brand became a symbol of conscious consumerism.<\/p><div id=\"relatedsearches1\" class=\"every-content-2\" style=\"height: 450px;\"><script>console.log(\"RSOC loading..\");<\/script>\r\n<!-- Initialize Google CSA object - Required for ad functionality -->\r\n<script type=\"text\/javascript\" charset=\"utf-8\">\r\n\t(function(g,o){g[o]=g[o]||function(){(g[o]['q']=g[o]['q']||[]).push(\r\n\t\targuments)},g[o]['t']=1*new Date})(window,'_googCsa');\r\n<\/script><\/div><style>\r\n  #relatedsearches1,\r\n  #relatedsearches2 {\r\n    \/* Base container styles - final appearance *\/\r\n    margin-bottom: 20px;\r\n    padding: 15px;\r\n    background-color: #111827; \/* Final background color (gray-900) *\/\r\n    border-radius: 8px;\r\n    min-height: 250px; \/* Restore a reasonable min-height *\/\r\n    box-sizing: border-box;\r\n    overflow: hidden;\r\n    position: relative; \/* Needed to contain the absolute overlay *\/\r\n  }\r\n\r\n  \/* REMOVED .skeleton-active styles *\/\r\n\r\n  .skeleton-overlay {\r\n    position: absolute;\r\n    inset: 0; \/* Cover parent *\/\r\n    z-index: 10; \/* Ensure it's on top *\/\r\n    pointer-events: none; \/* Prevent interaction *\/\r\n    border-radius: 8px; \/* Match parent *\/\r\n\r\n    \/* --- Skeleton visuals applied directly to the overlay --- *\/\r\n    --skeleton-bar-height: 35px;\r\n    --skeleton-gap-height: 15px;\r\n    --skeleton-unit-height: calc(var(--skeleton-bar-height) + var(--skeleton-gap-height));\r\n    --skeleton-padding: 15px;\r\n    --skeleton-bar-color: #374151; \/* gray-700 *\/\r\n    --skeleton-bg-color: #1f2937;  \/* gray-800 *\/\r\n    --skeleton-shimmer-color: rgba(52, 211, 153, 0.1); \/* emerald-400 10% *\/\r\n\r\n    background-color: var(--skeleton-bg-color);\r\n    background-image:\r\n      linear-gradient(to right, transparent, var(--skeleton-shimmer-color), transparent),\r\n      linear-gradient(var(--skeleton-bar-color) var(--skeleton-bar-height), transparent 0);\r\n    background-size:\r\n      200% var(--skeleton-bar-height),\r\n      calc(100% - (2 * var(--skeleton-padding))) var(--skeleton-unit-height);\r\n    background-repeat: repeat-y;\r\n    background-position:\r\n      calc(-200% + var(--skeleton-padding)) var(--skeleton-padding),\r\n      var(--skeleton-padding) var(--skeleton-padding);\r\n    animation: shimmer 1.5s infinite linear;\r\n    \/* --- End Skeleton Visuals --- *\/\r\n\r\n    \/* --- Visibility Control --- *\/\r\n    opacity: 0;\r\n    transition: opacity 0.3s ease-out;\r\n  }\r\n\r\n  .skeleton-overlay.skeleton-visible {\r\n    opacity: 1;\r\n  }\r\n\r\n  @keyframes shimmer {\r\n    to {\r\n       background-position:\r\n        calc(200% + var(--skeleton-padding)) var(--skeleton-padding),\r\n        var(--skeleton-padding) var(--skeleton-padding);\r\n    }\r\n  }\r\n\r\n  \/* No longer need rules for .skeleton-loading class or :empty *\/\r\n\r\n<\/style>\n\n\n\n<p>Then reality hit. By 2019, TOMS was drowning in debt and nearly went bankrupt. The company restructured, got new ownership, and quietly killed the One-for-One model. Now they donate one-third of their profits to community organizations focused on mental health, gun violence prevention, and increasing access to opportunity.<\/p>\n\n\n\n<p>It's a smarter model, honestly. Dumping free shoes into developing economies was causing problems for local shoemakers. But the new approach doesn't fit on a bumper sticker, and that's hurt their marketing.<\/p>\n\n\n\n<p>So the question becomes: if you strip away the feel-good story, are these actually good shoes?<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Classic Alpargata: Still Their Bread and Butter<\/h2>\n\n\n\n<p>The TOMS Alpargata is the shoe most people picture when they hear the brand name. It's a canvas slip-on with a rubber sole, elastic V on the top, and that signature stitching along the edge. They retail for $55-$65 depending on the material.<\/p>\n\n\n\n<p>Here's the honest take: they're comfortable out of the box. The canvas molds to your foot within a day or two. The OrthoLite insole provides decent cushioning for a flat shoe. And they're genuinely easy to throw on for errands, casual Fridays, or weekend trips.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Where the Alpargata Falls Short<\/h3>\n\n\n\n<p>Durability is the Alpargata's biggest weakness. The canvas starts looking rough after about three months of regular wear. The sole separates from the upper if they get soaked repeatedly. And the insole compresses faster than you'd expect for a $60 shoe.<\/p>\n\n\n\n<p>If you wear them 4-5 times a week, expect to replace them every 6-8 months. That's a cost-per-wear problem. A $60 shoe that lasts seven months costs you about $0.40 per wear. A $100 shoe that lasts two years costs $0.14. Math matters.<\/p>\n\n\n\n<p>The other issue is arch support. There isn't much. If you're on your feet all day, you'll feel it by mid-afternoon. TOMS added the CloudBound insole to some newer models, which helps, but the classic Alpargata still runs pretty flat.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"801\" src=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img3.jpg\" alt=\"Close-up of a person wearing black puma sneakers on dirt.\" class=\"wp-image-39453\" srcset=\"https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img3.jpg 1200w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img3-300x200.jpg 300w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img3-1024x684.jpg 1024w, https:\/\/www.everyday-guide.com\/site\/wp-content\/uploads\/2026\/02\/toms_shoes_article-1-guide_img3-768x513.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n\n<h2 class=\"wp-block-heading\">Beyond the Alpargata: What Else TOMS Makes<\/h2>\n\n\n\n<p>TOMS has expanded well beyond that one slip-on. Here's what's worth your attention (and what isn't).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TOMS Mallow Sneakers ($70-$85)<\/h3>\n\n\n\n<p>These are TOMS' answer to the casual sneaker trend. Made with recycled materials and a cushy midsole, they're surprisingly comfortable. The knit upper breathes well, and they look more &#8220;normal&#8221; than the Alpargata. If you want a TOMS shoe that doesn't scream &#8220;I shop at Whole Foods,&#8221; this is it.<\/p>\n\n\n\n<p>The downside: they run about a half size large. Order down.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TOMS Resident Sneakers ($75-$90)<\/h3>\n\n\n\n<p>A <a href=\"https:\/\/www.everyday-guide.com\/site\/lwqo\" title=\"Ariat\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">leather<\/a> or suede sneaker option that looks a step above the canvas styles. Build quality is noticeably better here. The rubber outsole grips well and holds up to daily wear. These are the shoes that make you think, &#8220;Oh, TOMS actually makes real shoes now.&#8221;<\/p>\n\n\n\n<p>At $90, though, you're competing with brands that have been making sneakers for decades. It's a tougher sell when New Balance and Adidas live in the same price range.<\/p><div id=\"every-155052785\" class=\"every-content-4\"><div class='content_4' style='min-width: 300px; min-height: 250px;'>\r\n  <\/div><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">TOMS Boots ($90-$130)<\/h3>\n\n\n\n<p>TOMS makes ankle boots and desert boots in suede and <a href=\"https:\/\/www.everyday-guide.com\/site\/lwqo\" title=\"Ariat\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">leather<\/a>. They look good. The problem is they don't hold up to actual winter weather. The suede stains easily, and the soles aren't built for ice or heavy rain. Treat them as three-season boots and you'll be fine. Expect them to handle Minnesota winters and you'll be disappointed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">TOMS Sandals ($45-$65)<\/h3>\n\n\n\n<p>Basic slide and strap sandals. Nothing special here. The cushioning is decent, but you can find similar quality at Target for half the price. Skip these unless you really love the brand.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Sizing and Fit: What You Need to Know<\/h2>\n\n\n\n<p>TOMS sizing is inconsistent across styles, and that's frustrating. Here's what to expect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Alpargatas:<\/strong> True to size for most people. If you're between sizes, go up. The canvas stretches, so a snug fit on day one becomes perfect by day three.<\/li>\n<li><strong>Mallow Sneakers:<\/strong> Run half a size large. Size down.<\/li>\n<li><strong>Resident Sneakers:<\/strong> True to size.<\/li>\n<li><strong>Boots:<\/strong> Run slightly narrow. Wide-footed shoppers should try them on in person or order a half size up.<\/li>\n<\/ul>\n\n\n\n<p>Width options are limited. TOMS doesn't offer wide or narrow sizing on most styles. If you have wide feet, the Alpargata's stretchy canvas works in your favor. The <a href=\"https:\/\/www.everyday-guide.com\/site\/lwqo\" title=\"Ariat\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">leather<\/a> and suede styles are less forgiving.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Materials and Sustainability<\/h2>\n\n\n\n<p>TOMS has made a real push toward sustainable materials. About two-thirds of their shoes now use recycled, organic, or plant-based materials. That includes recycled polyester, organic cotton canvas, and plant-dyed fabrics.<\/p>\n\n\n\n<p>They also use EarthWise <a href=\"https:\/\/www.everyday-guide.com\/site\/vz1p\" title=\"clearbags\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">packaging<\/a> (recycled and recyclable boxes) and have committed to becoming a B Corp, which means they meet verified standards for social and environmental performance.<\/p>\n\n\n\n<p>Is it perfect? No. Most shoes are still manufactured in China, Vietnam, and Ethiopia. The supply chain isn't fully transparent, and &#8220;sustainable materials&#8221; doesn't mean the shoe is biodegradable or even recyclable at end of life. But compared to fast <a href=\"https:\/\/www.everyday-guide.com\/site\/r8vp\" title=\"BCBG\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">fashion<\/a> brands pumping out $15 sneakers with zero accountability, TOMS is making genuine effort.<\/p>\n\n\n\n<p>The question is whether that effort is worth the premium. A pair of Alpargatas costs $55-$65. A similar canvas slip-on from a no-name brand costs $20. You're paying roughly $35-$45 extra for the TOMS name, slightly better materials, and the social impact contribution. Whether that trade-off works for you is personal.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Social Impact Model: What Your Money Actually Funds<\/h2>\n\n\n\n<p>Let's talk about the giving. TOMS donates one-third of profits (not revenue, profits) to grassroots organizations. In 2023, they reported giving over $2 million to more than 100 organizations. Focus areas include mental health access, gun violence prevention, and creating economic opportunity in underserved communities.<\/p>\n\n\n\n<p>This is genuinely better than the old model. One-for-One shoe donations were criticized by economists for undermining local shoe markets in developing countries. Giving cash to effective organizations lets communities decide what they actually need.<\/p>\n\n\n\n<p>But here's the catch: one-third of profits is vague. If TOMS has a bad year financially (which has happened), the donations shrink. You're not guaranteed your $65 shoe purchase is sending a specific dollar amount anywhere. It's a promise tied to the company's bottom line.<\/p>\n\n\n\n<p>If social impact is your primary reason for buying, you might get more bang for your buck by purchasing cheaper shoes and donating the difference directly to a charity you trust. Just something to think about.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Shipping, Returns, and Customer Service<\/h2>\n\n\n\n<p>TOMS offers free standard shipping on orders over $65. Below that, shipping runs about $5.95. Standard delivery takes 5-7 business days. There's no expedited shipping option on the main site, which is annoying if you need shoes fast.<\/p>\n\n\n\n<p>Returns are free within 30 days, as long as the shoes are unworn and in original <a href=\"https:\/\/www.everyday-guide.com\/site\/vz1p\" title=\"clearbags\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">packaging<\/a>. That's pretty standard. They process refunds within 5-10 business days after receiving the return, which is on the slower side.<\/p>\n\n\n\n<p>Customer service gets mixed reviews online. Email response times can be slow (48-72 hours). There's no phone support listed on their site, which pushes you toward email or social media. If you have a sizing issue or defective pair, expect the process to take a week or more to resolve.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Honest Downsides<\/h2>\n\n\n\n<p>Every brand has weaknesses. TOMS has several you should know about before buying:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Durability is mediocre.<\/strong> The classic canvas styles wear out faster than the price suggests they should. You're replacing these shoes twice a year if they're your daily pair.<\/li>\n<li><strong>Arch support is minimal.<\/strong> Fine for short errands. Not great for long days on your feet. You may need aftermarket insoles.<\/li>\n<li><strong>The price-to-quality ratio is off.<\/strong> You're paying a premium for the brand story. The actual construction doesn't justify $60+ for canvas slip-ons.<\/li>\n<li><strong>Limited sizing options.<\/strong> No wide widths on most styles. Inconsistent sizing between shoe types.<\/li>\n<li><strong>Slow customer service.<\/strong> No phone support. Email responses take days.<\/li>\n<li><strong>Style repetition.<\/strong> The Alpargata has barely changed in 18 years. The brand can feel stale if you're looking for fresh designs.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Who Should Buy TOMS (And Who Shouldn't)<\/h2>\n\n\n\n<p>TOMS makes sense for a specific type of buyer. You care about where your money goes. You want a casual slip-on that looks put-together without being dressy. You don't need your shoes to last forever, and you're okay with paying a brand premium for social impact.<\/p>\n\n\n\n<p>Skip TOMS if you prioritize durability, need serious arch support, or want the best possible shoe for your dollar. You can find better-built casual shoes for less money from brands like Hey Dude, <a href=\"https:\/\/www.everyday-guide.com\/site\/yrcf\" title=\"Skechers\" class=\"pretty-link-keyword\"rel=\"nofollow sponsored \" target=\"_blank\">Skechers<\/a>, or even Vans.<\/p>\n\n\n\n<p>Also skip if you have wide feet. The limited sizing will frustrate you.<\/p><div id=\"relatedsearches2\" class=\"every-content-5\"><script>console.log(\"RSOC bottom loading..\");<\/script>\r\n<\/div><script type=\"text\/javascript\" charset=\"utf-8\">\r\n    console.log('[DEBUG] Ad script block started');\r\n\r\n    \/\/ Debug function to log important events and states\r\n    function debugLog(type, message, data = null) {\r\n        const timestamp = new Date().toISOString();\r\n        console.log(`[${timestamp}] [${type}]`, message);\r\n        if (data) {\r\n            console.log('Debug data:', data);\r\n        }\r\n    }\r\n\r\n    \/\/ Validate required parameters before initialization\r\n    function validateConfig(config) {\r\n        const required = ['pubId', 'styleId', 'relatedSearchTargeting', 'resultsPageBaseUrl'];\r\n        const missing = required.filter(param => !config[param]);\r\n        \r\n        if (missing.length > 0) {\r\n            throw new Error(`Missing required parameters: ${missing.join(', ')}`);\r\n        }\r\n        \r\n        if (config.relatedSearchTargeting !== 'content' && config.relatedSearchTargeting !== 'query') {\r\n            throw new Error('relatedSearchTargeting must be either \"content\" or \"query\"');\r\n        }\r\n        \r\n        return true;\r\n    }\r\n\r\n    \/\/ Enhanced URL parameter parsing function with title fallback for referrerAdCreative\r\n    function getUrlParameter(name, defaultValue = '') {\r\n        try {\r\n            const urlParams = new URLSearchParams(window.location.search);\r\n            const value = urlParams.get(name);\r\n            \r\n            \/\/ Special handling for referrerAdCreative\r\n            if (name === 'referrerAdCreative' && !value) {\r\n                let siteTitle = document.title || defaultValue;\r\n                \r\n                \/\/ Clean up the site title if needed\r\n                if (siteTitle !== defaultValue) {\r\n                    siteTitle = siteTitle.replace(' \u2013 Everyday Guide \u2013 Your Source of Information for Daily Topics!', '').trim();\r\n                    debugLog('WARNING', 'Using modified page title as fallback for referrerAdCreative', {\r\n                        originalTitle: document.title,\r\n                        cleanedTitle: siteTitle,\r\n                        source: 'document.title'\r\n                    });\r\n                    return siteTitle;\r\n                }\r\n            }\r\n            \r\n            return value ? decodeURIComponent(value) : defaultValue;\r\n        } catch (error) {\r\n            debugLog('ERROR', `Failed to parse URL parameter: ${name}`, error);\r\n            return defaultValue;\r\n        }\r\n    }\r\n\r\n    \/\/ Add tracking domain and CID handling with validation\r\n    function getTrackingParams() {\r\n        const trackingDomain = getUrlParameter('td', '');\r\n        const cid = getUrlParameter('cid', '');\r\n        \r\n        \/\/ Only validate if tracking domain is provided\r\n        if (trackingDomain && !trackingDomain.match(\/^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\/)) {\r\n            debugLog('WARNING', 'Invalid tracking domain format', {\r\n                provided: trackingDomain\r\n            });\r\n            return {\r\n                trackingDomain: '',\r\n                cid: cid\r\n            };\r\n        }\r\n        \r\n        return {\r\n            trackingDomain: trackingDomain,\r\n            cid: cid\r\n        };\r\n    }\r\n\r\n    const { trackingDomain, cid } = getTrackingParams();\r\n\r\n    \/\/ Get parameters from URL with defaults\r\n    const urlStyleId = getUrlParameter('styleid', '9024836547');\r\n    const urlTerms = getUrlParameter('terms', '');\r\n    const urlChannel = getUrlParameter('channel', '2273637055'); \/\/ edg 1871989443\r\n    const urlAdTitle = getUrlParameter('adtitle', '');\r\n    const urlCpid = getUrlParameter('cpid', '');\r\n    const urlOid = getUrlParameter('oid', '');\r\n\r\n    \/\/ Set tracking IDs immediately at script start, before any async operations\r\n    \/\/ Only call set_tracking_ids if it exists (tracker.js has initialized)\r\n    try {\r\n        \/\/ Debug tracker state\r\n        const trackerState = window._trackerInternalState || {};\r\n        const hasTrackerFunction = typeof window.set_tracking_ids === 'function';\r\n        const sessionData = sessionStorage.getItem('ctrkr_click_data');\r\n        let parsedSessionData = null;\r\n        try { parsedSessionData = sessionData ? JSON.parse(sessionData) : null; } catch(e) {}\r\n        \r\n        debugLog('TRACKING_DEBUG', 'Tracker state before setting IDs', {\r\n            trackerInitialized: trackerState.ready === true,\r\n            hasSetTrackingFunction: hasTrackerFunction,\r\n            hasSessionStorage: !!sessionStorage,\r\n            hasSessionData: !!sessionData,\r\n            clickId: parsedSessionData?.clickId,\r\n            existingParams: parsedSessionData?.adParams\r\n        });\r\n        \r\n        if (hasTrackerFunction) {\r\n            window.set_tracking_ids({\r\n                ad_client_id: \"partner-pub-9681717277196944\", \/\/ Your AdSense publisher ID\r\n                style_id: urlStyleId,\r\n                channel_id: urlChannel\r\n            });\r\n            \r\n            \/\/ Check if the params were actually set\r\n            setTimeout(() => {\r\n                try {\r\n                    const afterSessionData = sessionStorage.getItem('ctrkr_click_data');\r\n                    let afterParsedData = null;\r\n                    try { afterParsedData = afterSessionData ? JSON.parse(afterSessionData) : null; } catch(e) {}\r\n                    \r\n                    debugLog('TRACKING_DEBUG', 'Tracker state after setting IDs', {\r\n                        hasSessionData: !!afterSessionData,\r\n                        clickId: afterParsedData?.clickId,\r\n                        updatedParams: afterParsedData?.adParams\r\n                    });\r\n                } catch (e) {\r\n                    debugLog('TRACKING_DEBUG', 'Error checking session after update', e);\r\n                }\r\n            }, 50);\r\n            \r\n            debugLog('TRACKING', 'Successfully called set_tracking_ids');\r\n        } else {\r\n            debugLog('TRACKING', 'Tracker set_tracking_ids function not available');\r\n        }\r\n    } catch (e) {\r\n        debugLog('TRACKING_ERROR', 'Error in tracking setup', e);\r\n    }\r\n\r\n    \/\/ Define base URL constant\r\n    const BASE_RESULTS_URL = \"https:\/\/www.everyday-guide.com\/site\/search-results\/\";\r\n\r\n    \/\/ Page level configuration for related searches\r\n    var pageOptions = {\r\n        \/\/ Required Parameters\r\n        \"pubId\": \"partner-pub-9681717277196944\",    \/\/ Your AdSense publisher ID\r\n        \"styleId\": urlStyleId,                       \/\/ From URL or default\r\n        \"relatedSearchTargeting\": \"content\",         \/\/ Must use 'content' for content pages\r\n        \"resultsPageBaseUrl\": BASE_RESULTS_URL,      \/\/ Placeholder, will be finalized later\r\n        \"resultsPageQueryParam\": \"q\",\r\n        \/\/\"ivt\": false,\r\n        \/\/ Safety and Filtering\r\n        \"adsafe\": \"low\",\r\n        \/\/\"adtest\": \"off\",\r\n        \"terms\": \"\",\r\n        \"referrerAdCreative\": \"\",\r\n\r\n        \/\/ Tracking and Analytics\r\n        \"channel\": urlChannel,                       \/\/ From URL or default\r\n        \r\n        \/\/ Additional Settings\r\n        'ignoredPageParams': Array.from(new URLSearchParams(location.search).keys()).join(', '),\r\n\r\n        \/\/ Callback function for ad loading\r\n        \"adLoadedCallback\": function(containerName, adsLoaded, isExperimentVariant, callbackOptions) {\r\n            try {\r\n                \/\/ Find the container element\r\n                const container = document.getElementById(containerName);\r\n                if (!container) {\r\n                    debugLog('ERROR', `Container not found: ${containerName}`);\r\n                    return;\r\n                }\r\n\r\n                \/\/ Find the overlay within this container\r\n                const overlay = container.querySelector('.skeleton-overlay');\r\n\r\n                \/\/ Fade out and remove the overlay\r\n                if (overlay && overlay.classList.contains('skeleton-visible')) {\r\n                    overlay.classList.remove('skeleton-visible'); \/\/ Start fade out\r\n                    debugLog('SKELETON', `Fading out overlay in ${containerName}`);\r\n\r\n                    \/\/ Remove from DOM after transition\r\n                    setTimeout(() => {\r\n                        if (overlay) { \/\/ Check if it still exists\r\n                             overlay.remove();\r\n                             debugLog('SKELETON', `Removed overlay from DOM in ${containerName}`);\r\n                        }\r\n                    }, 300); \/\/ Match CSS transition duration\r\n                }\r\n\r\n                if (adsLoaded && callbackOptions && callbackOptions.termPositions) {\r\n                    const terms = Object.keys(callbackOptions.termPositions);\r\n                    console.log('Related Search Terms Shown:', terms);\r\n                    console.log('Term Positions:', callbackOptions.termPositions);\r\n                }\r\n                \r\n                debugLog('CALLBACK', `Container: ${containerName}`, {\r\n                    adsLoaded,\r\n                    isExperimentVariant,\r\n                    callbackOptions\r\n                });\r\n\r\n                if (adsLoaded) {\r\n                    debugLog('SUCCESS', 'Related searches loaded successfully');\r\n                    \/\/ Remove legacy tracking call\r\n                    \/\/ window.trackEvent('adview');\r\n                    \/\/ Debug tracking state before sending event\r\n                    try {\r\n                        const eventSessionData = sessionStorage.getItem('ctrkr_click_data');\r\n                        let eventParsedData = null;\r\n                        try { eventParsedData = eventSessionData ? JSON.parse(eventSessionData) : null; } catch(e) {}\r\n                        \r\n                        debugLog('TRACKING_EVENT', 'State before ad_view event', {\r\n                            hasSessionData: !!eventSessionData,\r\n                            clickId: eventParsedData?.clickId,\r\n                            params: eventParsedData?.adParams\r\n                        });\r\n                    } catch (e) {\r\n                        debugLog('TRACKING_ERROR', 'Error checking session before event', e);\r\n                    }\r\n                    \r\n                    \/\/ Send tracking event using new API with parameters as fallback\r\n                    window.track_event('ad_view', {});\r\n                    \/\/ Track Facebook Pixel ViewContent event\r\n                    fbq('track', 'ViewContent');\r\n                    \r\n                    \/\/ Log terms and their positions if available\r\n                    if (callbackOptions && callbackOptions.termPositions) {\r\n                        console.log('Related Search Terms:', Object.keys(callbackOptions.termPositions));\r\n                        console.log('Term Positions:', callbackOptions.termPositions);\r\n                    }\r\n                    \r\n                    \/\/ Log container dimensions for debugging layout issues\r\n                    const rect = container.getBoundingClientRect();\r\n                    debugLog('LAYOUT', 'Container dimensions', {\r\n                        width: rect.width,\r\n                        height: rect.height,\r\n                        visible: rect.height > 0\r\n                    });\r\n                } else {\r\n                    debugLog('WARNING', 'No related searches available');\r\n                    container.style.display = 'none';\r\n                    \/\/ Remove legacy tracking call\r\n                    \/\/ window.trackEvent('noresult');\r\n                    \/\/ Debug tracking state before sending event\r\n                    try {\r\n                        const eventSessionData = sessionStorage.getItem('ctrkr_click_data');\r\n                        let eventParsedData = null;\r\n                        try { eventParsedData = eventSessionData ? JSON.parse(eventSessionData) : null; } catch(e) {}\r\n                        \r\n                        debugLog('TRACKING_EVENT', 'State before no_result event', {\r\n                            hasSessionData: !!eventSessionData,\r\n                            clickId: eventParsedData?.clickId,\r\n                            params: eventParsedData?.adParams\r\n                        });\r\n                    } catch (e) {\r\n                        debugLog('TRACKING_ERROR', 'Error checking session before event', e);\r\n                    }\r\n                    \r\n                    \/\/ Send tracking event using new API with parameters as fallback\r\n                    window.track_event('rsoc_not_monetized', {});\r\n                    \r\n                    \/\/ Log possible reasons for no results\r\n                    debugLog('DEBUG', 'Checking possible issues', {\r\n                        url: window.location.href,\r\n                        containerExists: !!container,\r\n                        containerVisible: container.offsetParent !== null,\r\n                        pageContent: document.body.textContent.length\r\n                    });\r\n                }\r\n            } catch (error) {\r\n                debugLog('ERROR', 'Error in callback', {\r\n                    message: error.message,\r\n                    stack: error.stack\r\n                });\r\n            }\r\n        }\r\n    };\r\n\r\n    \/\/ Configuration for the related searches containers\r\n    const rsblock1 = {\r\n        \/\/ Required Parameters\r\n        \"container\": \"relatedsearches1\",\r\n        \"width\": 700,\r\n        \r\n        \/\/ Optional Parameters\r\n        \"relatedSearches\": 6,\r\n        \r\n        \/\/ Reference to the callback in pageOptions\r\n        \"adLoadedCallback\": pageOptions.adLoadedCallback\r\n    };\r\n\r\n    const rsblock2 = {\r\n        \/\/ Required Parameters\r\n        \"container\": \"relatedsearches2\",\r\n        \"width\": 700,\r\n        \r\n        \/\/ Optional Parameters\r\n        \"relatedSearches\": 6,\r\n        \r\n        \/\/ Reference to the callback in pageOptions\r\n        \"adLoadedCallback\": pageOptions.adLoadedCallback\r\n    };\r\n\r\n    \/\/ --- Ad Initialization Logic ---\r\n\r\n    let adsInitialized = false;\r\n    const AD_INIT_TIMEOUT = 2500; \/\/ Timeout in milliseconds (e.g., 2.5 seconds)\r\n    let initTimeoutId = null;\r\n\r\n    \/\/ Function to inject skeleton overlay SYNCHRONOUSLY\r\n    function injectSkeletonOverlay(containerId) {\r\n        const container = document.getElementById(containerId);\r\n        if (container) {\r\n            if (!container.querySelector('.skeleton-overlay')) {\r\n                const overlay = document.createElement('div');\r\n                overlay.className = 'skeleton-overlay skeleton-visible';\r\n                container.appendChild(overlay);\r\n                debugLog('SKELETON', `Injected overlay into ${containerId}`);\r\n            } else {\r\n                debugLog('SKELETON', `Overlay already exists in ${containerId}`);\r\n            }\r\n        } else {\r\n            debugLog('WARNING', `Container ${containerId} not found for overlay injection.`);\r\n        }\r\n    }\r\n\r\n    \/\/ Function to hide skeletons if initialization fails\r\n    function hideSkeletonsOnError() {\r\n        ['relatedsearches1', 'relatedsearches2'].forEach(containerId => {\r\n            const container = document.getElementById(containerId);\r\n            const overlay = container?.querySelector('.skeleton-overlay.skeleton-visible');\r\n            if (overlay) {\r\n                overlay.classList.remove('skeleton-visible');\r\n                \/\/ Optionally remove after fade, but maybe just hide on error\r\n                debugLog('SKELETON', `Hiding overlay in ${containerId} due to init error.`);\r\n            }\r\n            \/\/ Also hide the main container if ads fail to load\r\n            if(container) container.style.display = 'none';\r\n        });\r\n    }\r\n\r\n    \/\/ Main function to initialize Google CSA ads\r\n    function initializeGoogleAds() {\r\n        if (adsInitialized) return; \/\/ Prevent double initialization\r\n        adsInitialized = true;\r\n        clearTimeout(initTimeoutId); \/\/ Clear the timeout if event fired\r\n        debugLog('ADS_INIT', 'Proceeding with _googCsa initialization.');\r\n\r\n        injectSkeletonOverlay('relatedsearches1');\r\n        injectSkeletonOverlay('relatedsearches2');\r\n\r\n        \/\/ Re-evaluate tracking params based on the final state from event-tracker.js\r\n        const trackerState = window._trackerInternalState || {};\r\n        const finalCid = trackerState.clickId || getUrlParameter('cid', ''); \/\/ Use state's CID or fallback to original URL param\r\n        \/\/ Note: Tracking domain (td) is primarily used by event-tracker, but include if needed for URL construction\r\n        const finalTd = (trackerState.trackingMethod === 'redirect' ? trackerState.domain : null) || getUrlParameter('td', ''); \/\/ Get TD if redirect, else fallback\r\n        \r\n        \/\/ Tracking IDs already set at the beginning of script\r\n\r\n        \/\/ Re-construct the results URL using the potentially updated CID\/TD\r\n        pageOptions.resultsPageBaseUrl = BASE_RESULTS_URL;\r\n        debugLog('ADS_INIT', 'Final resultsPageBaseUrl:', { url: pageOptions.resultsPageBaseUrl });\r\n\r\n        \/\/ Add referrerAdCreative only if urlAdTitle has a value (moved here to be part of final options)\r\n        if (urlAdTitle) {\r\n            pageOptions.referrerAdCreative = urlAdTitle;\r\n            debugLog('INFO', 'referrerAdCreative parameter included in configuration', { referrerAdCreative: urlAdTitle });\r\n        } else {\r\n            delete pageOptions.referrerAdCreative;\r\n            debugLog('INFO', 'No referrerAdCreative parameter provided, removed from configuration');\r\n        }\r\n\r\n        \/\/ Add terms if provided (moved here)\r\n        if (urlTerms) {\r\n            pageOptions.terms = urlTerms;\r\n        }\r\n\r\n        \/\/ Update ignoredPageParams (moved here)\r\n        pageOptions.ignoredPageParams = Array.from(new URLSearchParams(location.search).keys()).join(', ');\r\n\r\n        \/\/ Debug log all parameters before initialization\r\n        debugLog('PARAMS', 'Page Options Configuration:', {\r\n            \/\/ Required Parameters\r\n            pubId: pageOptions.pubId,\r\n            styleId: pageOptions.styleId,\r\n            relatedSearchTargeting: pageOptions.relatedSearchTargeting,\r\n            resultsPageBaseUrl: pageOptions.resultsPageBaseUrl,\r\n            resultsPageQueryParam: pageOptions.resultsPageQueryParam,\r\n            referrerAdCreative: pageOptions.referrerAdCreative,\r\n            \r\n            \/\/ Optional Parameters\r\n            terms: pageOptions.terms || '(not set)',\r\n            maxTermLength: pageOptions.maxTermLength,\r\n            linkTarget: pageOptions.linkTarget,\r\n            \r\n            \/\/ Safety and Filtering\r\n            adsafe: pageOptions.adsafe,\r\n            adtest: pageOptions.adtest,\r\n            ivt: pageOptions.ivt,\r\n            \r\n            \/\/ Language and Encoding\r\n            hl: pageOptions.hl,\r\n            \r\n            \/\/ Tracking and Analytics\r\n            channel: pageOptions.channel,\r\n            \r\n            \/\/ Container Configurations\r\n            containerSettings: {\r\n                block1: {\r\n                    container: rsblock1.container,\r\n                    width: rsblock1.width,\r\n                    relatedSearches: rsblock1.relatedSearches\r\n                },\r\n                block2: {\r\n                    container: rsblock2.container,\r\n                    width: rsblock2.width,\r\n                    relatedSearches: rsblock2.relatedSearches\r\n                }\r\n            }\r\n        });\r\n\r\n        \/\/ --- Call Google CSA ---\r\n        try {\r\n            verifyScriptLoading(); \/\/ Verify dependent scripts\r\n            validateConfig(pageOptions); \/\/ Validate final config\r\n\r\n            \/\/ Log the final pageOptions before initialization\r\n            console.log('[DEBUG] Final pageOptions just before _googCsa:', JSON.stringify(pageOptions, null, 2));\r\n\r\n            _googCsa('relatedsearch', pageOptions, rsblock1, rsblock2);\r\n            debugLog('ADS_INIT', '_googCsa called successfully.');\r\n\r\n        } catch (error) {\r\n            console.error('[ERROR] Google CSA Initialization Failed!', error);\r\n            debugLog('ERROR', 'Google CSA Initialization failed', {\r\n                message: error.message,\r\n                stack: error.stack\r\n            });\r\n            \/\/ Hide skeletons and containers on error\r\n            hideSkeletonsOnError();\r\n        }\r\n    }\r\n\r\n    \/\/ --- Event Listener and Timeout --- \r\n\r\n    \/\/ Check if tracker is already ready *before* setting up listener\/timeout\r\n    if (window._trackerInternalState?.ready) {\r\n        debugLog('ADS_INIT', 'Tracker was already ready. Initializing ads immediately.');\r\n        initializeGoogleAds();\r\n    } else {\r\n        debugLog('ADS_INIT', 'Tracker not ready yet. Setting up listener and timeout.');\r\n\r\n        \/\/ Listener for the tracker signal\r\n        const trackerListener = (event) => {\r\n            debugLog('ADS_INIT', 'Received trackerInitialized event', event.detail);\r\n            window.removeEventListener('trackerInitialized', trackerListener); \/\/ Clean up listener\r\n            initializeGoogleAds();\r\n        };\r\n        window.addEventListener('trackerInitialized', trackerListener);\r\n\r\n        \/\/ Timeout fallback: Initialize ads if the tracker event doesn't arrive promptly\r\n        initTimeoutId = setTimeout(() => {\r\n            debugLog('ADS_INIT', `Timeout waiting for trackerInitialized event after ${AD_INIT_TIMEOUT}ms. Proceeding.`);\r\n            window.removeEventListener('trackerInitialized', trackerListener); \/\/ Clean up listener if timeout fires first\r\n            initializeGoogleAds();\r\n        }, AD_INIT_TIMEOUT);\r\n    }\r\n\r\n    \/\/ Add script loading verification\r\n    function verifyScriptLoading() {\r\n        debugLog('SCRIPT', 'Entering verifyScriptLoading');\r\n        debugLog('SCRIPT', 'Checking script loading status', {\r\n            adsScriptLoaded: !!document.querySelector('script[src*=\"ads.js\"]'),\r\n            googCsaAvailable: typeof _googCsa === 'function'\r\n        });\r\n        debugLog('SCRIPT', 'Exiting verifyScriptLoading');\r\n    }\r\n\r\n    \/\/ --- Modify constructUrlWithTracking to accept parameters --- \r\n    \/\/ (Keep the original getTrackingParams for initial values if needed elsewhere, or remove if redundant)\r\n    function constructUrlWithTracking(baseUrl, cid, td, styleid, channel) {\r\n        try {\r\n            const url = new URL(baseUrl);\r\n            \/\/ Add parameters if they exist\r\n            if (td) url.searchParams.set('td', td);\r\n            if (cid) url.searchParams.set('cid', cid);\r\n            if (styleid) url.searchParams.set('styleid', styleid);\r\n            if (channel) url.searchParams.set('channel', channel);\r\n            return url.toString();\r\n        } catch (error) {\r\n            debugLog('ERROR', 'Failed to construct results page URL with tracking parameters', {\r\n                baseUrl,\r\n                error: error.message\r\n            });\r\n            return baseUrl;\r\n        }\r\n    }\r\n\r\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">The Bottom Line<\/h2>\n\n\n\n<p>TOMS is a brand that's better at storytelling than shoemaking. That's not entirely a knock. The social impact work is real and meaningful, especially since they moved away from the flawed One-for-One model. And the Alpargata is genuinely comfortable for casual wear, even if it won't last as long as you'd like.<\/p>\n\n\n\n<p>But you should go in with clear eyes. You're paying $55-$65 for a shoe that costs maybe $15 to make, and the premium goes toward brand overhead, marketing, and yes, charitable giving. If that trade-off feels right to you, the Mallow sneakers and Resident styles offer the best value in the current lineup. The classic Alpargata is fine for occasional wear but not worth it as an everyday shoe.<\/p>\n\n\n\n<p><strong>Buy TOMS because you genuinely like the shoes and appreciate the mission. Don't buy them just because the marketing makes you feel good. There's a difference, and your wallet knows it.<\/strong><\/p>\n      <div class=\"prli-link-to-disclosures\">\n        <a href=\"https:\/\/www.everyday-guide.com\/site\/disclaimer\/\">(*)This post contains affiliate links. If you use these links to buy something we may earn a commission. Thanks.<\/a>\n      <\/div>\n      ","protected":false},"excerpt":{"rendered":"<p>TOMS built its brand on social impact, but the shoes themselves are a mixed bag. The Alpargatas are iconic but wear out fast. Newer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":39449,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[105,28],"tags":[],"class_list":["post-39455","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-buying-guide","category-fashion"],"_links":{"self":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/posts\/39455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/comments?post=39455"}],"version-history":[{"count":0,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/posts\/39455\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/media\/39449"}],"wp:attachment":[{"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/media?parent=39455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/categories?post=39455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.everyday-guide.com\/site\/wp-json\/wp\/v2\/tags?post=39455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}