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 */
});
});
})();
Since its dreamy beginnings in 2015, The White Willow has helped over half a million customers worldwide sleep better. However, calls on order status were making the in-house team lose sleep. In a world previously dominated by legacy brands that had compounded trust at a steady pace over decades, it was not easy to build trust for a start-up e-commerce company that offers limited order visibility.
One thing led to another, and they soon realised the entirety of their logistical operations was in disarray. Many of their tasks were manual and chasing the paper trail was proving to be a nightmare. The support team encountered a chaotic influx of follow-up tasks and a constant barrage of WISMO (Where-is-my-order) inquiries flooding in each day.
Managing returns was another huge pain-point for The White Willow. As they provide a trial period of a few weeks to all customers, the manual returns & exchange process was cumbersome and inefficient. And the never-ending saga brought with it a whole loop of time-consuming tasks to stay on top of.
The White Willow was forced to remain in constant touch with various courier partners to ensure that all their orders were on their way, but this is no viable plan of action for a rapidly scaling business. Despite The White Willow's earnest efforts to streamline shipment tracking by collaborating with their courier partners it just didn't hit the mark and a solution remained elusive.
Finding the Perfect Match
The White Willow was hunting for an end-to-end logistics solution that could:
1) Provide real-time status to customers via a branded order tracking page
2) Send shoppers real-time order tracking notifications across multiple channels
2) Automate resolutions of shipping exceptions to ensure on-time delivery
3) Automate returns management and processing
Bouncing Back From Sleepless Nights
The turning point arrived with the integration of ClickPost into their system. This innovative addition marked a transformative shift, significantly alleviating the burden of customer complaints and fostering a newfound sense of efficiency and control within their logistics framework via order visibility & alerts and automated management of returns & delays.
On Cloud Nine…
The White Willow achieved a remarkable 50% reduction in failed deliveries, slashed customer queries by an impressive 56%, and have doubled their tracking page visits.
The White Willow X ClickPost, automated notifications for everyone's peace of mind!
Good Day The White Willow!
Introducing The White Willow, founded by Abhishek Jain and Meghna Aggarwal Jain, where comfort meets innovation in the realm of sleep essentials.
Born from a passion for quality rest and rejuvenation, the brand is dedicated to crafting premium sleep solutions that elevate one's slumber experience.
Inspired by the serene beauty of nature, their products- over 70 different types of pillows, are meticulously designed to provide optimal support and relaxation.
From luxurious memory foam pillows to orthopedic supports, each item is thoughtfully curated to cater to unique sleep needs.
Website
thewhitewillow.in
Industry
Home Decor & Furnishing
Channel
eCommerce Store
Solutions Used
Tracking & Notification Features
Use Case
Real-time tracking & automated notifications to customers to improve post-purchase experience
Other Customer Success Stories
Fashion & Apparel
How DaMENSCH reduced RTO rate by 54% with the help of ClickPost