Webhook Integration Guide
Table of Contents
- Overview
- Webhook Events
- Source Setting Parameters
- Payload Schemas
- Authentication
- Error Handling & Logging
Overview
The TAI TMS webhook system allows your application to receive HTTP POST notifications when key events occur inside the platform — shipment lifecycle changes, customer and carrier record updates, and accounting document creation.
How It Works
Webhooks are configured through Source Settings in the TMS admin interface. Each webhook integration is an IntegrationSource of type PublicAPIWebhooks, scoped to one or more Linked Organizations. When a triggering event occurs for a record that belongs to a linked organization, the TMS serializes the relevant data and POSTs it as JSON to the URL(s) you have configured.
TMS Event Occurs
│
▼
Linked Organization matches?
│ Yes
▼
(For shipment events) Batch in ~1-min window
│
▼
Serialize payload (camelCase JSON)
│
▼
POST to configured URL
│
▼
Log result to WebhookActivityLog
Key Behaviors
| Behavior | Detail |
|---|---|
| HTTP method | POST |
| Content type | application/json |
| Encoding | UTF-8 |
| Property naming | camelCase |
| Date format | ISO 8601 — yyyy-MM-ddTHH:mm:ssK (UTC) |
| Enum serialization | String values (not integers) |
| Retry policy | No automatic retries — each event is attempted once |
| Delivery guarantee | At-most-once. If your endpoint is unavailable or errors, the event is logged and no further delivery is attempted. |
| Transport | HTTPS strongly recommended but not enforced; plain HTTP endpoints are accepted (see Authentication) |
| Custom headers | None. Only Authorization (if configured) plus HttpClient's auto-added Content-Type and Content-Length. No User-Agent, no X-Webhook-*, no HMAC signature. |
| HTTP redirects | 3xx responses are followed automatically |
Shipment Webhook Batching
Shipment-related webhooks (ShipmentCreateUrl, ShipmentDetailUpdateUrl, ShipmentStatusUpdateUrl, ShipmentLocationUpdateUrl, ShipmentLocationUpdateExtendedUrl) are dispatched via a background queue with a ~1-minute delay after the triggering event. Multiple edits to the same shipment within that window coalesce into a single delivery — the timer resets on each new change and fires ~1 minute after the last change is saved. This prevents duplicate webhooks when users make multiple edits in quick succession.
Accounting, customer, and carrier webhooks are dispatched immediately, with one exception: BillCreateUrl uses a background job with a ~5-second delay.
Versioning
The Version source setting controls the shape of shipment payloads and how statuses are represented. It applies only to shipment webhooks (Create, Detail, Status, Location, LocationExtended). Accounting, customer, and carrier payloads are unversioned and always use the current schema.
| Version | Behavior |
|---|---|
| 1 | Legacy (deprecated). Shipment payloads use the ShipmentWebhookExport model. |
| 2 | Shipment statuses are transformed: Committed → Booked and Quote → Quoted. All other statuses (Dispatched, InTransit, OutForDelivery, Delivered, etc.) are sent unchanged. |
| 3 (default) | Current format. Statuses are sent as-is: Committed and Quote. |
Only the string values "1" and "2" are explicitly recognized. If Version is missing, empty, or set to any other value (including "3"), the payload is sent in V3 form.
Webhook Events
Each URL parameter in your Source Setting corresponds to a distinct event type. Multiple URL parameters can be configured on a single Source Setting; each fires independently.
Shipment Events
ShipmentCreateUrl
Fires when a new shipment is created in the TMS.
- Trigger: A new shipment is persisted for the first time via the BackOffice UI, Public API POST, EDI 204 inbound, or system-generated flow.
- Payload: Full shipment details (
ShipmentDetails). - Delivery: Batched with a ~1-minute delay (see Shipment Webhook Batching above).
- Notes: If
ShipmentCreateUrlis not configured butShipmentDetailUpdateUrlis, the creation event delivers toShipmentDetailUpdateUrlinstead.
ShipmentDetailUpdateUrl
Fires when an existing shipment's details are modified.
- Trigger: Any update to shipment information — stops (address, contact, dates, add/remove/reorder), commodities, accessorials, carrier/transit-leg assignment, reference numbers, customer, quotes, and more.
- Payload: Full shipment details (
ShipmentDetails), reflecting the state after the update. - Delivery: Batched with a ~1-minute delay.
- Notes:
ShipmentDetailUpdateUrlalso fires alongsideShipmentStatusUpdateUrlon every status change. If you subscribe to both, expect paired deliveries on status transitions.
ShipmentStatusUpdateUrl
Fires on shipment status changes and on certain transit-related edits.
- Trigger: Any of the following:
- Shipment status transitions (
Quote,Committed,Dispatched,InTransit,OutForDelivery,Delivered,Complete,Canceled,Reinstated) - Stop date/time edits on any stop — FirstPick, LastDrop, or additional stops — including scheduled, appointment, and actual arrival/departure times
- Stop add/delete on additional stops
- Bulk stop-date updates
- EDI 214 status updates (v1 and v2)
- Public API Tracking Updates and Check Call events
- Shipment status transitions (
- Payload: Full shipment details (
ShipmentDetails) including the current status. Note that the payload'sstatusmay match the previous webhook's status when the trigger was a non-status change (e.g., a stop-date edit). - Delivery: Batched with a ~1-minute delay. There is no additional throttle. Every triggering event within the queue window fires the webhook once.
- Notes:
ShipmentDetailUpdateUrlfires alongside this webhook from the same handler if subscribed.
Status values by version:
| Version | "Booked" status sent as | "Quoting" status sent as |
|---|---|---|
| 2 | Booked | Quoted |
| 3 (default) | Committed | Quote |
ShipmentLocationUpdateUrl
Fires when a new GPS/location update is received for a shipment.
- Trigger: A location ping is recorded for the shipment via:
- Public API POST
/PublicApi/Location/v2/ShipmentLocations - Driver-tracking provider callbacks (MacroPoint, TruckerTools, FourKites, Project44, FarEye, OpenTrack)
- Public API POST
- Payload: Simplified shipment data focused on location — shipment ID, status, latitude, longitude, location string, and last location update timestamp.
- Delivery: Batched with a ~1-minute delay.
- Throttle: Fires at most once every 15 minutes per shipment. Additional location pings within the 15-minute window are silently dropped from the webhook (the underlying location data is still stored).
ShipmentLocationUpdateExtendedUrl
Fires from the same triggers as ShipmentLocationUpdateUrl but delivers a richer payload including full shipment context.
- Trigger: Same as
ShipmentLocationUpdateUrl. - Payload: Extended shipment + location payload.
- Delivery: Batched with a ~1-minute delay.
- Throttle: 15-minute window, tracked separately from
ShipmentLocationUpdateUrl. Each webhook has its own 15-minute counter, so subscribing to both is safe — one throttling the other has no effect.
Accounting Events
BillCreateUrl
Fires when a carrier/vendor bill is approved through the Approve Bill workflow.
- Trigger: A bill completes the approval workflow via POST
/api/registerbills, bulk bill import, or a bill revision. - Payload: Full bill details (
Bill) including line items, payment status, and external sync details. - Delivery: Background job with a ~5-second delay after the approval action. This is the only accounting webhook that is not synchronous.
- Subscription scoping: The bill's
payerOrganizationIdis matched against the Source Setting's Linked Organizations.
CommissionBillCreateUrl
Fires when a commission is approved to Created status via the Approve Commissions workflow.
- Trigger: Commission records transition to
ChargeLineAccountingStatus.Createdvia PUT/api/approveCommissions(UI) or the Public API commission approval endpoint. - Payload: Commission details (
Commission), which mirrors the bill structure but represents agent/rep commissions. - Delivery: Synchronous / immediate.
- Notes: Structurally identical to
BillCreateUrlpayloads but only fires on the "Created" transition — not on declines, variance moves, or other status changes.
InvoiceCreateUrl
Fires when a customer invoice is finalized.
- Trigger: The Invoice Create process completes for a customer invoice (create, revision/adjustment, consolidation, or manual regeneration via POST
/api/invoices/generateDigitalInvoices). - Payload: Invoice details only (
Invoice) — organization info, line items, payment status, due dates, recipients. - Delivery: Synchronous / immediate.
- Notes: See
DoNotMarkInvoiceAsPrintedin Source Setting Parameters for behavior around the invoice's printed state after delivery.
InvoiceCreateWithShipmentUrl
Fires at the same moment as InvoiceCreateUrl but includes the associated shipment data.
- Trigger: Same as
InvoiceCreateUrl. - Payload: A composite object containing both
invoice(Invoice) andshipmentDetails(ShipmentDetails). - Delivery: Synchronous / immediate.
- Notes: If both
InvoiceCreateUrlandInvoiceCreateWithShipmentUrlare configured on the same Source Setting, both fire with different payloads. Configure both only if your downstream system needs both shapes.
Customer Events
CustomerCreateUrl
Fires when a new customer organization is created.
- Trigger: A customer organization is persisted for the first time via Public API POST
/PublicApi/Customer/v2/Customersor the BackOffice "New Customer" UI. - Payload: Customer organization details (
Organization). - Delivery: Synchronous / immediate.
- Notes: Scoped to the parent organization hierarchy of the webhook's linked organization. Only customers whose
ParentIdschain intersects the linked org will trigger this webhook.
CustomerUpdateUrl
Fires when an existing customer organization is modified — directly or indirectly.
- Trigger:
- Any field update on a customer organization via Public API PUT or the BackOffice UI (name, address, phone, reference number, notes, etc.)
- Indirect trigger: creating or updating the customer's Invoice Accounting Profile
- Indirect trigger: Credit Limit changes on the customer
- Payload: Full updated customer details (
Organization). - Delivery: Synchronous / immediate.
- Notes: Same organization-hierarchy scoping as
CustomerCreateUrl.
Carrier Events
LSPCarrierCreateUrl
Fires when a new carrier record is added via Highway integration onboarding.
- Trigger: The Highway onboarding webhook adds a new
BrokerCarrierrecord. - Payload: Carrier details (
LSPCarrier) including carrier master info, insurance records, supported trailer types, contacts, payment preferences, and labels. - Delivery: Synchronous / immediate.
- Notes: This webhook currently fires only on the Highway onboarding path. Carriers added via Public API POST
/PublicApi/Carriers/v2/Carriers, the BackOffice "New Carrier" UI, or other integrations (DAT, DATConvoy, Truckstop, MyCarrier) do not triggerLSPCarrierCreateUrl.
LSPCarrierUpdateUrl
Fires when an existing carrier record is modified.
- Trigger: Any update to a broker carrier record via Public API PUT
/PublicApi/Carriers/v2/Carriers, the BackOffice UI, or the Highway integration. - Payload: Full updated carrier details (
LSPCarrier). - Delivery: Synchronous / immediate.
- Notes: Fires on any column change — status, terms, insurance, payment preferences, addresses, supported equipment, labels, etc.
Source Setting Parameters
When configuring a Source Setting of type PublicAPIWebhooks, the following parameters are available:
| Parameter | Type | Description |
|---|---|---|
ShipmentCreateUrl | URL | Endpoint for shipment creation events. |
ShipmentDetailUpdateUrl | URL | Endpoint for shipment detail update events. Also fires alongside ShipmentStatusUpdateUrl. |
ShipmentStatusUpdateUrl | URL | Endpoint for shipment status and transit-related change events. |
ShipmentLocationUpdateUrl | URL | Endpoint for location updates (simplified payload). 15-min throttle. |
ShipmentLocationUpdateExtendedUrl | URL | Endpoint for location updates (extended payload). 15-min throttle, tracked independently from ShipmentLocationUpdateUrl. |
BillCreateUrl | URL | Endpoint for bill approval events. Fires with a ~5-second delay. |
CommissionBillCreateUrl | URL | Endpoint for commission approval events. |
InvoiceCreateUrl | URL | Endpoint for invoice creation events (invoice only). |
InvoiceCreateWithShipmentUrl | URL | Endpoint for invoice creation events (invoice + shipment). Fires independently of InvoiceCreateUrl. |
CustomerCreateUrl | URL | Endpoint for customer creation events. |
CustomerUpdateUrl | URL | Endpoint for customer update events (includes indirect triggers). |
LSPCarrierCreateUrl | URL | Endpoint for carrier creation events. Currently limited to Highway onboarding. |
LSPCarrierUpdateUrl | URL | Endpoint for carrier update events. |
Authorization | String | Static authorization token sent verbatim in the Authorization request header. |
UserName | String | Username for HTTP Basic Authentication (paired with Password). |
Password | String | Password for HTTP Basic Authentication (paired with UserName). |
Version | Integer (1, 2, or 3) | Controls shipment payload format and status label behavior. Defaults to 3-equivalent for any unrecognized or missing value. |
DoNotMarkInvoiceAsPrinted | Boolean (true/false) | When true, invoices are not marked as printed after the webhook fires — they remain visible in the Invoice Delivery screen. Defaults to false. |
Payload Schemas
All payloads are delivered as a JSON object in the HTTP POST body. Property names are camelCase. Dates are ISO 8601 UTC strings (yyyy-MM-ddTHH:mm:ssK). Enum fields are serialized as strings, not integers.
Shipment Payloads
Used by: ShipmentCreateUrl · ShipmentDetailUpdateUrl · ShipmentStatusUpdateUrl
Version note: Version 1 uses the legacy ShipmentWebhookExport shape (see V1 Legacy Schema). Versions 2 and 3 use the schema below.
ShipmentDetails
| Field | Type | Nullable | Description |
|---|---|---|---|
shipmentId | integer | No | Unique shipment identifier. |
status | string (enum) | No | Current shipment status. V3: Quote, Committed, InTransit, Delivered, etc. V2: Quoted, Booked, InTransit, Delivered. |
shipmentType | string (enum) | No | Mode of transport (e.g., LTL, TL, Parcel). |
serviceLevel | string (enum) | No | Service level (e.g., Standard, Expedited). |
stackable | boolean | No | Whether freight can be stacked. |
trailerType | string (enum) | Yes | Required trailer type (e.g., DryVan, Flatbed, Reefer). |
trailerSize | string (enum) | Yes | Trailer size (e.g., FT53, FT48). |
weightUnits | string (enum) | Yes | Unit of weight (LBS, KGS). |
dimensionUnits | string (enum) | Yes | Unit of dimension (IN, CM). |
importExport | string (enum) | Yes | Import/export flag if applicable. |
mileage | decimal | No | Total estimated mileage. |
transitTime | integer | Yes | Estimated transit time in days. |
totalBuy | decimal | No | Total carrier cost. |
totalSell | decimal | No | Total customer charge. |
latitude | number | Yes | Last known GPS latitude. |
longitude | number | Yes | Last known GPS longitude. |
locationString | string | Yes | Human-readable last known location. |
lastLocationUpdate | string (datetime) | Yes | UTC timestamp of the most recent location ping. |
driverCellPhoneNumber | string | Yes | Driver's cell phone number. |
hazmatEmergencyContactNumber | string | Yes | Emergency contact for hazmat shipments. |
customer | CustomerDetailsV2 | No | Customer record associated with the shipment. |
carrierRep | StaffDTO | Yes | TMS staff member assigned as carrier rep. |
payerOrganization | PayerOrganization | No | The billing organization for this shipment. |
stops | ShippingAddress[] | No | Ordered list of shipment stops (origin, destination, and any intermediates). |
commodities | Commodity[] | No | Line-level freight commodity records. |
accessorialCodes | Accessorial[] | No | List of accessorial services applied. |
shipmentReferenceNumbers | ReferenceNumber[] | No | Shipment-level reference numbers. |
shipmentAlerts | ShipmentAlert[] | No | Active alerts on the shipment. |
carrierList | CarrierDetails[] | No | One or more carriers assigned to the shipment (supports multi-leg). |
attachments | Attachment[] | No | Files attached to the shipment. |
CustomerDetailsV2
| Field | Type | Nullable | Description |
|---|---|---|---|
name | string | No | Customer organization name. |
referenceNumber | string | Yes | External reference number for the customer. |
staffID | integer | No | Internal ID of the assigned TMS rep. |
staffName | string | Yes | Display name of the assigned TMS rep. |
staffReferenceNumber | string | Yes | External reference for the assigned rep. |
salesRepNames | string | Yes | Comma-separated names of associated sales reps. |
billToOrganizationId | integer | No | Organization ID used for invoicing. |
officeOrganizationId | integer | No | Office/branch organization ID. |
officeName | string | Yes | Name of the office/branch. |
StaffDTO
| Field | Type | Nullable | Description |
|---|---|---|---|
staffId | integer | Yes | Internal staff ID. |
contactName | string | Yes | Full name. |
email | string | Yes | Email address. |
phone | string | Yes | Phone number. |
PayerOrganization
| Field | Type | Nullable | Description |
|---|---|---|---|
organizationId | integer | No | Organization ID. |
name | string | No | Organization name. |
address | Address | Yes | Primary address. |
ShippingAddress
Represents a single stop on the shipment route.
| Field | Type | Nullable | Description |
|---|---|---|---|
shipmentStopId | integer | No | Unique stop ID. |
stopType | string (enum) | No | Pickup, Delivery, or Stop. |
companyName | string | Yes | Facility or company name at this stop. |
streetAddress | string | Yes | Primary street line. |
streetAddressTwo | string | Yes | Secondary street line. |
city | string | Yes | City. |
state | string | Yes | State/province. |
zipCode | string | Yes | Postal code. |
country | string (enum) | No | Country code (e.g., US, CA, MX). |
contactName | string | Yes | Contact name at the stop. |
phone | string | Yes | Contact phone. |
fax | string | Yes | Fax number. |
email | string | Yes | Contact email. |
instructions | string | Yes | Pickup/delivery instructions. |
notes | string | Yes | Internal notes for this stop. |
referenceNumber | string | Yes | Stop-level reference number. |
estimatedReadyDateTime | string (datetime) | Yes | Scheduled open/ready time. |
estimatedCloseDateTime | string (datetime) | Yes | Scheduled close time. |
appointmentReadyDateTime | string (datetime) | Yes | Confirmed appointment open time. |
appointmentCloseDateTime | string (datetime) | Yes | Confirmed appointment close time. |
actualArrivalDateTime | string (datetime) | Yes | Actual arrival recorded by driver or TMS. |
actualDepartureDateTime | string (datetime) | Yes | Actual departure recorded by driver or TMS. |
shipmentStopReferenceNumbers | ReferenceNumber[] | No | Stop-level reference numbers. |
shipmentStopPickupCommodities | StopCommodity[] | No | Commodities picked up at this stop. |
shipmentStopDeliveryCommodities | StopCommodity[] | No | Commodities delivered at this stop. |
Commodity
| Field | Type | Nullable | Description |
|---|---|---|---|
shipmentCommodityId | integer | No | Unique commodity line ID. |
description | string | Yes | Freight description. |
handlingQuantity | integer | No | Number of handling units. |
packagingType | string (enum) | No | e.g., Pallet, Box, Drum, Crate. |
length | decimal | Yes | Length of a single unit. |
width | decimal | Yes | Width of a single unit. |
height | decimal | Yes | Height of a single unit. |
weightTotal | decimal | No | Total weight for this commodity line. |
piecesTotal | integer | No | Total piece count. |
freightClass | string (enum) | Yes | NMFC freight class (e.g., Class50, Class100). |
nmfc | string | Yes | NMFC item number. |
harmonizedCode | string | Yes | Harmonized tariff code. |
hazardousMaterial | boolean | No | Whether this line contains hazmat. |
unNumber | string | Yes | UN hazmat identification number. |
packingGroup | string (enum) | Yes | Hazmat packing group (I, II, III). |
hazardClasses | string[] | No | List of applicable hazard classes. |
additionalMarkings | string | Yes | Additional hazmat markings. |
hazmatCustomClassDescription | string | Yes | Custom hazmat class description. |
hazmatPieceDescription | string | Yes | Piece-level hazmat description. |
referenceNumber | string | Yes | Commodity-level reference number. |
shipmentCommodityReferenceNumbers | ReferenceNumber[] | No | Additional reference numbers for this line. |
CarrierDetails
| Field | Type | Nullable | Description |
|---|---|---|---|
carrierMasterId | integer | Yes | Carrier master record ID. |
name | string | Yes | Carrier name. |
scac | string | Yes | Standard Carrier Alpha Code. |
dotNumber | string | Yes | DOT number. |
mcNumber | string | Yes | MC operating authority number. |
trackingURL | string | Yes | Carrier's self-service tracking URL. |
city | string | Yes | Carrier home city. |
state | string | Yes | Carrier home state. |
zipCode | string | Yes | Carrier home zip. |
phoneNumber | string | Yes | Carrier contact phone. |
tariffName | string | Yes | Tariff applied to this leg. |
transitType | string (enum) | No | Leg type (e.g., Linehaul, Drayage). |
status | string (enum) | No | Carrier leg status. |
buy | decimal | No | Carrier cost for this leg. |
sell | decimal | No | Sell rate for this leg. |
parentShipmentId | integer | Yes | Parent shipment ID for child legs. |
childShipmentIds | integer[] | No | IDs of child/segment shipments. |
Accessorial
| Field | Type | Nullable | Description |
|---|---|---|---|
code | string | No | Accessorial code (e.g., LIFTGATE, RESDELIVERY). |
name | string | Yes | Human-readable accessorial name. |
ReferenceNumber
| Field | Type | Nullable | Description |
|---|---|---|---|
referenceType | string | No | Reference type label (e.g., PO, BOL, PRO). |
value | string | No | Reference number value. |
ShipmentAlert
| Field | Type | Nullable | Description |
|---|---|---|---|
alertId | integer | No | Unique alert ID. |
type | string | No | Alert type label. |
createdDate | string (datetime) | No | When the alert was created. |
resolved | boolean | No | Whether the alert has been resolved. |
StopCommodity
Links a commodity to a specific stop for pickup or delivery tracking.
| Field | Type | Nullable | Description |
|---|---|---|---|
shipmentCommodityId | integer | No | References a Commodity.shipmentCommodityId. |
handlingQuantity | integer | No | Number of handling units at this stop. |
Attachment
| Field | Type | Nullable | Description |
|---|---|---|---|
fileName | string | No | File name including extension. |
fileUrl | string | No | URL to access the attachment. |
Location Payload
Used by: ShipmentLocationUpdateUrl
This is a trimmed-down view of the shipment focused purely on location data. It does not include full stop details, commodities, or financials.
LocationShipmentDetails
| Field | Type | Nullable | Description |
|---|---|---|---|
shipmentId | integer | No | Unique shipment identifier. |
status | string (enum) | No | Current shipment status. |
latitude | number | Yes | Current GPS latitude. |
longitude | number | Yes | Current GPS longitude. |
locationString | string | Yes | Human-readable location description. |
lastLocationUpdate | string (datetime) | Yes | UTC timestamp of this location ping. |
Bill Payload
Used by: BillCreateUrl
Bill
| Field | Type | Nullable | Description |
|---|---|---|---|
billId | integer | No | Unique bill ID. |
billNumber | string | Yes | Bill reference number. |
billDate | string (datetime) | No | Date the bill was issued. |
billDueDate | string (datetime) | No | Payment due date. |
billType | string (enum) | No | e.g., Carrier, Vendor. |
totalAmount | decimal | No | Total bill amount. |
totalAmountApplied | decimal | No | Amount already applied via payments. |
paymentStatus | string (enum) | No | e.g., Unpaid, PartiallyPaid, Paid. |
pendingUnapprovedBills | boolean | No | Whether related unapproved bills exist. |
payerOrganization | Organization | No | The customer organization billed. |
vendor | Vendor | No | The carrier or vendor receiving payment. |
carrierMasterName | string | Yes | Carrier master name (if applicable). |
carrierMasterId | integer | Yes | Carrier master ID (if applicable). |
lineItems | BillLineItem[] | No | Individual charge lines. |
paymentLineItems | BillPaymentLineItem[] | No | Payment applications against this bill. |
externalSync | ExternalSyncDetails | Yes | Status of sync to an external accounting system (e.g., QuickBooks). |
BillLineItem
| Field | Type | Nullable | Description |
|---|---|---|---|
billLineItemId | integer | No | Unique line item ID. |
description | string | Yes | Charge description. |
accessorialCode | string | Yes | Associated accessorial code. |
quantity | integer | No | Quantity for this line. |
amount | decimal | No | Line amount. |
calculationType | string (enum) | Yes | How the charge is calculated (e.g., Flat, PerUnit). |
account | GeneralLedgerAccount | Yes | GL account assignment. |
externalSync | ExternalSyncDetails | Yes | External sync status for this line. |
BillPaymentLineItem
| Field | Type | Nullable | Description |
|---|---|---|---|
billPaymentLineItemId | integer | No | Unique payment line ID. |
billId | integer | Yes | Bill this payment applies to. |
billNumber | string | Yes | Bill number reference. |
shipmentId | integer | Yes | Shipment associated with this payment. |
amountApplied | decimal | No | Amount applied from this payment line. |
Commission Payload
Used by: CommissionBillCreateUrl
The commission payload mirrors the bill structure — the same field set representing agent or rep commissions rather than carrier/vendor bills. Uses the same nested types (Organization, Vendor, BillLineItem, BillPaymentLineItem, ExternalSyncDetails).
Invoice Payloads
Invoice
Used by: InvoiceCreateUrl · InvoiceCreateWithShipmentUrl (as invoice property)
| Field | Type | Nullable | Description |
|---|---|---|---|
invoiceId | integer | No | Unique invoice ID. |
invoiceNumber | string | Yes | Invoice reference number. |
invoiceDate | string (datetime) | No | Date the invoice was created. |
invoiceDueDate | string (datetime) | No | Payment due date. |
printedDate | string (datetime) | Yes | Date the invoice was marked as printed/delivered. |
factorDate | string (datetime) | Yes | Date the invoice was factored, if applicable. |
isRevision | boolean | No | Whether this is a revised invoice. |
totalAmount | decimal | No | Total invoice amount. |
totalAmountApplied | decimal | No | Amount already collected. |
paymentStatus | string (enum) | No | e.g., Unpaid, PartiallyPaid, Paid. |
billingOrganization | Organization | No | The organization issuing the invoice (your company). |
payerOrganization | Organization | No | The customer organization being invoiced. |
invoiceAccountingProfile | InvoiceAccountingProfile | Yes | Accounting preferences for this invoice. |
lineItems | InvoiceLineItem[] | No | Individual charge lines. |
paymentLineItems | InvoicePaymentLineItem[] | No | Payment applications against this invoice. |
invoiceRecipients | string[] | No | Email addresses this invoice was delivered to. |
externalSync | ExternalSyncDetails | Yes | External accounting sync status. |
InvoiceAccountingProfile
| Field | Type | Nullable | Description |
|---|---|---|---|
paymentPreference | string (enum) | No | Preferred payment method. |
creditLimit | decimal | Yes | Customer credit limit. |
paymentTerms | integer | Yes | Net payment terms in days. |
taxNumber | string | Yes | Customer tax ID. |
preferredInvoicingMethod | string (enum) | No | e.g., Email, Print, Portal. |
invoiceDeliveryInstructions | string | Yes | Special delivery instructions. |
podRequiredWithInvoice | boolean | No | Whether proof of delivery is required. |
bolRequiredWithInvoice | boolean | No | Whether bill of lading is required. |
customReferenceNumber | string | Yes | Custom reference number for the invoice. |
InvoiceLineItem
| Field | Type | Nullable | Description |
|---|---|---|---|
invoiceLineItemId | integer | No | Unique line item ID. |
description | string | Yes | Charge description. |
accessorialCode | string | Yes | Associated accessorial code. |
quantity | decimal | No | Quantity for this line. |
amount | decimal | No | Line amount. |
calculationType | string (enum) | No | How the charge is calculated. |
account | GeneralLedgerAccount | Yes | GL account assignment. |
externalSync | ExternalSyncDetails | Yes | External sync status for this line. |
InvoicePaymentLineItem
| Field | Type | Nullable | Description |
|---|---|---|---|
invoicePaymentLineItemId | integer | No | Unique payment line ID. |
invoiceId | integer | Yes | Invoice this payment applies to. |
invoiceNumber | string | Yes | Invoice number reference. |
shipmentId | integer | Yes | Shipment associated with this payment. |
amountApplied | decimal | No | Amount applied from this payment line. |
InvoiceWithShipment
Used by: InvoiceCreateWithShipmentUrl
A composite wrapper — the root object has two properties:
| Field | Type | Description |
|---|---|---|
invoice | Invoice | The full invoice record (see above). |
shipmentDetails | ShipmentDetails | The full shipment record associated with the invoice. |
Customer Payload
Used by: CustomerCreateUrl · CustomerUpdateUrl
Organization
This is also the shared type used within bill and invoice payloads wherever an organization reference appears.
| Field | Type | Nullable | Description |
|---|---|---|---|
organizationId | integer | No | Unique organization ID. |
name | string | No | Organization name. |
organizationType | string (enum) | No | e.g., Customer, Carrier, Vendor. |
referenceNumber | string | Yes | External reference number. |
notes | string | Yes | Internal notes. |
phone | string | Yes | Primary phone. |
mobile | string | Yes | Mobile phone. |
fax | string | Yes | Fax number. |
webAddress | string | Yes | Website URL. |
parentIds | string | Yes | Comma-delimited list of parent organization IDs in the hierarchy. |
address | Address | Yes | Primary address. |
billToAddress | Address | Yes | Billing address (if different from primary). |
modifiedById | integer | Yes | Staff ID of the last user to modify this record. |
modifiedByName | string | Yes | Name of the last user to modify this record. |
modifiedDate | string (datetime) | No | Last modification timestamp. |
createdDate | string (datetime) | No | Record creation timestamp. |
Carrier Payload
Used by: LSPCarrierCreateUrl · LSPCarrierUpdateUrl
LSPCarrier
| Field | Type | Nullable | Description |
|---|---|---|---|
lspCarrierId | integer | No | Broker-specific carrier record ID. |
masterCarrierId | integer | No | Carrier master record ID. |
status | string (enum) | No | e.g., Active, Inactive, Pending. |
taxId | string | Yes | Carrier tax ID / EIN. |
netTerms | integer | No | Payment net terms in days. |
paymentFrequency | string (enum) | No | How often payments are issued. |
preferredPaymentType | string (enum) | Yes | e.g., Check, ACH, QuickPay. |
creditLimit | decimal | Yes | Credit limit extended to this carrier. |
creditCardProcessingFee | decimal | Yes | Processing fee percentage for credit card payments. |
acceptCreditCard | boolean | No | Whether the carrier accepts credit card payments. |
requires1099 | boolean | No | Whether a 1099 form is required. |
carrierNotes | string | Yes | Internal notes. |
supportedShipmentTypes | string[] | No | List of supported modes (e.g., LTL, TL). |
carrierMasterInfo | CarrierMasterInfo | No | Core carrier identity information. |
remitPaymentAddress | ContactInformation | Yes | Address to send payments to. |
brokerCarrierLabels | string[] | No | Custom labels/tags assigned to this carrier. |
lspCarrierContacts | CarrierContact[] | No | Contact records for this carrier. |
lspCarrierInsurances | CarrierInsurance[] | No | Insurance certificates on file. |
lspCarrierSupportedTrailerTypes | SupportedTrailerType[] | No | Equipment types this carrier can handle. |
lspCarrierParameters | CarrierParameter[] | No | Custom key-value configuration parameters. |
CarrierMasterInfo
| Field | Type | Nullable | Description |
|---|---|---|---|
name | string | No | Legal carrier name. |
scac | string | Yes | Standard Carrier Alpha Code. |
dotNumber | string | Yes | DOT number. |
mcNumber | string | Yes | MC operating authority number. |
phoneNumber | string | Yes | Primary phone. |
city | string | Yes | City. |
state | string | Yes | State. |
zipCode | string | Yes | Zip code. |
CarrierContact
| Field | Type | Nullable | Description |
|---|---|---|---|
contactName | string | Yes | Contact full name. |
phone | string | Yes | Phone number. |
email | string | Yes | Email address. |
contactType | string (enum) | No | Role or type of contact. |
CarrierInsurance
| Field | Type | Nullable | Description |
|---|---|---|---|
insuranceType | string (enum) | No | Type of coverage (e.g., Cargo, Liability, GeneralLiability). |
policyNumber | string | Yes | Insurance policy number. |
expirationDate | string (datetime) | Yes | Policy expiration date. |
amount | decimal | Yes | Coverage amount. |
insuranceCompany | string | Yes | Name of the insurance provider. |
SupportedTrailerType
| Field | Type | Nullable | Description |
|---|---|---|---|
trailerType | string (enum) | No | e.g., DryVan, Flatbed, Reefer. |
CarrierParameter
| Field | Type | Nullable | Description |
|---|---|---|---|
key | string | No | Parameter key name. |
value | string | Yes | Parameter value. |
Shared Object Types
These types appear across multiple payload schemas.
Address
| Field | Type | Nullable | Description |
|---|---|---|---|
streetAddress | string | Yes | Primary street line. |
streetAddressTwo | string | Yes | Suite, unit, or secondary line. |
city | string | Yes | City. |
state | string | Yes | State or province. |
zipCode | string | Yes | Postal code. |
country | string (enum) | Yes | Country code (e.g., US, CA, MX). |
ContactInformation
| Field | Type | Nullable | Description |
|---|---|---|---|
companyName | string | Yes | Company name. |
streetAddress | string | Yes | Primary street line. |
streetAddressTwo | string | Yes | Secondary street line. |
city | string | Yes | City. |
state | string | Yes | State. |
zipCode | string | Yes | Postal code. |
country | string (enum) | Yes | Country. |
phone | string | Yes | Phone number. |
email | string | Yes | Email address. |
GeneralLedgerAccount
| Field | Type | Nullable | Description |
|---|---|---|---|
accountId | integer | No | GL account ID. |
accountNumber | string | Yes | GL account number. |
accountName | string | Yes | GL account name. |
ExternalSyncDetails
Represents the sync state of a record to an external accounting system (e.g., QuickBooks Online).
| Field | Type | Nullable | Description |
|---|---|---|---|
status | string (enum) | No | e.g., NotSynced, Synced, Error. |
referenceNumber | string | Yes | External system's reference ID for this record. |
amount | decimal | Yes | Amount as recorded in the external system. |
date | string (datetime) | Yes | Date of the last sync. |
Vendor
| Field | Type | Nullable | Description |
|---|---|---|---|
vendorId | integer | No | Unique vendor ID. |
name | string | No | Vendor name. |
vendorType | string (enum) | No | e.g., Carrier, Agent, ThirdParty. |
phone | string | Yes | Vendor phone. |
referenceNumber | string | Yes | External reference number. |
notes | string | Yes | Internal notes. |
isFactoringCompany | boolean | Yes | Whether this vendor is a factoring company. |
remitToAddress | Address | Yes | Address to remit payments to. |
modifiedById | integer | Yes | Staff ID of the last modifier. |
modifiedByName | string | Yes | Name of the last modifier. |
modifiedDate | string (datetime) | Yes | Last modification timestamp. |
V1 Legacy: ShipmentWebhookExport
Deprecated. Version 1 payloads are no longer recommended. Use Version 3 (default) for all new integrations.
Used by: ShipmentCreateUrl · ShipmentDetailUpdateUrl · ShipmentStatusUpdateUrl when Version = 1
| Field | Type | Nullable | Description |
|---|---|---|---|
shipmentId | integer | No | Unique shipment ID. |
shipmentType | string (enum) | No | Mode of transport. |
stackable | boolean | No | Whether freight can be stacked. |
trailerType | string | Yes | Trailer type description. |
serviceLevel | string | Yes | Service level description. |
customerName | string | Yes | Customer name. |
proNumber | string | Yes | PRO number. |
shipperReferenceNumber | string | Yes | Shipper reference. |
secondaryBOLNumber | string | Yes | Secondary BOL. |
poReference | string | Yes | PO reference. |
carrierSCAC | string | Yes | Carrier SCAC code. |
tariffDescription | string | Yes | Tariff description. |
status | string | No | Status label. |
statusCode | integer | No | Numeric status code. |
pickupDate | string (datetime) | Yes | Scheduled pickup date. |
actualPickupArrivalDateTime | string (datetime) | Yes | Actual pickup arrival. |
proofOfDeliveryArrivalDateTime | string (datetime) | Yes | POD arrival time. |
deliveryEstimatedDateTime | string (datetime) | Yes | Estimated delivery. |
totalBuy | decimal | No | Total carrier cost. |
totalSell | decimal | No | Total customer charge. |
latitude | number | Yes | Last known latitude. |
longitude | number | Yes | Last known longitude. |
mileage | decimal | No | Total mileage. |
pickupNumber | string | Yes | Pickup confirmation number. |
lspName | string | Yes | LSP (broker) name. |
salesRepName | string | Yes | Sales rep name. |
linehaulCarrierName | string | Yes | Linehaul carrier name. |
linehaulMCNumber | string | Yes | Linehaul carrier MC number. |
linehaulDOTNumber | string | Yes | Linehaul carrier DOT number. |
customerReferenceNumber | string | Yes | Customer reference number. |
customerStaffReferenceNumber | string | Yes | Customer staff reference. |
billToOrganizationId | string | Yes | Billing org ID (as string). |
customerStaffID | string | Yes | Customer staff ID (as string). |
originAddress | V1Address | Yes | Simplified origin address. |
destinationAddress | V1Address | Yes | Simplified destination address. |
commodities | V1Commodity[] | No | Commodity lines. |
accessorialCodes | string[] | No | List of accessorial code strings. |
V1Address
| Field | Type | Nullable | Description |
|---|---|---|---|
companyName | string | Yes | Company name. |
streetAddress | string | Yes | Street address. |
city | string | Yes | City. |
state | string | Yes | State. |
zipCode | string | Yes | Zip code. |
contactName | string | Yes | Contact name. |
phone | string | Yes | Phone number. |
V1Commodity
| Field | Type | Nullable | Description |
|---|---|---|---|
description | string | Yes | Freight description. |
handlingQuantity | integer | No | Number of handling units. |
packagingType | string | Yes | Packaging type. |
weightTotal | decimal | No | Total weight. |
freightClass | string | Yes | Freight class. |
hazardousMaterial | boolean | No | Whether hazmat. |
Authentication
All webhook communication is outbound — the TMS sends requests to your endpoint. You are responsible for securing your endpoint; the TMS provides the following mechanisms to prove the request is coming from the platform.
Transport Security
The TMS supports TLS 1.0, 1.1, and 1.2. TLS 1.3 is not currently supported. If your endpoint enforces TLS 1.3-only, webhook delivery will fail at the transport layer.
HTTPS is strongly recommended but not enforced. The TMS will POST to a plain http:// URL if configured — this exposes the Authorization header and payload in transit. There is no TLS pinning; standard OS certificate store validation applies.
Recommendation: Configure https:// endpoints only, and require TLS 1.2 on your endpoint.
Authentication Methods
Two authentication methods are available and are configured per Source Setting. They can be used independently or together — see the precedence note below.
Option 1 — Static Authorization Header
Set the Authorization source setting parameter to any string value. The TMS will include it verbatim as the Authorization header on every request. No prefix or transformation is added.
This is the most flexible option — it supports any scheme your endpoint requires:
# Bearer token
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
# Custom API key (if your endpoint expects this header)
Authorization: ApiKey abc123xyz
# HMAC signature (pre-computed and stored as a static value)
Authorization: HMAC sha256=abc123...
Source Setting parameter: Authorization
Option 2 — HTTP Basic Authentication
Set both the UserName and Password source setting parameters. The TMS will Base64-encode username:password and attach it as a standard Authorization: Basic header. Encoding uses ASCII.
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Special characters in usernames or passwords should be verified to survive ASCII encoding without truncation.
Source Setting parameters: UserName, Password
When Both Are Configured
If both Authorization and UserName/Password are set on the same Source Setting, Basic Authentication takes precedence. The effective header sent will be Authorization: Basic <base64(user:pass)>.
| Configuration | Header sent |
|---|---|
Authorization only | Authorization: <your value> |
UserName + Password only | Authorization: Basic <base64(user:pass)> |
| Both set | Authorization: Basic <base64(user:pass)> (Basic wins) |
Verifying Requests Are From the TMS
Because the TMS does not sign payloads with a cryptographic signature (no HMAC, no X-Signature header), the recommended approach is:
- Use a strong secret in the
Authorizationheader. Treat theAuthorizationvalue as a shared secret — use a long, randomly generated token and validate it on every request. - Validate over HTTPS only. This ensures the
Authorizationheader cannot be observed in transit. - Return 401 Unauthorized for requests with missing or incorrect credentials. The TMS will log the response code but will not retry.
Error Handling & Logging
Delivery Behavior
The TMS makes a single attempt to deliver each webhook. There is no automatic retry. If your endpoint is unavailable, times out, or returns an error status code, the event is logged and no further delivery is attempted.
| Scenario | TMS behavior |
|---|---|
| Endpoint returns 2xx | Success — response body and status code logged. |
| Endpoint returns 3xx | Follows the redirect automatically to the new URL. |
| Endpoint returns 4xx or 5xx | Logged as-is — the non-2xx status is recorded but does not trigger a retry or exception. Response body is still captured. |
| Network error / DNS failure | Exception caught — error message logged, no response data captured. |
| Endpoint times out | Exception caught — error message logged. The TMS uses the default HttpClient timeout (~100 seconds). |
| TLS / certificate error | Exception caught — error message logged. |
Important: The TMS does not distinguish between 2xx and non-2xx responses for retry purposes. A 500 from your endpoint is logged just like a 200 — no re-delivery is attempted either way. To signal a real problem, you must proactively monitor WebhookActivityLogs yourself.
Your endpoint should respond quickly. Long-running processing should be dequeued asynchronously — accept the webhook, return 200 OK immediately, and process in the background.
Webhook Activity Logs
Every delivery attempt — successful or not — is written to the WebhookActivityLogs table in the TMS logging database, joined with the ApiDetails table via ApiDetailId. This is the primary tool for diagnosing integration issues.
Log Fields
| Field | Type | Populated | Description |
|---|---|---|---|
WebhookActivityLogId | long | Always | Auto-incrementing primary key. |
OrganizationId | int | Always | The organization that owns the triggering record. |
StaffId | int | Always for user-initiated events; may reflect a system user ID for background/EDI/driver-tracking events | The staff member whose action triggered the webhook. |
IntegrationSourceId | int? | Usually populated; nullable in schema | The Source Setting that owns this webhook configuration. |
WebhookType | WebhookType? (nullable enum, values 1–13) | Always | Which webhook fired (e.g., ShipmentCreate, InvoiceCreate). Serialized as an integer in SQL. |
Id | long? | Always | The ID of the triggering record — polymorphic per WebhookType (ShipmentId for shipment events, BillId for BillCreate, InvoiceId for invoice events, OrganizationId for customer/carrier events). |
StartDateTime | datetime (UTC) | Always | When the TMS began processing the webhook. |
EndDateTime | datetime (UTC) | Always | When the delivery attempt completed (or failed). |
Duration | int (seconds) | Always | DATEDIFF(SECOND, StartDateTime, EndDateTime) — computed by the database. |
ErrorMessage | string | On network-level error only | Exception message if a network-level or system error occurred (DNS failure, timeout, TLS error). Truncated to 1,000 characters. Absent when any HTTP response was received. |
ApiDetail.Url | string | When an HTTP request was sent | The absolute URL the request was sent to. Truncated to 200 characters. |
ApiDetail.HttpStatusCode | int | When an HTTP response was received | The HTTP status code returned by your endpoint (e.g., 200, 401, 500). |
ApiDetail.Request | string | Always | The full JSON payload that was sent to your endpoint. |
ApiDetail.Response | string | When an HTTP response was received | The raw response body returned by your endpoint (any status code). |
"When an HTTP response was received" means any status code — 2xx, 3xx, 4xx, or 5xx all count. Fields are absent only when a network-level exception prevented a response entirely.
Reading the Logs
A few common patterns when investigating a failed delivery:
The webhook fired but my endpoint returned a 401
ErrorMessagewill be null — an HTTP response was received.ApiDetail.HttpStatusCodewill be401.ApiDetail.Requestwill contain the exact JSON that was sent.- Check that the
Authorization(or Basic) source setting value matches what your endpoint expects.
The webhook fired but I received nothing
- If
ApiDetail.Responseis empty andApiDetail.HttpStatusCodeis 200, your endpoint returned an empty body — that is fine. - If
ErrorMessageis populated, a network-level failure occurred before any HTTP response was received. The error message will indicate the cause (e.g.,"No such host is known","The operation was canceled").
The webhook never appeared in logs
- The triggering event may not have matched the linked organization on the Source Setting. Verify the shipment/customer/carrier belongs to the linked org.
- For shipment webhooks, the triggering event may still be within the ~1-minute batching window — wait and re-check.
- For
ShipmentLocationUpdateUrlandShipmentLocationUpdateExtendedUrl, confirm the 15-minute throttle window has elapsed since the last successful delivery. - Because of the log-batching described below, expect up to a ~10-second delay before a delivery attempt is queryable.
Log Persistence and Batching
Webhook activity logs are flushed to the logging database in batches. A flush occurs when any of these conditions are met:
| Condition | Threshold |
|---|---|
| Time since last flush | > 10 seconds |
| Items accumulated | ≥ 200 entries |
This means a log entry may not appear in the database immediately — expect up to a ~10-second delay before a delivery attempt is queryable in the logs.
Updated about 1 month ago
