and runs during HTML parse, but hubspotutk is set by js.hs-analytics.net, measured loading at ~834ms. On a first visit the cookie does not exist yet, so a single read returns nothing and the visitor gets no external ID at all — and a first visit is exactly what an ad click is. So poll briefly until HubSpot sets it. The SDK loads lazily (~4.5s) and replays a queue, so an init queued a second or two in still lands before any events are transmitted. */ (function attachExternalId() { var attempts = 0; var MAX_ATTEMPTS = 40; /* 40 x 200ms = 8s, then give up quietly */ var timer = null; function tryAttach() { var raw = getExternalId(); if (!raw) { if (++attempts >= MAX_ATTEMPTS && timer) clearInterval(timer); return; } if (timer) clearInterval(timer); sha256Hex(raw).then(function (hash) { oaiq("init", { user: { external_id_sha256: hash } }); }).catch(function () {}); } tryAttach(); /* returning visitor: immediate */ if (!getExternalId()) timer = setInterval(tryAttach, 200); })(); /* --------------------------------------------------------------------------- 2. Load the SDK off the critical path Whichever comes first: the main thread going idle after load, or the first sign of real user intent. No preconnect on purpose — a TLS handshake during LCP for a script we deliberately deferred is a net loss. Measured on clickpost.ai: load event 3614ms, SDK fetched 4508ms. ------------------------------------------------------------------------ */ var loaded = false; var INTENT = ["pointerdown", "keydown", "scroll"]; function loadSdk() { if (loaded) return; loaded = true; INTENT.forEach(function (t) { removeEventListener(t, loadSdk, { passive: true }); }); var s = document.createElement("script"); s.src = SDK; s.async = true; s.fetchPriority = "low"; document.head.appendChild(s); } INTENT.forEach(function (t) { addEventListener(t, loadSdk, { passive: true, once: true }); }); addEventListener("load", function () { window.requestIdleCallback ? requestIdleCallback(loadSdk, { timeout: 2500 }) : setTimeout(loadSdk, 1500); }, { once: true }); /* --------------------------------------------------------------------------- 3. Conversion id sha256(lowercase(email) + "|" + formId + "|" + ISO-hour), first 20 hex, "lead_" prefix. - email lowercased/trimmed so casing does not fork the id - formId keeps two different forms in the same hour from colliding - the hour bucket is only the server's fallback; the id computed here is sent to the relay verbatim, so the two paths cannot disagree even when a submit straddles an hour boundary Ads Manager's own sample omits event_id. We send it so the pixel event and the relay event collapse into one conversion instead of counting twice. ------------------------------------------------------------------------ */ function buildEventId(email, formId) { var seed = [ String(email || "").trim().toLowerCase(), String(formId || ""), new Date().toISOString().slice(0, 13) ].join("|"); return crypto.subtle.digest("SHA-256", new TextEncoder().encode(seed)).then(function (buf) { var hex = Array.prototype.map.call(new Uint8Array(buf), function (b) { return b.toString(16).padStart(2, "0"); }).join(""); return "lead_" + hex.slice(0, 20); }); } /* Guards a re-fire from the history.pushState that book-a-demo-core.js runs after submit, and from back-navigation onto the same state. */ function firedOnce(id) { try { if (sessionStorage.getItem("oaiq_" + id)) return true; sessionStorage.setItem("oaiq_" + id, "1"); return false; } catch (e) { return false; /* private mode / blocked storage: fire rather than lose it */ } } /* Path 2. keepalive lets the request finish even if the page navigates away. Failures are swallowed deliberately: a reporting call must never surface an error to someone who just submitted a form. The relay hashes the email server-side into user.emails_sha256 and adds the caller's IP and user agent, so this event carries the same match signals the pixel gets for free. */ function sendToRelay(email, formId, eventType, eventId) { try { var payload = { token: RELAY_TOKEN, email: email, form_id: formId || "", event_type: eventType, event_id: eventId, /* verbatim, so both paths always match */ source_url: location.href }; var oppref = getOppref(); if (oppref) payload.oppref = oppref; var externalId = getExternalId(); if (externalId) payload.external_id = externalId; fetch(RELAY_URL, { method: "POST", keepalive: true, headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }).catch(function () {}); } catch (e) {} } /* Capture the email while the form is still on the page. onFormSubmitted does not reliably carry submissionValues, and by then the form may be removed. */ var lastEmail = ""; document.addEventListener("submit", function (e) { var f = e.target; if (!f || !f.querySelector) return; var i = f.querySelector('input[name="email"], input[type="email"]'); if (i && i.value) lastEmail = i.value; }, true); /* Every HubSpot form on the site reports through this one message event, so no module or theme JS needs editing to add coverage. */ window.addEventListener("message", function (e) { var d = e.data; if (!d || d.type !== "hsFormCallback" || d.eventName !== "onFormSubmitted") return; var email = (d.data && d.data.submissionValues && d.data.submissionValues.email) || lastEmail; if (!email) return; /* without an email there is no stable id to dedupe on */ var eventType = EVENT_BY_FORM[d.id] || EVENT_DEFAULT; buildEventId(email, d.id).then(function (id) { if (firedOnce(id)) return; oaiq("measure", eventType, { type: DATA_TYPE }, { event_id: id }); /* path 1 */ sendToRelay(email, d.id, eventType, id); /* path 2 */ }); }); })();

91ÊÓÆµ

See where your logistics stands on automation Start assessment

Home > Blog >

Decathlon Automates B2B Shipping and Carrier Management with ClickPost

Decathlon Automates B2B Shipping and Carrier Management with ClickPost

Rohan Ganguly
By Rohan Ganguly

Ready to ship smarter? Talk to our logistics experts.

Trusted by 600+ brands

In this blog

    The Heart, Mind, and Momentum Behind Decathlon


    , founded in 1976 in France, is a global leader in affordable sports products, with a revenue of USD 487 million. In India, the brand operates numerous warehouses and stores and caters to a large customer base. Recently, Decathlon sought smarter logistics solutions to streamline bulk shipping and integrate with other systems.

    Maloth Surendar Naik, Product Owner for Decathlon India, shared how Decathlon struggled with manual order creation and lacked NDR management, leading to 20,000 failed orders/month.. After integrating with ClickPost, Decathlon shifted to an API-based order flow, processing 2.5 lakh orders/month.

    ClickPost’s solutions, including automated NDR notifications and whitelabeled tracking pages, helped Decathlon reduce RTO percentages to just 2-3%, the lowest in the industry. Over the past three years, ClickPost has streamlined Decathlon’s operations, improving order creation, tracking, and overall visibility.

    We Didn’t Just Hear Decathlon’s Needs – We Felt Them

    When Decathlon approached us with their downsides, we sat down to get to the root of each problem they had. As Maloth Surender Naik, the Product Manager at Decathlon India, explains, “The process that slowed down our shipping was the manual activities, where we had to manually hand over to partners, enter the records manually into our system, and this process was repeated by stakeholders as well.�

    Here’s What They Really Faced:

    1.  Inefficiencies of Manual Intervention 

    Decathlon’s configuration with several distributors and logistics platforms took hours due to manual inputs. They uploaded data individually, faced disrupted sync within teams and processes, and made mistakes, handling large datasets. What they needed was an automated workflow to replace time-taking and manually-handled operations in their supply chain. 

    2. Difficult Multi-platform Management 

    The sports retail giant faced delays in its shipping operations due to multiple platform management. They processed orders, tracked shipments, and communicated PODs manually via email threads using individual platforms. The process was inefficient, costly, and error-prone. Decathlon needed a system that could do more than eliminate repetitive tasks and dashboard to-and-fro. They required a single integrated system to manage multiple tools and shipping processes.

    3. Costly Tech Enablements, Slow Payoffs

    Decathlon used costly, complex systems that required custom coding for carrier integrations, did not sync automatically with OMS/WMS, and involved long testing cycles. Fixing API bugs and lengthy sandbox testing led to time-taking carrier onboarding, causing back-and forth in allocation rule-tweaking. ClickPost solved all of this by offering a quick API-based carrier integration process, and flexible rule-based shipping, all without disrupting Decathlon’s workflow.

    What Changed When ClickPost Stepped Into Decathlon’s Supply Chain

    “With ClickPost, manual workflows will be automated and our stakeholders will have one-stop solutions to solve operational challenges.�

     

     

    — Maloth Surender Naik, Decathlon Sports India

    What was once slow and manual became quick, seamless, and completely coordinated. ClickPost transformed Decathlon’s B2B logistics with automated orders, smart carrier selection, real-time proofs of delivery, and complete delivery transparency. They no longer chase updates or manage spreadsheets. Operations are now smoother, dispatches are faster, and partners are happier. ClickPost not only saved them time but also contributed to Decathlon’s overall growth by offering:

     

    • A unified platform to manage B2B orders, carriers, and proofs of delivery, avoiding the hassle of switching between systems. 

    • Automated tracking updates to keep partners informed in real time, reducing WISMOs.

    • Quick carrier onboarding and tech support to help them avoid technical delays.

    • They wanted automation that improved efficiency and allowed their team to focus on growth.

    ClickPost’s Key Contributions

    ClickPost quickly transformed Decathlon’s logistics. It brought their teams, partners, and platforms in sync and offered more automated coordination between its internal systems. Here’s how firmer control was achieved.

    1. Automated B2B Order Creation:

    Orders from Decathlon’s internal systems now transfer directly into ClickPost. Shipping labels are generated instantly, removing manual data entry and automatically cutting dispatch time.

    2. Smart Carrier Allocation:

    With Decathlon’s delivery zones, order types, and service level agreements, we created custom rules to automatically assign the most suitable carrier for each shipment. This optimizes speed and cost-effectively.

    3. Real-Time Tracking & Proofs of Delivery:

    Every shipment is tracked across carriers through a single dashboard. Delivery proofs, including photos, signatures, and timestamps, are captured digitally and stored to facilitate quicker billing and eliminate disputes.

    4. Seamless WMS/ERP Integration:

    ClickPost connected with Decathlon’s existing warehouse management and ERP systems, ensuring smooth data synchronization across teams and partners without any disruption.

    5. Rapid Onboarding of Regional Carriers:

    We onboarded several regional carriers for Decathlon’s operations into Tier 2 and Tier 3 cities. There were no technical issues or delays.

    Our Accomplishments in Numbers:

    • With ClickPost logistics automation, Decathlon has fulfilled 14,522,303 orders in the last year.
    • The average RTO rate for Decathlon through ClickPost is 7.3%, which is way lower than the average RTO rates of 25%-40% for apparels.
     

    Key Takeaways from the Shared Collaboration

    • We introduced automated order processing to replace manual workloads.

    • Enabled smart carrier allocation and real-time delivery tracking to speed up deliveries.

    • We streamlined their backend operations.

    • Improved overall delivery visibility and experiences for Decathlon’s customers.

    • The achieved outcomes strengthened ClickPost’s partnership with Decathlon. 

    The Road Ahead in Logistics 

    Our journey with Decathlon is just beginning. As their B2B operations expand across India and beyond, ClickPost is collaborating closely with them to support new warehouse launches, improve regional logistics, and bring more intelligence to their shipping processes. With both teams focused on innovation and putting customers first, the future is full of opportunities.

    Looking ahead, we are excited to launch ClickPost Darwin to change Decathlon’s B2B deliveries. It will improve deliveries by giving teams an easy, mobile-first way to capture real-time proof of delivery with photos, signatures, and timestamps. It removes paperwork delays, cuts down on disputes, and provides instant visibility for every delivery. 

    Scale like Decathlon with Darwin, ClickPost’s logistics intelligence engine. Because smarter supply chains win.

    The Logistics Automation Platform for E-commerce

    Momentum Leader - G2 Users Most Likely To Recommend - G2 Best Results Mid-Market - G2
    . window.disableHubSpotCookieBanner = true; function killNative() { var n = document.getElementById("hs-eu-cookie-confirmation"); if (n && n.parentNode) { n.parentNode.removeChild(n); return true; } return false; } killNative(); if (window.MutationObserver) { var mo = new MutationObserver(function () { killNative(); }); mo.observe(document.documentElement, { childList: true, subtree: true }); setTimeout(function () { mo.disconnect(); }, 15000); } var COOKIE = "cp_cookie_consent"; var EU = ["at","be","bg","hr","cy","cz","dk","ee","fi","fr","de","gr","hu","ie","it","lv","lt","lu","mt","nl","pl","pt","ro","sk","si","es","se","gb","uk","is","li","no","ch"]; function readCookie(nm) { var m = document.cookie.match(new RegExp("(?:^|; )" + nm + "=([^;]*)")); return m ? decodeURIComponent(m[1]) : null; } function writeCookie(nm, val, days) { var d = new Date(); d.setTime(d.getTime() + (days * 864e5)); document.cookie = nm + "=" + encodeURIComponent(val) + ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax" + (location.protocol === "https:" ? ";Secure" : ""); } function stored() { var raw = readCookie(COOKIE); if (!raw) return null; try { var o = JSON.parse(raw); if (typeof o.analytics === "boolean") return o; } catch (e) {} return null; } function apply(state, revoke) { window._hsp = window._hsp || []; window._hsp.push(["setHubSpotConsent", { analytics: !!state.analytics, advertisement: !!state.advertisement, functionality: !!state.functionality }]); if (revoke && !state.analytics && !state.advertisement && !state.functionality) { window._hsp.push(["revokeCookieConsent"]); } window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "cp_cookie_consent", cp_consent_analytics: !!state.analytics, cp_consent_advertisement: !!state.advertisement, cp_consent_functionality: !!state.functionality }); document.documentElement.setAttribute("data-cp-consent", "set"); } function inScope(banner) { if (banner.getAttribute("data-scope") !== "eu_only") return true; var geo = (document.body.getAttribute("data-geo_location") || "").toLowerCase(); if (!geo) return true; return EU.indexOf(geo) !== -1; } function init(banner) { var days = parseInt(banner.getAttribute("data-days"), 10) || 180; var prefs = banner.querySelector("[data-cpcb-prefs]"); var compact = banner.querySelector('[data-cpcb-actions="compact"]'); var expanded = banner.querySelector('[data-cpcb-actions="expanded"]'); var toggles = banner.querySelectorAll("[data-cpcb-toggle]"); function show() { banner.hidden = false; requestAnimationFrame(function () { banner.classList.add("is-visible"); }); } function hide() { banner.classList.remove("is-visible"); setTimeout(function () { banner.hidden = true; }, 300); } function collapse() { if (!prefs) return; prefs.hidden = true; if (expanded) expanded.hidden = true; if (compact) compact.hidden = false; } function expand() { if (!prefs) return; prefs.hidden = false; if (compact) compact.hidden = true; if (expanded) expanded.hidden = false; } function paint(state) { Array.prototype.forEach.call(toggles, function (t) { var key = t.getAttribute("data-cpcb-toggle"); if (key === "necessary") { t.setAttribute("aria-checked", "true"); return; } t.setAttribute("aria-checked", state[key] ? "true" : "false"); }); } function fromToggles() { var state = { analytics: false, advertisement: false, functionality: false }; Array.prototype.forEach.call(toggles, function (t) { var key = t.getAttribute("data-cpcb-toggle"); if (key in state) state[key] = t.getAttribute("aria-checked") === "true"; }); return state; } function commit(state, revoke) { writeCookie(COOKIE, JSON.stringify({ analytics: !!state.analytics, advertisement: !!state.advertisement, functionality: !!state.functionality, v: 1, ts: Date.now() }), days); apply(state, revoke); hide(); } Array.prototype.forEach.call(toggles, function (t) { if (t.disabled) return; t.addEventListener("click", function () { t.setAttribute("aria-checked", t.getAttribute("aria-checked") === "true" ? "false" : "true"); }); }); banner.addEventListener("click", function (e) { if (!e.target || !e.target.closest) return; var btn = e.target.closest("[data-cpcb-action]"); if (!btn) return; var action = btn.getAttribute("data-cpcb-action"); if (action === "customise") { expand(); return; } if (action === "accept") { commit({ analytics: true, advertisement: true, functionality: true }, false); return; } if (action === "reject") { commit({ analytics: false, advertisement: false, functionality: false }, true); return; } if (action === "save") { commit(fromToggles(), true); return; } }); var existing = stored(); if (existing) { apply(existing, false); paint(existing); collapse(); } else if (!inScope(banner)) { // Out of the consent-required region: implied consent, banner never shown. commitSilently(); } else { collapse(); show(); } function commitSilently() { var all = { analytics: true, advertisement: true, functionality: true }; writeCookie(COOKIE, JSON.stringify({ analytics: true, advertisement: true, functionality: true, v: 1, ts: Date.now(), implied: true }), days); apply(all, false); } // Public re-open hook for a footer "Cookie settings" link. window.cpCookieBanner = window.cpCookieBanner || {}; window.cpCookieBanner.open = function () { var s = stored() || { analytics: false, advertisement: false, functionality: false }; paint(s); expand(); show(); }; } function boot() { var banners = document.querySelectorAll("[data-cpcb]"); if (!banners.length) return; init(banners[0]); document.addEventListener("click", function (e) { if (!e.target || !e.target.closest) return; var trigger = e.target.closest("[data-cp-cookie-settings]"); if (!trigger) return; e.preventDefault(); if (window.cpCookieBanner && window.cpCookieBanner.open) window.cpCookieBanner.open(); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", boot); } else { boot(); } })();