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 */
});
});
})();
ClickPost Decides how Every Order Reaches the Customer
The ETA to promise, the carrier to assign, how to save a failed delivery: ClickPost takes accurate decisions, so brands deliver better.
Brands have mastered the sale. The experience after it is where loyalty is actually decided.
When a delivery runs late, when a return goes unresolved, when an exception slips through, customers notice. ClickPost exists so brands do not have to choose between scaling fast and delivering well.
Mission
Help brands deliver on their promise at scale.
Vision
A future of autonomous logistics decisions, so brands spend their energy on growth.
Powered by ClickPost
Built by the people who saw the gap
Naman Vijay
Co-founder and CEO
Saw how much brands invested in winning a customer and how little infrastructure existed to keep one. Leads growth and international expansion.
Prashant Gupta
Co-founder and CTO
Saw brands running post-purchase on disconnected tools with no way to act in real time. Leads product and engineering.
Our story: Building the decision engine for commerce operations
2017
Founded to make logistics intelligent
Founded to give brands real-time shipment intelligence across every carrier; without switching carriers or changing fulfilment operations.
Day 1The problem was clear
2018
Early scale, early signal
10,000+ shipments optimized daily. First proof the platform could handle enterprise volume while keeping every carrier in sync.
10K+Shipments / day
2020
Profitable and expanding
Crossed profitability. 100,000+ shipments optimized per day. Global demand increases.
100K+Shipments / day
2022
The intelligence layer for high-growth brands
250,000+ shipments optimized daily. Unicorn and Fortune 50 brands across multiple markets trusted ClickPost to run smarter logistics operations.
250K+Shipments / day
2024
Series A and 1M shipments optimized daily
Raised Series A. Hit 1M+ shipments optimized daily. 450+ global brands and 500+ carrier integrations across D2C, enterprise, and cross-border.
1M+Series A · 450+ brands
2025
Intelligence across every movement type
AI-led allocation, predictive logistics, quick commerce intelligence, and B2B and bulk movement intelligence reached maturity. One control layer for all movements.
1One control layer across all movement types
2026
The era of autonomous commerce operations
Agentic workflows and automations across pre-purchase decisions, in-flight exceptions, and post-purchase resolution. Logistics that acts before you ask.
AgenticAutonomous. Predictive. Always on.
1 / 7
2017
2018
2020
2022
2024
2025
2026
5B+
Shipments Optimized for Global Brands
60%
Reduction in “Where is my order” queries for D2C brands.
22%
Lesser spends on shipping with intelligent carrier selection.
40%
Lesser RTOs. We maximize delivery conversions.
What we believe
Built to scale
Every system we build is designed to hold up at scale. We have optimized 5B+ shipments and innately understand logistics complexities across carriers and geographies.
Ahead of change
As AI reshapes how commerce runs, we're building the backbone of brand operations. Our work across 600+ brands of all stages and categories shows us what's changing early.
Intelligence over gut feel
Every shipment tells us something about how carriers perform and where deliveries fail. We turn that data into clear decisions on routing, delays and returns, so brands act proactively.
Made for repeat revenue
A customer decides whether to buy again based on what happens after they pay. We make that stretch dependable, with accurate delivery dates and proactive updates.
Backed by industry leaders
This infrastructure has not been fully built yet.
We are setting the standard for logistics decisioning globally. If you work on problems that are technically hard and commercially real, we should talk.