Skip to main content

July 20, 2026 Release Notes, Version 26.09

An overview of new features and bug fixes released on July 20, 2026 for Shipwell version 26.09

S
Written by Shipwell TMS Support

Hazmat Company Settings

Summary

This release introduces configurable Hazmat Emergency Contacts, letting you set your own 24-hour emergency-response contact information instead of relying on Shipwell's built-in default. Until now, the emergency contact printed on every hazmat Bill of Lading was a fixed value (CHEMTREC / 800-424-9300), with no way to substitute your own emergency-response provider or contact.

Now you can define your hazmat emergency contact company (and its contacts) once on your Company profile, and Shipwell will automatically apply the right details to hazmat product line items and print them on the generated BOL. Because the values travel with the product line item, the correct emergency contact appears on your shipping papers without re-entering it on every shipment.

Key Capabilities:

  • Define hazmat emergency contacts at the company level, configure one or more emergency-response companies on your Company profile in a new Hazmat Contacts section. Each company captures a Company Name (required), Company Phone Number (required), and one or more contacts. Each contact captures Contact Name, Contact Email, and Contact Phone Number. Add, edit, and remove companies and contacts as needed.

  • Auto-populate on hazmat product line items, when hazmat is enabled on a product line item, a new sub-section shows Hazmat Company, Company Phone Number, and Contact Name. These pre-fill from your configured contacts (defaulting to the first when more than one exists) and can be selected from a dropdown of your configured companies/contacts.

  • Visible on Shipment Details, the selected hazmat company, phone, and contact name display in the line-item section of Shipment Details (read-only) whenever a line item is marked hazmat.

  • Prints on the Bill of Lading, the hazmat company, company phone, and contact name from the line item flow through to the generated BOL, replacing the previous hardcoded default.

How It Works:

The user defines the hazmat emergency contact companies and contacts once, in the new Hazmat Contacts section of the Company profile.

When a user enables hazmat on a product line item, the Hazmat Company, Company Phone Number, and Contact Name auto-fill from that company-level configuration (defaulting to the first configured contact), and the user can select a different configured contact or edit the values directly on the line item.

Those values are carried with the line item onto the generated BOL and shown on Shipment Details.

Shipment Details:

BOL:

Follow these steps to enable these changes on your customized BOL:

Hazmat Emergency Contact Line:

  1. Navigate to Manage-->Company-->Templates and select your saved BOL.

  2. Select the Hazmat Emergency Contact field.

  3. In the “Raw Value” text box, replace those contents with the following: {% join(", ", flatten(iterate({shipment::line_items}, "{hazmat_contact_company}"))) %}

  4. Select File--> Save

Hazmat Columns:

  1. Navigate to Manage-->Company-->Templates and select your saved BOL.

  2. Select the Hazmat Emergency Column field.

  3. In the “Raw Value” text box, replace those contents with the following: {% {is_hazmat} == true ? 'YES' ~ '\n' ~ {hazmat_contact_name} ~ '\n' ~ {hazmat_contact_phone} : 'NO' %}

  4. Select File--> Save

Companies that haven't configured any hazmat contacts continue to use the existing default — no action required and no change to current behavior.

Benefits:

Accurate emergency information on legally required documents — print your own 24-hour emergency-response contact on hazmat shipping papers instead of a generic default.

Configure once, apply everywhere — set your emergency contacts at the company level and have them flow automatically onto line items and the BOL.

Flexibility for real-world setups — support multiple emergency-response providers and multiple contacts per provider.

No disruption to existing shipments — customers who don't configure contacts keep the current default behavior with no action needed.

Known Limitations:

The hazmat contact fields shown on Shipment Details are read-only; they originate from the product line item.

EDI 204 hazmat segment transmission is not included in this release

Hazmat code / UN-number behavior is unchanged.

Unmatched Invoices

Summary

Freight invoices that arrive electronically (EDI 210) but cannot be automatically matched to a shipment are no longer dropped. Shipwell now recognizes that the invoice belongs to a specific customer and places it in an Unmatched state so your team can review it and match it to the correct shipment, instead of the invoice never appearing in Shipwell.

Key Capabilities:

  • Invoices that cannot be auto-matched are captured and surfaced under Settlements, on the Unmatched tab, where previously an unmatchable invoice was ignored entirely.

  • Smarter automatic matching: When an invoice could match more than one shipment, Shipwell uses multiple data points (Reference ID, Custom Reference Number, BOL, and PRO) to narrow to a single shipment. If it still cannot identify exactly one, the invoice is flagged as Unmatched for manual matching. Invoices are no longer matched to shipments whose delivery date is more than 90 days old.

How It Works:

Go to Settlements, then the Unmatched tab. For an invoice that needs matching, open its actions menu and choose Match to open the Match Invoice To Shipment window, then select the correct shipment and confirm.

Benefits:

No more silently dropped invoices, fewer incorrect automatic matches, and a clear manual path to reconcile the exceptions.

Customizable Calendar Cards

Summary

Schedulers can now choose which fields appear on the appointment cards in the scheduling calendar, so each card shows the information that matters to their operation instead of a fixed layout.

Key Capabilities:

Select the fields to display on calendar appointment cards (for example PO, reference IDs, product, carrier, and appointment times). The card layout reflects your selection, and your preferences are remembered.

How It Works:

In the scheduling calendar, open the card field configuration and choose the fields you want. The calendar cards immediately render the fields you selected.

Benefits:

Schedulers spend less time opening detail panels because the calendar surfaces the data they rely on at a glance.

Known Limitations:

  • (working on this bug right now): Cannot save the customization settings so new screenshot is needed with the customization visible in the calendar.

  • Appointment color customization (coming soon)

  • The current available fields are based on the appointment data. We will enhance this in the future to include Shipment and Order data.

Customizable Unscheduled Appointment Cards

Summary

Customize fields in unscheduled appointment cards. You control which fields each unscheduled card shows, and you can now sort and filter the unscheduled appointments to schedule more efficiently.

Key Capabilities:

  • Sort the unscheduled appointment queue so the appointments you need to schedule surface first, making it faster to find and place work.

  • Filter the unscheduled list in the Unscheduled & FCFS Appointments view to focus on just the appointments you care about.

  • Choose which filter buttons appear with the "Select Filter Categories" option, so the filter bar matches how your team works. Available filters include Appointment Type, Carrier Name, Dock, Facility Name, Product Category, Product Reference, and planned dates.

  • Your filter bar setup is remembered on the same browser, so it stays in place when you close the view or refresh the page, with no need to reconfigure it each session.

How It Works:

Open the appointment card field configuration and select the fields you want on unscheduled cards. The cards render dynamically from the fields you choose.

Benefits:

Schedulers can triage the unscheduled queue faster because each card shows the details needed to place it, without opening every appointment.

Known Limitations:

  • The current available fields are based on the appointment data. We will enhance this in the future to include Shipment and Order data.

The screenshot below shows you the user interface for how you select, remove, and drag/drop the fields you would like to see in your appointments card. This can be accessed via the appointments menu.

Overnight Dock Hours

Summary

Facilities that stay open across midnight can now be scheduled correctly. Appointments can be booked into the full overnight window, including the early morning hours on the following day.

How It Works:

Configure a facility with operating hours that cross midnight, for example open Sunday 5:00 PM through Monday 7:00 AM. The appointment calendar shows the full continuous window and offers the early morning slots on the next day, and capacity rules apply across the overnight span.

Benefits:

Receivers and shippers that run overnight operations can book appointments accurately instead of losing the hours that fall after midnight.

Known Limitations:

  • Appointments booked in a window that spans two days may not always show up on both days.

Example #1

This is a 24/7 Facility setup where the daily open time is set to 00:00 and there is no closing time.

Example #2

This is a Monday thru Friday (closing Sat morning) for 6pm to 3am daily. Notice that the Last Appointment End Time is now possible to set for 3am so that appointments can be scheduled overnight without hitting a rules constraint.

Overnight Scheduling Example

This is an example of an overnight appointment for 11:30pm to 12:30am. Notice how the appointment shows up on 11:30pm to 12:00am on Day 1 (ie Tues) and then the remainder of the appointment shows up on 12:00am to 12:30am on Day 2 (ie Wed).

External Reference IDs in Dashboards and Search

Summary

An External Reference ID from the Address Book now flows through Orders, so you can see and search by the reference your own facilities use. HFS, for example, assigns each facility a reference ID and needs it on orders and shipments to track where each order is going.

Key Capabilities:

The External Reference ID appears on the Orders Dashboard as a column and in the order side panel, and on the Order Stop details. You can filter the Orders Dashboard by External Reference ID with an autocomplete selector, find it through global order search, and search the scheduling calendar by it.

How It Works:

Map an External Reference ID to a location in the Address Book. Orders that use that location then display the reference ID, and you can filter, search, and schedule against it. This applies to v3 orders.

Benefits:

Teams that tag facilities with their own identifiers can scan and track which order is going where, and EDI mappings (for example Orderful) line up against a consistent reference.

Multi-stop overlay now also includes the External Reference for the stop.

Stop search includes the External Reference

External Reference also shows up in the Stop Details

Lat / Long locations also support the External Reference

Swifty Legacy Self-Service Email Configuration

Summary

This release introduces the self-service Swifty Legacy email configuration, letting Shipwell configure company-specific virtual inboxes for Swifty Legacy directly, instead of the manual, one-off engineering setup previously required for every customer's inbound email routing. Until now, standing up Swifty Legacy email handling for a customer meant an engineering ticket per tenant, with no dedicated configuration surface.

Now, each tenant gets its own dedicated virtual inbox, an automatically created associated user, and a defined response-routing structure, so replies route correctly without one-off engineering work per customer.

Key Capabilities:

  • Tenant-specific virtual inboxes, each tenant can have a dedicated Swifty Legacy virtual inbox created and stored.

  • Automated user creation, a Shipwell user is automatically created and associated with each virtual inbox, removing a manual setup step.

  • Configuration UI, a new front-end surface for managing inbox configuration, replacing what previously required direct backend/engineering changes.

How It Works:

A Customer or CSM creates a virtual inbox for a tenant through the new configuration UI. Shipwell automatically provisions the associated user and wires up response routing for that inbox. Once configured, inbound and outbound Swifty email for that tenant flows through its dedicated inbox automatically, with no further manual routing changes needed per shipment or message.

Note: Customer who have existing Swifty Legacy email configurations won't need to reconfigure.

Benefits:

  • Faster setup, new customers can be onboarded to Swifty email without an engineering ticket for each one.

  • Consistent structure, every tenant gets the same reliable inbox and routing pattern instead of ad hoc, per-customer configuration.

[Beta] Document Intelligence - a standalone, searchable workspace

Summary

Turn any freight document into trusted, searchable data, right inside your TMS.

Document Intelligence automatically reads, labels, and makes searchable the freight documents you upload — Bills of Lading, Proofs of Delivery, invoices, rate confirmations, customs documents, and more. In this release it graduates into a standalone service with its own workspace in Shipwell, with materially better search, more reliable processing at volume, tools to inspect exactly what was extracted from every page, and access from AI assistants via the Shipwell MCP server. It's built to plug into other parts of the platform – Shipments and Settlements are next.

Find it under Manage → Document Intelligence. Four areas:

  • Documents — drag-and-drop upload (any supported file type), plus a searchable, filterable table of everything in your library. Filter by status, by entity type, and by association (e.g., a shipment ID).

  • Runs — track every processing run and its status.

  • Activity Logs — a step-by-step view of what happened during processing, for troubleshooting.

  • Config — define what to extract with your own schemas (including a natural-language schema builder) and manage how documents from different sources are handled.

Key Capabilities:

  • Upload almost any freight document. PDFs, images (JPG, PNG, TIFF, WebP), Word docs, spreadsheets (CSV/XLS/XLSX), and text files (TXT/XML) — 13 formats. The system extracts key-value fields, tables, and any custom fields you define.

  • Automatic document labeling. Turn on classification to get an AI-generated document type, a short headline, and a summary for each document. Multi-document PDFs can be split into their logical sub-documents.

  • Smarter, honest search. Search blends semantic (meaning-based), full-text, and fuzzy/typo-tolerant matching into a single ranking — find a document by an exact BOL number or by roughly what it was about. Search several phrasings at once (e.g. "proof of delivery", "POD", "delivery receipt") to widen recall.

  • Signature detection and classification. Detected signatures are returned with their location on the page and a confidence score. This indicates the model found a signature and classifies the type of signature (shipper, carrier, or consignee).

  • Extraction you can verify. Every extracted field comes with a confidence score and its location on the page, so you can confirm accuracy at a glance. Describe what to pull in plain language, and a schema generator turns it into an extraction schema.

  • Query it from AI assistants. Through the Shipwell MCP server, AI agents can search your document library, inspect extracted fields and signatures, and upload or reprocess documents — in natural language.

How It Works:

Upload a document and processing runs asynchronously — pendingprocessingcompleted (or failed / skipped / oversized) — and you're notified by a webhook event instead of polling. Once complete, extracted fields, labels, and searchable content are available in the workspace, via API, and via MCP.

Benefits:

  • Less manual data entry — structured data is extracted for you instead of being keyed from a PDF.

  • Trust what you extract — every value is tied to its spot on the source page, with a confidence score.

  • Find documents faster — hybrid search finds what you need whether you remember the exact number or only the gist.

  • More reliable at volume — large documents process safely within supported limits, and transient provider errors are retried automatically.

  • Built to expand — a standalone service designed to embed into Shipments and Settlements next, and already reachable by AI assistants.

Getting access: contact your Customer Success Manager to enable this capability.

API Changes

Inline Document Retrieval (encoding parameter) (Legacy Document Endpoints)

The four legacy document detail endpoints now support an optional encoding query parameter, allowing callers to retrieve document file content inline - as base64-encoded bytes or as a raw binary stream - without needing to follow a presigned URL. This is strictly additive and backwards compatible; existing callers are unaffected.

Affected Endpoints (GET detail only):

Endpoint

/shipments/{shipmentId}/documents/{documentId}/

/companies/{companyId}/documents/{documentId}/

/brokerages/{brokerageId}/shipper-relationships/{shipperRelationshipId}/documents/{documentId}/

/carrier-relationships/{carrierRelationshipId}/documents/{documentId}/

Query Parameter:

Parameter

Type

Description

encoding

string (optional)

Controls how the document file is returned. Valid values: url (default), base64, raw. Invalid values return 400 with the valid choices listed.

Behavior by value:

Value

Response

(omitted) or url

Existing behavior — metadata JSON with file as a short-lived (10-minute) presigned S3 URL. No new fields.

base64

Same metadata JSON plus three additive fields: file_base64, content_type, size. Documents over 50 MB return 413 Payload Too Large with a presigned URL fallback in file.

raw

Streams the original file bytes directly (not JSON). Responds with the file's Content-Type and Content-Disposition: inline; filename="…". No size cap.

Additive Response Fields (base64 only):

Field

Type

Description

file_base64

string

RFC 4648 base64-encoded file content (no line wrapping)

content_type

string

MIME type of the stored file (e.g. application/pdf). Fallback: application/octet-stream

size

integer

Source file size in bytes (pre-encoding)

Example Request (base64):

GET /shipments/{shipmentId}/documents/{documentId}/?encoding=base64

Example Response (base64):

{ "id": "b53aaea4-49ff-40b6-b90a-4b566ed334bc", "file": "https://s3.us-west-2.amazonaws.com/...(presigned URL)...", "filename": "Bill_of_Lading_Standard_SW.pdf", "type": "BOL", "description": "Bill of Lading (Standard)", "created_at": "2026-02-17T19:24:01.023072Z", "updated_at": "2026-02-17T19:24:01.024339Z", "file_base64": "JVBERi0xLjQKJeLj...(base64-encoded content)...", "content_type": "application/pdf", "size": 440904 }

Example: 413 response (file exceeds 50 MB):

{ "error": "TooLargeForInline", "error_description": "Document exceeds the 50 MB inline limit.", "file": "https://s3.us-west-2.amazonaws.com/...(presigned URL)..." }

Example: 400 response (invalid encoding value):

{ "encoding": ["'banana' is not a valid choice. Valid choices: url, raw, base64."] }

Notes:

  • List endpoints are not affected — the encoding parameter is silently ignored on list routes.

  • No change to authentication, authorization, or tenancy. The inline content exposes exactly the bytes the caller could already fetch via the presigned URL.

  • There is a 50 MB cap in file size

Document Intelligence API Changes

Overview

Enhancements to document search and new investigation endpoints on the Document Intelligence API. All endpoints are tenant-scoped, mounted under /document-store, and header-versioned (X-Shipwell-Version: 2026-05-01).

Hybrid document search

GET /document-store/documents:search

Fuses a semantic lane (vector similarity) and a lexical lane (full-text + fuzzy/trigram) using Reciprocal Rank Fusion. Submit multiple query variants to widen recall.

Parameter

Type

Description

q

string, repeatable (max 8)

Query variants. Repeat to widen recall:?q=proof+of+delivery&q=POD. All variants embedded in one call and fused.

min_similarity

float 0–1 (default 0.3)

Recall floor for the semantic lane.

snippet_chars

int 0–40000 (default 4000)

Max characters ofcontent_text. 0 = scores only.

page / page_size

int

Paging (page_size default 25, max 100).

event_entity_id / entity_id

string, repeatable

Scope to an entity type / specific entity (entity_id requires event_entity_id).

event_source_id / document_id / content_type

string

Additional scope filters (AND-ed).

Result fields: document_id, filename, page_number, content_text (snippet), similarity, lex_score, rrf_score.

GET /document-store/documents:search?q=BOL-12345&q=BOL12345&event_entity_id=shipment&snippet_chars=200

{ "queries": ["BOL-12345", "BOL12345"], "total": 3, "results": [ { "document_id": "01J9XYZ...", "filename": "shipment_bol_12345.pdf", "page_number": 1, "content_text": "BILL OF LADING BOL Number: BOL-12345...", "similarity": 0.94, "lex_score": 1.0, "rrf_score": 0.0167 } ] }

The lexical lane uses full-text plus trigram matching, so exact IDs and rare tokens (a BOL number) rank strongly without a separate "exact-match" mode. There is no LLM re-ranking step.

Document listGET /document-store/documents (used when there's no search query) supports status (repeatable: pending/processing/completed/failed/skipped/oversized), event_entity_id, and entity_id filters.

Document investigation endpoints

Read-only endpoints for inspecting exactly what was extracted (also available as Shipwell MCP tools).

  • OutlineGET /document-store/documents/{id}/outline: page_count, status, extracted schemas[], per-page stats (text_chars, kv_field_count, signature_count, has_extraction), result_breakdown[].

  • Page extractionGET /document-store/documents/{id}/pages/{n}: extracted_text (capped 40,000 chars, with extracted_text_truncated), kv_fields[] (key/value + confidence + geometry), signatures[].

  • Key-value listingGET /document-store/documents/{id}/kv-fields: flat KV list; filters page_number, key_contains, limit (default 200, max 1000).

  • Signature listingGET /document-store/documents/{id}/signatures: page_number, result_id, geometry (bounding box).

{ "page_number": 1, "content_text": "BILL OF LADING BOL Number: 12345...", "fields": [ {"key": "BOL Number", "value": "12345", "confidence": 0.98, "geometry": [{"left": 0.12, "top": 0.18, "width": 0.40, "height": 0.03}]} ], "signatures": [ {"page_number": 1, "result_id": "01J...", "geometry": [{"left": 0.55, "top": 0.83, "width": 0.18, "height": 0.05}]} ] }

Now on the Shipwell MCP server

Document Intelligence is available through the Shipwell MCP server, so AI agents/assistants can operate on your document library in natural language — search (search_docstore_documents), inspect (get_docstore_document_outline, list_docstore_document_kv_fields, list_docstore_document_signatures), and manage (upload_docstore_document, reprocess_docstore_documents, generate_docstore_schema) documents. (Early access — talk to your CSM.)

Analytics Model Updates

Table: fact_tracking_location

Field Name

Field Description

fact_tracking_location_key

Primary key

dim_shipment_detail_key

Foreign key to the dim_shipment_detail table

resource_id

The shipment resource ID (platform_uuid) being tracked

resource_type

Type of resource being tracked

device_id

Identifier for the tracking device

carrier_id

Identifier for the carrier associated with this tracking event

provider

GPS tracking provider name

latitude

GPS latitude coordinate of the tracking event

longitude

GPS longitude coordinate of the tracking event

speed

Speed of the resource at the time of the tracking event

odometer

Odometer reading at the time of the tracking event

address

Reverse geocoded address of the tracking location

location_name

Name of the location, if available

event_description

Description of the tracking event

created_at

Timestamp when the tracking event was created

update_time

Timestamp when the tracking event was last updated

tracking_updated_at

Most recent update timestamp used for incremental processing

Other Minor Enhancements and Bug Fixes

Description

Improved contract rate calculations for more accurate pricing on complex shipments

Made it easier to link package types directly to lanes for more precise rating

Routing guides now consider product categories for better carrier selection

Contracts can apply different rate types to product categories within a lane

Fixed postal code errors when only city and state were entered

Carriers must now provide a reason when declining tenders

Dayton Freight rates now appear correctly for standard shipments

Fixed dimension errors so direct rates return properly

Ensured accurate quotes for oversized freight by handling Excessive Length charges

Added support for R+L Carriers Excessive Length charges

Fixed missing PRO numbers after FedEx Freight dispatch

Improved reliability of PRO number generation for carrier dispatches

Enabled dynamic market rates for Averitt direct connections

Service levels now display correctly on CH Robinson shipment documents

Shipments no longer get stuck at Pickup after carrier confirmation

Fixed FedEx Freight live quote errors

AAA Cooper shipments now update to In Transit automatically

Carrier names now display correctly on Priority 1 quotes

NMFC numbers now pass correctly to Priority 1 during dispatch

Fixed rating failures with SEFL for decimal-based freight classes

SEFL dispatches now return valid pickup confirmation numbers

Fixed SEFL dispatch errors caused by missing delivery dates

Fixed issue where pickup and delivery addresses were occasionally flipped

ZIP codes are automatically trimmed to 5 digits for carrier compatibility

Estes rates now return correctly when using 9-digit ZIP codes

Added option to prevent automatic delivery date updates during dispatch

Shipping labels now generate correctly for ODFL shipments with fractional pallets

Users can now delete obsolete XPO Direct carrier accounts successfully

Shipper names are shortened to meet XPOs 30-character limit

CloudTrucks now replaces Shipwell BOL numbers with their own identifiers

Contract rates now populate correctly when shipment date matches contract end date

Fixed XPO Direct rating errors caused by incorrect account setup

R+L rating improved by ignoring duplicate Guaranteed charges

Added support for Delivery Appointment charges with SEFL

Corrected billing terms for Dayton Freight to process 3rd Party accounts correctly

Added support for Delivery Appointment charges with Ward Trucking

Rating interface now shows clear error messages when stop instructions exceed limits

Fixed Overlength charges mapping for ODFL direct connections

Cleaned up rating requests by removing redundant Guaranteed charges

Estes shipments now display correctly in carrier portal

Fixed setup errors for new XPO carrier accounts

PRO numbers now appear correctly for multiple LTL carriers

Fixed SEFL rating errors caused by special characters in account numbers

Estes mapping updated for Grocery Warehouse pickup and delivery charges

SAIA rate requests now send correct billing configuration

SAIA delivery dates now calculate correctly based on pickup date

Estes PRO numbers now display correctly on shipment records

ABF rating now works correctly with proper account identifiers

XPO rates now populate correctly for American Highway locations

Carrier tenders now include expiration dates for clearer deadlines

You can now set your own Hazmat emergency contacts on shipping documents

Fixed issue preventing DAT market rates from appearing in Pricing Intel dashboard

Fixed GPS drift issue that incorrectly marked shipments as Delivered

Improved tools to recover and export shipment data for reconciliation

Fixed mileage and drive time errors in shipment creation form

Appointment times now stay as entered instead of being overwritten

Fixed error when assigning carrier and driver simultaneously

Tracking maps for ocean shipments now show locations in correct order

Carrier users now correctly see all customer shipments

Inbound EDI 210 invoices now process unknown unit qualifiers smoothly

Fixed crash on load board when using specialized transport modes

Carrier tender rejections sent via EDI are now recorded correctly

Fixed issue preventing compatible orders from being added to existing shipments

Swifty now forwards tracking emails for easier visibility

DC Arrival Report now shows complete and accurate data

Duplicate seafood orders in Inventory Release have been resolved

Consolidation Manifest Reports now show correct quantities

Swifty forwarding email setup

Swifty notifications expanded to include more users for error alerts

Swifty email updates and requested changes

Did this answer your question?