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 */ }); }); })();

91ÊÓƵ

See where your logistics stands on automation Start assessment

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.

India post - clickpost

Trusted by 600+ global brands

puma
decathlon-logo
nykaa-logo
herbalife-logo
lenskart-logo
dogtra-logo
the-body-shop-logo
Birkenstock-logo
New-Me-logo
palome
Tata-1mg-logo
Adidas-logo
Jackery-logo
Oriflame-logo
Giva-logo
mars-logo
Sotheby-logo
ABFRL-logo
india post clickpost logo

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 API capabilities on ClickPost

Partner ID Order Creation Cancellation Tracking via Polling Tracking via Webhook Proof of Delivery (POD) Non Delivery Report (NDR) Create Pickup Request AWB Generation Flow Label Generation Country
Indiapost Logo
India Post
438 ✓ -- ✓ -- -- -- -- -- ✓ India

India Post tracking API without CAPTCHAs or scraping

Track IndiaPost Packages with the ClickPost Tracking Page

  1. Find your IndiaPost tracking number from your order confirmation or shipping notification.

  2. Visit the ClickPost Tracking Page for your brand.

  3. Enter your tracking number in the search field.

  4. Click Track to view live shipment status, estimated delivery date, and milestones.

Why the India Post website doesn't scale for order tracking

  1. Open the IndiaPost website and select Consignment or Ref No.
  2. Enter the Consignment or Reference Number.
  3. Enter the CAPTCHA characters shown on screen.
  4. 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.

India Post API integration FAQs

Is there an India Post API for tracking?

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.

Start shipping with India Post on ClickPost

image (3)-3
. window.disableHubSpotCookieBanner = true; function killNative() { var n = document.getElementById("hs-eu-cookie-confirmation"); if (n && n.parentNode) { n.parentNode.removeChild(n); return true; } return false; } killNative(); if (window.MutationObserver) { var mo = new MutationObserver(function () { killNative(); }); mo.observe(document.documentElement, { childList: true, subtree: true }); setTimeout(function () { mo.disconnect(); }, 15000); } var COOKIE = "cp_cookie_consent"; var EU = ["at","be","bg","hr","cy","cz","dk","ee","fi","fr","de","gr","hu","ie","it","lv","lt","lu","mt","nl","pl","pt","ro","sk","si","es","se","gb","uk","is","li","no","ch"]; function readCookie(nm) { var m = document.cookie.match(new RegExp("(?:^|; )" + nm + "=([^;]*)")); return m ? decodeURIComponent(m[1]) : null; } function writeCookie(nm, val, days) { var d = new Date(); d.setTime(d.getTime() + (days * 864e5)); document.cookie = nm + "=" + encodeURIComponent(val) + ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax" + (location.protocol === "https:" ? ";Secure" : ""); } function stored() { var raw = readCookie(COOKIE); if (!raw) return null; try { var o = JSON.parse(raw); if (typeof o.analytics === "boolean") return o; } catch (e) {} return null; } function apply(state, revoke) { window._hsp = window._hsp || []; window._hsp.push(["setHubSpotConsent", { analytics: !!state.analytics, advertisement: !!state.advertisement, functionality: !!state.functionality }]); if (revoke && !state.analytics && !state.advertisement && !state.functionality) { window._hsp.push(["revokeCookieConsent"]); } window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "cp_cookie_consent", cp_consent_analytics: !!state.analytics, cp_consent_advertisement: !!state.advertisement, cp_consent_functionality: !!state.functionality }); document.documentElement.setAttribute("data-cp-consent", "set"); } function inScope(banner) { if (banner.getAttribute("data-scope") !== "eu_only") return true; var geo = (document.body.getAttribute("data-geo_location") || "").toLowerCase(); if (!geo) return true; return EU.indexOf(geo) !== -1; } function init(banner) { var days = parseInt(banner.getAttribute("data-days"), 10) || 180; var prefs = banner.querySelector("[data-cpcb-prefs]"); var compact = banner.querySelector('[data-cpcb-actions="compact"]'); var expanded = banner.querySelector('[data-cpcb-actions="expanded"]'); var toggles = banner.querySelectorAll("[data-cpcb-toggle]"); function show() { banner.hidden = false; requestAnimationFrame(function () { banner.classList.add("is-visible"); }); } function hide() { banner.classList.remove("is-visible"); setTimeout(function () { banner.hidden = true; }, 300); } function collapse() { if (!prefs) return; prefs.hidden = true; if (expanded) expanded.hidden = true; if (compact) compact.hidden = false; } function expand() { if (!prefs) return; prefs.hidden = false; if (compact) compact.hidden = true; if (expanded) expanded.hidden = false; } function paint(state) { Array.prototype.forEach.call(toggles, function (t) { var key = t.getAttribute("data-cpcb-toggle"); if (key === "necessary") { t.setAttribute("aria-checked", "true"); return; } t.setAttribute("aria-checked", state[key] ? "true" : "false"); }); } function fromToggles() { var state = { analytics: false, advertisement: false, functionality: false }; Array.prototype.forEach.call(toggles, function (t) { var key = t.getAttribute("data-cpcb-toggle"); if (key in state) state[key] = t.getAttribute("aria-checked") === "true"; }); return state; } function commit(state, revoke) { writeCookie(COOKIE, JSON.stringify({ analytics: !!state.analytics, advertisement: !!state.advertisement, functionality: !!state.functionality, v: 1, ts: Date.now() }), days); apply(state, revoke); hide(); } Array.prototype.forEach.call(toggles, function (t) { if (t.disabled) return; t.addEventListener("click", function () { t.setAttribute("aria-checked", t.getAttribute("aria-checked") === "true" ? "false" : "true"); }); }); banner.addEventListener("click", function (e) { if (!e.target || !e.target.closest) return; var btn = e.target.closest("[data-cpcb-action]"); if (!btn) return; var action = btn.getAttribute("data-cpcb-action"); if (action === "customise") { expand(); return; } if (action === "accept") { commit({ analytics: true, advertisement: true, functionality: true }, false); return; } if (action === "reject") { commit({ analytics: false, advertisement: false, functionality: false }, true); return; } if (action === "save") { commit(fromToggles(), true); return; } }); var existing = stored(); if (existing) { apply(existing, false); paint(existing); collapse(); } else if (!inScope(banner)) { // Out of the consent-required region: implied consent, banner never shown. commitSilently(); } else { collapse(); show(); } function commitSilently() { var all = { analytics: true, advertisement: true, functionality: true }; writeCookie(COOKIE, JSON.stringify({ analytics: true, advertisement: true, functionality: true, v: 1, ts: Date.now(), implied: true }), days); apply(all, false); } // Public re-open hook for a footer "Cookie settings" link. window.cpCookieBanner = window.cpCookieBanner || {}; window.cpCookieBanner.open = function () { var s = stored() || { analytics: false, advertisement: false, functionality: false }; paint(s); expand(); show(); }; } function boot() { var banners = document.querySelectorAll("[data-cpcb]"); if (!banners.length) return; init(banners[0]); document.addEventListener("click", function (e) { if (!e.target || !e.target.closest) return; var trigger = e.target.closest("[data-cp-cookie-settings]"); if (!trigger) return; e.preventDefault(); if (window.cpCookieBanner && window.cpCookieBanner.open) window.cpCookieBanner.open(); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", boot); } else { boot(); } })();