Claim refunds on shipping labels you bought but never used
Every Monday, find the labels you paid for but never shipped, request the refunds automatically, and post the recovered total to your shipping ops channel.
Every Monday at 8am, hunt down postage I paid for but never used and claim the money back. Start with EasyPost List Shipments to pull every label purchased in the last 30 days, paginating until you have the full set.
Before requesting anything, read the existing reclaim ledger in Google Sheets with Get Values. Any tracking code already recorded there as submitted or refunded is done, so drop it from this run. We must never double request a refund on the same label.
For each remaining label, check its tracker with EasyPost Retrieve Tracker, or use List Trackers to pull them in bulk when that is more efficient. The unused label signal is a tracker sitting at unknown or pre_transit with no scan events recorded, meaning the carrier never took possession. A tracker at in_transit or any status beyond it means the label was consumed, so it must never be refunded under any circumstances.
Use judgement about what a quiet tracker actually means. A label bought a few hours ago with no scan is almost certainly just waiting on the carrier's first scan, not an abandoned label. Respect a configurable grace period, default 5 days, measured from the label purchase date: nothing gets a refund request until it has been quiet for at least that long. If a carrier is known to be slow to post first scans, lean toward waiting rather than refunding a label that is genuinely in the network.
For each label that clears those checks, call EasyPost Refund Shipment. Read the refund_status that comes back, which can be submitted, refunded, rejected, or not_applicable. Treat these as genuinely different outcomes. Since 18 October 2025 USPS applies a 14 day hold before processing a refund on a never scanned label, so a request coming back as submitted rather than refunded is the normal case, not a failure. Record the pending state honestly and never report a submitted refund as money already recovered.
Log every outcome to the reclaim ledger in Google Sheets with Append Values, one row per label: purchase date, carrier, service level, tracking code, label cost, refund status, and the date the request was made. This ledger is what the next run reads to skip anything already handled, so write it even when the refund was rejected or not applicable.
Finish with Slack Bot Send a Message to the shipping ops channel summarizing the run: how many labels were submitted for refund, the total dollars now in flight, anything the carrier rejected along with the reason, and how much has actually settled. Keep the in flight total separate from the settled total so nobody counts the money twice.
USPS only accepts unused label refund requests within 30 days of the label being printed. Call out separately in the Slack summary any unused label that is approaching that cutoff, roughly 25 days old or more, and flag it as needing a person to chase before the window closes. That escalation list is the most time sensitive part of the message, so put it where it will not be missed.
What does this prompt do?
- Reviews every shipping label you bought in the last 30 days and picks out the ones the carrier never collected or scanned
- Waits out a grace period you control, five days by default, so a label with a slow first scan is never mistaken for an unused one
- Requests the refund on each genuinely unused label, then logs it to a running spreadsheet ledger with the purchase date, carrier, service level, tracking code and cost
- Skips anything already claimed by reading the ledger first, so the same label is never submitted twice
- Sends your shipping ops channel a Monday summary: refunds now in flight, dollars involved, anything the carrier turned down, and any label running out of time that needs a person
What do I need to use this?
- An EasyPost account that you use to buy shipping labels
- A Google Sheet to hold the reclaim ledger, with a tab for the logged refund history
- A Slack workspace and a channel for your shipping or fulfillment team
- A rough sense of how long your carrier normally takes to record a first scan, so you can set the grace period
How can I customize it?
- Change the grace period before a quiet label counts as unused, five days by default, or set it higher if your carrier is slow to scan
- Change the schedule, the Slack channel it reports to, and how far back it looks for labels
- Adjust when a label gets escalated to a person, so you get a warning further ahead of the refund deadline
- Add your own ledger columns, such as the order number or the warehouse the label was printed at
FAQs
How do you know a label was really never used?
Could it request a refund for a package that is actually on its way?
How long does it take to get the money back?
Can it request the same refund twice?
Is there a deadline for claiming these refunds?
Related templates
Stop buying stale lists. Reps run a saved search, work the results like an inbox, and only the accounts they approve ever reach your CRM.
See how your brand's news coverage and sentiment stack up against four competitors, then let an assistant write the weekly report for you.
One screen showing every social post waiting on approval, sorted by deadline, so reviewers can approve or reject without leaving the page.
Every Monday, find the past champions and closed-won contacts who changed jobs, update Attio, and get the moves worth chasing in Slack.
Staff submit what happened, your social manager edits the copy, picks the accounts and puts it on the calendar without a single spreadsheet.
Drag creators through Sourced to Wrapped on a board grouped by campaign, with audience stats on every card and a one-click brief for each creator.
Stop paying for postage you never used.
Put this on your Monday morning schedule and let it chase every abandoned label before the refund window closes.