Webhooks vs Polling for Shipment Tracking
Once a parcel is with a carrier, your system has to find out when something happens to it. There are only two ways: ask repeatedly, or be told. Both are legitimate, and the choice has more consequences than it first appears.
Polling: asking repeatedly
Polling means your system calls the carrier's tracking endpoint on a schedule — every fifteen minutes, every hour — for shipments that are still in transit, and records anything that changed.
What is good about it
It works with every carrier that has a tracking API, needs no publicly reachable endpoint on your side, and fails in an obvious way: if polling stops, your data goes stale and monitoring notices. You are in control of the timing, so a burst of carrier activity cannot overwhelm you.
What is bad about it
Most polls return nothing new, so you spend API calls to learn that nothing happened. It scales badly — ten thousand active shipments polled hourly is a lot of wasted traffic, and carriers rate-limit. And your data is always up to one polling interval out of date, which shows up as a customer seeing "in transit" when the parcel was delivered forty minutes ago.
Webhooks: being told
A webhook means you give the carrier a URL, and they call it when a shipment's status changes. Your system receives the event and updates the record.
What is good about it
Near real-time updates, no wasted calls, and it scales with actual events rather than with the number of shipments you are watching. For customer-facing tracking and proactive notifications, this is a genuinely better experience.
What is bad about it
You need a publicly reachable, always-available endpoint. If your server is down for ten minutes, you may simply miss those events — some carriers retry, some do not, and the ones that do have their own retry policies. You are also now accepting inbound traffic from a third party, which has to be authenticated.
Webhooks also arrive out of order more often than people expect. A "delivered" event can land before the "out for delivery" event that preceded it, because they took different paths through a queue.
What a webhook endpoint actually needs
Accepting webhooks properly is more work than publishing a URL:
Why production systems use both
The honest answer is that webhooks are better and polling is safer, so mature systems take webhooks as the primary channel and keep a low-frequency poll as a safety net.
That reconciliation poll runs infrequently — perhaps a few times a day — over shipments that have had no events for longer than expected. It catches the cases webhooks silently miss: an outage on your side, a delivery failure on theirs, a shipment that quietly stopped producing events.
It costs very little and it is the difference between "our tracking is usually right" and "our tracking is right".
A practical decision guide
One refinement worth knowing: polling frequency does not have to be uniform. A shipment booked an hour ago and one that has been out for delivery since this morning deserve different intervals. Tiering by expected activity cuts call volume substantially without affecting the data you care about.
Where we come in
We build shipment tracking systems that ingest both, verify and queue webhook traffic, and reconcile against polling so gaps surface rather than accumulate. The related courier API integration work covers the carrier side of the same problem.
More reading
How Courier API Integration Works
What actually happens when your software talks to a courier's API — the endpoints involved, the order they are called in, and the parts that are harder than they look.
Courier API Failure Handling: Retries, Backoff and Idempotency
The difference between an integration that works in testing and one that survives production is entirely in how it behaves when the other side misbehaves.
Tracking Status Normalisation Across Carriers
Every carrier describes the same journey differently. Translating them into one consistent model is the largest hidden cost in multi-carrier tracking — and the thing customers notice when it is missing.