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 Aramex Packages with the ClickPost Tracking Page
Get your Aramex tracking codes.
Visit the official tracking portal of ClickPost.
Click “Track.”
Wait for a few seconds to get real-time updates on the shipments.
Track Aramex Packages with the Official Page
Launch Aramex’s shipment tracking portal.
Enter the tracking codes in the given box. You can enter multiple codes by separating them with a comma or space.
Click on the “Track” button.
It will show the updates on the screen shortly.
List of Aramex APIs
API
Description
Manifestation and Label Generation API
Instantly create bulk shipping labels and AWB numbers automatically.
Track Shipment API
View the entire tracking journey on a unified dashboard.
Cancellation API
Cancel shipments instantly by making a simple API call.
EDD API
Keep customers informed of the real-time delivery estimates.
NDR Action Update
Send NDR reports to carriers and resolve them instantly to reduce RTOs.
Return Webhooks
Track customer returns and refunds with Aramex-enabled webhooks.
API & Description
Manifestation and Label Generation API
Instantly create bulk shipping labels and AWB numbers automatically.
Track Shipment API
View the entire tracking journey on a unified dashboard.
Cancellation API
Cancel shipments instantly by making a simple API call.
EDD API
Keep customers informed of the real-time delivery estimates.
NDR Action Update
Send NDR reports to carriers and resolve them instantly to reduce RTOs.
Return Webhooks
Track customer returns and refunds with Aramex-enabled webhooks.
Frequently asked questions
Everything you need to know about ClickPost’s Carriers Integration
What Aramex shipping services are supported via ClickPost?
Integrating Aramex with ClickPost presents various services needed for improving overall logistics performance and customers’ post-purchase experience. These include automated carrier allocation, order creation, multi-carrier order tracking, delivery delays and failed delivery management, returns management, customer notifications, and so on. Plus, merchants will also get in-depth reports on various operational activities to improve future shipping performance.
How does ClickPost handle delivery exceptions for Aramex shipments?
ClickPost’s NDR management API instantly updates Aramex’s databases with the latest NDR reports. It then segregates them into issue-specific budgets and automates the customer engagement workflow. After that, the responses are relayed back to carriers for the next attempts. ClickPost has launched its AI-powered delivery exceptions manager, Parth, to make the feedback loop much more efficient.
Does ClickPost automate order manifesting and pickup scheduling for Aramex?
Yes! ClickPost automates order manifesting and pickup scheduling for Aramex. Its order manifestation API lets merchants create shipping labels in bulk, and the pickup request API allows them to send a pickup request to the carriers automatically.
Are customers notified about Aramex shipments via ClickPost notifications?
ClickPost triggers automated notifications about Aramex shipments to shoppers at each step of the delivery process. These notifications can also be configured with personalized content, brand details, and customers’ native languages.
What is Aramex?
Established in 1982, Aramex is one of the leading integrated logistics service providers in the UAE. This logistics giant is serviceable across 65 countries worldwide and has integrated a workforce of over 17,000 professionals to successfully manage logistics operations across different locations. Aramex’s service portfolio consists of a wide range of services. The Aramex freight service includes solutions like air freight, sea freight, land freight, domestic freight, and international freight. With the air freight solution, you can fulfill international shipments in 2-3 days. Plus, it also offers LCL and FTL services under its air freight and land freight solutions. Alongside these, e-commerce businesses will benefit from same-day door-to-door domestic delivery, doorstep collection, COD, and pick-up and drop-off services with Aramex. To facilitate a faster and more efficient shipping journey, Aramex has established 60+ facilities across 29 countries. The temperature-controlled service offered by Aramex is a perfect solution for businesses planning to ship time-sensitive products domestically and internationally. ClickToShip is a native shipping management platform offered by Aramex through which businesses can calculate shipping rates, automate preparation, and manage delivery addresses. To help customers with the shopping process, Aramex has come up with the Shop & Ship solution. It offers some custom addresses to shoppers so they can utilize these addresses while shopping from websites that are not serviceable in their locations.