LTL Rates — CSV Upload

LTL (Less-than-Truckload) rate pricing works differently from TL. Rather than a flat per-mile charge, LTL rates are class-based — the freight cost depends on the shipment’s weight, the distance, and the NMFC freight class of the goods being shipped. Heavier, denser freight falls into lower classes and attracts lower rates; lighter, bulkier freight is assigned higher classes.

In OTM, LTL pricing uses two layers:

  • Base Tariff — a rate offering already loaded in OTM that contains the published class-based rate table (rate per hundredweight by freight class and distance). This tariff is typically loaded once and shared across all carriers that use the same tariff basis.
  • Carrier Rate Offering — the actual contract with a specific carrier, which defines a discount percentage off the base tariff. OTM looks up the class rate from the base tariff, then applies the discount to calculate the final cost.

LTL lanes are also typically defined at a broader geography than TL. Where TL uses city-to-city lanes, LTL carriers often publish rates by origin city to destination state — reflecting how their regional networks are structured.

Six CSV files must be uploaded in the order listed below:

  • File 1 — RATE_OFFERING: Define the rate offering header (carrier, mode, weight range)
  • File 2 — RATE_BASE_DEF: Link the rate offering to a base tariff (LTL only — not used in TL)
  • File 3 — X_LANE: Define the lane (origin city → destination state)
  • File 4 — RATE_GEO: Link the rate offering to the lane and set the minimum charge
  • File 5 — RATE_GEO_COST_GROUP: Create a cost group container
  • File 6 — RATE_GEO_COST: Define the discount percentage off the base tariff

How to upload:

Business Process Automation > Integration > Integration Manager > Upload an XML/CSV Transmission

Select the file type from the dropdown, choose your CSV file, and click Upload. Repeat for each file in the order listed above.

Note: Every CSV file must have the object name as the first row, column headers as the second row, and data starting from the third row. OTM will reject files that do not follow this structure.

File 1 — RATE_OFFERING

Same structure as a TL rate offering but with LTL-specific values. The weight range reflects the typical LTL shipment band — below the minimum is parcel, above the maximum is TL.

RATE_OFFERING_GID / RATE_OFFERING_XID: GID and unique ID for this offering
RATE_OFFERING_TYPE_GID: Use LTL - MASTER (not TL). The "MASTER" indicates this offering will reference a base tariff via RATE_BASE_DEF.
SERVPROV_GID: GID of the carrier (Service Provider) in OTM — must already exist in your domain
CURRENCY_GID: Currency for the rate, e.g. USD
TRANSPORT_MODE_GID: Use LTL — this is a system-level value in OTM and is not prefixed with the domain name
RATE_SERVICE_GID: Rate service GID defined in OTM for this carrier contract — must exist in your domain. Rate Service configuration will be covered in a separate topic.
RATE_VERSION_GID: Rate version — use YOUR_DOMAIN.DEFAULT if no custom version has been created
MIN_WEIGHT_CONSTRAINT / MAX_WEIGHT_CONSTRAINT: Typical LTL range is 151 LB minimum (below this is parcel) up to 19,999 LB maximum (above this is TL). Each requires a _UOM_CODE column (e.g. LB) and a _BASE column (same numeric value).
RATE_DISTANCE_GID: Distance provider GID — e.g. YOUR_DOMAIN.MILEMAKER or YOUR_DOMAIN.PC_MILER
IS_ACTIVE: Y to activate
TOTAL_STOPS_CONSTRAINT / PICKUP_STOPS_CONSTRAINT / DELIVERY_STOPS_CONSTRAINT: For a standard LTL shipment: 2 total, 1 pickup, 1 delivery
STOPS_INCLUDED_IN_RATE: Number of stops included in the base rate

CSV Template:

RATE_OFFERING
RATE_OFFERING_GID,RATE_OFFERING_XID,RATE_OFFERING_TYPE_GID,SERVPROV_GID,CURRENCY_GID,TRANSPORT_MODE_GID,RATE_SERVICE_GID,RATE_VERSION_GID,MIN_WEIGHT_CONSTRAINT,MIN_WEIGHT_CONSTRAINT_UOM_CODE,MIN_WEIGHT_CONSTRAINT_BASE,MAX_WEIGHT_CONSTRAINT,MAX_WEIGHT_CONSTRAINT_UOM_CODE,MAX_WEIGHT_CONSTRAINT_BASE,RATE_DISTANCE_GID,IS_ACTIVE,TOTAL_STOPS_CONSTRAINT,PICKUP_STOPS_CONSTRAINT,DELIVERY_STOPS_CONSTRAINT,STOPS_INCLUDED_IN_RATE,DOMAIN_NAME
YOUR_DOMAIN.LTL_RATE_001,LTL_RATE_001,LTL - MASTER,YOUR_DOMAIN.YOUR_CARRIER,USD,LTL,YOUR_DOMAIN.YOUR_RATE_SERVICE,YOUR_DOMAIN.DEFAULT,151,LB,151,19999,LB,19999,YOUR_DOMAIN.MILEMAKER,Y,2,1,1,2,YOUR_DOMAIN

File 2 — RATE_BASE_DEF (LTL only)

Links the carrier’s rate offering to a base tariff. This is what makes the offering an LTL - MASTER — OTM uses the base tariff’s class rate table as the starting point, and then applies the discount defined in RATE_GEO_COST to calculate the actual cost.

RATE_MASTER_RO_GID: GID of the Rate Offering created in File 1
BASE_TARIFF_RO_GID: GID of the base tariff rate offering already loaded in OTM — e.g. YOUR_DOMAIN.LTL-BASE-US. This tariff must exist in OTM before uploading this file.
DOMAIN_NAME: Your OTM domain

CSV Template:

RATE_BASE_DEF
RATE_MASTER_RO_GID,BASE_TARIFF_RO_GID,DOMAIN_NAME
YOUR_DOMAIN.LTL_RATE_001,YOUR_DOMAIN.LTL-BASE-US,YOUR_DOMAIN
Note: The base tariff is typically loaded once per environment and shared across all carriers that use the same tariff basis. If your organisation uses multiple tariff bases (e.g. one for domestic, one for regional carriers), confirm which tariff applies to this carrier before uploading.

File 3 — X_LANE

Defines the lane. LTL lanes use a city-level origin and a state/province-level destination — reflecting how LTL carriers structure their regional pricing rather than pricing point-to-point like TL.

X_LANE_GID / X_LANE_XID: GID and unique ID for the lane. Recommended convention: {ORIGIN_CITY}_{ORIGIN_STATE}-{DEST_STATE}, e.g. DALLAS_TX-GA
SOURCE_CITY / SOURCE_PROVINCE_CODE / SOURCE_COUNTRY_CODE3_GID: Origin city, state, and 3-character country code
SOURCE_GEO_HIERARCHY_GID: Use CITY for the origin
DEST_PROVINCE_CODE: Destination state or province code (e.g. GA for Georgia). No destination city is required for state-level lanes.
DEST_GEO_HIERARCHY_GID: Use STATE/PROVINCE — this means the rate applies to all destinations within that state

CSV Template:

X_LANE
X_LANE_GID,X_LANE_XID,SOURCE_CITY,SOURCE_PROVINCE_CODE,SOURCE_COUNTRY_CODE3_GID,SOURCE_GEO_HIERARCHY_GID,DEST_PROVINCE_CODE,DEST_GEO_HIERARCHY_GID,DOMAIN_NAME
YOUR_DOMAIN.DALLAS_TX-GA,DALLAS_TX-GA,DALLAS,TX,USA,CITY,GA,STATE/PROVINCE,YOUR_DOMAIN

File 4 — RATE_GEO

Links the Rate Offering to the Lane and sets the minimum charge for this lane. The minimum charge is the floor cost OTM applies if the calculated freight cost (base tariff rate × discount) falls below this amount — a standard feature of LTL contracts.

RATE_GEO_GID / RATE_GEO_XID: GID and unique ID. Recommended convention: {RATE_OFFERING_XID}_{X_LANE_XID}
RATE_OFFERING_GID: GID of the Rate Offering created in File 1
X_LANE_GID: GID of the Lane created in File 3
MIN_COST: Minimum charge for any shipment on this lane, e.g. 178
MIN_COST_GID: Currency for the minimum cost, e.g. USD
MIN_COST_BASE: Same numeric value as MIN_COST
IS_ACTIVE: Y to activate this lane within the rate offering

CSV Template:

RATE_GEO
RATE_GEO_GID,RATE_GEO_XID,RATE_OFFERING_GID,X_LANE_GID,MIN_COST,MIN_COST_GID,MIN_COST_BASE,IS_ACTIVE,DOMAIN_NAME
YOUR_DOMAIN.LTL_RATE_001_DALLAS_TX-GA,LTL_RATE_001_DALLAS_TX-GA,YOUR_DOMAIN.LTL_RATE_001,YOUR_DOMAIN.DALLAS_TX-GA,178,USD,178,Y,YOUR_DOMAIN

File 5 — RATE_GEO_COST_GROUP

Creates a cost group under the Rate Geo — same purpose as in TL. Acts as a container for the discount cost line.

CSV Template:

RATE_GEO_COST_GROUP
RATE_GEO_COST_GROUP_GID,RATE_GEO_COST_GROUP_XID,RATE_GEO_GID,RATE_GEO_COST_GROUP_SEQ,DOMAIN_NAME
YOUR_DOMAIN.LTL_RATE_001_DALLAS_TX-GA,LTL_RATE_001_DALLAS_TX-GA,YOUR_DOMAIN.LTL_RATE_001_DALLAS_TX-GA,1,YOUR_DOMAIN

File 6 — RATE_GEO_COST

Defines the discount percentage off the base tariff for this lane. Unlike TL (which stores a rate per mile), LTL stores a discount factor — OTM looks up the applicable class rate from the base tariff, then applies this discount to arrive at the final freight cost.

Important: Row 3 of this file must contain the date format declaration exactly as shown. Do not remove or modify this line.
RATE_GEO_COST_GROUP_GID: GID of the Cost Group created in File 5
RATE_GEO_COST_SEQ: Sequence number — use 1 for a single discount line
CHARGE_MULTIPLIER_SCALAR: The discount percentage — e.g. 17.2 means a 17.2% discount off the base tariff rate
CHARGE_ACTION: Use D for Discount
COST_TYPE: Use D for Discount type
EFFECTIVE_DATE: Date this rate becomes active — format YYYYMMDDHH24MISS, e.g. 20260101000000 for 1 Jan 2026
EXPIRATION_DATE: Date this rate expires — leave blank for no expiry

CSV Template:

RATE_GEO_COST
RATE_GEO_COST_GROUP_GID,RATE_GEO_COST_SEQ,CHARGE_MULTIPLIER_SCALAR,CHARGE_ACTION,COST_TYPE,EFFECTIVE_DATE,EXPIRATION_DATE,DOMAIN_NAME
EXEC SQL ALTER SESSION SET NLS_DATE_FORMAT = 'YYYYMMDDHH24MISS'
YOUR_DOMAIN.LTL_RATE_001_DALLAS_TX-GA,1,17.2,D,D,20260101000000,,YOUR_DOMAIN

Questions & Discussion

Have a question about this topic? Post it below using your GitHub account. Comments are visible to everyone and help other OTM consultants with the same question.