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

Logistics Automations for Beauty and Cosmetic Brands

ClickPost automates tracking, returns, COD confirmation, and failed delivery recovery for beauty brands.

D2C - Beauty and Cosmetic

Delivery decisions trained on 5 billion+ shipments.
Trusted by operations teams at 600+ brands.

ClickPost streamlines operations across multiple parties and acts as a logistics enabler for us.

Kailash S.

Operations Team

The post-purchase upsells have been a solid bonus for incremental revenue.

Samarth Sindhi

Samarth Sindhi

CEO

With ClickPost, every courier booking happens from one panel, B2B, B2C, Quick Commerce.

Nikhil Rangari

Nikhil Rangari

AVP Operations

9%

lesser RTOs

~100%

on-time deliveries

ClickPost is the heartbeat of our operations.

Piyush Kumar

Piyush Kumar

AVP Operations

AI Allocation is like moving from riding a tricycle to a sports bike.

Anirudh Likhite

Anirudh Likhite

SVP Supply Chain & Procurement

The real-time tracking statuses are reassuring for teams and customers.

Rajat Mehra

Rajat Mehra

Product Manager

10%

Faster Delivery TAT

33%

RTO reduction

Order creation used to take whole-day. Now with ClickPost allocation is real time, and if partner A fails it automatically routes to partner B.

Pulkit Chaturvedi

Pulkit Chaturvedi

Head of Supply Chain

Returns with ClickPost have increased our NPS

Anshu Kumar

Anshu Kumar

Logistics & Customer Delight Lead

Tracking, carrier allocation and returns have become seamless with ClickPost.

Vipin Kumar

Vipin Kumar

Senior Director Supply Chain

80%

NDRs solved in 24H with Parth AI.

100%

AI NDR Calling with Parth

Smart alerts, single-dashboard visibility into every breach have lifted productivity.

Soumyadip Singha

Soumyadip Singha

Operations Manager

We have reduced complaints by 20% in 6 weeks.

Nayana Chethan

Nayana Chethan

Head of Customer Support

Make your post-purchase experience
glow with ClickPost
Why beauty is different

Why beauty is different

Repeat-driven revenue, high COD share that makes every failed delivery expensive.
RTOs High COD Fit issues
What your brand ops need

What your brand ops need

Fast deliveries with branded tracking that build trust.
Branded Tracking Faster deliveries
Earn the repeat order

Earn the repeat order

AI routes to the best courier. Self-serve order edits reduce support load.
AI carrier allocation Order editing

Why beauty is different

Be it a first-time or a reorder, good delivery
experiences build loyalty
Serums, shampoos, and cosmetics get bought again and again.
So a single bad delivery could cost you the customer.

A bad delivery ends the relationship

They highly anticipated the delivery, so a slow delivery that means you will breach the promise date, kills trust.

Launches and drops increase support load

Beauty runs on limited launches, influencer drops, and sampling. Each one floods support with where-is-my-order tickets
28–32%
Repeat purchase rates for beauty products
30-50%
COD rates. One of the highest amongst categories
18-20%
RTOs for beauty brands in India

HOW CLICKPOST HELPS

Own the experience,
from the buy button to the next order

Self-serve order edits and upsells

Reduce support load, let customers add/edit a shade or a serum. No tickets for you.
  • Control order edit window as per your delivery timelines
  • Google address verification, reduce RTOs
  • Recommend relevant products, induce upsells
40% Lesser Support Costs
33% Lesser RTOs
Self-serve order edits and upsells

Real-time branded updates

Proactive updates by email and SMS at every milestone, plus a branded tracking page that looks like your brand. Fewer "where is my order" tickets during drops and peak.
  • Mobile-first branded tracking page
  • Milestone alerts by email, SMS, and push
  • Estimated delivery dates that set expectations
60% Lesser WISMO
47% Higher NPS
Real-time branded updates

Failed delivery recovery

Trigger multi-channel journeys when a delivery fails. Use AI calling for scalable feedback collection, and auto update couriers
  • Set NDR journeys using a combination of SMS, WhatsApp, AI calling
  • Customer feedback directly sent to couriers via API
  • Standardised failed delivery buckets, trigger custom flows
100% NDR Coverage
40% Lesser RTOs
Failed delivery recovery

AI order confirmation

Reconfirm buyer intent and convert COD to prepaid with Parth, our AI voice agent
  • Calls customers after they place an order. Confirms address and intent
  • Nudges to covert COD to prepaid
  • Sends a payment link on WhatsApp
Built in telephony
Multi-lingual support
AI order confirmation

Getting started

Go live in days. Join the company 
of the most loved beauty brands

700+ carrier integrations

Go live in days. Join the company 
of the most loved beauty brands

Easily manage all your carriers from a single platform. Prevent SLA breaches and track performance.
75+ communication gateways

75+ communication gateways

Integrate multiple channels, or ClickPost WhatsApp gateway. Keep customers informed for all milestones.
AI-first analytics

AI-first analytics

Ask your shipment data anything with AI assistants within all ClickPost modules
  • Pilgrim - BG
    ClickPost's AI Allocation automatically routes orders to our best-performing carriers in each region. It's like upgrading from a tricycle to a sports bike.
    Anirudh Likhite
    Anirudh Likhite
    SVP Supply Chain and Procurement, Pilgrim
  • Avimee Herbal
    With the smart alerts set in the Apex Control Tower, we’re literally having to put in less efforts to understand where the problem is and manage them faster
    Kamal Kumawat
    Head of Supply Chain at Avimee Herbal
    Head of Supply Chain at Avimee Herbal
  • Nykaa - Testimonial
    ClickPost and Nykaa both have come a long way! We are working on 2 hours, even 30 minutes delivery and how we can push our connection speed. ClickPost is the heartbeat of Nykaa's logistics ecosystem.
    Piyush Kumar
    Piyush Kumar
    AVP, Logistics Operations, Nykaa
  • Dot and Key - BG
    Before Apex Control Tower, everything was manual: pickup handling, order processing, NDR. Now smart alerts and single-dashboard visibility into every breach have lifted productivity across both ops and CX teams.
    Soumyadip Singha
    Soumyadip Singha
    Operations Manager, Dot & Key
4.8 Ratting Stars - White
4.4 Rating Stars White 4.4

Automate your logistics
with ClickPost

Book a 30-minute demo with our experts to build a world-class 
post-purchase experience
. 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(); } })();