Webhook Integration Guide

Table of Contents


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

BehaviorDetail
HTTP methodPOST
Content typeapplication/json
EncodingUTF-8
Property namingcamelCase
Date formatISO 8601 — yyyy-MM-ddTHH:mm:ssK (UTC)
Enum serializationString values (not integers)
Retry policyNo automatic retries — each event is attempted once
Delivery guaranteeAt-most-once. If your endpoint is unavailable or errors, the event is logged and no further delivery is attempted.
TransportHTTPS strongly recommended but not enforced; plain HTTP endpoints are accepted (see Authentication)
Custom headersNone. Only Authorization (if configured) plus HttpClient's auto-added Content-Type and Content-Length. No User-Agent, no X-Webhook-*, no HMAC signature.
HTTP redirects3xx 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.

VersionBehavior
1Legacy (deprecated). Shipment payloads use the ShipmentWebhookExport model.
2Shipment 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 ShipmentCreateUrl is not configured but ShipmentDetailUpdateUrl is, the creation event delivers to ShipmentDetailUpdateUrl instead.

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: ShipmentDetailUpdateUrl also fires alongside ShipmentStatusUpdateUrl on 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
  • Payload: Full shipment details (ShipmentDetails) including the current status. Note that the payload's status may 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: ShipmentDetailUpdateUrl fires alongside this webhook from the same handler if subscribed.

Status values by version:

Version"Booked" status sent as"Quoting" status sent as
2BookedQuoted
3 (default)CommittedQuote

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)
  • 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 payerOrganizationId is 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.Created via 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 BillCreateUrl payloads 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 DoNotMarkInvoiceAsPrinted in 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) and shipmentDetails (ShipmentDetails).
  • Delivery: Synchronous / immediate.
  • Notes: If both InvoiceCreateUrl and InvoiceCreateWithShipmentUrl are 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/Customers or 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 ParentIds chain 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 BrokerCarrier record.
  • 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 trigger LSPCarrierCreateUrl.

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:

ParameterTypeDescription
ShipmentCreateUrlURLEndpoint for shipment creation events.
ShipmentDetailUpdateUrlURLEndpoint for shipment detail update events. Also fires alongside ShipmentStatusUpdateUrl.
ShipmentStatusUpdateUrlURLEndpoint for shipment status and transit-related change events.
ShipmentLocationUpdateUrlURLEndpoint for location updates (simplified payload). 15-min throttle.
ShipmentLocationUpdateExtendedUrlURLEndpoint for location updates (extended payload). 15-min throttle, tracked independently from ShipmentLocationUpdateUrl.
BillCreateUrlURLEndpoint for bill approval events. Fires with a ~5-second delay.
CommissionBillCreateUrlURLEndpoint for commission approval events.
InvoiceCreateUrlURLEndpoint for invoice creation events (invoice only).
InvoiceCreateWithShipmentUrlURLEndpoint for invoice creation events (invoice + shipment). Fires independently of InvoiceCreateUrl.
CustomerCreateUrlURLEndpoint for customer creation events.
CustomerUpdateUrlURLEndpoint for customer update events (includes indirect triggers).
LSPCarrierCreateUrlURLEndpoint for carrier creation events. Currently limited to Highway onboarding.
LSPCarrierUpdateUrlURLEndpoint for carrier update events.
AuthorizationStringStatic authorization token sent verbatim in the Authorization request header.
UserNameStringUsername for HTTP Basic Authentication (paired with Password).
PasswordStringPassword for HTTP Basic Authentication (paired with UserName).
VersionInteger (1, 2, or 3)Controls shipment payload format and status label behavior. Defaults to 3-equivalent for any unrecognized or missing value.
DoNotMarkInvoiceAsPrintedBoolean (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

FieldTypeNullableDescription
shipmentIdintegerNoUnique shipment identifier.
statusstring (enum)NoCurrent shipment status. V3: Quote, Committed, InTransit, Delivered, etc. V2: Quoted, Booked, InTransit, Delivered.
shipmentTypestring (enum)NoMode of transport (e.g., LTL, TL, Parcel).
serviceLevelstring (enum)NoService level (e.g., Standard, Expedited).
stackablebooleanNoWhether freight can be stacked.
trailerTypestring (enum)YesRequired trailer type (e.g., DryVan, Flatbed, Reefer).
trailerSizestring (enum)YesTrailer size (e.g., FT53, FT48).
weightUnitsstring (enum)YesUnit of weight (LBS, KGS).
dimensionUnitsstring (enum)YesUnit of dimension (IN, CM).
importExportstring (enum)YesImport/export flag if applicable.
mileagedecimalNoTotal estimated mileage.
transitTimeintegerYesEstimated transit time in days.
totalBuydecimalNoTotal carrier cost.
totalSelldecimalNoTotal customer charge.
latitudenumberYesLast known GPS latitude.
longitudenumberYesLast known GPS longitude.
locationStringstringYesHuman-readable last known location.
lastLocationUpdatestring (datetime)YesUTC timestamp of the most recent location ping.
driverCellPhoneNumberstringYesDriver's cell phone number.
hazmatEmergencyContactNumberstringYesEmergency contact for hazmat shipments.
customerCustomerDetailsV2NoCustomer record associated with the shipment.
carrierRepStaffDTOYesTMS staff member assigned as carrier rep.
payerOrganizationPayerOrganizationNoThe billing organization for this shipment.
stopsShippingAddress[]NoOrdered list of shipment stops (origin, destination, and any intermediates).
commoditiesCommodity[]NoLine-level freight commodity records.
accessorialCodesAccessorial[]NoList of accessorial services applied.
shipmentReferenceNumbersReferenceNumber[]NoShipment-level reference numbers.
shipmentAlertsShipmentAlert[]NoActive alerts on the shipment.
carrierListCarrierDetails[]NoOne or more carriers assigned to the shipment (supports multi-leg).
attachmentsAttachment[]NoFiles attached to the shipment.

CustomerDetailsV2

FieldTypeNullableDescription
namestringNoCustomer organization name.
referenceNumberstringYesExternal reference number for the customer.
staffIDintegerNoInternal ID of the assigned TMS rep.
staffNamestringYesDisplay name of the assigned TMS rep.
staffReferenceNumberstringYesExternal reference for the assigned rep.
salesRepNamesstringYesComma-separated names of associated sales reps.
billToOrganizationIdintegerNoOrganization ID used for invoicing.
officeOrganizationIdintegerNoOffice/branch organization ID.
officeNamestringYesName of the office/branch.

StaffDTO

FieldTypeNullableDescription
staffIdintegerYesInternal staff ID.
contactNamestringYesFull name.
emailstringYesEmail address.
phonestringYesPhone number.

PayerOrganization

FieldTypeNullableDescription
organizationIdintegerNoOrganization ID.
namestringNoOrganization name.
addressAddressYesPrimary address.

ShippingAddress

Represents a single stop on the shipment route.

FieldTypeNullableDescription
shipmentStopIdintegerNoUnique stop ID.
stopTypestring (enum)NoPickup, Delivery, or Stop.
companyNamestringYesFacility or company name at this stop.
streetAddressstringYesPrimary street line.
streetAddressTwostringYesSecondary street line.
citystringYesCity.
statestringYesState/province.
zipCodestringYesPostal code.
countrystring (enum)NoCountry code (e.g., US, CA, MX).
contactNamestringYesContact name at the stop.
phonestringYesContact phone.
faxstringYesFax number.
emailstringYesContact email.
instructionsstringYesPickup/delivery instructions.
notesstringYesInternal notes for this stop.
referenceNumberstringYesStop-level reference number.
estimatedReadyDateTimestring (datetime)YesScheduled open/ready time.
estimatedCloseDateTimestring (datetime)YesScheduled close time.
appointmentReadyDateTimestring (datetime)YesConfirmed appointment open time.
appointmentCloseDateTimestring (datetime)YesConfirmed appointment close time.
actualArrivalDateTimestring (datetime)YesActual arrival recorded by driver or TMS.
actualDepartureDateTimestring (datetime)YesActual departure recorded by driver or TMS.
shipmentStopReferenceNumbersReferenceNumber[]NoStop-level reference numbers.
shipmentStopPickupCommoditiesStopCommodity[]NoCommodities picked up at this stop.
shipmentStopDeliveryCommoditiesStopCommodity[]NoCommodities delivered at this stop.

Commodity

FieldTypeNullableDescription
shipmentCommodityIdintegerNoUnique commodity line ID.
descriptionstringYesFreight description.
handlingQuantityintegerNoNumber of handling units.
packagingTypestring (enum)Noe.g., Pallet, Box, Drum, Crate.
lengthdecimalYesLength of a single unit.
widthdecimalYesWidth of a single unit.
heightdecimalYesHeight of a single unit.
weightTotaldecimalNoTotal weight for this commodity line.
piecesTotalintegerNoTotal piece count.
freightClassstring (enum)YesNMFC freight class (e.g., Class50, Class100).
nmfcstringYesNMFC item number.
harmonizedCodestringYesHarmonized tariff code.
hazardousMaterialbooleanNoWhether this line contains hazmat.
unNumberstringYesUN hazmat identification number.
packingGroupstring (enum)YesHazmat packing group (I, II, III).
hazardClassesstring[]NoList of applicable hazard classes.
additionalMarkingsstringYesAdditional hazmat markings.
hazmatCustomClassDescriptionstringYesCustom hazmat class description.
hazmatPieceDescriptionstringYesPiece-level hazmat description.
referenceNumberstringYesCommodity-level reference number.
shipmentCommodityReferenceNumbersReferenceNumber[]NoAdditional reference numbers for this line.

CarrierDetails

FieldTypeNullableDescription
carrierMasterIdintegerYesCarrier master record ID.
namestringYesCarrier name.
scacstringYesStandard Carrier Alpha Code.
dotNumberstringYesDOT number.
mcNumberstringYesMC operating authority number.
trackingURLstringYesCarrier's self-service tracking URL.
citystringYesCarrier home city.
statestringYesCarrier home state.
zipCodestringYesCarrier home zip.
phoneNumberstringYesCarrier contact phone.
tariffNamestringYesTariff applied to this leg.
transitTypestring (enum)NoLeg type (e.g., Linehaul, Drayage).
statusstring (enum)NoCarrier leg status.
buydecimalNoCarrier cost for this leg.
selldecimalNoSell rate for this leg.
parentShipmentIdintegerYesParent shipment ID for child legs.
childShipmentIdsinteger[]NoIDs of child/segment shipments.

Accessorial

FieldTypeNullableDescription
codestringNoAccessorial code (e.g., LIFTGATE, RESDELIVERY).
namestringYesHuman-readable accessorial name.

ReferenceNumber

FieldTypeNullableDescription
referenceTypestringNoReference type label (e.g., PO, BOL, PRO).
valuestringNoReference number value.

ShipmentAlert

FieldTypeNullableDescription
alertIdintegerNoUnique alert ID.
typestringNoAlert type label.
createdDatestring (datetime)NoWhen the alert was created.
resolvedbooleanNoWhether the alert has been resolved.

StopCommodity

Links a commodity to a specific stop for pickup or delivery tracking.

FieldTypeNullableDescription
shipmentCommodityIdintegerNoReferences a Commodity.shipmentCommodityId.
handlingQuantityintegerNoNumber of handling units at this stop.

Attachment

FieldTypeNullableDescription
fileNamestringNoFile name including extension.
fileUrlstringNoURL 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

FieldTypeNullableDescription
shipmentIdintegerNoUnique shipment identifier.
statusstring (enum)NoCurrent shipment status.
latitudenumberYesCurrent GPS latitude.
longitudenumberYesCurrent GPS longitude.
locationStringstringYesHuman-readable location description.
lastLocationUpdatestring (datetime)YesUTC timestamp of this location ping.

Bill Payload

Used by: BillCreateUrl

Bill

FieldTypeNullableDescription
billIdintegerNoUnique bill ID.
billNumberstringYesBill reference number.
billDatestring (datetime)NoDate the bill was issued.
billDueDatestring (datetime)NoPayment due date.
billTypestring (enum)Noe.g., Carrier, Vendor.
totalAmountdecimalNoTotal bill amount.
totalAmountApplieddecimalNoAmount already applied via payments.
paymentStatusstring (enum)Noe.g., Unpaid, PartiallyPaid, Paid.
pendingUnapprovedBillsbooleanNoWhether related unapproved bills exist.
payerOrganizationOrganizationNoThe customer organization billed.
vendorVendorNoThe carrier or vendor receiving payment.
carrierMasterNamestringYesCarrier master name (if applicable).
carrierMasterIdintegerYesCarrier master ID (if applicable).
lineItemsBillLineItem[]NoIndividual charge lines.
paymentLineItemsBillPaymentLineItem[]NoPayment applications against this bill.
externalSyncExternalSyncDetailsYesStatus of sync to an external accounting system (e.g., QuickBooks).

BillLineItem

FieldTypeNullableDescription
billLineItemIdintegerNoUnique line item ID.
descriptionstringYesCharge description.
accessorialCodestringYesAssociated accessorial code.
quantityintegerNoQuantity for this line.
amountdecimalNoLine amount.
calculationTypestring (enum)YesHow the charge is calculated (e.g., Flat, PerUnit).
accountGeneralLedgerAccountYesGL account assignment.
externalSyncExternalSyncDetailsYesExternal sync status for this line.

BillPaymentLineItem

FieldTypeNullableDescription
billPaymentLineItemIdintegerNoUnique payment line ID.
billIdintegerYesBill this payment applies to.
billNumberstringYesBill number reference.
shipmentIdintegerYesShipment associated with this payment.
amountApplieddecimalNoAmount 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)

FieldTypeNullableDescription
invoiceIdintegerNoUnique invoice ID.
invoiceNumberstringYesInvoice reference number.
invoiceDatestring (datetime)NoDate the invoice was created.
invoiceDueDatestring (datetime)NoPayment due date.
printedDatestring (datetime)YesDate the invoice was marked as printed/delivered.
factorDatestring (datetime)YesDate the invoice was factored, if applicable.
isRevisionbooleanNoWhether this is a revised invoice.
totalAmountdecimalNoTotal invoice amount.
totalAmountApplieddecimalNoAmount already collected.
paymentStatusstring (enum)Noe.g., Unpaid, PartiallyPaid, Paid.
billingOrganizationOrganizationNoThe organization issuing the invoice (your company).
payerOrganizationOrganizationNoThe customer organization being invoiced.
invoiceAccountingProfileInvoiceAccountingProfileYesAccounting preferences for this invoice.
lineItemsInvoiceLineItem[]NoIndividual charge lines.
paymentLineItemsInvoicePaymentLineItem[]NoPayment applications against this invoice.
invoiceRecipientsstring[]NoEmail addresses this invoice was delivered to.
externalSyncExternalSyncDetailsYesExternal accounting sync status.

InvoiceAccountingProfile

FieldTypeNullableDescription
paymentPreferencestring (enum)NoPreferred payment method.
creditLimitdecimalYesCustomer credit limit.
paymentTermsintegerYesNet payment terms in days.
taxNumberstringYesCustomer tax ID.
preferredInvoicingMethodstring (enum)Noe.g., Email, Print, Portal.
invoiceDeliveryInstructionsstringYesSpecial delivery instructions.
podRequiredWithInvoicebooleanNoWhether proof of delivery is required.
bolRequiredWithInvoicebooleanNoWhether bill of lading is required.
customReferenceNumberstringYesCustom reference number for the invoice.

InvoiceLineItem

FieldTypeNullableDescription
invoiceLineItemIdintegerNoUnique line item ID.
descriptionstringYesCharge description.
accessorialCodestringYesAssociated accessorial code.
quantitydecimalNoQuantity for this line.
amountdecimalNoLine amount.
calculationTypestring (enum)NoHow the charge is calculated.
accountGeneralLedgerAccountYesGL account assignment.
externalSyncExternalSyncDetailsYesExternal sync status for this line.

InvoicePaymentLineItem

FieldTypeNullableDescription
invoicePaymentLineItemIdintegerNoUnique payment line ID.
invoiceIdintegerYesInvoice this payment applies to.
invoiceNumberstringYesInvoice number reference.
shipmentIdintegerYesShipment associated with this payment.
amountApplieddecimalNoAmount applied from this payment line.

InvoiceWithShipment

Used by: InvoiceCreateWithShipmentUrl

A composite wrapper — the root object has two properties:

FieldTypeDescription
invoiceInvoiceThe full invoice record (see above).
shipmentDetailsShipmentDetailsThe 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.

FieldTypeNullableDescription
organizationIdintegerNoUnique organization ID.
namestringNoOrganization name.
organizationTypestring (enum)Noe.g., Customer, Carrier, Vendor.
referenceNumberstringYesExternal reference number.
notesstringYesInternal notes.
phonestringYesPrimary phone.
mobilestringYesMobile phone.
faxstringYesFax number.
webAddressstringYesWebsite URL.
parentIdsstringYesComma-delimited list of parent organization IDs in the hierarchy.
addressAddressYesPrimary address.
billToAddressAddressYesBilling address (if different from primary).
modifiedByIdintegerYesStaff ID of the last user to modify this record.
modifiedByNamestringYesName of the last user to modify this record.
modifiedDatestring (datetime)NoLast modification timestamp.
createdDatestring (datetime)NoRecord creation timestamp.

Carrier Payload

Used by: LSPCarrierCreateUrl · LSPCarrierUpdateUrl

LSPCarrier

FieldTypeNullableDescription
lspCarrierIdintegerNoBroker-specific carrier record ID.
masterCarrierIdintegerNoCarrier master record ID.
statusstring (enum)Noe.g., Active, Inactive, Pending.
taxIdstringYesCarrier tax ID / EIN.
netTermsintegerNoPayment net terms in days.
paymentFrequencystring (enum)NoHow often payments are issued.
preferredPaymentTypestring (enum)Yese.g., Check, ACH, QuickPay.
creditLimitdecimalYesCredit limit extended to this carrier.
creditCardProcessingFeedecimalYesProcessing fee percentage for credit card payments.
acceptCreditCardbooleanNoWhether the carrier accepts credit card payments.
requires1099booleanNoWhether a 1099 form is required.
carrierNotesstringYesInternal notes.
supportedShipmentTypesstring[]NoList of supported modes (e.g., LTL, TL).
carrierMasterInfoCarrierMasterInfoNoCore carrier identity information.
remitPaymentAddressContactInformationYesAddress to send payments to.
brokerCarrierLabelsstring[]NoCustom labels/tags assigned to this carrier.
lspCarrierContactsCarrierContact[]NoContact records for this carrier.
lspCarrierInsurancesCarrierInsurance[]NoInsurance certificates on file.
lspCarrierSupportedTrailerTypesSupportedTrailerType[]NoEquipment types this carrier can handle.
lspCarrierParametersCarrierParameter[]NoCustom key-value configuration parameters.

CarrierMasterInfo

FieldTypeNullableDescription
namestringNoLegal carrier name.
scacstringYesStandard Carrier Alpha Code.
dotNumberstringYesDOT number.
mcNumberstringYesMC operating authority number.
phoneNumberstringYesPrimary phone.
citystringYesCity.
statestringYesState.
zipCodestringYesZip code.

CarrierContact

FieldTypeNullableDescription
contactNamestringYesContact full name.
phonestringYesPhone number.
emailstringYesEmail address.
contactTypestring (enum)NoRole or type of contact.

CarrierInsurance

FieldTypeNullableDescription
insuranceTypestring (enum)NoType of coverage (e.g., Cargo, Liability, GeneralLiability).
policyNumberstringYesInsurance policy number.
expirationDatestring (datetime)YesPolicy expiration date.
amountdecimalYesCoverage amount.
insuranceCompanystringYesName of the insurance provider.

SupportedTrailerType

FieldTypeNullableDescription
trailerTypestring (enum)Noe.g., DryVan, Flatbed, Reefer.

CarrierParameter

FieldTypeNullableDescription
keystringNoParameter key name.
valuestringYesParameter value.

Shared Object Types

These types appear across multiple payload schemas.

Address

FieldTypeNullableDescription
streetAddressstringYesPrimary street line.
streetAddressTwostringYesSuite, unit, or secondary line.
citystringYesCity.
statestringYesState or province.
zipCodestringYesPostal code.
countrystring (enum)YesCountry code (e.g., US, CA, MX).

ContactInformation

FieldTypeNullableDescription
companyNamestringYesCompany name.
streetAddressstringYesPrimary street line.
streetAddressTwostringYesSecondary street line.
citystringYesCity.
statestringYesState.
zipCodestringYesPostal code.
countrystring (enum)YesCountry.
phonestringYesPhone number.
emailstringYesEmail address.

GeneralLedgerAccount

FieldTypeNullableDescription
accountIdintegerNoGL account ID.
accountNumberstringYesGL account number.
accountNamestringYesGL account name.

ExternalSyncDetails

Represents the sync state of a record to an external accounting system (e.g., QuickBooks Online).

FieldTypeNullableDescription
statusstring (enum)Noe.g., NotSynced, Synced, Error.
referenceNumberstringYesExternal system's reference ID for this record.
amountdecimalYesAmount as recorded in the external system.
datestring (datetime)YesDate of the last sync.

Vendor

FieldTypeNullableDescription
vendorIdintegerNoUnique vendor ID.
namestringNoVendor name.
vendorTypestring (enum)Noe.g., Carrier, Agent, ThirdParty.
phonestringYesVendor phone.
referenceNumberstringYesExternal reference number.
notesstringYesInternal notes.
isFactoringCompanybooleanYesWhether this vendor is a factoring company.
remitToAddressAddressYesAddress to remit payments to.
modifiedByIdintegerYesStaff ID of the last modifier.
modifiedByNamestringYesName of the last modifier.
modifiedDatestring (datetime)YesLast 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

FieldTypeNullableDescription
shipmentIdintegerNoUnique shipment ID.
shipmentTypestring (enum)NoMode of transport.
stackablebooleanNoWhether freight can be stacked.
trailerTypestringYesTrailer type description.
serviceLevelstringYesService level description.
customerNamestringYesCustomer name.
proNumberstringYesPRO number.
shipperReferenceNumberstringYesShipper reference.
secondaryBOLNumberstringYesSecondary BOL.
poReferencestringYesPO reference.
carrierSCACstringYesCarrier SCAC code.
tariffDescriptionstringYesTariff description.
statusstringNoStatus label.
statusCodeintegerNoNumeric status code.
pickupDatestring (datetime)YesScheduled pickup date.
actualPickupArrivalDateTimestring (datetime)YesActual pickup arrival.
proofOfDeliveryArrivalDateTimestring (datetime)YesPOD arrival time.
deliveryEstimatedDateTimestring (datetime)YesEstimated delivery.
totalBuydecimalNoTotal carrier cost.
totalSelldecimalNoTotal customer charge.
latitudenumberYesLast known latitude.
longitudenumberYesLast known longitude.
mileagedecimalNoTotal mileage.
pickupNumberstringYesPickup confirmation number.
lspNamestringYesLSP (broker) name.
salesRepNamestringYesSales rep name.
linehaulCarrierNamestringYesLinehaul carrier name.
linehaulMCNumberstringYesLinehaul carrier MC number.
linehaulDOTNumberstringYesLinehaul carrier DOT number.
customerReferenceNumberstringYesCustomer reference number.
customerStaffReferenceNumberstringYesCustomer staff reference.
billToOrganizationIdstringYesBilling org ID (as string).
customerStaffIDstringYesCustomer staff ID (as string).
originAddressV1AddressYesSimplified origin address.
destinationAddressV1AddressYesSimplified destination address.
commoditiesV1Commodity[]NoCommodity lines.
accessorialCodesstring[]NoList of accessorial code strings.

V1Address

FieldTypeNullableDescription
companyNamestringYesCompany name.
streetAddressstringYesStreet address.
citystringYesCity.
statestringYesState.
zipCodestringYesZip code.
contactNamestringYesContact name.
phonestringYesPhone number.

V1Commodity

FieldTypeNullableDescription
descriptionstringYesFreight description.
handlingQuantityintegerNoNumber of handling units.
packagingTypestringYesPackaging type.
weightTotaldecimalNoTotal weight.
freightClassstringYesFreight class.
hazardousMaterialbooleanNoWhether 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)>.

ConfigurationHeader sent
Authorization onlyAuthorization: <your value>
UserName + Password onlyAuthorization: Basic <base64(user:pass)>
Both setAuthorization: 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:

  1. Use a strong secret in the Authorization header. Treat the Authorization value as a shared secret — use a long, randomly generated token and validate it on every request.
  2. Validate over HTTPS only. This ensures the Authorization header cannot be observed in transit.
  3. 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.

ScenarioTMS behavior
Endpoint returns 2xxSuccess — response body and status code logged.
Endpoint returns 3xxFollows the redirect automatically to the new URL.
Endpoint returns 4xx or 5xxLogged as-is — the non-2xx status is recorded but does not trigger a retry or exception. Response body is still captured.
Network error / DNS failureException caught — error message logged, no response data captured.
Endpoint times outException caught — error message logged. The TMS uses the default HttpClient timeout (~100 seconds).
TLS / certificate errorException 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

FieldTypePopulatedDescription
WebhookActivityLogIdlongAlwaysAuto-incrementing primary key.
OrganizationIdintAlwaysThe organization that owns the triggering record.
StaffIdintAlways for user-initiated events; may reflect a system user ID for background/EDI/driver-tracking eventsThe staff member whose action triggered the webhook.
IntegrationSourceIdint?Usually populated; nullable in schemaThe Source Setting that owns this webhook configuration.
WebhookTypeWebhookType? (nullable enum, values 1–13)AlwaysWhich webhook fired (e.g., ShipmentCreate, InvoiceCreate). Serialized as an integer in SQL.
Idlong?AlwaysThe ID of the triggering record — polymorphic per WebhookType (ShipmentId for shipment events, BillId for BillCreate, InvoiceId for invoice events, OrganizationId for customer/carrier events).
StartDateTimedatetime (UTC)AlwaysWhen the TMS began processing the webhook.
EndDateTimedatetime (UTC)AlwaysWhen the delivery attempt completed (or failed).
Durationint (seconds)AlwaysDATEDIFF(SECOND, StartDateTime, EndDateTime) — computed by the database.
ErrorMessagestringOn network-level error onlyException 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.UrlstringWhen an HTTP request was sentThe absolute URL the request was sent to. Truncated to 200 characters.
ApiDetail.HttpStatusCodeintWhen an HTTP response was receivedThe HTTP status code returned by your endpoint (e.g., 200, 401, 500).
ApiDetail.RequeststringAlwaysThe full JSON payload that was sent to your endpoint.
ApiDetail.ResponsestringWhen an HTTP response was receivedThe 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

  • ErrorMessage will be null — an HTTP response was received.
  • ApiDetail.HttpStatusCode will be 401.
  • ApiDetail.Request will 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.Response is empty and ApiDetail.HttpStatusCode is 200, your endpoint returned an empty body — that is fine.
  • If ErrorMessage is 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 ShipmentLocationUpdateUrl and ShipmentLocationUpdateExtendedUrl, 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:

ConditionThreshold
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.


Did this page help you?