Webhook Integration Guide
Table of Contents
Overview
The TAI TMS webhook system allows your application to receive real-time 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
▼
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 fires once |
| Delivery | At-least-once; idempotency handling is the consumer's responsibility |
Versioning
The Version source setting controls the shape of shipment payloads and how statuses are represented.
| Version | Behavior |
|---|---|
1 | Legacy (deprecated). Shipment payloads use the ShipmentWebhookExport model. |
2 | Shipment statuses are transformed: Committed → Booked and Quote → Quoted. |
3 (default) | Current format. Statuses are sent as-is: Committed and Quote. |
If no
Versionis configured, the system defaults to version3.
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
ShipmentCreateUrlFires when a new shipment is created in the TMS.
- Trigger: Shipment record is persisted for the first time.
- Payload: Full shipment details (
ShipmentDetails). - Notes: Fires once per shipment, immediately on creation.
ShipmentDetailUpdateUrl
ShipmentDetailUpdateUrlFires when an existing shipment's details are modified.
- Trigger: Any update to shipment information — stops/addresses, commodities, accessorials, carrier assignment, reference numbers, etc.
- Payload: Full shipment details (
ShipmentDetails), reflecting the state after the update. - Notes: Can fire multiple times over the life of a shipment. This does not fire for status-only changes (see
ShipmentStatusUpdateUrl).
ShipmentStatusUpdateUrl
ShipmentStatusUpdateUrlFires when a shipment's status changes.
-
Trigger: A shipment transitions to a new status (e.g.,
Quote → Committed,Committed → InTransit,InTransit → Delivered). -
Payload: Full shipment details (
ShipmentDetails) including the new status value. -
Throttle: Fires at most once every 15 minutes per shipment, per linked organization. If a status update occurs within the 15-minute window of the previous one, it is suppressed until the window expires.
-
Status values by version:
Version "Booked" status sent as "Quoting" status sent as 2BookedQuoted3(default)CommittedQuote
ShipmentLocationUpdateUrl
ShipmentLocationUpdateUrlFires when a new GPS/location update is received for a shipment — but only if enough time has elapsed since the last update.
- Trigger: A location update is recorded for an in-transit shipment.
- Payload: Simplified shipment data focused on location — shipment ID, status, latitude, longitude, location string, and last location update timestamp.
- Throttle: Fires at most once every 15 minutes per shipment. If a location ping arrives within 15 minutes of the previous webhook delivery, it is silently dropped.
- Notes: This webhook is specifically designed for high-frequency location tracking scenarios. The 15-minute throttle prevents flooding your endpoint with every GPS ping.
Accounting Events
BillCreateUrl
BillCreateUrlFires when a bill is approved through the Approve Bill workflow.
- Trigger: A carrier/vendor bill completes the approval workflow step.
- Payload: Full bill details (
PublicAPIBill) including line items, payment status, and external sync details. - Delivery timing: Dispatched via a background job with a ~5-second delay after the approval action.
- Notes: The payload includes the payer organization, vendor, line items, and any existing payment applications. The bill's
payerOrganizationIdis used to match the webhook's linked organization.
CommissionBillCreateUrl
CommissionBillCreateUrlFires when a commission bill is approved through the Approve Bill workflow.
- Trigger: A commission record completes the approval workflow step.
- Payload: Commission details (
PublicAPICommission), which mirrors the bill structure but represents agent/rep commissions. - Notes: Structurally identical to
BillCreateUrlbut scoped to commission-type billing records.
InvoiceCreateUrl
InvoiceCreateUrlFires when an invoice is finalized.
- Trigger: The Invoice Create process completes for a customer invoice.
- Payload: Invoice details only (
PublicAPIInvoice) — organization info, line items, payment status, due dates, recipients. - Notes: See
DoNotMarkInvoiceAsPrintedin Source Setting Parameters for behavior around the invoice's printed state after delivery.
InvoiceCreateWithShipmentUrl
InvoiceCreateWithShipmentUrlFires at the same moment as InvoiceCreateUrl, but includes the associated shipment data in the payload.
- Trigger: The Invoice Create process completes for a customer invoice.
- Payload: A composite object containing both
invoice(PublicAPIInvoice) andshipmentDetails(ShipmentDetails). - Notes: Use this instead of
InvoiceCreateUrlwhen your downstream system needs to correlate invoice financials with the full shipment record in a single call.InvoiceCreateUrlandInvoiceCreateWithShipmentUrlshould not both be configured on the same Source Setting — they fire for the same event.
Customer Events
CustomerCreateUrl
CustomerCreateUrlFires when a new customer organization is created in the TMS.
- Trigger: A customer organization record is persisted for the first time.
- Payload: Customer organization details (
PublicAPIOrganization) — name, addresses, contact info, reference number, and metadata. - Notes: Scoped to the parent organization hierarchy of the webhook's linked organization. Only customers that belong to the linked org's hierarchy will trigger this webhook.
CustomerUpdateUrl
CustomerUpdateUrlFires when an existing customer organization's record is modified.
- Trigger: Any field update on a customer organization (name, address, phone, reference number, notes, etc.).
- Payload: Full updated customer details (
PublicAPIOrganization). - Notes: Same organization hierarchy scoping as
CustomerCreateUrl. Not every internal state change triggers this — it fires on direct record edits.
Carrier Events
LSPCarrierCreateUrl
LSPCarrierCreateUrlFires when a new carrier is added to the TMS.
- Trigger: A broker carrier (LSP carrier) record is created.
- Payload: Carrier details (
PublicAPILSPCarrier) including carrier master info, insurance records, supported trailer types, contacts, payment preferences, and labels.
LSPCarrierUpdateUrl
LSPCarrierUpdateUrlFires when an existing carrier record is modified.
- Trigger: Any update to a broker carrier record — contact info, insurance, payment terms, supported equipment, labels, status, etc.
- Payload: Full updated carrier details (
PublicAPILSPCarrier).
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. |
ShipmentStatusUpdateUrl | URL | Endpoint for shipment status change events. |
ShipmentLocationUpdateUrl | URL | Endpoint for shipment location update events (15-min throttled). |
BillCreateUrl | URL | Endpoint for bill approval events. |
CommissionBillCreateUrl | URL | Endpoint for commission bill approval events. |
InvoiceCreateUrl | URL | Endpoint for invoice creation events (invoice only). |
InvoiceCreateWithShipmentUrl | URL | Endpoint for invoice creation events (invoice + shipment). |
CustomerCreateUrl | URL | Endpoint for customer creation events. |
CustomerUpdateUrl | URL | Endpoint for customer update events. |
LSPCarrierCreateUrl | URL | Endpoint for carrier creation events. |
LSPCarrierUpdateUrl | URL | Endpoint for carrier update events. |
Authorization | String | Static authorization token sent in the Authorization request header. |
Version | Integer (1, 2, or 3) | Controls payload format and status label behavior. Defaults to 3. |
DoNotMarkInvoiceAsPrinted | Boolean (true/false) | When true, invoices will not be marked as printed after the webhook fires — they will remain visible in the Invoice Delivery screen. Defaults to false (invoices are marked printed after delivery). |
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.
The sections below map each webhook URL type to its payload shape. Nested object types are defined once and cross-referenced where reused.
Shipment Payloads
Used by: ShipmentCreateUrl · ShipmentDetailUpdateUrl · ShipmentStatusUpdateUrl
Version note: Version
1uses the legacyShipmentWebhookExportshape (see V1 Legacy Schema). Versions2and3use the schema below.
ShipmentDetails
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
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
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
PayerOrganization| Field | Type | Nullable | Description |
|---|---|---|---|
organizationId | integer | No | Organization ID. |
name | string | No | Organization name. |
address | Address | Yes | Primary address. |
ShippingAddress
ShippingAddressRepresents 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
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
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
Accessorial| Field | Type | Nullable | Description |
|---|---|---|---|
code | string | No | Accessorial code (e.g., LIFTGATE, RESDELIVERY). |
name | string | Yes | Human-readable accessorial name. |
ReferenceNumber
ReferenceNumber| Field | Type | Nullable | Description |
|---|---|---|---|
referenceType | string | No | Reference type label (e.g., PO, BOL, PRO). |
value | string | No | Reference number value. |
ShipmentAlert
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
StopCommodityLinks 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
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
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
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
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
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 exactly, representing agent or rep commissions rather than carrier/vendor bills.
Commission
Commission| Field | Type | Nullable | Description |
|---|---|---|---|
commissionId | integer | No | Unique commission record ID. |
commissionNumber | string | Yes | Commission reference number. |
commissionDate | string (datetime) | No | Date the commission was issued. |
commissionDueDate | string (datetime) | No | Payment due date. |
commissionType | string (enum) | No | Commission type. |
totalAmount | decimal | No | Total commission amount. |
totalAmountApplied | decimal | No | Amount already paid out. |
paymentStatus | string (enum) | No | e.g., Unpaid, PartiallyPaid, Paid. |
pendingUnapprovedCommissions | boolean | No | Whether related unapproved commissions exist. |
payerOrganization | Organization | No | The organization this commission is billed under. |
vendor | Vendor | No | The rep or agent receiving the commission. |
carrierMasterName | string | Yes | Carrier master name (if applicable). |
carrierMasterId | integer | Yes | Carrier master ID (if applicable). |
lineItems | BillLineItem[] | No | Individual commission charge lines. |
paymentLineItems | BillPaymentLineItem[] | No | Payment applications. |
externalSync | ExternalSyncDetails | Yes | External accounting sync status. |
Invoice Payloads
Invoice
InvoiceUsed 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
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
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
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
InvoiceWithShipmentUsed 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
OrganizationThis 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 | Pipe-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
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
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
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
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
SupportedTrailerType| Field | Type | Nullable | Description |
|---|---|---|---|
trailerType | string (enum) | No | e.g., DryVan, Flatbed, Reefer. |
CarrierParameter
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
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
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
GeneralLedgerAccount| Field | Type | Nullable | Description |
|---|---|---|---|
accountId | integer | No | GL account ID. |
accountNumber | string | Yes | GL account number. |
accountName | string | Yes | GL account name. |
ExternalSyncDetails
ExternalSyncDetailsRepresents 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
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
ShipmentWebhookExport
Deprecated. Version1payloads are no longer recommended. Use Version3(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
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
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
All webhook requests are sent over HTTPS. The TMS enforces TLS 1.0, 1.1, and 1.2. Endpoints that do not support HTTPS or present an invalid certificate will cause the request to fail and be logged as an error. There is no TLS pinning; standard OS certificate store validation applies.
Recommendation: Require TLS 1.2 or higher on your endpoint and reject any plain HTTP connections.
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.
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.
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
The encoding uses ASCII. 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 static Authorization value is applied first, but the Basic auth header is set afterward and overwrites it. The effective header sent will be the Authorization: Basic ... value.
| 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, the recommended approach for endpoint verification is:
- Use a secret in the Authorization header. Treat the
Authorizationvalue as a shared secret — use a long, randomly generated token and validate it on every request. - Validate over HTTPS only. This ensures the Authorization header cannot be observed in transit.
- Return
401 Unauthorizedfor 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 4xx or 5xx | Logged as-is — the non-2xx status is recorded but does not trigger a retry or exception. |
| 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. |
Your endpoint should respond quickly. Long-running processing should be dequeued asynchronously — accept the webhook, return
200 OKimmediately, 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. This is the primary tool for diagnosing integration issues.
Log Fields
| Field | Type | Populated | Description |
|---|---|---|---|
WebhookActivityLogId | long | Always | Auto-incrementing primary key. |
OrganizationId | integer | Always | The organization that owns the triggering record. |
StaffId | integer | Always | The staff member whose action triggered the webhook (or system ID for background jobs). |
IntegrationSourceId | integer | Always | The Source Setting that owns this webhook configuration. |
WebhookType | string (enum) | Always | Which webhook fired (e.g., ShipmentCreate, InvoiceCreate). |
Id | long | Always | The ID of the triggering record (shipment ID, invoice ID, etc.). |
StartDateTime | datetime (UTC) | Always | When the TMS began processing the webhook. |
EndDateTime | datetime (UTC) | Always | When the delivery attempt completed (or failed). |
Duration | integer | Always | Seconds between StartDateTime and EndDateTime — computed by the database. |
ErrorMessage | string | On error only | Exception message if a network-level or system error occurred. Truncated to 1,000 characters. Only present when no HTTP response was received. |
ApiDetail.Url | string | On success only | The absolute URL the request was sent to. Truncated to 200 characters. |
ApiDetail.HttpStatusCode | integer | On success only | 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 | On success only | The raw response body returned by your endpoint. |
"On success only" here means an HTTP response was received — any status code counts. Fields are absent only when a network-level exception prevented a response entirely (DNS failure, connection refused, timeout, TLS error).
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
Authorizationsource setting value matches what your endpoint expects.
The webhook fired but I received nothing
- If
ApiDetail.Responseis empty andApiDetail.HttpStatusCodeis200, 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
ShipmentStatusUpdateUrlandShipmentLocationUpdateUrl, confirm the 15-minute throttle window has elapsed since the last delivery.
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.
