“Where is my shipment?” is the most expensive question in logistics. Every time a customer has to ask it by phone or email, someone on your team stops doing revenue work to answer it. A wordpress theme with shipment tracking in place — a real track-and-trace page on your own domain — turns that call into a self-service lookup, and turns your website from a brochure into an operational tool customers return to weekly.
This is a build guide. It covers what the page has to do, the two architectures you can choose between, how to construct the page in Moovit, how to wire it to a carrier API, what mobile and accessibility actually require, and the point at which you should stop building and buy a transport management system instead.
What customers expect from a tracking page
Consumer parcel carriers have set the bar, and B2B shippers arrive at your site carrying that expectation whether or not it is fair. Strip it back and there are five things a tracking page must do.
- Find the shipment from one field. A reference number, typed or pasted, and nothing else. Do not ask for a postcode, an account login or a date range as well. Every extra required field is a support call you were trying to avoid.
- Answer the real question first. The question is not “what is the event history?” — it is “when will it arrive?”. Put the current status and the estimated delivery at the top, in large type. The event log goes underneath.
- Be honest about staleness. Show when the status was last updated. A page that displays “In transit” with no timestamp is worse than no page, because the reader cannot tell whether it is four minutes or four days old.
- Explain exceptions in plain language. “Held at customs — we have filed the entry and expect release within 48 hours” prevents a call. A bare code such as
EXC-04guarantees one. - Give a route out. Every result, especially a failed lookup, needs an obvious next step: the reference format explained, a contact link, and your operating hours.
Something to decide before you build: is the page public or authenticated? A public lookup on a reference number is the lowest-friction option and the industry norm, but the reference is then the only secret protecting shipment data. If your consignments carry commercially sensitive detail — consignee names, values, commodities — either put the page behind a login or limit the public view to status and ETA only, with the detail reserved for signed-in account users.
Tracking by reference vs carrier API
Every cargo tracking website is one of two architectures underneath. The choice determines your cost, your build time and how fresh the data is.
Reference lookup against your own records
You hold the shipment status yourself — in a custom post type, a database table, or a spreadsheet synced nightly — and the page queries it. Your operations team updates statuses as milestones happen.
This is genuinely fine for a forwarder or a moving company handling tens of shipments a week on lanes you control. It is cheap, it has no third-party dependency, and the wording is entirely yours. Its weakness is discipline: the page is exactly as current as the last person who updated it, so if milestones are entered once a day, say so on the page.
Carrier API pass-through
The page takes the reference, calls the carrier’s tracking API in real time, and renders what comes back. Data is as fresh as the carrier’s network, and nobody on your team maintains it.
The costs are integration and fragility. You need credentials per carrier, you have to map each carrier’s status vocabulary onto your own, and when the carrier’s API is down your page is down. Multi-carrier aggregators exist precisely to absorb that, at a per-lookup or monthly fee.
| Own records | Carrier API | |
|---|---|---|
| Data freshness | As good as your process | Near real time |
| Build effort | Low | Medium to high |
| Ongoing cost | Staff time | API fees, or an aggregator subscription |
| Works offline of carriers | Yes | No |
| Multi-carrier | Uniform by design | Needs status mapping per carrier |
| Best fit | Forwarders, movers, regional fleets | Courier, parcel, high-volume 3PL |
The pragmatic answer for most mid-size operators is a hybrid: your own records as the source of truth for your milestones, enriched with a carrier lookup for the leg you have subcontracted. Build the reference-lookup page first. It is useful on its own, and it becomes the front end for the API later without being rewritten.
Building the tracking page in Moovit
Two things to be clear about before the steps. Moovit is a theme: it supplies the page templates, the styling, the enquiry forms and three ways to build a layout. It does not ship a tracking engine, and no WordPress theme does — tracking data comes from a shipment tracking plugin wordpress installs alongside the theme, or from your own carrier integration. What the theme gives you is a place to put it that looks like the rest of your site and takes an afternoon rather than a sprint.
- Create the page and give it a permanent URL. Use
/tracking/or/track-your-shipment/and never change it afterwards. This URL goes on invoices, in dispatch emails and on printed paperwork; it has to survive a redesign. - Pick your build surface. Moovit, our logistics and cargo WordPress theme supports three build methods — its bundled Aheto drag-and-drop builder, Elementor, and native Gutenberg blocks. Use whichever your team already works in; the tracking form is a shortcode or a widget either way.
- Install the tracking source. Either a tracking plugin that stores shipments and exposes a lookup shortcode, or your own lightweight endpoint. Keep the status vocabulary short and fixed — booked, collected, in transit, at customs, out for delivery, delivered, exception. Seven states a customer understands beat thirty a carrier understands.
- Build the result layout top-down. Current status and ETA in the largest type on the page; reference, origin and destination beneath; the event log last, newest first, each row with a timestamp and a location. Resist adding fields nobody asked for.
- Design the failure state deliberately. The “not found” result is the one customers see when they are already frustrated. Show the expected reference format with a worked example, note that new bookings can take a few hours to appear, and put a contact link and your hours directly beneath.
- Put the entry field in the header. A tracking box in the site header on every page removes a navigation step. Moovit’s header customisation supports global and per-page headers with search and contact elements, so this is a header setting rather than a template edit.
- Wire the confirmation emails. A tracking page only pays for itself if customers know it exists. The booking confirmation and dispatch notice should both carry the reference and a direct link to the tracking URL.
One setup note worth budgeting for: Moovit’s one-click demo import brings in the homepage layouts and page templates, but it does not configure SMTP, notification addresses or any third-party API credentials. Those are environment-specific and are a separate session’s work.
Connecting a carrier API
When you move to live carrier data, five things decide whether the integration is maintainable.
Keep credentials out of WordPress content
API keys belong in wp-config.php or an environment variable, read by a small plugin — never in a page, a shortcode attribute or a theme option that ends up in a database export. Treat the tracking integration as code, kept in version control, not as site configuration.
Cache aggressively, and show the cache age
Carrier tracking updates on scan events, not continuously, so a five to fifteen minute cache per reference costs the customer nothing and protects you from rate limits and from a bot hammering your page. Pair it with the “last updated” timestamp so the caching is visible rather than deceptive.
Map statuses once, centrally
Every carrier has its own vocabulary. Write one mapping table from carrier codes to your seven customer-facing states, and render only your states. Doing this per-template is how tracking pages end up showing raw carrier codes to customers eighteen months later.
Fail visibly, not silently
When the carrier API times out, say so — “live tracking is temporarily unavailable; last known status at 14:20” — and log it. A page that silently renders an empty result trains customers to phone instead, which is the cost you were trying to remove.
Rate-limit the public form
A public lookup field is a free query against a paid API. Throttle by IP, add a light bot check, and validate the reference format before spending a call. Without this, one scraper can turn a modest API bill into a large one overnight.
Mobile and accessibility
Tracking is checked on a phone, often outdoors, often one-handed, frequently by someone waiting on a delivery. The track and trace page is the page on a logistics site where mobile quality matters most, and it is usually the least tested.
- Set the right keyboard. Numeric references should trigger a numeric keypad; alphanumeric ones should disable autocapitalisation and autocorrect, which silently mangle pasted references.
- Accept the reference as it is pasted. Strip spaces, hyphens and a leading
#server-side rather than rejecting the input. People paste from emails and PDFs, complete with formatting. - Make the status readable without zooming. Large type, and a status that is never conveyed by colour alone — pair every colour with text or an icon, so it survives both colour blindness and bright sunlight.
- Label the field properly. A real
<label>, not placeholder text: placeholders vanish on focus and are skipped by some screen readers. - Announce the result. Render the result into an ARIA live region so a screen reader reads the new status without the user hunting for it, and move focus to the result heading.
- Make the event log a real table with proper headers, not a grid of divs. Assistive technology can then navigate it row by row.
The relevant standard is WCAG 2.2, and the parts that bite hardest here are contrast, target size and the use of colour. Test the page once on a real handset in daylight before launch; it exposes more than any emulator.
When to outsource to a TMS
Building tracking into your website is the right call up to a point, and past it you are writing logistics software badly. The signals that you have crossed the line:
- You are maintaining integrations with more than two or three carriers, each with its own status vocabulary and its own outages.
- Customers are asking for things beyond status — proof of delivery images, documents, invoices, booking changes. That is a portal, not a page.
- Your operations team is entering the same milestone into the website and into another system. Duplicate data entry always ends in a contradiction a customer notices.
- You need per-account visibility rules, so different logins see different shipments.
- Tracking downtime has become a commercial issue, and you need someone contractually accountable for uptime.
At that point buy a TMS or a multi-carrier visibility platform and let your website embed or link to it. The website’s job reverts to what it is good at — being found, explaining the service, and capturing the enquiry. That is a much cheaper place to spend your development budget than a tracking engine you now have to keep alive.
Choosing a WordPress theme with shipment tracking in mind
No theme ships a tracking engine, so what you are really choosing is a theme that gives the page a good home — header customisation, service pages to link it from, and a builder your team can edit without a developer. Almost every operator who ends up with good tracking started with a plain reference-lookup page and improved it as volume justified it. Build the page, put it in the header, link it from every confirmation email, and see how much phone traffic it removes before you spend anything on APIs.
If you are starting from scratch, Moovit, our logistics and cargo WordPress theme gives you the service pages, header customisation and layout tools to stand this up quickly. Pair it with an instant freight quote calculator and you have both halves of a self-service freight website. You can also browse our full range of business and logistics WordPress themes.

Recent Comments