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 */
});
});
})();
“With ClickPost, every courier booking happens from one panel - B2B, B2C, Quick Commerce. Tracking, analytics, and billing are a click away, and the process is system-driven instead of people-dependent.” -
Scaling Omnichannel Operations Without Losing Control
As Giva scaled to 250+ stores (Aug 2025) with plans to reach 350 by Mar 2026, shipment volumes surged across channels. But day-to-day logistics operations relied on multiple carrier portals, spreadsheets, and manual follow-ups; slowing execution and obscuring shipment statuses. Giva adopted ClickPost to centralize carrier workflows, digitize appointments and PODs, and provide a single source of truth for store, inter-warehouse and last mile movements.
Where Manual Processes Created Roadblocks
Growing store count and shipment complexity exposed operational bottlenecks:
Fragmented tools & logins: Booking across 10–15 courier portals created credential sprawl and AWB tracking chaos.
Opaque tracking: Teams lacked a unified view of where shipments were, which ones were priority, and which were at risk.
Returns (RTO) blind spots: Reasons for returns surfaced late - often after consignments reached back to the warehouse.
Manual appointment coordination: Emails and calls to schedule/confirm marketplace slots increased SLA risk.
High people dependency: Dedicated staff tracked, chased, and reconciled - effort that didn’t scale with omnichannel growth.
Building a Smarter Flow
Giva and ClickPost Darwin partnered to streamline critical B2B workflows:
Unified Booking & Order Creation One portal for all carriers. Teams generate LR/AWB, labels, and documents from a single interface - no hopping across transporter sites.
Real-Time Visibility & Control Tower A consolidated dashboard to search by AWB/order ID, prioritize appointment or high-value consignments, and act on aging/no-movement alerts.
Appointment Scheduling (Auto-Emails) User-friendly appointment workflows trigger courier notifications in ~2 minutes - reducing manual mail trails and missed slots.
POD Management & Reconciliation Readiness Centralized PODs support finance closure. ClickPost Darwin roadmapped AI enhancements: auto-sharpen blurred images, trigger re-upload requests to carriers, and capture receiver ID alongside the POD for airtight proof.
Policy & Security Fit For high-security movement (BBC vans for ~95% of volume), ClickPost Darwin supports strict handover protocols and is exploring lat/long capture on delivery for added assurance.
“Our Excel-heavy B2B routine took 2–3 hours/day. With ClickPost Darwin, the same work takes 20–30 minutes - and our floor ops and appointment identification are far more accurate.” - Poorna Tejaswi (B2B - Quick Commerce Dept.), Giva
Impact in Numbers
Metric
Before ClickPost Darwin
After ClickPost Darwin
Daily B2B Ops Time (planning, booking, coordination)
2 - 3 hours/day (spreadsheets & emails)
20–30 mins/day (↓ ~75–85%)
Carrier Booking
10–15 portals & credentials
Single portal for all carriers
Priority & Appointment Visibility
Manual checks; missed escalations
Control Tower flags at-risk & appointment shipments
Appointment Emails
Manual drafting & follow-ups
Auto-emails in ~2 mins; fewer missed slots
Manpower Dependency
High (chase, track, reconcile)
System-driven workflows; fewer follow-ups
POD & Finance Prep
Scattered images; slow closure
Centralized PODs; AI roadmap for re-upload & ID capture
Ready to simplify omni channel logistics like Giva?
Book a demo to see how ClickPost can centralize booking, sharpen visibility, and slash manual hours.
About GIVA
Giva is a fast-growing jewelry brand with a rapidly expanding offline footprint across India. Formerly a D2C brand, Giva today focuses on an omnichannel model. To support this growth, the logistics and operations team manages high-security, time-sensitive movements from warehouses to stores, between facilities and for last mile operations seamlessly with ClickPost.
Website
Industry
Jewelry & Lifestyle
Warehouses:
Central DC + Regional B2B Nodes
B2B Channels
Warehouse → Store replenishment, Warehouse ↔ Warehouse transfers
Primary Transporters
BVC Logistics, Ekart logistics
Solutions Used
Booking & Order Creation | Courier Recommendation| Visibility | Control Tower | Appointment Scheduling | POD Management | Reconciliation
Other Customer Success Stories
Fashion & Apparel
How DaMENSCH reduced RTO rate by 54% with the help of ClickPost