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

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 fires once
DeliveryAt-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.

VersionBehavior
1Legacy (deprecated). Shipment payloads use the ShipmentWebhookExport model.
2Shipment statuses are transformed: Committed → Booked and Quote → Quoted.
3 (default)Current format. Statuses are sent as-is: Committed and Quote.

If no Version is configured, the system defaults to version 3.


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: Shipment record is persisted for the first time.
  • Payload: Full shipment details (ShipmentDetails).
  • Notes: Fires once per shipment, immediately on creation.

ShipmentDetailUpdateUrl

Fires 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

Fires 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
    2BookedQuoted
    3 (default)CommittedQuote

ShipmentLocationUpdateUrl

Fires 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

Fires 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 payerOrganizationId is used to match the webhook's linked organization.

CommissionBillCreateUrl

Fires 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 BillCreateUrl but scoped to commission-type billing records.

InvoiceCreateUrl

Fires 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 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 in the payload.

  • Trigger: The Invoice Create process completes for a customer invoice.
  • Payload: A composite object containing both invoice (PublicAPIInvoice) and shipmentDetails (ShipmentDetails).
  • Notes: Use this instead of InvoiceCreateUrl when your downstream system needs to correlate invoice financials with the full shipment record in a single call. InvoiceCreateUrl and InvoiceCreateWithShipmentUrl should not both be configured on the same Source Setting — they fire for the same event.

Customer Events

CustomerCreateUrl

Fires 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

Fires 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

Fires 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

Fires 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:

ParameterTypeDescription
ShipmentCreateUrlURLEndpoint for shipment creation events.
ShipmentDetailUpdateUrlURLEndpoint for shipment detail update events.
ShipmentStatusUpdateUrlURLEndpoint for shipment status change events.
ShipmentLocationUpdateUrlURLEndpoint for shipment location update events (15-min throttled).
BillCreateUrlURLEndpoint for bill approval events.
CommissionBillCreateUrlURLEndpoint for commission bill approval events.
InvoiceCreateUrlURLEndpoint for invoice creation events (invoice only).
InvoiceCreateWithShipmentUrlURLEndpoint for invoice creation events (invoice + shipment).
CustomerCreateUrlURLEndpoint for customer creation events.
CustomerUpdateUrlURLEndpoint for customer update events.
LSPCarrierCreateUrlURLEndpoint for carrier creation events.
LSPCarrierUpdateUrlURLEndpoint for carrier update events.
AuthorizationStringStatic authorization token sent in the Authorization request header.
VersionInteger (1, 2, or 3)Controls payload format and status label behavior. Defaults to 3.
DoNotMarkInvoiceAsPrintedBoolean (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 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 exactly, representing agent or rep commissions rather than carrier/vendor bills.

Commission

FieldTypeNullableDescription
commissionIdintegerNoUnique commission record ID.
commissionNumberstringYesCommission reference number.
commissionDatestring (datetime)NoDate the commission was issued.
commissionDueDatestring (datetime)NoPayment due date.
commissionTypestring (enum)NoCommission type.
totalAmountdecimalNoTotal commission amount.
totalAmountApplieddecimalNoAmount already paid out.
paymentStatusstring (enum)Noe.g., Unpaid, PartiallyPaid, Paid.
pendingUnapprovedCommissionsbooleanNoWhether related unapproved commissions exist.
payerOrganizationOrganizationNoThe organization this commission is billed under.
vendorVendorNoThe rep or agent receiving the commission.
carrierMasterNamestringYesCarrier master name (if applicable).
carrierMasterIdintegerYesCarrier master ID (if applicable).
lineItemsBillLineItem[]NoIndividual commission charge lines.
paymentLineItemsBillPaymentLineItem[]NoPayment applications.
externalSyncExternalSyncDetailsYesExternal accounting sync status.

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

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.

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, the recommended approach for endpoint verification is:

  1. Use a 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 4xx or 5xxLogged as-is — the non-2xx status is recorded but does not trigger a retry or exception.
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.

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. This is the primary tool for diagnosing integration issues.

Log Fields

FieldTypePopulatedDescription
WebhookActivityLogIdlongAlwaysAuto-incrementing primary key.
OrganizationIdintegerAlwaysThe organization that owns the triggering record.
StaffIdintegerAlwaysThe staff member whose action triggered the webhook (or system ID for background jobs).
IntegrationSourceIdintegerAlwaysThe Source Setting that owns this webhook configuration.
WebhookTypestring (enum)AlwaysWhich webhook fired (e.g., ShipmentCreate, InvoiceCreate).
IdlongAlwaysThe ID of the triggering record (shipment ID, invoice ID, etc.).
StartDateTimedatetime (UTC)AlwaysWhen the TMS began processing the webhook.
EndDateTimedatetime (UTC)AlwaysWhen the delivery attempt completed (or failed).
DurationintegerAlwaysSeconds between StartDateTime and EndDateTime — computed by the database.
ErrorMessagestringOn error onlyException message if a network-level or system error occurred. Truncated to 1,000 characters. Only present when no HTTP response was received.
ApiDetail.UrlstringOn success onlyThe absolute URL the request was sent to. Truncated to 200 characters.
ApiDetail.HttpStatusCodeintegerOn success onlyThe HTTP status code returned by your endpoint (e.g., 200, 401, 500).
ApiDetail.RequeststringAlwaysThe full JSON payload that was sent to your endpoint.
ApiDetail.ResponsestringOn success onlyThe 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

  • 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 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 ShipmentStatusUpdateUrl and ShipmentLocationUpdateUrl, 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:

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.