Skip to content
ParsedMail

Shipping notification parser

A shipping notification parser reads tracking emails from carriers such as UPS, FedEx, DHL and USPS, and ship notices from suppliers, and returns the carrier, tracking number, order reference, status and expected delivery date as typed JSON. ParsedMail sends it by webhook or API to your ERP, inventory tool or customer notifications.

Email received

From: Fulfillment <[email protected]> Subject: Your order 88-4410 has shipped Good news, part of your order 88-4410 is on its way. Carrier: FedEx Ground Tracking: 7489 2210 5563 Shipped: October 13, 2026 Estimated delivery: Friday, October 16, 2026 Packages: 2 In this shipment: - Nitrile gloves, size M, box of 100 (qty 20) - Hand sanitizer refill 1 gal (qty 4) Still to ship: Paper towel rolls (qty 12), expected next week. Track your package anytime in your account.

Fields described as

carrier, tracking number, order reference, shipment status (label created, in transit, out for delivery, delivered, exception), ship date, estimated delivery date, number of packages, items shipped with quantity

JSON delivered to your webhook

{
  "carrier": "FedEx", 0.98
  "tracking_number": "748922105563", 0.97
  "order_reference": "88-4410", 0.99
  "shipment_status": "in transit", 0.89
  "ship_date": "2026-10-13", 0.97
  "estimated_delivery_date": "2026-10-16", 0.95
  "packages": 2, 0.96
  "items_shipped": [
    { "description": "Nitrile gloves, size M, box of 100", "quantity": 20 },
    { "description": "Hand sanitizer refill 1 gal", "quantity": 4 }
  ] 0.94
}

Shipping emails come from carriers and from senders

Tracking information reaches a business in two kinds of email. Carriers send their own notifications, from label created through out for delivery to delivered and exceptions. Suppliers, 3PL warehouses and online stores send ship notices that mention the carrier and tracking number inside their own layout, often with a list of what is in the box and what is still on backorder. Purchasing, receiving and customer service all need the same few facts from these emails, and they usually get them by reading each one.

ParsedMail reads both kinds against one schema, so a UPS notification, a DHL Express update and a supplier ship notice all come back with the same keys. It works well next to an order email parser, because the order reference links each shipment to the order you already created.

A shipment schema that works for every carrier

FieldTypeWhy
carrierenumOptions UPS, FedEx, DHL, USPS, other, so "FedEx Ground" and "FedEx Home Delivery" map to one value
tracking_numberstringKept as text, spaces removed by instruction
order_referencestringYour PO or the sender order number
shipment_statusenumA short fixed list your system understands
estimated_delivery_datedateYYYY-MM-DD
items_shippedtableDescription and quantity per line, for partial shipments

Write instructions next to fields when you need a specific form, for example "tracking number without spaces". The schema is plain English, editable at any time, and each change creates a new version.

Sending tracking data where it is used

  • ERP and purchasing. Update the purchase order with the expected receipt date in NetSuite, Business Central or Odoo, so receiving knows what arrives on which day.
  • Ecommerce and customer service. Add tracking to the customer order in Shopify or WooCommerce, or post it to the helpdesk ticket that asked "where is my order".
  • Operations sheets. Append each notice to a Google Sheet or Excel table of open shipments, filtered by status.
  • Alerts. Post a message to Slack or Microsoft Teams when the status is exception or the delivery date moves.

All of these start from the same signed webhook. Zapier, Make and n8n receive it with their built-in webhook triggers, and the inbound email webhook page shows the exact payload.

Many updates for one parcel

A single parcel can produce five or six emails. That is useful for status tracking and noisy everywhere else. Two things help:

  • Status as an enum. Your automation only acts on the statuses it cares about, for example delivered and exception, and ignores the rest.
  • Deduplication. An identical notice resent with the same Message-ID, or the same sender, subject and body within 30 days, is marked duplicate, not parsed and not counted. Different status updates are different emails and are parsed normally.

To keep marketing emails from carriers out of the count, set allowed senders on the inbox. Only the addresses and domains you list are parsed, everything else is logged as blocked_sender.

Packing slips and PDF ship notices

Some suppliers attach an advance ship notice or a packing slip as PDF or CSV instead of writing it in the body. ParsedMail reads those attachments as text and merges them with the body, so the items table can come from the attachment while the tracking number comes from the email. Scanned packing slips are read as images on paid plans. See attachments and PDF parsing for the limits per email.

When the email is unclear

Carrier emails are usually clear, supplier notices less so. When a notice mentions two tracking numbers, describe tracking numbers as a list instead of a single string. When the delivery date is a range such as "Oct 16 to Oct 18", add two date fields for the earliest and latest date. Every field carries a confidence score, and on Growth and Scale a notice under your threshold, or one without a required tracking number, goes to the review queue before it reaches your systems. The same review flow is described for booking confirmations, which share many of these date problems.

Frequently asked questions

Which carriers does the shipping parser support?

Any carrier that sends email, including UPS, FedEx, DHL, USPS and regional carriers. There are no per-carrier templates, the model reads each email against your schema.

Does ParsedMail track the parcel itself?

No. It reads the email you receive and returns the tracking data in it. Live tracking comes from the carrier or a tracking service you connect in your automation.

Can it handle partial shipments?

Yes. Describe the shipped items as a table, and add a field for items still to ship if your suppliers mention them.

Will every status update count as an email?

Each distinct update counts as one email. Exact resends are marked as duplicates and not charged, and senders outside your allowed list are not counted.

Can I send the tracking number back to Shopify?

Yes. Catch the webhook in Zapier, Make or n8n and use their Shopify step to add tracking to the matching order, keyed on the order reference.

Related

See your own email as JSON

Paste one into the demo, describe the fields and look at the result. No account needed.