Canonical Package Status Implementation Guide and Specifications

Modified on Tue, May 26 at 9:31 AM

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

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article