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 >

DHL eCommerce Returns- [Complete Guide]

DHL eCommerce Returns- [Complete Guide]

Devaraj Mahantesh
By Devaraj Mahantesh

Ready to ship smarter? Talk to our logistics experts.

Trusted by 600+ brands

In this blog

    DHL eCommerce 

    Among the many shipping services available today, DHL is one of the most well-known and trusted logistics companies. Founded in the U.S back in 1969, DHL has its main headquarters in Germany and is, in essence, a German logistics firm. 

    DHL provides various services such as express mail, courier, and package delivery. Being one of the world's leading logistic platforms, DHL also ships over 1,800,000,000 packages every year.

    DHL focuses more on international higher-scale domestic shipments. These services are also made available to eCommerce brands.

    Whether a large parcel or something as small as a letter, consumers can use DHL to ship a large variety of items. Overall, the company has established itself as one of the best platforms in logistics services.

    What are DHL Returns?

    Like USPS, DHL provides its customers with different ways to deliver returns. The process is quite simple for consumers who wish to return a package they received from DHL. 

    To make things even more manageable, eCommerce brands give their customers a return label inside the box itself. For returns, DHL uses their 'SmartMail Parcel Return' service. 

    This service is set in place to ensure the entire returns process is efficient and quick. 

    How does DHL Returns Work?

    Now that you've got a basic idea of how DHL eCommerce returns work, it's time to understand how the entire process is facilitated from start to end. 

    1) Remove any old label from your package

    If you still have your old package box, ensure to remove any old labels that may be present. 

    If the box that you received the product initially is not in a condition where you can use it again (or if you've thrown it away), you'll have to get a new box to pack your item. 

    2) Get a new return label

    If the eCommerce brand you bought from does not provide you with a return label, you can easily make one at DHL's website. Customers must enter basic details such as name, address, email, etc. 

    However, it's important to note that the return label at DHL can cost you money. The charge for the return label will be deducted from the refund amount unless your package was damaged, different from what you ordered, or faulty. 

    3) Pack your product and label it well

    Once the return label is ready, it's time to get things moving and package your product. The first order of business is to ensure that there are no free spaces in the box. You can use items such as: 

    • Crumpled paper
    • Toilet paper
    • PolyFoam

    Using lightweight objects as padding is best since it will not add unnecessary weight to your parcel. If you have a fragile product, you can use bubble wrap to protect it from potential damage. 

    Sticking the return label properly is just as important. Ensure that you attach the DHL return label at the top and not in the middle to make scanning the barcode easy. You should also avoid sticking the return label on the box's corners. 

    4) Drop off your package

    Down to the two options that DHL provides to its customers for returns. You can drop the package at a DHL ServicePoint or have someone from DHL pick it up from your home.  

    There are 1250 DHL ServicePoints in Belgium alone. To opt for DHL to pick up the parcel from your home, you'll have to book an appointment with them on their scheduled pickup page.  

    5) Track your return order

    Once your return is sent by either of the methods mentioned above, the last thing left is tracking your order. With the help of DHL's track and trace, you can look up where your order is currently at. 

    On the tracking page, you'll have to enter the barcode number on the return label. This is also called the JVGL code and is present at the very bottom of the label. 

    You will also need to enter your postal code. Once you're done, you can click on the 'Follow your Shipment' option to start tracking your order. 

    Why Should eCommerce Brands Choose DHL for Returns?

    Out of the many different logistics companies that exist today, DHL is one of the best options for any eCommerce brand. DHL provides free web plugins that online stores can integrate. There is also the option to get custom solutions if your store needs them. 

    In addition, DHL offers eCommerce stores various shipping solutions to ensure that consumers do not abandon their carts at the last second. 

    DHL also delivers orders for customers that work throughout the week on Saturdays.  

    Further, DHL also notifies customers of the current status of the order. They send out emails and text messages to make sure your customers are alerted no matter where they are. 

    Overall, DHL provides handy and straightforward solutions, from your online store to your customer's doorstep. 

    How ClickPost Helps eCommerce stores with DHL Returns

    ClickPost has some of the best services that eCommerce brands can make use of. Let's take a look at some of them. 

    1) Instant integrations

    Direct integrations can take around two weeks to more than a month. With ClickPost, you can go live immediately and use the best services.

    2) Tracking 

    With ClickPost, your order tracking process becomes more simple, more accessible and quicker to perform. You can also get a branded tracking page that helps you increase your overall NPS (Net Promoter Score).

    3) Return portal 

    One of the best practices while offering returns is having a return portal. At ClickPost, you can use a plug-and-play return portal and not go through the hassle of creating one yourself!

    FAQs

    1) How long does it take for a return parcel to reach the sender?

    Ans: All shipments within the region of Benelux (i.e. either Belgium, Netherlands or Luxembourg) are all delivered to the sender in a span of two days. International shipments can take up to five days to reach the final destination. 

    2) Is DHL the best option for eCommerce returns?

    Ans: DHL is one of the best options for eCommerce returns. There are other firms such as USPS, UPS and FedEx that you can look at and decide which is the best for your brand. 

    Conclusion 

    To wrap up, this was all about DHL eCommerce returns and how they work. We've listed the steps for everyone to understand the entire consumer journey for returns at DHL. Overall, DHL provides excellent solutions for not just eCommerce but any brand in the market.

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