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 Qatar Post Packages with the ClickPost Tracking Page
Retrieve your Qatar Post tracking number from your order confirmation or shipping notification.
Visit the ClickPost Tracking Page for your brand.
Enter your tracking number in the designated field.
Click Track to view live shipment status, expected delivery date, and milestones.
Track Qatar Post Packages with the Official Page
Visit the Qatar Post homepage and locate the tracking section.
Enter your tracking ID in the search field.
Complete the CAPTCHA verification.
Click the search icon to get real-time updates on your shipment.
List of Qatar Post APIs
API
Description
Manifestation and shipping label generation API
Create shipping labels for multiple Qatar Post shipments at once to accelerate order dispatch and eliminate manual processing.
Track Shipment API
Get full transparency on all Qatar Post consignments from a unified ClickPost dashboard with real-time status updates and automated alerts.
Cancellation API
Cancel Qatar Post orders on demand via ClickPost in seconds — no manual carrier requests needed.
EDD API
Display accurate expected delivery dates at checkout and on product pages to boost customer trust and reduce inbound queries.
NDR Action Update
Update Qatar Post NDR statuses in real time, push corrected delivery instructions back to the carrier, and reduce RTO rates.
Return Webhooks
Automate the entire Qatar Post returns and refund process using integrated webhooks for seamless reverse logistics.
API & Description
Manifestation and shipping label generation API
Create shipping labels for multiple Qatar Post shipments at once to accelerate order dispatch and eliminate manual processing.
Track Shipment API
Get full transparency on all Qatar Post consignments from a unified ClickPost dashboard with real-time status updates and automated alerts.
Cancellation API
Cancel Qatar Post orders on demand via ClickPost in seconds — no manual carrier requests needed.
EDD API
Display accurate expected delivery dates at checkout and on product pages to boost customer trust and reduce inbound queries.
NDR Action Update
Update Qatar Post NDR statuses in real time, push corrected delivery instructions back to the carrier, and reduce RTO rates.
Return Webhooks
Automate the entire Qatar Post returns and refund process using integrated webhooks for seamless reverse logistics.
Frequently asked questions
What is Qatar Post and what services does it offer?
Qatar Post is the national postal service of Qatar, offering local, international, and express delivery services. It serves individuals and businesses across Qatar and connects to global postal networks, making it a reliable carrier for regional and cross-border e-commerce shipments.
How do I track a Qatar Post shipment?
Enter your tracking ID on the Qatar Post website and complete the CAPTCHA to view the live status. For a branded experience with milestones and EDD, use ClickPost's unified tracking page linked to your store.
Does Qatar Post support international delivery?
Yes. Qatar Post offers international delivery services connecting Qatar to global destinations. Through ClickPost, international Qatar Post shipments are tracked and managed from a single dashboard with automated customer notifications.
How does ClickPost integrate with Qatar Post?
ClickPost integrates with Qatar Post via an API to provide real-time tracking and label generation. All shipment data syncs automatically; no manual portal access needed.
How does ClickPost help convert COD orders to prepaid for Qatar Post shipments?
ClickPost's smart automation identifies COD orders and nudges customers toward prepaid through personalized communication and incentives, enabling up to a 10% COD-to-prepaid conversion that improves cash flow and reducing RTO risk.
How does ClickPost reduce WISMO queries for Qatar Post shipments?
ClickPost's branded tracking pages and automated notifications via WhatsApp, SMS, and email keep customers updated at every Qatar Post delivery milestone, reducing WISMO queries by up to 76% without any manual effort from your team.