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 Fareye Packages with ClickPost Tracking Page
Open the ClickPost tracking page.
Enter your Fareye AWB number or tracking ID in the tracking field.
Submit the tracking request to fetch the latest shipment details.
View real-time shipment milestones, transit updates, and delivery status on a single tracking dashboard.
Track Fareye Packages on the Official Page
Open the Fareye Delivery tracking page.
Enter your Fareye tracking number in the tracking field.
Click the Track button to retrieve shipment details.
View shipment status, tracking company details, and the latest delivery updates in real time.
List of Fareye APIs
API
Description
Manifestation and Label Generation API
Generate shipping labels and create shipment manifests.
Shipment Tracking API
Retrieve shipment events and tracking milestones.
Cancellation API
Cancel shipments and automate cancellation workflows.
EDD API
Calculate estimated delivery timelines.
NDR Action Update
Manage failed delivery and exception workflows.
Return Webhooks
Automate returns and reverse logistics processes.
API & Description
Manifestation and Label Generation API
Generate shipping labels and create shipment manifests.
Shipment Tracking API
Retrieve shipment events and tracking milestones.
Cancellation API
Cancel shipments and automate cancellation workflows.
EDD API
Calculate estimated delivery timelines.
NDR Action Update
Manage failed delivery and exception workflows.
Return Webhooks
Automate returns and reverse logistics processes.
Frequently asked questions
Everything you need to know about Fareye Carrier Integration
What is Fareye API integration with ClickPost?
Fareye API integration with ClickPost connects Fareye’s delivery ecosystem with ClickPost’s logistics platform to automate shipment creation, tracking, delivery updates, and returns management.
Can ClickPost automate carrier allocation for Fareye shipments?
Yes. ClickPost automatically allocates shipments based on predefined business rules including carrier performance, shipping cost, serviceability, and SLA requirements.
How does ClickPost help reduce WISMO (Where Is My Order) queries for Fareye shipments?
ClickPost provides real-time tracking updates, branded tracking pages, and automated notifications across channels to keep customers informed throughout delivery.
How do I handle webhook failures in FarEye tracking API and set up retry logic?
Return HTTP 200 immediately and process async. Deduplicate using shipment ID + status + timestamp. Use a dead-letter queue with exponential backoff for failed events and retry after 1 min, 5 min, then 30 min. Run a periodic reconciliation job to catch any silently dropped events.
Can Fareye support high-volume logistics operations?
Yes. Fareye supports large-scale logistics operations with shipment orchestration, tracking visibility, and delivery automation capabilities.