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 */
});
});
})();
India Post API Integration for Orders, Labels and Tracking
Book India Post shipments, print labels and track every consignment through one ClickPost API. You reach every PIN code in India without logging in to the India Post portal.
Trusted by 600+ global brands
Why brands connect India Post through ClickPost
India Post covers every PIN code in India. ClickPost automates booking, tracking and customer updates on top of that reach.
Lower WISMO queries by 25% with advanced tracking and proactive issue management.
Cut RTO rates by up to 40% and build brand loyalty through intelligent NDR workflows and delivery reattempt logic.
Reduce shipping costs by up to 29% with ClickPost's smart carrier allocation that assigns the right carrier for every order.
India Post tracking API without CAPTCHAs or scraping
Track IndiaPost Packages with the ClickPost Tracking Page
Find your IndiaPost tracking number from your order confirmation or shipping notification.
Visit the ClickPost Tracking Page for your brand.
Enter your tracking number in the search field.
Click Track to view live shipment status, estimated delivery date, and milestones.
Why the India Post website doesn't scale for order tracking
Open the IndiaPost website and select Consignment or Ref No.
Enter the Consignment or Reference Number.
Enter the CAPTCHA characters shown on screen.
Click Search to view the current status and delivery history of your package.
India Post APIs available through ClickPost
API
Description
Manifestation and Label Generation API
Manifest multiple orders and generate shipping labels in real time, eliminating manual delays at dispatch.
Tracking Shipment API
Track shipments in real time across IndiaPost's network with live updates pushed to your system.
Cancellation API
Cancel IndiaPost orders programmatically before dispatch to reduce overhead and return costs.
EDD API
Display accurate estimated delivery dates at checkout and on product pages to set clear customer expectations.
NDR Action Update
Act on failed deliveries and push corrected instructions back to IndiaPost to reduce RTO rates.
Return Webhooks
Automate returns using IndiaPost-integrated webhooks for seamless reverse logistics.
API & Description
Manifestation and Label Generation API
Manifest multiple orders and generate shipping labels in real time, eliminating manual delays at dispatch.
Tracking Shipment API
Track shipments in real time across IndiaPost's network with live updates pushed to your system.
Cancellation API
Cancel IndiaPost orders programmatically before dispatch to reduce overhead and return costs.
EDD API
Display accurate estimated delivery dates at checkout and on product pages to set clear customer expectations.
NDR Action Update
Act on failed deliveries and push corrected instructions back to IndiaPost to reduce RTO rates.
Return Webhooks
Automate returns using IndiaPost-integrated webhooks for seamless reverse logistics.
Frequently asked questions
Everything you need to know about ClickPost’s Carriers Integration
How does ClickPost use AI for Carrier Allocation?
ClickPost uses AI-driven algorithms to analyze multiple factors, such as cost, turnaround times, SLA Adherence for carriers, to recommend the best carrier for each shipment.
How does ClickPost use AI for Carrier Allocation?
ClickPost uses AI-driven algorithms to analyze multiple factors, such as cost, turnaround times, SLA Adherence for carriers, to recommend the best carrier for each shipment.
How does ClickPost use AI for Carrier Allocation?
ClickPost uses AI-driven algorithms to analyze multiple factors, such as cost, turnaround times, SLA Adherence for carriers, to recommend the best carrier for each shipment.
How does ClickPost use AI for Carrier Allocation?
ClickPost uses AI-driven algorithms to analyze multiple factors, such as cost, turnaround times, SLA Adherence for carriers, to recommend the best carrier for each shipment.
Yes. ClickPost is integrated with India Post, and its API lets you create orders, generate labels and fetch tracking status for any consignment number. Tracking data comes back as JSON with the same event codes ClickPost uses for your other carriers, so your system handles India Post like any other courier.
How does ClickPost integrate with India Post?
You connect your India Post business account to ClickPost once, during onboarding. After that, orders you create in ClickPost are booked with India Post and their labels are generated automatically. ClickPost checks India Post for status changes and passes each update to your system, so nobody on your team has to work inside the India Post portal.
Can I track India Post consignments in bulk?
Yes. On the India Post website you enter one consignment number at a time and solve a CAPTCHA for each. ClickPost tracks every active India Post shipment in your account automatically and updates your system whenever a status changes. The setup is the same at any order volume.
Does the integration cover Speed Post?
It does. Speed Post and India Post parcel shipments run through the same integration, so you manage and track both from one dashboard and one API.
Where can I find the India Post API documentation?
In the ClickPost API docs at docs.clickpost.ai. India Post is carrier partner ID 438 in ClickPost. Pass that ID in your API calls and use the order creation and tracking endpoints described in the docs.
Is the India Post tracking API free?
No. It comes with a ClickPost plan rather than as a free standalone API. What you pay depends on the plan, which you can compare on the pricing page or get quoted on a demo call. Shipping charges are separate, and India Post bills them under your own contract.
How do I get started with India Post on ClickPost?
Start with an active India Post business account. You share its credentials during onboarding, and ClickPost's team sets up the connection. Once it's live, India Post shows up in your dashboard next to your other carriers and you can begin assigning orders to it.
Can I send India Post tracking updates on WhatsApp?
You can. When an India Post shipment changes status, ClickPost sends your customer a WhatsApp, SMS or email update with your brand name and a link to your tracking page. Customers get their answer without visiting the India Post site, which means fewer "where is my order" calls to your support team.
Does it work with WooCommerce and Shopify?
Both work. ClickPost connects to Shopify, WooCommerce, Magento and most OMS and WMS tools. Store orders flow into ClickPost and are booked with India Post, and tracking updates are written back to each order. You don't need a separate India Post plugin.
Can ClickPost assign orders to India Post automatically?
Yes. For each order, ClickPost's carrier allocation weighs cost, serviceability and past performance, and sends the order to India Post when it comes out ahead. That happens often for Tier 3 and rural PIN codes, where private couriers have thinner coverage.