ECGrid Simplify
Canonical Package Status Format Specification
Version: 1.0 Date: May 26, 2026 Owner: ECGrid Product
1. Purpose
This document defines the canonical Package Status format used by ECGrid Simplify. It is the single source of truth for package status structure, field definitions, data types, length limits, required fields, and serialization rules across XML and JSON.
The Package Status (997) document communicates delivery and shipment status information for packages and parcels. It includes status codes, delivery appointments, tracking information, delivery exceptions, and address change notifications. Both XML and JSON representations convey the same logical status data. A JSON Schema (Simplify_Package_Status.schema.json) provides machine-enforceable validation. This document is the human-readable companion.
2. Scope
In scope:
- Package status document structure (header and detail lines).
- Field-level definitions, data types, length limits, and validation rules.
- Canonical XML and JSON representations.
- Status codes, delivery appointments, and delivery exceptions.
- Package tracking, weight, charges, and service level information.
- Multiple party types and address change tracking.
Out of scope:
- Transport (HTTPS, AS2, SFTP). Covered in ECGrid Simplify API docs.
- Real-time GPS and location coordinates.
- Driver signature images and proof-of-delivery photographs.
- Carrier-specific exception codes and internal routing logic.
3. Document Structure
A Package Status payload contains a single status report with header information, multiple party references (shipper, consignee, billing parties), and one or more detail records containing package status information and delivery location details.
- Top-level shape:
packageStatusMessage
└── packageStatus (required, exactly one)
├── header (required information)
│ ├── tradingPartnerId
│ ├── documentId / transactionRefNumber
│ ├── sender / receiver
│ ├── transactionPurposeCode / transactionDate
│ └── vendor information
├── parties (shipper, signer, ultimateConsignee, billTo, freightBillTo, shipNoticeTo, thirdParty)
└── detail[] (1..n package status records)
4. Header Fields
The header section contains transaction-level status information.
Field | Type | Length | Req | Description | Example |
tradingPartnerId | string | 1–35 | Yes | ECGrid trading partner identifier. Routes the document. | SEV2TEST01 |
documentId | string | 1–35 | Yes | Unique identifier for this package status document. | PS-2026-05-001 |
userId | string | 1–35 | No | User ID of the person generating the status. | USER123 |
sender | string | 2–17 | Yes | Sender ID (typically carrier) in the qualifier namespace. | SEV2TEST01 |
senderQualifier | string | 1–4 | Yes | Qualifier for sender ID (e.g. SE, ZZ, 01, 14). | SE |
receiver | string | 2–17 | Yes | Receiver ID (typically shipper/buyer) in qualifier namespace. | SEV2TEST02 |
receiverQualifier | string | 1–4 | Yes | Qualifier for receiver ID. | SE |
groupSender | string | 1–9 | No | EDI functional group sender ID. | 1 |
groupReceiver | string | 1–9 | No | EDI functional group receiver ID. | 1 |
vendorId | string | 1–35 | No | Vendor/supplier identifier. | VEND12345 |
transactionPurposeCode | string | 1–3 | Yes | Purpose of status (e.g., 00=Original, 01=Response). | 00 |
transactionDate | string | 8 | Yes | Date status was generated. YYYYMMDD. | 20260520 |
transactionRefNumber | string | 1–35 | No | Reference number for tracking this status transaction. | TX-2026-05-001 |
5. Party Information Blocks
Multiple party types are used in package status: Shipper, Signer, UltimateConsignee, BillTo, FreightBillTo, ShipNoticeTo, and ThirdParty. All use the same party structure.
Field | Type | Length | Req | Description | Example |
partyIdentification | string | 1–80 | Yes | Party identifier (DUNS, GLN, internal code, etc.). | 12345 |
partyIdentificationTypeCode | string | 1–5 | Yes | Qualifier for identifier (92=internal, 1=DUNS). | 92 |
name | string | 1–60 | Yes | Legal name of the party. | Acme Shipping |
name2 | string | 1–60 | No | Secondary name line. |
|
name3 | string | 1–60 | No | Tertiary name line. |
|
streetAddress1 | string | 1–55 | Yes | Street address line 1. | 789 Warehouse Way |
streetAddress2 | string | 1–55 | No | Street address line 2. |
|
streetAddress3 | string | 1–55 | No | Street address line 3. |
|
city | string | 2–30 | Yes | City. | Newark |
cityCode | string | 1–10 | No | City code if applicable. |
|
stateCode | string | 2 | No | State or province code. | NJ |
postalCode | string | 3–15 | Yes | Postal/ZIP code. | 07101 |
countryCode | string | 2 | Yes | ISO 3166-1 alpha-2 country code. | US |
vatNumber | string | 1–20 | No | VAT/Tax ID number. |
|
dockNumber | string | 1–10 | No | Dock number at location (shipTo/shipper only). | DOCK-A1 |
storeNumber | string | 1–10 | No | Store or location number (shipTo/shipper only). | STORE-001 |
6. Detail Records - Package Status Information
The detail array contains one or more package status records with status details and party references (shipTo, deliveryTo, changedTo for address changes).
Field | Type | Length | Req | Description | Example |
assignedNumber | integer | 1–6 | No | Sequential number assigned to this detail record. | 1 |
status.refId | string | 1–35 | No | Reference ID for the package (tracking number, shipment ID). | TRACK-12345 |
status.refIdQualifier | string | 1–3 | No | Qualifier for the reference ID. | 01 |
status.detail.packageId | string | 1–35 | No | Package identifier. | PKG-001 |
status.detail.shipmentStatusCode | string | 1–3 | Yes | Status code (e.g., 01=Pickup, 02=In Transit, 03=Delivered). | 02 |
status.detail.appointmentStatusCode | string | 1–3 | No | Appointment status (e.g., 01=Scheduled, 02=Confirmed). | 01 |
status.detail.appointmentReasonCode | string | 1–3 | No | Reason for appointment (e.g., 01=Delivery, 02=Pickup). | 01 |
status.detail.date | string | 8 | No | Status date. YYYYMMDD. | 20260520 |
status.detail.time | string | 4 | No | Status time. HHMM (24-hour). | 1430 |
status.detail.weight | number | 1–15 | No | Package weight. | 25.50 |
status.detail.weightQualifier | string | 1–2 | No | Weight qualifier (e.g., B=Billable). | B |
status.detail.zone | string | 1–10 | No | Delivery zone or area code. | ZONE-01 |
status.detail.serviceLevelCode | string | 1–3 | No | Service level (e.g., 01=Ground, 02=Overnight). | 01 |
status.detail.deliveryCode | string | 1–3 | No | Delivery status code (e.g., 01=Delivered, 02=Exception). | 01 |
status.detail.charge | number | 1–17 | No | Charge amount for this package. | 45.99 |
status.detail.rateQualifier | string | 1–3 | No | Rate type (e.g., 01=Standard, 02=Premium). | 01 |
status.detail.paymentMethod | string | 1–35 | No | Payment method (e.g., Prepaid, Collect). | Prepaid |
status.detail.countryCode | string | 2 | No | Destination country code. ISO 3166-1 alpha-2. | US |
7. Delivery Location and Address Changes
Detail-level party records track original shipTo address, actual deliveryTo address (if different), and changedTo address if delivery location has been modified.
Field | Type | Length | Req | Description | Example |
detail.shipTo.partyIdentification | string | 1–80 | Yes | Identifier for original ship-to party. | 12345-STORE |
detail.shipTo.name | string | 1–60 | Yes | Original destination name. | Acme Store #5 |
detail.shipTo.city | string | 2–30 | Yes | Original destination city. | New York |
detail.shipTo.postalCode | string | 3–15 | Yes | Original destination postal code. | 10001 |
detail.shipTo.dockNumber | string | 1–10 | No | Dock number at original destination. | DOCK-A1 |
detail.shipTo.storeNumber | string | 1–10 | No | Store number at original destination. | STORE-001 |
detail.shipTo.note | string | 1–255 | No | Special delivery instructions. | Leave at loading dock |
detail.deliveryTo.partyIdentification | string | 1–80 | No | Identifier for actual delivery party (if different). | 12345-ALT |
detail.deliveryTo.name | string | 1–60 | No | Actual delivery destination name. | Acme Warehouse East |
detail.deliveryTo.city | string | 2–30 | No | Actual delivery city. | Newark |
detail.deliveryTo.postalCode | string | 3–15 | No | Actual delivery postal code. | 07101 |
detail.deliveryTo.note | string | 1–255 | No | Delivery notes or special handling. | Delivered to receiving area |
detail.changedTo.partyIdentification | string | 1–80 | No | Identifier for redirected/changed delivery address. | 12345-NEW |
detail.changedTo.name | string | 1–60 | No | Changed delivery destination name. | Acme Regional Hub |
detail.changedTo.city | string | 2–30 | No | Changed delivery city. | Chicago |
detail.changedTo.postalCode | string | 3–15 | No | Changed delivery postal code. | 60601 |
detail.changedTo.note | string | 1–255 | No | Reason for address change. | Customer requested redirection |
8. Naming Conventions
- XML: PascalCase for all element names (e.g. PackageStatus, ShipmentStatusCode, DeliveryCode).
- JSON: camelCase for all field names (e.g. packageStatus, shipmentStatusCode, deliveryCode).
- Field semantics and length limits are identical across both. Only casing differs.
- Empty optional values in XML use self-closing tags (e.g. <Zone/>). In JSON, use empty string or null.
9. Status Code Reference
- Common shipment status codes:
- 01 = Pickup
- 02 = In Transit
- 03 = Delivered
- 04 = Exception/Failed Delivery
- 05 = On Hold
- 06 = Returned to Shipper
- 07 = Appointment Scheduled
10. XML Example
<PackageStatusMessage>
<PackageStatus>
<TradingPartnerId>SEV2TEST01</TradingPartnerId>
<DocumentId>PS-2026-05-001</DocumentId>
<SenderQualifier>SE</SenderQualifier>
<Sender>SEV2TEST01</Sender>
<ReceiverQualifier>SE</ReceiverQualifier>
<Receiver>SEV2TEST02</Receiver>
<VendorId>VEND12345</VendorId>
<TransactionPurposeCode>00</TransactionPurposeCode>
<TransactionDate>20260520</TransactionDate>
<TransactionRefNumber>TX-2026-05-001</TransactionRefNumber>
<Shipper>
<PartyIdentification>54321-WH</PartyIdentification>
<PartyIdentificationTypeCode>92</PartyIdentificationTypeCode>
<Name>Widget Supplier</Name>
<StreetAddress1>456 Oak Ave</StreetAddress1>
<City>Springfield</City>
<StateCode>IL</StateCode>
<PostalCode>62701</PostalCode>
<CountryCode>US</CountryCode>
</Shipper>
<UltimateConsignee>
<PartyIdentification>12345-STORE</PartyIdentification>
<PartyIdentificationTypeCode>92</PartyIdentificationTypeCode>
<Name>Acme Store #5</Name>
<StreetAddress1>555 Retail Road</StreetAddress1>
<City>New York</City>
<StateCode>NY</StateCode>
<PostalCode>10001</PostalCode>
<CountryCode>US</CountryCode>
</UltimateConsignee>
<Detail>
<AssignedNumber>1</AssignedNumber>
<Status>
<RefId>TRACK-12345</RefId>
<RefIdQualifier>01</RefIdQualifier>
<Detail>
<PackageId>PKG-001</PackageId>
<ShipmentStatusCode>02</ShipmentStatusCode>
<AppointmentStatusCode>01</AppointmentStatusCode>
<AppointmentReasonCode>01</AppointmentReasonCode>
<Date>20260520</Date>
<Time>1430</Time>
<Weight>25.50</Weight>
<WeightQualifier>B</WeightQualifier>
<Zone>ZONE-01</Zone>
<ServiceLevelCode>01</ServiceLevelCode>
<DeliveryCode>01</DeliveryCode>
<Charge>45.99</Charge>
<RateQualifier>01</RateQualifier>
<PaymentMethod>Prepaid</PaymentMethod>
<CountryCode>US</CountryCode>
</Detail>
</Status>
<ShipTo>
<PartyIdentification>12345-STORE</PartyIdentification>
<PartyIdentificationTypeCode>92</PartyIdentificationTypeCode>
<Name>Acme Store #5</Name>
<StreetAddress1>555 Retail Road</StreetAddress1>
<City>New York</City>
<StateCode>NY</StateCode>
<PostalCode>10001</PostalCode>
<CountryCode>US</CountryCode>
<DockNumber>DOCK-A1</DockNumber>
<Note>Leave at loading dock</Note>
</ShipTo>
<DeliveryTo>
<PartyIdentification>12345-STORE</PartyIdentification>
<PartyIdentificationTypeCode>92</PartyIdentificationTypeCode>
<Name>Acme Store #5</Name>
<StreetAddress1>555 Retail Road</StreetAddress1>
<City>New York</City>
<StateCode>NY</StateCode>
<PostalCode>10001</PostalCode>
<CountryCode>US</CountryCode>
<Note>Delivered to receiving area</Note>
</DeliveryTo>
</Detail>
</PackageStatus>
</PackageStatusMessage>
11. JSON Example
{
"packageStatusMessage": {
"packageStatus": {
"tradingPartnerId": "SEV2TEST01",
"documentId": "PS-2026-05-001",
"senderQualifier": "SE",
"sender": "SEV2TEST01",
"receiverQualifier": "SE",
"receiver": "SEV2TEST02",
"vendorId": "VEND12345",
"transactionPurposeCode": "00",
"transactionDate": "20260520",
"transactionRefNumber": "TX-2026-05-001",
"shipper": {
"partyIdentification": "54321-WH",
"partyIdentificationTypeCode": "92",
"name": "Widget Supplier",
"streetAddress1": "456 Oak Ave",
"city": "Springfield",
"stateCode": "IL",
"postalCode": "62701",
"countryCode": "US"
},
"ultimateConsignee": {
"partyIdentification": "12345-STORE",
"partyIdentificationTypeCode": "92",
"name": "Acme Store #5",
"streetAddress1": "555 Retail Road",
"city": "New York",
"stateCode": "NY",
"postalCode": "10001",
"countryCode": "US"
},
"detail": [
{
"assignedNumber": 1,
"status": {
"refId": "TRACK-12345",
"refIdQualifier": "01",
"detail": {
"packageId": "PKG-001",
"shipmentStatusCode": "02",
"appointmentStatusCode": "01",
"appointmentReasonCode": "01",
"date": "20260520",
"time": "1430",
"weight": 25.50,
"weightQualifier": "B",
"zone": "ZONE-01",
"serviceLevelCode": "01",
"deliveryCode": "01",
"charge": 45.99,
"rateQualifier": "01",
"paymentMethod": "Prepaid",
"countryCode": "US"
}
},
"shipTo": {
"partyIdentification": "12345-STORE",
"partyIdentificationTypeCode": "92",
"name": "Acme Store #5",
"streetAddress1": "555 Retail Road",
"city": "New York",
"stateCode": "NY",
"postalCode": "10001",
"countryCode": "US",
"dockNumber": "DOCK-A1",
"note": "Leave at loading dock"
},
"deliveryTo": {
"partyIdentification": "12345-STORE",
"partyIdentificationTypeCode": "92",
"name": "Acme Store #5",
"streetAddress1": "555 Retail Road",
"city": "New York",
"stateCode": "NY",
"postalCode": "10001",
"countryCode": "US",
"note": "Delivered to receiving area"
}
}
]
}
}
}
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article