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 */ }); }); })();

91ÊÓƵ

Assess Your Post-Purchase Brand Readiness Start Assessment

G2 - Orange BG 4.8 G2 Rating 2

Shipment Tracking Software That Becomes Your Next Sale

ClickPost gives US shoppers branded, real time tracking across FedEx, UPS, USPS, DHL, and 600 plus carriers. Keep them on your brand, cut status tickets, recover lost revenue.

47% higher NPS
60% fewer WISMO queries
600+ carriers
tracking-banner-561

One integration for the carriers your US shoppers use

Live demo · Shipment tracking

Walk the branded tracking journey your shopper sees

Every step is built to keep the shopper informed, on your brand, and one tap from their next order. Click a step, or press start and move through it yourself.

Four ways ClickPost tracking builds your brand and cuts cost

One platform for tracking data, shopper communication, and the analytics that tell you what to fix next.

Curb return policy abusers

Multi carrier tracking

One integration normalizes status across FedEx, UPS, USPS, DHL, and 500 plus carriers.
500+
Convert returns

Proactive comms

Branded email, SMS, and push alerts on every milestone, with early delay warnings.
60% fewer WISMO
Returns, now your repurchase moments

Branded tracking pages

Tracking on your domain with recommendations that turn a status check into a second order.
47% NPS lift
Automate reverse logistics, end to end

Automate reverse logistics, end to end

Watch WISMO trends, delivery performance, and NPS, and capture feedback in the tracking view.
1 dashboard
Proactive communication

Answer where is my order before the shopper asks

Silence is what drives support tickets. ClickPost fills the gap with timely, on brand updates and early warnings when a shipment slips. Switch channels to preview the same milestone across email, SMS, and push.

  • Milestone updates by email, SMS, and push, styled to match your store.
  • Delay and exception alerts that let shoppers act instead of worry.
  • Delivery estimates shown before and after purchase to set expectations.
  • Auto translated updates for shoppers you serve outside the US.
Your Store: Order #US-100482 has shipped via FedEx. Arriving Wed, Aug 14. 9:12 AM
Update: your package is out for delivery, arriving by 7 PM today. Track: yourstore.com/track 8:04 AM
Thanks, that is so much clearer than the carrier site 8:05 AM
9:41Wednesday, August 14
Your Store
Out for delivery, arriving by 7:00 PM today.
now
Your Store
Delivered. How did we do? Rate your delivery.
7h
every shipment data
Apex Control Tower - Icon Control tower

See every shipment and act on what the data shows

Filter, track, and resolve exceptions from one portal, and turn delivery performance into better carrier decisions.
  • icon End to end visibility of every order and shipment in a single view.
  • icon Exception resolution so delays get fixed before they become refunds.
  • icon WISMO and NPS trends that tell you where post purchase is leaking value.
  • icon Carrier performance insights to route future shipments smarter.
60%
fewer WISMO queries
47%
higher customer NPS
54%
returns converted to exchanges
22%
savings on logistics cost
Tracking ROI calculator

See what better tracking is worth to you

Enter your numbers to estimate the support cost you can save and the incremental revenue branded tracking can recover in a year.

1. Tell us about your business

Defaults are typical benchmarks. Change any value to fit your business.

2. Fine-tune the impact assumptions

Defaults are ClickPost platform benchmarks. Leave them for a conservative estimate, or match your own data.

Compare

How ClickPost compares to AfterShip, Narvar, and parcelLab

CAPABILITIES
Carriers integrated
Branded tracking page on your domain
Proactive email, SMS, and push alerts
Product recommendations on tracking page
WISMO analytics and NPS capture
AI carrier allocation and exception management
Returns and exchanges in the same platform
Typical time to go live
CLICKPOST
600+
Email, SMS, push
Built in
Real time
Days
AFTERSHIP
1,100+
Email, SMS, WhatsApp
Add-on / marketing assets
Analytics dashboards
Limited
Days to weeks
NARVAR
Broad, carrier-agnostic
Email, SMS
Yes
Analytics suite
Predictive ETA (IRIS)
Weeks to months
PARCELLAB
350+
Email, SMS
Limited
Analytics suite
AI delay prediction
Via partners
Weeks

Competitor details are compiled from public sources and marketing material as of August 2026 and may change. Verify against each vendor's current documentation before publishing.

INTEGRATIONS

Plugs into your stack 
almost instantly

Native integrations for Shopify and Shopify Plus. First-class integrations with every US carrier and the CX tools your team already runs.

Frame 1410114536 (8)
Shopify & Shopify Plus one-click install, variant-level exchanges out of the box.
Frame 1410114536 (9)
FedEx, UPS, USPS, DHL pre-paid labels, drop-off tracking, rate-shopping built in.
Frame 1410114536 (10)
Klaviyo, Gorgias, Attentive, Zendesk every return event, in the tools you already use.
Frame 2147227962
THE LEADER IN POST-PURCHASE

Powering 600+ leading retail brands

From the first tracking scan to the final return, ClickPost powers everything that happens after checkout.

  • BG

    We’ve been using Clickpost and it’s genuinely been super helpful. The post-purchase upsells have been a solid bonus for incremental revenue.

    Samarth Sindhi
    Samarth Sindhi
    Chief Executive Officer, MarsGHC
  • Birkenstock - Testimonial Image

    ClickPost’s team were experts in their systems and integrated seamlessly with ours. They proactively resolved every issue, ensuring a smooth experience.

    Sonali Das
    Sonali Das
    D2C Tech and Product Head, Birkenstock
  • VanillaPura - BG

    Great experience and fantastic support from ClickPost. This immediately cut our top post-purchase support tickets, making ROI easy to quantify. Plus, the customization features and upsell tools help increase AOV. Highly recommend.

    Paul Fulton
    Paul Fulton
    VanillaPura
  • GOPURE - Slider BG

    ClickPost helped us create a return experience that fit our business instead of forcing us to fit the platform. They customized our workflows without additional costs or developer support. The automation they built for our returns, freed up 5 hours a week.

    Sandy Vangyi
    Sandy Vangyi
    Director of CX, GOPURE
Proof & recognition

Loved by buyers. Recognized by G2. Audited for the enterprise.

users-love-us G2 2026 JAN 1
Momentum Leader Jan 2026 1
Users Most Likely To Recommend - G2
High Performer Mid Market G2 2026 JAN 1 (1)
Enterprise-grade certifications
ISO 27001 SOC 2 Type II GDPR Compliant CCPA Compliant

It replaces silent shipping with real time updates on a branded page plus proactive alerts. Shoppers always know where their order is and what to do if something changes, which raises trust and repeat purchase rates.

ClickPost pushes real time status to the shopper before they need to ask, resolves exceptions early, and answers where is my order queries on the tracking page itself. Brands on ClickPost see up to 60% fewer order status queries.

Yes. ClickPost normalizes tracking data across FedEx, UPS, USPS, DHL, and 500 plus carriers through a single integration, so every shipment shows a consistent status regardless of who is carrying it.

A branded tracking page is a tracking view hosted on your own domain with your logo, colors, and product recommendations. It keeps shoppers on your brand during the highest engagement window after purchase instead of sending them to a carrier site.

Most teams launch branded tracking in days using prebuilt carrier and platform connectors, with no engineering lift required for standard setups.

Savings come from deflected support tickets, fewer failed deliveries and returns, and incremental revenue from tracking page visits. Use the ROI calculator on this page to estimate your own numbers.

Order tracking follows the full order from purchase to delivery, including processing and fulfillment. Shipment tracking focuses on the parcel once a carrier picks it up. ClickPost covers both in one branded view so shoppers see the whole journey.

Yes. ClickPost connects to Shopify along with Magento, WooCommerce, BigCommerce, and Salesforce Commerce Cloud, so tracking pages and notifications work with your existing store setup.

Accurate status, address validation, and early exception handling cut failed deliveries and reattempts. Clear delivery expectations and easy exchanges also reduce the returns that come from delivery uncertainty.

4.8 Ratting Stars - White
4.4 Rating Stars White 4.4

Ready to Turn Order Tracking into Your Best Retention Channel

See ClickPost Shipment Tracking in action. Book a 30-minute personalized demo with our team, no scripted slides.
. window.disableHubSpotCookieBanner = true; function killNative() { var n = document.getElementById("hs-eu-cookie-confirmation"); if (n && n.parentNode) { n.parentNode.removeChild(n); return true; } return false; } killNative(); if (window.MutationObserver) { var mo = new MutationObserver(function () { killNative(); }); mo.observe(document.documentElement, { childList: true, subtree: true }); setTimeout(function () { mo.disconnect(); }, 15000); } var COOKIE = "cp_cookie_consent"; var EU = ["at","be","bg","hr","cy","cz","dk","ee","fi","fr","de","gr","hu","ie","it","lv","lt","lu","mt","nl","pl","pt","ro","sk","si","es","se","gb","uk","is","li","no","ch"]; function readCookie(nm) { var m = document.cookie.match(new RegExp("(?:^|; )" + nm + "=([^;]*)")); return m ? decodeURIComponent(m[1]) : null; } function writeCookie(nm, val, days) { var d = new Date(); d.setTime(d.getTime() + (days * 864e5)); document.cookie = nm + "=" + encodeURIComponent(val) + ";expires=" + d.toUTCString() + ";path=/;SameSite=Lax" + (location.protocol === "https:" ? ";Secure" : ""); } function stored() { var raw = readCookie(COOKIE); if (!raw) return null; try { var o = JSON.parse(raw); if (typeof o.analytics === "boolean") return o; } catch (e) {} return null; } function apply(state, revoke) { window._hsp = window._hsp || []; window._hsp.push(["setHubSpotConsent", { analytics: !!state.analytics, advertisement: !!state.advertisement, functionality: !!state.functionality }]); if (revoke && !state.analytics && !state.advertisement && !state.functionality) { window._hsp.push(["revokeCookieConsent"]); } window.dataLayer = window.dataLayer || []; window.dataLayer.push({ event: "cp_cookie_consent", cp_consent_analytics: !!state.analytics, cp_consent_advertisement: !!state.advertisement, cp_consent_functionality: !!state.functionality }); document.documentElement.setAttribute("data-cp-consent", "set"); } function inScope(banner) { if (banner.getAttribute("data-scope") !== "eu_only") return true; var geo = (document.body.getAttribute("data-geo_location") || "").toLowerCase(); if (!geo) return true; return EU.indexOf(geo) !== -1; } function init(banner) { var days = parseInt(banner.getAttribute("data-days"), 10) || 180; var prefs = banner.querySelector("[data-cpcb-prefs]"); var compact = banner.querySelector('[data-cpcb-actions="compact"]'); var expanded = banner.querySelector('[data-cpcb-actions="expanded"]'); var toggles = banner.querySelectorAll("[data-cpcb-toggle]"); function show() { banner.hidden = false; requestAnimationFrame(function () { banner.classList.add("is-visible"); }); } function hide() { banner.classList.remove("is-visible"); setTimeout(function () { banner.hidden = true; }, 300); } function collapse() { if (!prefs) return; prefs.hidden = true; if (expanded) expanded.hidden = true; if (compact) compact.hidden = false; } function expand() { if (!prefs) return; prefs.hidden = false; if (compact) compact.hidden = true; if (expanded) expanded.hidden = false; } function paint(state) { Array.prototype.forEach.call(toggles, function (t) { var key = t.getAttribute("data-cpcb-toggle"); if (key === "necessary") { t.setAttribute("aria-checked", "true"); return; } t.setAttribute("aria-checked", state[key] ? "true" : "false"); }); } function fromToggles() { var state = { analytics: false, advertisement: false, functionality: false }; Array.prototype.forEach.call(toggles, function (t) { var key = t.getAttribute("data-cpcb-toggle"); if (key in state) state[key] = t.getAttribute("aria-checked") === "true"; }); return state; } function commit(state, revoke) { writeCookie(COOKIE, JSON.stringify({ analytics: !!state.analytics, advertisement: !!state.advertisement, functionality: !!state.functionality, v: 1, ts: Date.now() }), days); apply(state, revoke); hide(); } Array.prototype.forEach.call(toggles, function (t) { if (t.disabled) return; t.addEventListener("click", function () { t.setAttribute("aria-checked", t.getAttribute("aria-checked") === "true" ? "false" : "true"); }); }); banner.addEventListener("click", function (e) { if (!e.target || !e.target.closest) return; var btn = e.target.closest("[data-cpcb-action]"); if (!btn) return; var action = btn.getAttribute("data-cpcb-action"); if (action === "customise") { expand(); return; } if (action === "accept") { commit({ analytics: true, advertisement: true, functionality: true }, false); return; } if (action === "reject") { commit({ analytics: false, advertisement: false, functionality: false }, true); return; } if (action === "save") { commit(fromToggles(), true); return; } }); var existing = stored(); if (existing) { apply(existing, false); paint(existing); collapse(); } else if (!inScope(banner)) { // Out of the consent-required region: implied consent, banner never shown. commitSilently(); } else { collapse(); show(); } function commitSilently() { var all = { analytics: true, advertisement: true, functionality: true }; writeCookie(COOKIE, JSON.stringify({ analytics: true, advertisement: true, functionality: true, v: 1, ts: Date.now(), implied: true }), days); apply(all, false); } // Public re-open hook for a footer "Cookie settings" link. window.cpCookieBanner = window.cpCookieBanner || {}; window.cpCookieBanner.open = function () { var s = stored() || { analytics: false, advertisement: false, functionality: false }; paint(s); expand(); show(); }; } function boot() { var banners = document.querySelectorAll("[data-cpcb]"); if (!banners.length) return; init(banners[0]); document.addEventListener("click", function (e) { if (!e.target || !e.target.closest) return; var trigger = e.target.closest("[data-cp-cookie-settings]"); if (!trigger) return; e.preventDefault(); if (window.cpCookieBanner && window.cpCookieBanner.open) window.cpCookieBanner.open(); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", boot); } else { boot(); } })();