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 */
});
});
})();
Acer Adopts AI-Driven POD Verification with ClickPost Darwin
With ClickPost Darwin, Acer transitioned from fragmented, manual workflows to a system-driven logistics intelligence layer, unifying institutional operations across 10,000+ monthly orders.
“Automating proof of delivery verification has been particularly impactful for our institutional business. By working with ClickPost, we’ve reduced manual intervention, improved turnaround times, and strengthened visibility across our logistics operations.”
— , Head of Logistics Operations, Acer
Challenge: Fragmented POD Verification and Manual Logistics Workflows
POD Verification & Tracking Challenges
Proof of Delivery (POD) verification relied on physical hard copies routed through centralised courier offices
Carrier customer service teams and Acer in-house tracking teams spending 3–5 hours daily on POD verification.
POD tracking and collection consuming a significant portion of the operations team’s bandwidth
For BFSI orders, OTP-based confirmation is not permitted, making physical PODs the only mode of verification
Verification cycles stretching across multiple days, delaying reconciliation and payment processing
Manual Order Booking & Dispatch Coordination
Courier partners manually creating dockets for 1,000–1,200 invoices daily
Manual airway bill generation and ERP entry increasing operational dependency on carrier teams sometimes delays beyond working hours.
Lack of a unified system to allocate and track orders across warehouse locations
Limited Visibility & Customer Communication
High volume of inbound queries from customers and internal sales teams
Shipment status updates dependent on manual tracking across multiple carrier portals
Solution: AI-Led, Unified Institutional Logistics with ClickPost Darwin
With ClickPost Darwin, Acer transitioned from fragmented, manual workflows to a system-driven logistics intelligence layer, unifying institutional operations across 10,000+ monthly orders.
AI-Powered POD Verification
ClickPost’s AI automatically processes all uploaded PODs and intelligently categorises them as correct or requiring intervention. This exception-based workflow eliminates routine manual checks and enables faster, more accurate delivery verification.
Majority of PODs auto-cleared without human intervention
Operations teams focus only on flagged or exception cases
Delivery verification completed within 24 hours of POD upload
“Earlier, the cycle depended on physical POD movement and manual checks, which took several days. Now, within 24 hours of the carrier uploading the POD, we can bucket it into correct or problematic segments and act immediately.” -Balaji Venkatachalam, Senior Manager – Logistics
Automated Order Booking & ERP Integration
ClickPost integrated directly with Acer’s ERP to automate airway bill generation and dispatch workflows across warehouse locations.
Manual handoffs between teams eliminated
Faster docket creation and carrier handover
More predictable dispatch execution for institutional shipments
“Through ClickPost’s API integration, dockets are generated faster, helping us remove dispatch delays and ensure quicker handover to carriers.”
Real-Time, Proactive Customer Communications
ClickPost enabled automated delivery notifications via email, SMS, and WhatsApp, creating a single source of truth for shipment updates.
Reduced dependence on manual status checks across carrier portals
Fewer inbound queries from customers and internal teams
Operations teams re-focused on monitoring delivery performance
“Earlier, a large part of the day went into manually tracking shipments and updating customers. With ClickPost’s automated notifications, this is no longer an area of concern.” — Balaji Venkatachalam, Senior Manager – Logistics
Continuous Improvement: Advancing Toward Higher POD Automation
Acer and ClickPost continue to collaborate on workflow enhancements to increase the share of PODs automatically categorized as ‘correct’ from 80% to 95%+, further reducing manual intervention as institutional volumes scale.
About Acer
Founded in 1976, Acer is a global technology company with operations in over 160 countries. It designs and delivers innovative products and solutions across computing and beyond, with a strong focus on sustainable growth and responsible innovation.
Website :
Modules used - Order Creation, Tracking, AI Pod Verification
Other Customer Success Stories
Fashion & Apparel
How DaMENSCH reduced RTO rate by 54% with the help of ClickPost