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 */
});
});
})();
Track ST Courier Packages with ClickPost Tracking Page
Find your ST Courier AWB number.
Visit the Clickpost Tracking Page
Type in your AWB number.
Click “Track” to see your shipment status.
Track ST Courier Packages on the Official Page
Go to the official ST Courier tracking page.
Enter your order’s specific AWB number.
Hit “Search” to start tracking your shipment.
View the displayed information to find your parcel’s location.
List of ST Courier APIs
API
Description
Manifestation and Label Generation API
Create an order on ST Courier itself and begin generating automated shipping labels.
Track Shipment API
Obtain all tracking information related to ST Courier orders in real-time.
Cancellation API
Effortlessly cancel any order in case your customer changes their mind.
EDD API
Provide accurate delivery estimates and help customers stay in the loop from the get-go.
NDR Action Update
Follow up and take action on any failed delivery to lower your RTO rates.
Return Webhooks
Leverage smart webhooks to instantly create a return order.
API & Description
Manifestation and Label Generation API
Create an order on ST Courier itself and begin generating automated shipping labels.
Track Shipment API
Obtain all tracking information related to ST Courier orders in real-time.
Cancellation API
Effortlessly cancel any order in case your customer changes their mind.
EDD API
Provide accurate delivery estimates and help customers stay in the loop from the get-go.
NDR Action Update
Follow up and take action on any failed delivery to lower your RTO rates.
Return Webhooks
Leverage smart webhooks to instantly create a return order.
Frequently asked questions
Everything you need to know about ClickPost’s Carriers Integration
How does ST Courier API integration work with ClickPost?
ST Courier’s API integration with ClickPost enables you to manage all your carriers in one place and take action for any NDR instantly. This also includes getting access to branded tracking pages, automated delivery notifications, and automated workflows for processing returns.
Is it possible to track multiple shipments from ST Courier at once?
No. The ST Courier tracking page only allows users to track one shipment at a time using its official AWB number.
Can I automate the shipping process with ST Courier through ClickPost?
Yes. Once integrated you can easily automate the entire shipping process on ST Courier. From generating AWB numbers to sending real-time tracking updates, online stores owners have the ability to eliminate various manual tasks.
What happens if there is an issue with the tracking data from ST Courier?
In case you don’t get your parcel information from ST Courier, simply contact our support team and we’ll work out a quick solution.
What are ST Courier API's?
Born in 2007, ST Courier has been in the logistics industry for nearly two decades and has made a name for itself delivering packages within the same day. What started out as a small firm based in Tamil Nadu has today turned into a courier giant consisting of 2000+ branches across the country with the ability to ship to 220+ countries. With 200+ transshipment hubs spread throughout India, the firm also enables businesses to ship larger goods and cargo to various regions, such as urban and rural areas. The company stands by the motto “Serve to all at all places and at all times” and stuck with it through thick and thin, even during the 2020 COVID-19 pandemic. ST Courier, founded by one person, today, employs 13000+ people, and provides delivery services to commercial entities and individuals. Other value-added services of the company include cash-on-delivery and door-step pickup.