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 Zajil Express Packages with the ClickPost Tracking Page
Locate the Zajil Express track number
Visit the Clickpost Tracking Page
Enter the Zajil Express tracking number in the given box.
Hit the “Track” button to check the order status.
Track Zajil Express Packages on the Official Page
Visit the Zajil Express website and enter the tracking number or your mobile number to track the shipment.
Enter the tracking numbers, each separated by a comma.
Click on the “Track” button.
In a few seconds, you will see the shipment status on the screen.
List of Zajil Express APIs
API
Description
Manifestation and Label Generation API
Generate multiple shipping labels to fast-forward the shipping process.
Tracking Shipment API
Keep an eye on real-time shipment information on a centralized portal.
Cancellation API
Cancel orders effortlessly with this API.
EDD API
Display accurate estimated delivery dates to maintain transparency with customers.
NDR Action Update
Tackle NDR cases by taking immediate action on them and reduce RTO percentage.
Return Webhooks
Initiate the reverse logistics process using Zajil Express-integrated webhooks.
API & Description
Manifestation and Label Generation API
Generate multiple shipping labels to fast-forward the shipping process.
Tracking Shipment API
Keep an eye on real-time shipment information on a centralized portal.
Cancellation API
Cancel orders effortlessly with this API.
EDD API
Display accurate estimated delivery dates to maintain transparency with customers.
NDR Action Update
Tackle NDR cases by taking immediate action on them and reduce RTO percentage.
Return Webhooks
Initiate the reverse logistics process using Zajil Express-integrated webhooks.
Frequently asked questions
1. How does ClickPost integrate with Zajil Express for courier and freight services?
ClickPost offers a universal API that integrates with Zajiil Express. The integration process involves getting Zajil’s documentation and credentials and configuring them with the ClickPost account. The next step includes developing the logic to fetch updates and sending shipping information. The final steps include the testing and staging stages.
2. Is label creation for Zajil Express orders automated through ClickPost?
Label creation for Zajil orders is automated through the ClickPost platform. ClickPost offers a label creation and order manifestation API to generate shipping labels in high volumes. This fast-forwards the order dispatch process
3. Can ClickPost fetch delivery proof and recipient data from Zajil?
Yes. ClickPost can fetch the delivery proof and recipient data from Zajil. The logistics intelligence platform uses capable APIs to fetch delivery proof automatically. It includes electronic proofs of delivery, such as e-signatures and photographs.
4. Does ClickPost support reverse pickup and return workflows for Zajil?
Yes, it does. ClickPost supports a complete suite of automated shipping solutions for Zajil Express, including return workflows and reverse pickups. With ClickPost’s Return Pro platform, customers can initiate returns and exchange requests for Zajil’s order on the platform.
5. What is Zajil Express API?
Zajil Express is a goods delivery service provider based in Saudi Arabia. It launched in Unaziah in 1999 as a store-to-store express service. Today, Zajil’s network spans all over the UAE and the GCC regions. The logistics giant is headquartered in Riyadh, where it serves over 20 eCommerce companies and corporate customers. Its specialized technologies empower 20 million deliveries per day.In 2025, it operated as a postal service with B2B, Cold Deliveries, and Heavy shipping. In 2018, it took it one step further by managing shipments in 100 locations with last-mile delivery and door-to-door fulfillment. In 2020, it expanded to China, UAE, USA, Kuwait, and Bahrain and reached 7+ million customers in 2021. Zajil’s solutions include e-commerce shipping, freight forwarding, fulfillment, and domestic distribution. These solutions encompass SME services, Returns management, B2C, cross-border delivery, Co-Packing, Air freight, Sea freight, Customs Clearance, warehousing, last-mile delivery, same-day, drop shipping, and more.