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 >

How ClickPost Transformed Shopdeck’s Logistics Journey

How ClickPost Transformed Shopdeck’s Logistics Journey

Rohan Ganguly
By Rohan Ganguly

Ready to ship smarter? Talk to our logistics experts.

Trusted by 600+ brands

In this blog

    From Checkout to Doorstep: Shopdeck’s Logistics Journey

    Scaling in e-commerce is a balancing act. Every new customer, every fresh order, and every product launch adds complexity behind the scenes. For Shopdeck, one of India’s fastest-growing e-commerce enablers, this was no different.

    Shopdeck empowers businesses to sell smarter, offering solutions that span storefront management, payment systems, and integrated operations. But as they grew, the logistics challenges stacked up: more sellers meant more shipments, more third-party logistics (3PL) partners, and more pressure to deliver a seamless post-purchase experience.

    4 years ago, Shopdeck partnered with ClickPost to tackle these challenges head-on. What started as a logistics integration has evolved into a deep collaboration built on efficiency, reliable support, and tailored innovation.

    Shopdeck’s Roadblocks Before ClickPost

    Before partnering with ClickPost, Shopdeck’s rapid growth brought a new set of operational challenges:

    Challenges

    • Fragmented 3PL management — Managing multiple third-party logistics partners meant scattered systems, constant coordination, and delays in dispatch.

    • Limited order-level visibility — Shopdeck lacked a unified view of shipments, making it hard to track every order in real-time and resolve issues proactively.

    • Manual processes slowing scale — Reconciling tracking statuses, creating dockets, and resolving exceptions consumed significant time and effort, leaving little room for optimization.

    • Delivery inefficiencies impacting experience — With order volumes increasing, inconsistencies in carrier performance led to missed delivery SLAs and growing WISMO (“Where Is My Order?”) inquiries.

    • Support gaps from logistics partners — When issues arose, resolutions weren’t always quick, creating operational bottlenecks during critical business hours.

    These pain points made it clear that Shopdeck needed more than a tool, it needed a logistics partner capable of delivering control, speed, and innovation at scale. That’s where ClickPost came in.

    What Shopdeck Needed, ClickPost Delivered

    Shopdeck praised ClickPost for three things:

     

    • Improved overall efficiency with 3PL operations,

    • receiving support from the customer support team with a dedicated POC helping resolve issues in minutes, and

    • developing features exclusively for shopdeck.

    These strengths gave Shopdeck order-level control, unmatched support, and tailored innovation to scale smoothly. Let’s take a deeper look at these solutions.

    Order-Level Control

    Chanchal Krishna, Head of Revenue explained:

    “ClickPost has really helped us in improving the efficiency of our overall ways of working with 3PLs. The order level where we have reached ClickPost has played an important role in scaling where we are right now.” 

     

    When order volumes start surging, small inefficiencies compound fast. Shopdeck needed more than a patchwork solution, it needed order-level visibility and control.

    By integrating ClickPost’s unified API, Shopdeck streamlined its workflows across multiple 3PL partners. What used to take hours, manual reconciliation of tracking statuses, error-prone handoffs, and siloed communications, is now automated and centrally managed.

     

    • Seamless multi-carrier integration: Shopdeck connects with hundreds of carriers through a single API, ensuring smoother operations without juggling fragmented dashboards.

    • AI-driven carrier allocation: ClickPost’s machine learning models automatically select the most cost-effective and fastest carrier for every order, removing guesswork from scaling.

    • Real-time tracking: Live updates for every shipment reduced WISMO (“Where Is My Order?”) inquiries and enhanced customer satisfaction.

    These changes didn’t just improve process efficiency, they gave Shopdeck the logistical agility to grow without bottlenecks. Scaling from thousands to tens of thousands of orders became a matter of execution, not reinvention.

    Unparalleled Support

    Chanchal added: 

    “Anytime, any hour of the day, weekdays, weekends—we’ve faced problems, we’ve got them resolved in minutes. There’s been a dedicated POC working with us throughout.”

     

    For Shopdeck, scaling wasn’t just about software, it was about partnership. When logistics power operations at this scale, downtime isn’t an option. ClickPost’s support team became an always-on extension of Shopdeck’s operations.

     

    • Dedicated point of contact: A single POC ensures faster resolutions and better alignment with Shopdeck’s evolving priorities.

    • 24/7 responsiveness: Whether weekday or weekend, late-night hiccups or early-morning launches, ClickPost resolved issues in minutes, not hours.

    • Proactive troubleshooting: Beyond firefighting, ClickPost’s support team works closely with Shopdeck to anticipate potential blockers and solve them before they escalate.

    This level of responsiveness meant Shopdeck never had to worry about disruptions derailing fulfillment. It’s one thing to have a platform, it’s another to have a partner invested in your success.

    Tailored Innovation

    Chanchal Krishna once again mentions: 

    “There are a few features where ClickPost went above and beyond and developed for Shopdeck primarily.”

     

    Scaling operations are rarely one-size-fits-all. As Shopdeck expanded, its logistics challenges evolved beyond standard solutions. That’s where ClickPost’s custom-first approach came in. Rather than sticking to off-the-shelf features, ClickPost worked closely with Shopdeck to design and build tools tailored specifically to its needs.

     

    • Custom-built modules: From pre-dispatch workflows to advanced tracking dashboards, ClickPost adapted its technology to match Shopdeck’s operational model.

    • Collaborative product development: Shopdeck’s feedback didn’t just inform ClickPost’s roadmap, it shaped it. Several product features were co-created based on Shopdeck’s unique requirements.

    • Future-ready flexibility: These innovations weren’t just quick fixes. They laid the foundation for Shopdeck’s next phase of growth, ensuring scalability without compromising control.

    This partnership blurred the line between vendor and collaborator. For Shopdeck, it wasn’t just about adopting a logistics solution, it was about building one together.

    Real Outcomes: A Collaboration That Went Beyond Faster Shipments

    For Shopdeck, the ClickPost partnership didn’t just streamline processes, it redefined business outcomes.

    By consolidating 3PL workflows, automating manual processes, and enabling smarter carrier allocation, Shopdeck unlocked measurable gains:

     

    • Scalable operations: Seamless handling of growing order volumes without additional operational overhead.

    • Reduced manual workload: Automation eliminated time-consuming reconciliations, freeing up Shopdeck’s team to focus on strategic growth.

    • Happier customers: Real-time updates, fewer delivery exceptions, and faster turnarounds meant a stronger post-purchase experience.

    • Innovation edge: With custom-built tools, Shopdeck’s logistics evolved into a competitive advantage, setting it apart in a crowded e-commerce space.

    In short, ClickPost didn’t just support Shopdeck’s growth, it accelerated it.

    The Right Partner Propels You Forward

    When asked what sets ClickPost apart, Chanchal Krishna from Shopdeck didn’t hesitate to answer. He highlighted how the last 4 years with ClickPost have been amazing and appreciated the three things that ClickPost did for Shopdeck.

    Logistics can make or break an e-commerce journey. For Shopdeck, partnering with ClickPost meant more than streamlining shipments; it meant unlocking new possibilities. By combining efficiency, always-on support, and tailored innovation, ClickPost helped Shopdeck transform its logistics backbone into a true growth engine.

    Looking to scale your e-commerce operations without adding operational chaos? Discover how ClickPost can help you build smarter, faster, and customer-first logistics, just like Shopdeck.

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