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:
Navigate to Manage-->Company-->Templates and select your saved BOL.
Select the Hazmat Emergency Contact field.
In the “Raw Value” text box, replace those contents with the following:
{% join(", ", flatten(iterate({shipment::line_items}, "{hazmat_contact_company}"))) %}Select File--> Save
Hazmat Columns:
Navigate to Manage-->Company-->Templates and select your saved BOL.
Select the Hazmat Emergency Column field.
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' %}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 — pending → processing → completed (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 |
|
|
|
|
Query Parameter:
Parameter | Type | Description |
| string (optional) | Controls how the document file is returned. Valid values: |
Behavior by value:
Value | Response |
(omitted) or | Existing behavior — metadata JSON with |
| Same metadata JSON plus three additive fields: |
| Streams the original file bytes directly (not JSON). Responds with the file's |
Additive Response Fields (base64 only):
Field | Type | Description |
| string | RFC 4648 base64-encoded file content (no line wrapping) |
| string | MIME type of the stored file (e.g. |
| 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
encodingparameter 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 |
| string, repeatable (max 8) | Query variants. Repeat to widen recall: |
| float 0–1 (default 0.3) | Recall floor for the semantic lane. |
| int 0–40000 (default 4000) | Max characters of |
| int | Paging ( |
| string, repeatable | Scope to an entity type / specific entity ( |
| 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 list — GET /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).
Outline —
GET /document-store/documents/{id}/outline:page_count,status, extractedschemas[], per-page stats (text_chars,kv_field_count,signature_count,has_extraction),result_breakdown[].Page extraction —
GET /document-store/documents/{id}/pages/{n}:extracted_text(capped 40,000 chars, withextracted_text_truncated),kv_fields[](key/value + confidence + geometry),signatures[].Key-value listing —
GET /document-store/documents/{id}/kv-fields: flat KV list; filterspage_number,key_contains,limit(default 200, max 1000).Signature listing —
GET /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 |



































