Live Auto-Updating Package Tracking in Google Sheets
If you've ever set up package tracking in Google Sheets — with any add-on — you've hit the same wall. You drop a formula, it returns In Transit, you nod, and you move on. A day later you check back and... it still says In Transit. The package was actually delivered six hours ago, but the cell never refreshed.
Every other tracking add-on we've seen has this problem. The formula evaluates once and then sits frozen, until you re-enter it, run a script, click some "refresh" button, or worse — write an Apps Script trigger that pulls new data on a schedule and inevitably breaks. Your Package Tracker is different: our PKG_STATUS_LIVE formula keeps your sheet current on its own.
This guide explains how it works, how to use it, and why it's a meaningful difference for anyone tracking packages at any scale.
The 30-second version
Install Your Package Tracker. In any cell, type:
=PKG_STATUS_LIVE("1Z999AA10123456784", "UPS", TODAY())
That's it. The cell will display the current tracking status — In Transit, Out for Delivery, Delivered, etc. — and it'll keep showing the latest known status as the carrier posts new scans. No scripts, no buttons, no scheduled tasks.
Drag-fill it across 500 rows? That works too. We'll explain why below.
The problem with regular tracking formulas
Google Sheets has a quirk that bites every tracking add-on: custom functions only re-evaluate when their inputs change. Once a cell with =PKG_STATUS("1Z...", "UPS") returns In Transit, Sheets caches that value indefinitely. Even if the package gets delivered ten minutes later, your sheet won't reflect it. The only way to force a re-evaluation is to either (a) re-type the formula, (b) clear and re-enter it, or (c) wrap it in a volatile function like NOW() — except Google specifically blocks NOW() from being passed to custom functions.
Most tracking add-ons paper over this with one of two workarounds:
- Manual "refresh" buttons — you click a menu item, the add-on re-runs every formula. Annoying for daily checks, useless if you forget.
- Apps Script triggers — you grant the add-on permission to run code in the background on a schedule. The OAuth scope is invasive (
script.scriptapp), the trigger limit is tight (20 per script), and any code change requires re-authorization from every user.
We rejected both approaches. Here's what we built instead.
How PKG_STATUS_LIVE actually works
Three pieces, all on our side:
- Carrier push notifications. When you first call
PKG_STATUS_LIVE, our backend registers your tracking number with the global carrier tracking network. From then on, the carrier pushes updates to us every time the package gets scanned, without us having to poll. We get the same real-time event stream the carrier uses internally. - A live cache. Push events update a Cloudflare KV store within milliseconds. Your formula reads from this cache, so cell values reflect the latest known state without ever hitting the carrier directly.
- A daily nudge. The
TODAY()argument you pass into the formula causes Google Sheets to re-evaluate the formula whenever the date changes. That's enough to keep the cell visually current with no extra setup. For instant updates, the menu's Refresh Live Tracking action re-evaluates every_LIVEcell on the active sheet.
The result: from your perspective, the cell just always shows the right thing.
What other add-ons can't do, but _LIVE can
Drag-fill across hundreds of rows without errors
This is the one that surprises people. With most tracking add-ons, dragging a formula across 500 rows fires 500 simultaneous carrier lookups. The carrier's API rate-limits you (every carrier does — 17track caps registrations at 3 per second), and you end up with #ERROR! in the majority of your cells.
_LIVE formulas don't have this problem. Our backend sees the burst and batches the registrations behind the scenes — up to 40 numbers per outbound API call, paced under the carrier's rate limit. Cells display Registering... for the first few seconds and then populate normally. Drag-fill 50 rows, 500 rows, doesn't matter.
Self-heal when a webhook gets dropped
Webhooks aren't 100% reliable. Sometimes a delivery fails. We protect against this by automatically retrying any tracking number that's been pending for too long, with exponential backoff (5 min → 15 min → 45 min → 2 hours → 6 hours). If the carrier eventually has data, we'll get it without you doing anything.
Stay quiet when nothing has changed
If your In Transit package hasn't moved, no events fire, no API calls happen, no quota is consumed. You only "spend" a tracking lookup when you first register a number. Refreshes are free for the lifetime of the package.
How it compares
| Feature | Your Package Tracker (_LIVE) | Other tracking add-ons |
|---|---|---|
| Cells refresh on their own | ✅ Yes | ❌ No |
| Drag-fill 500+ rows safely | ✅ Yes (server-side batching) | ❌ Usually breaks with rate-limit errors |
| Real-time updates from carrier | ✅ Yes (carrier push) | ❌ Usually polls on each read |
| Background retry for missed updates | ✅ Yes (5 min → 6 hour backoff) | ❌ Manual only |
| Requires extra OAuth permissions | ❌ No | Often yes (Apps Script triggers) |
| Sub-daily auto-refresh | ✅ Manual via menu, instant | ❌ Often per-day at best |
| Free trial | ✅ 3 lookups | Varies |
Setup walkthrough
1. Install the add-on
Install Your Package Tracker from the Google Workspace Marketplace. You get 3 free tracking lookups to try it.
2. Lay out your sheet
Three columns is the minimum:
| Col | Header | Example |
|---|---|---|
| A | Tracking Number | 1Z999AA10123456784 |
| B | Carrier | UPS |
| C | Status (LIVE) | (formula) |
3. Drop in the formula
In C2:
=PKG_STATUS_LIVE(A2, B2, TODAY())
You'll see Registering... wait ~10s, then click menu: Your Package Tracker → Refresh Live Tracking for a few seconds. Wait, then click the menu, and the cell populates with the actual tracking status. From now on, you don't have to click that menu again — the cell stays fresh on its own.
4. Drag down for the whole list
Select C2, grab the fill handle, drag down to row 500 (or 1,000, or 5,000 — doesn't matter). Each new row registers the carrier in the background. The first time you drag, you'll see a wave of Registering... cells; over the next minute they populate.
For richer output, also add PKG_SUMMARY_LIVE (one-line summary) and PKG_LAST_EVENT_LIVE (most recent event with location) in adjacent columns.
5. Force-refresh whenever you want
TODAY() re-evaluates the formula daily. If you want fresher values right now — say, you're tracking a package that's supposed to arrive today — click Your Package Tracker → Refresh Live Tracking in the menu. Every _LIVE cell on the active sheet re-evaluates immediately.
Common questions
"Does the daily refresh count against my quota?"
No. The only thing that consumes quota is the initial registration of each unique tracking number. Once registered, refreshes (whether from TODAY(), the menu, or carrier pushes) are free for the life of the shipment.
"What if the package hasn't been scanned yet?"
You'll see Registering... for a few seconds, then either:
- The actual status, if the carrier already has data for that number, or
Registering...continues if the carrier hasn't ingested the number yet.
In the second case, the cell will auto-update once the carrier posts the first scan event — usually within a few hours of label creation. You don't have to do anything; just leave the formula in place.
"Can I still use the old PKG_STATUS formula?"
Yes. Both families of formulas coexist:
PKG_STATUSand friends — manual refresh, 6-hour cache, suitable when you want a snapshot and don't need updates.PKG_STATUS_LIVEand friends — auto-updating, recommended for any ongoing tracking workflow.
You can mix them in the same sheet.
"What about PKG_SUMMARY_LIVE, PKG_LAST_EVENT_LIVE, PKG_EVENTS_LIVE?"
All four _LIVE formulas exist and work the same way. Pass (tracking, carrier, TODAY()) and they each return their respective output, kept current automatically.
"Why TODAY() and not NOW()?"
NOW() is on Google Sheets' internal blocklist for custom function arguments — try it and you'll get #ERROR!. TODAY() works because it only changes once per day, which is enough for our purposes (the carrier push notifications keep the underlying data fresh; TODAY() is just the "nudge" that tells Sheets to re-render the cell).
"What happens if I uninstall the add-on?"
Carrier registrations expire after a period of inactivity, and your KV records eventually time out. Re-installing and re-entering the same formula will start fresh.
When _LIVE is the wrong choice
_LIVE is the right default for most tracking workflows, but two cases call for the older PKG_STATUS:
- You want a frozen snapshot. If you're archiving a final delivery state and never want it to change,
PKG_STATUS(with its 6-hour cache) gives you a value that won't move on you. - You're auditing a one-time data pull. Use Bulk Track Packages from the menu — it does a synchronous fetch and writes static values into the sheet. No live updates, no
_LIVEformulas needed.
For everything else — daily ops dashboards, customer service queues, ongoing fulfillment tracking — _LIVE is the answer.
The takeaway
For years, "tracking in Google Sheets" meant accepting that your data was always somewhere between an hour and a day stale. Either you ran scripts, you paid for a SaaS dashboard, or you accepted reality and clicked refresh constantly.
That's no longer necessary. PKG_STATUS_LIVE("1Z...", "UPS", TODAY()) gives you the same live carrier-push tracking that big logistics platforms charge serious money for, in a single Google Sheets formula, for $19/month flat. Drag it across your shipment list, and never think about freshness again.
Install Your Package Tracker free from the Google Workspace Marketplace →