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
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
| Field | Type | Why |
|---|---|---|
| carrier | enum | Options UPS, FedEx, DHL, USPS, other, so "FedEx Ground" and "FedEx Home Delivery" map to one value |
| tracking_number | string | Kept as text, spaces removed by instruction |
| order_reference | string | Your PO or the sender order number |
| shipment_status | enum | A short fixed list your system understands |
| estimated_delivery_date | date | YYYY-MM-DD |
| items_shipped | table | Description 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?
Does ParsedMail track the parcel itself?
Can it handle partial shipments?
Will every status update count as an email?
Can I send the tracking number back to Shopify?
Related
See your own email as JSON
Paste one into the demo, describe the fields and look at the result. No account needed.